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

- -
+ @@ -157720,8 +157836,9 @@ unsigned int ThreadIdAsInt = *static_cast<unsigned int*>(static_cast<vo - + + @@ -157739,11 +157856,36 @@ unsigned int ThreadIdAsInt = *static_cast<unsigned int*>(static_cast<vo - + + + - + + + + + + + + + + + + + + +

+ Das ist essentiell; gute Icons zeichnen ist eine Kunst +

+ + +
+
+ + +