From b0e8fa2ff69a49526908c6b21349c56a9fac4680 Mon Sep 17 00:00:00 2001
From: Ichthyostega
Date: Mon, 5 May 2025 23:48:22 +0200
Subject: [PATCH] XV-Display: introduce a new kind of docking panel for the
play-control
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
While this is not strictly necessary for this experiment,
this is something we should try to establish early:
A »play control« should be handled as an independent UI element,
without tying it logically with some viewer (or timeline); the reason is
that such a play control needs a set of very well designed keyboard bindings,
and thus we will attempt use a focus concept to link to some active viewer
instead of creating one primary viewer, which gets the benefit of the
well accessible keybindings.
Basically we want to create an explicit association between
- a timeline
- some viewer
- a play-control
Introducing a new kind of panel shows again that the `PanelManager`
needs a rework; everything there is way too much ''hard wired''
And the new panel with the play control needs an **Icon** — which is
a challenge in itself; my proposal here is to build on the film metaphor,
and combine the symbol of "Play / Pause" with an stylised film or tape player
(with the secondary idea that this icon also somewhat looks like a owl face)
---
data/icons/svg/panel-play.svg | 517 ++++++++++++++++++++++++++
src/stage/ctrl/actions.hpp | 21 +-
src/stage/panel/play-panel.cpp | 57 +++
src/stage/panel/play-panel.hpp | 47 +++
src/stage/panel/viewer-panel.cpp | 2 +-
src/stage/panel/viewer-panel.hpp | 2 +-
src/stage/workspace/panel-manager.cpp | 28 +-
src/stage/workspace/panel-manager.hpp | 2 +-
src/stage/workspace/ui-style.cpp | 5 +-
wiki/thinkPad.ichthyo.mm | 156 +++++++-
10 files changed, 812 insertions(+), 25 deletions(-)
create mode 100644 data/icons/svg/panel-play.svg
create mode 100644 src/stage/panel/play-panel.cpp
create mode 100644 src/stage/panel/play-panel.hpp
diff --git a/data/icons/svg/panel-play.svg b/data/icons/svg/panel-play.svg
new file mode 100644
index 000000000..626d11a80
--- /dev/null
+++ b/data/icons/svg/panel-play.svg
@@ -0,0 +1,517 @@
+
+
+
+
+ Icon: play control
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+ Icon: play control
+
+
+
+ Ichthyostega
+
+
+
+
+ Lumiera.org
+
+
+ Icon to identify a play-control in the GUI
+
+prepared for Lumiera build :: Icon rendering
+ icon:panel-play
+ 2025
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/stage/ctrl/actions.hpp b/src/stage/ctrl/actions.hpp
index 3057554f9..fe6efc136 100644
--- a/src/stage/ctrl/actions.hpp
+++ b/src/stage/ctrl/actions.hpp
@@ -22,7 +22,9 @@
** Recommendation is to rely on `Gtk::Builder` and `Gtk::SimpleAction` instead.
** As of 5/2017, it is not clear to what extent this might force us into additional
** "desktop integration" we do not need nor want (like automatically connecting to
- ** D-Bus). For that reason, we'll postpone this transition for the time being /////////////////////TICKET #1068
+ ** D-Bus). For that reason, we'll postpone this transition for the time being /////////////////////TICKET #1068
+ ** @todo 5/2025 generally speaking, we use way too much registration relying on
+ ** matching textual IDs; This is a "boilerplaty" approach, we can do better ///////////////////////TICKET #1405 : all this registration with matching IDs is way too much "boilerplaty"
**
** @see ui-manager.hpp
** @see gtk-lumiera.cpp
@@ -147,6 +149,10 @@ namespace ctrl {
viewerPanelAction->signal_toggled().connect( [&]() { onMenu_view_viewer(); });
actionGroup->add(viewerPanelAction);
+ playPanelAction = ToggleAction::create("ViewPlay", StockID("panel_play"));
+ playPanelAction->signal_toggled().connect( [&]() { onMenu_view_play(); });
+ actionGroup->add(playPanelAction);
+
uiManager.insert_action_group(actionGroup);
@@ -180,6 +186,7 @@ namespace ctrl {
+
@@ -250,6 +257,7 @@ namespace ctrl {
assetsPanelAction->set_active (currentWindow.assetsPanel->is_shown());
timelinePanelAction->set_active(currentWindow.timelinePanel->is_shown());
viewerPanelAction->set_active (currentWindow.viewerPanel->is_shown());
+ ///////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1403 now we also have a playPanel
// is_updating_action_state = false;
*/
}
@@ -340,6 +348,16 @@ namespace ctrl {
unimplemented ("view viewer");
}
+ void
+ onMenu_view_play()
+ {
+ ///////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1403 added for sake of consistency : we have now also a palyer panel
+ /////////////////////////////////////////////////////////////////////////////////////TODO defunct since GTK-3 transition
+ //if(!is_updating_action_state)
+ // workspaceWindow.playPanel->show(viewerPanelAction->get_active()); //////global -> InteractionDirector
+ unimplemented ("view player");
+ }
+
// Temporary Junk
void
@@ -358,6 +376,7 @@ namespace ctrl {
Glib::RefPtr infoboxPanelAction;
Glib::RefPtr timelinePanelAction;
Glib::RefPtr viewerPanelAction;
+ Glib::RefPtr playPanelAction;
private: /* ===== Internals ===== */
diff --git a/src/stage/panel/play-panel.cpp b/src/stage/panel/play-panel.cpp
new file mode 100644
index 000000000..5846c04ac
--- /dev/null
+++ b/src/stage/panel/play-panel.cpp
@@ -0,0 +1,57 @@
+/*
+ PlayPanel - Dockable panel to hold the video display widgets and controls
+
+ Copyright (C)
+ 2008, Joel Holdsworth
+
+ **Lumiera** is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version. See the file COPYING for further details.
+
+* *****************************************************************/
+
+
+/** @file play-panel.cpp
+ ** Implementation of a dockable panel for player control and timecode display
+ */
+
+#include "stage/gtk-base.hpp"
+#include "stage/panel/play-panel.hpp"
+
+#include "stage/workspace/workspace-window.hpp"
+#include "stage/ui-bus.hpp" ///////////////////////////////////TODO why are we forced to include this after workspace-window.hpp ?? Ambiguity between std::ref and boost::reference_wrapper
+#include "stage/display-service.hpp"
+
+
+using namespace Gtk; ///////////////////////////////////////////////////////////////////////////////TICKET #1071 no wildcard includes please!
+using namespace stage::widget; ///////////////////////////////////////////////////////////////////////////////TICKET #1071 no wildcard includes please!
+using namespace stage::controller; ///////////////////////////////////////////////////////////////////////////////TICKET #1071 no wildcard includes please!
+
+namespace stage {
+namespace panel {
+
+ PlayPanel::PlayPanel (workspace::PanelManager& panelManager
+ ,Gdl::DockItem& dockItem)
+ : Panel{panelManager, dockItem, getTitle(), getStockID()}
+ , display_{}
+ , demoPlayback_{[this](void * const buffer){ display_.pushFrame(buffer); }}
+ {
+ //----- Pack in the Widgets -----//
+ pack_start(display_, PACK_EXPAND_WIDGET);
+ }
+
+ const char*
+ PlayPanel::getTitle()
+ {
+ return _("Play");
+ }
+
+ const gchar*
+ PlayPanel::getStockID()
+ {
+ return "panel_play";
+ }
+
+
+}}// namespace stage::panel
diff --git a/src/stage/panel/play-panel.hpp b/src/stage/panel/play-panel.hpp
new file mode 100644
index 000000000..35102d46b
--- /dev/null
+++ b/src/stage/panel/play-panel.hpp
@@ -0,0 +1,47 @@
+/*
+ VIEWER-PANEL.hpp - Dockable panel to hold the video display widgets and controls
+
+ Copyright (C)
+ 2008, Joel Holdsworth
+
+ **Lumiera** is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version. See the file COPYING for further details.
+
+*/
+
+/** @file play-panel.hpp
+ ** Definition of a dockable panel for playback control //////////////////////////////////////////////TICKET #1097 : me can haz more play panelz? wanna chase teh rat
+ */
+
+
+#ifndef STAGE_PANEL_PLAY_PANEL_H
+#define STAGE_PANEL_PLAY_PANEL_H
+
+
+#include "stage/panel/panel.hpp"
+#include "stage/widget/video-display-widget.hpp"
+#include "stage/ctrl/demo-controller.hpp"
+
+namespace stage {
+namespace panel {
+
+ /**
+ * A panel to display the video output.
+ */
+ class PlayPanel
+ : public Panel
+ {
+ widget::VideoDisplayWidget display_;
+ ctrl::DemoController demoPlayback_;
+
+ public:
+ PlayPanel (workspace::PanelManager&, Gdl::DockItem&);
+
+ static const char* getTitle();
+ static const gchar* getStockID();
+ };
+
+}}// namespace stage::panel
+#endif /*STAGE_PANEL_PLAY_PANEL_H*/
diff --git a/src/stage/panel/viewer-panel.cpp b/src/stage/panel/viewer-panel.cpp
index 50e7c515b..48bda5fcd 100644
--- a/src/stage/panel/viewer-panel.cpp
+++ b/src/stage/panel/viewer-panel.cpp
@@ -13,7 +13,7 @@
/** @file viewer-panel.cpp
- ** Implementation of a dockable panel to hold the video viewers
+ ** Implementation of a dockable panel with a video display widget
*/
#include "stage/gtk-base.hpp"
diff --git a/src/stage/panel/viewer-panel.hpp b/src/stage/panel/viewer-panel.hpp
index cb734fd2e..02b1cadae 100644
--- a/src/stage/panel/viewer-panel.hpp
+++ b/src/stage/panel/viewer-panel.hpp
@@ -12,7 +12,7 @@
*/
/** @file viewer-panel.hpp
- ** Definition of a dockable panel to hold the video viewers
+ ** Definition of a dockable panel to hold a video viewer
*/
diff --git a/src/stage/workspace/panel-manager.cpp b/src/stage/workspace/panel-manager.cpp
index faa38dc6b..a60a80c8a 100644
--- a/src/stage/workspace/panel-manager.cpp
+++ b/src/stage/workspace/panel-manager.cpp
@@ -22,7 +22,8 @@
#include "stage/workspace/panel-manager.hpp"
#include "stage/panel/assets-panel.hpp"
-#include "stage/panel/viewer-panel.hpp"
+#include "stage/panel/play-panel.hpp" //////////////////////////////////////////////////////////TICKET #1097 : need multiple play controls
+#include "stage/panel/viewer-panel.hpp" ///////////////////////////////////////////////////////////TICKET #1097 : need multiple viewers
#include "stage/panel/infobox-panel.hpp"
#include "stage/panel/timeline-panel.hpp"
@@ -41,6 +42,7 @@ namespace workspace {
PanelManager::Panel(),
PanelManager::Panel(),
PanelManager::Panel(),
+ PanelManager::Panel(),
PanelManager::Panel()
};
@@ -183,13 +185,13 @@ namespace workspace {
void
- PanelManager::splitPanel (panel::Panel& panel, Gtk::Orientation split_direction)
+ PanelManager::splitPanel (panel::Panel& panel, Gtk::Orientation split_direction, panel::Panel* toAdd)
{
-
- // Create the new panel
- const int index = getPanelType(&panel);
- panel::Panel *new_panel = createPanel_by_index(index);
-
+ if (not toAdd)
+ {// then duplicate the panel to split...
+ int index = getPanelType(&panel);
+ toAdd = createPanel_by_index(index);
+ }
// Dock the panel
Gdl::DockPlacement placement = Gdl::DOCK_NONE;
switch(split_direction)
@@ -209,7 +211,7 @@ namespace workspace {
}
panel.getDockItem().dock(
- new_panel->getDockItem(),placement);
+ toAdd->getDockItem(),placement);
}
@@ -240,13 +242,15 @@ namespace workspace {
PanelManager::createPanels()
{
///////////////////////////////TICKET #1026 : code smell, use types directly instead
- panel::Panel* assetsPanel = createPanel_by_name("AssetsPanel");
- panel::Panel* viewerPanel = createPanel_by_name("InfoBoxPanel");
+ panel::Panel* playPanel = createPanel_by_name("PlayPanel");
+ panel::Panel* viewerPanel = createPanel_by_name("ViewerPanel");
+ panel::Panel* infoBoxPanel = createPanel_by_name("InfoBoxPanel");
panel::Panel* timelinePanel = createPanel_by_name("TimelinePanel");
- dock_.add_item(assetsPanel->getDockItem(),Gdl::DOCK_LEFT);
+ dock_.add_item(viewerPanel->getDockItem(),Gdl::DOCK_LEFT);
dock_.add_item(timelinePanel->getDockItem(),Gdl::DOCK_BOTTOM);
- dock_.add_item(viewerPanel->getDockItem(),Gdl::DOCK_RIGHT);
+ dock_.add_item(infoBoxPanel->getDockItem(),Gdl::DOCK_RIGHT);
+ splitPanel(*infoBoxPanel, ORIENTATION_VERTICAL, playPanel);
}
diff --git a/src/stage/workspace/panel-manager.hpp b/src/stage/workspace/panel-manager.hpp
index 90029632a..38cbcaa5b 100644
--- a/src/stage/workspace/panel-manager.hpp
+++ b/src/stage/workspace/panel-manager.hpp
@@ -126,7 +126,7 @@ namespace workspace {
* @param panel The panel to split.
* @param split_direction The direction to split the panel in.
*/
- void splitPanel (panel::Panel& panel, Gtk::Orientation split_direction);
+ void splitPanel (panel::Panel& panel, Gtk::Orientation split_direction, panel::Panel* toAdd =nullptr);
public:
diff --git a/src/stage/workspace/ui-style.cpp b/src/stage/workspace/ui-style.cpp
index 3ea13f26d..5b7c79660 100644
--- a/src/stage/workspace/ui-style.cpp
+++ b/src/stage/workspace/ui-style.cpp
@@ -190,10 +190,11 @@ namespace workspace {
*/
void
UiStyle::registerStockItems()
- {
+ { ////////////////////////////////////////////////////////////////////TICKET #1405 : all this registration with matching IDs is way too much "boilerplaty"
Glib::RefPtr factory = Gtk::IconFactory::create();
addStockIconSet(factory, "panel-assets", "panel_assets", _("_Assets"));
+ addStockIconSet(factory, "panel-play", "panel_play", _("_Play"));
addStockIconSet(factory, "panel-viewer", "panel_viewer", _("_Viewer"));
addStockIconSet(factory, "panel-infobox", "panel_infobox", _("_InfoBox"));
addStockIconSet(factory, "panel-timeline", "panel_timeline",_("_Timeline"));
@@ -246,7 +247,7 @@ namespace workspace {
// Add the icon set to the icon factory
const Gtk::StockID stock_id(id);
factory->add(stock_id, icon_set);
- Gtk::Stock::add(Gtk::StockItem(stock_id, uLabel)); //////////////////////TICKET #1030 : use "icon names" instead of Gtk::StockItem
+ Gtk::Stock::add(Gtk::StockItem(stock_id, uLabel)); //////////////////////////////////////////TICKET #1030 : use "icon names" instead of Gtk::StockItem
return true;
}
diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm
index 031df5396..139cbfcdc 100644
--- a/wiki/thinkPad.ichthyo.mm
+++ b/wiki/thinkPad.ichthyo.mm
@@ -129797,6 +129797,124 @@ StM_bind(Builder<R1> b1, Extension<R1,R2> extension)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mal bei den Standard-Icons vom XFCE-Desktop nachschauen
+
+
+ ... die Starter-Konfig-Box durchscrollen
+
+
+ .... mal bei Tango nachschauen...
+
+
+ ..... XFCE hat doch diesen sehr sauber-minimalistischen Icon-Satz von »Elementary-OS« übernommen (den man dort wegwerfen wollte)
+
+
+
+
+
+
+
+
+ Ausgangspunkt sind verschiedene Icons für Musik-Player, die eine stilisierte Compact-Kasette zeigen. Das bringt mich auf die Idee, auf die Steenbeck-Schneidemaschinen anzuspielen, mit den großen Rollen, bzw. auf eine Magnetton-Maschine ... und dann könnte man ein »Playhead« aus einem »Play/Pause«-Symbol erzeugen
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Tja ⟹ dann gibt's bloß Inspiration + Arbeit
+
+
+
+
+
+
+
+ Ideen sind immer noch frei (sofern sie nicht patentiert sind) — nur der konkrete gestalterische Ausruck steht unter Copyright...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -154542,8 +154660,7 @@ std::cout << tmpl.render({"what", "World"}) << s
es ging darum, an die unterliegenden X-Windows ranzukommen, um sie dann auf dem Bidschirm zu positionierenl
-
-
+
@@ -154575,8 +154692,7 @@ std::cout << tmpl.render({"what", "World"}) << s
dieser Code ist anscheinend nicht deprecated
-
-
+