diff --git a/src/gui/ctrl/actions.hpp b/src/gui/ctrl/actions.hpp index e8eb46754..772e11d1e 100644 --- a/src/gui/ctrl/actions.hpp +++ b/src/gui/ctrl/actions.hpp @@ -43,7 +43,7 @@ #include "gui/gtk-base.hpp" #include "gui/ctrl/global-ctx.hpp" -#include "gui/ctrl/window-list.hpp" +#include "gui/ctrl/window-locator.hpp" #include "gui/workspace/workspace-window.hpp" #include "gui/workspace/panel-manager.hpp" #include "lib/format-string.hpp" @@ -133,8 +133,8 @@ namespace ctrl { menu("WindowMenu", _("_Window")); - entry ([&]() { globalCtx_.windowList_.newWindow(); } , "WindowNewWindow", StockID("new_window")); - entry ([&]() { globalCtx_.windowList_.closeWindow();}, "WindowCloseWindow", _("Close Window")); + entry ([&]() { globalCtx_.windowLoc_.newWindow(); } , "WindowNewWindow", StockID("new_window")); + entry ([&]() { globalCtx_.windowLoc_.closeWindow();} , "WindowCloseWindow", _("Close Window")); actionGroup->add(Action::create("WindowShowPanel", _("_Show Panel"))); @@ -287,9 +287,9 @@ namespace ctrl { cuString panelName = ustring::compose("Panel%1", i); actionGroup->add(Action::create(panelName, StockID(stock_id)), [i,this]() { - globalCtx_.windowList_.findActiveWindow() - .getPanelManager() - .showPanel (i); + globalCtx_.windowLoc_.findActiveWindow() + .getPanelManager() + .showPanel (i); }); } diff --git a/src/gui/ctrl/global-ctx.hpp b/src/gui/ctrl/global-ctx.hpp index ef1499c8c..d32d1f20e 100644 --- a/src/gui/ctrl/global-ctx.hpp +++ b/src/gui/ctrl/global-ctx.hpp @@ -40,7 +40,7 @@ ** - connection to the [UI-Bus](\ref ui-bus.hpp) ** - the UiManager ** - the InteractionDirector - ** - the WindowList + ** - the WindowLocator ** - the Wizard ** ** @see gtk-lumiera.hpp @@ -56,7 +56,7 @@ #include "gui/gtk-base.hpp" #include "gui/ui-bus.hpp" #include "gui/ctrl/ui-manager.hpp" -#include "gui/ctrl/window-list.hpp" +#include "gui/ctrl/window-locator.hpp" #include "gui/interact/wizard.hpp" #include "gui/interact/interaction-director.hpp" @@ -87,7 +87,7 @@ namespace ctrl { UiBus& uiBus_; UiManager& uiManager_; - WindowList windowList_; + WindowLocator windowLoc_; InteractionDirector director_; interact::Wizard wizard_; @@ -99,7 +99,7 @@ namespace ctrl { GlobalCtx (UiBus& bus, UiManager& manager) : uiBus_{bus} , uiManager_{manager} - , windowList_{*this} + , windowLoc_{*this} , director_{*this} , wizard_{*this} { } diff --git a/src/gui/ctrl/ui-manager.cpp b/src/gui/ctrl/ui-manager.cpp index 3a7fe218b..7a1f2f8eb 100644 --- a/src/gui/ctrl/ui-manager.cpp +++ b/src/gui/ctrl/ui-manager.cpp @@ -116,8 +116,8 @@ namespace ctrl { void UiManager::createApplicationWindow() { - if (globals_->windowList_.empty()) - globals_->windowList_.newWindow(); + if (globals_->windowLoc_.empty()) + globals_->windowLoc_.newWindow(); } @@ -158,7 +158,7 @@ namespace ctrl { UiManager::updateWindowFocusRelatedActions() { ///////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1076 find out how to handle this properly - actions_->updateActionState (globals_->windowList_.findActiveWindow()); + actions_->updateActionState (globals_->windowLoc_.findActiveWindow()); } diff --git a/src/gui/ctrl/ui-manager.hpp b/src/gui/ctrl/ui-manager.hpp index 13db171d0..fa28a51ac 100644 --- a/src/gui/ctrl/ui-manager.hpp +++ b/src/gui/ctrl/ui-manager.hpp @@ -37,7 +37,7 @@ ** - the global Actions available though the menu ** - the InteractionDirector (top-level controller) ** - the StyleManager - ** - the WindowList + ** - the WindowLocator ** ** @see gtk-lumiera.hpp ** @see ui-bus.hpp diff --git a/src/gui/ctrl/window-list.cpp b/src/gui/ctrl/window-locator.cpp similarity index 87% rename from src/gui/ctrl/window-list.cpp rename to src/gui/ctrl/window-locator.cpp index f20ac112e..3f4754370 100644 --- a/src/gui/ctrl/window-list.cpp +++ b/src/gui/ctrl/window-locator.cpp @@ -1,5 +1,5 @@ /* - WindowList - manage all top level windows + WindowLocator - manage all top level windows Copyright (C) Lumiera.org 2008, Joel Holdsworth @@ -21,14 +21,14 @@ * *****************************************************/ -/** @file window-list.cpp - ** Implementation parts of the list to manage all top level windows. +/** @file window-locator.cpp + ** Implementation details of management and access to all top level windows. ** @see ui-manager.hpp */ #include "gui/ctrl/global-ctx.hpp" -#include "gui/ctrl/window-list.hpp" +#include "gui/ctrl/window-locator.hpp" #include "gui/workspace/workspace-window.hpp" #include "lib/util.hpp" @@ -47,20 +47,20 @@ namespace ctrl { - WindowList::WindowList (GlobalCtx& globals) + WindowLocator::WindowLocator (GlobalCtx& globals) : globalCtx_{globals} , windowList_{} { } void - WindowList::newWindow () + WindowLocator::newWindow () { PWindow window (new WorkspaceWindow{globalCtx_.uiManager_}); REQUIRE(window); window->signal_delete_event().connect(sigc::mem_fun( - this, &WindowList::on_window_closed)); + this, &WindowLocator::on_window_closed)); windowList_.push_back(window); @@ -76,7 +76,7 @@ namespace ctrl { * the fist one in list will be killed */ void - WindowList::closeWindow() + WindowLocator::closeWindow() { findActiveWindow().hide(); } @@ -90,7 +90,7 @@ namespace ctrl { * called when there is at least one Lumiera window. */ WorkspaceWindow& - WindowList::findActiveWindow() + WindowLocator::findActiveWindow() { REQUIRE (not isnil (windowList_)); @@ -108,7 +108,7 @@ namespace ctrl { * has keyboard focus. This may very well be the case. */ WorkspaceWindow& - WindowList::findFocusWindow() + WindowLocator::findFocusWindow() { REQUIRE (not isnil (windowList_)); @@ -122,7 +122,7 @@ namespace ctrl { bool - WindowList::on_window_closed (GdkEventAny* event) + WindowLocator::on_window_closed (GdkEventAny* event) { REQUIRE(event); REQUIRE(event->window); @@ -157,7 +157,7 @@ namespace ctrl { void - WindowList::updateCloseWindowInMenus() + WindowLocator::updateCloseWindowInMenus() { globalCtx_.uiManager_.allowCloseWindow ( 1 < windowList_.size()); } diff --git a/src/gui/ctrl/window-list.hpp b/src/gui/ctrl/window-locator.hpp similarity index 84% rename from src/gui/ctrl/window-list.hpp rename to src/gui/ctrl/window-locator.hpp index dca2e37a9..b3bd0c64e 100644 --- a/src/gui/ctrl/window-list.hpp +++ b/src/gui/ctrl/window-locator.hpp @@ -1,5 +1,5 @@ /* - WINDOW-LIST.hpp - manage all top level windows + WINDOW-LOCATOR.hpp - manage all top level windows Copyright (C) Lumiera.org 2008, Joel Holdsworth @@ -21,10 +21,10 @@ */ -/** @file window-list.hpp +/** @file window-locator.hpp ** Manager for all top level application windows. - ** The central WindowList instance is owned by the GtkLumiera object and - ** initialised in GTK-main. The WindowList allows to create new windows + ** The central WindowLocator is part of the [UI global context](\ref GlobalCtx) and thus + ** initialised on startup of the UI. The WindowLocator allows to create new windows ** integrated with the application framework. ** ** @see gtk-lumiera.hpp @@ -32,8 +32,8 @@ */ -#ifndef GUI_CTRL_WINDOW_LIST_H -#define GUI_CTRL_WINDOW_LIST_H +#ifndef GUI_CTRL_WINDOW_LOCATOR_H +#define GUI_CTRL_WINDOW_LOCATOR_H #include "gui/gtk-base.hpp" @@ -59,7 +59,7 @@ namespace ctrl { /** * A centralised manager of all top level application windows. */ - class WindowList + class WindowLocator : boost::noncopyable { using PWindow = std::shared_ptr; @@ -69,7 +69,7 @@ namespace ctrl { public: - WindowList (GlobalCtx&); + WindowLocator (GlobalCtx&); bool empty() const; @@ -104,7 +104,7 @@ namespace ctrl { inline bool - WindowList::empty() const + WindowLocator::empty() const { return windowList_.empty(); } @@ -112,4 +112,4 @@ namespace ctrl { }}// namespace gui::ctrl -#endif /*GUI_CTRL_WINDOW_LIST_H*/ +#endif /*GUI_CTRL_WINDOW_LOCATOR_H*/ diff --git a/src/gui/interact/interaction-director.cpp b/src/gui/interact/interaction-director.cpp index e8605ad38..6f0dd627d 100644 --- a/src/gui/interact/interaction-director.cpp +++ b/src/gui/interact/interaction-director.cpp @@ -261,7 +261,7 @@ namespace interact { workspace::WorkspaceWindow& InteractionDirector::getWorkspaceWindow() { - return globalCtx_.windowList_.findActiveWindow(); + return globalCtx_.windowLoc_.findActiveWindow(); } diff --git a/src/gui/interact/wizard.cpp b/src/gui/interact/wizard.cpp index ea5181e3e..8585092fa 100644 --- a/src/gui/interact/wizard.cpp +++ b/src/gui/interact/wizard.cpp @@ -96,7 +96,7 @@ namespace interact { dialog.set_website(Config::get (KEY_WEBSITE)); dialog.set_authors(authorsList); - WorkspaceWindow& currentWindow = globalCtx_.windowList_.findActiveWindow(); + WorkspaceWindow& currentWindow = globalCtx_.windowLoc_.findActiveWindow(); dialog.set_transient_for (currentWindow); // Show the about dialog diff --git a/wiki/renderengine.html b/wiki/renderengine.html index 4afe7223d..f32caade3 100644 --- a/wiki/renderengine.html +++ b/wiki/renderengine.html @@ -2747,6 +2747,25 @@ Command instances are like prototypes -- thus each additional level of different see the description in &rarr; CommandSetup +
+
//A view within the UI, featuring some component of relevance to »the model«.//
+While any UI is comprised of numerous widgets acting as //view of something,// only some of those views play the prominent role to act as //building block component// of the user interface.
+Such UI component views exhibit some substantial traits
+* they conform to a built-in fixed list of view types, each of which is unique and dedicated to a very specific purpose: //''Timeline'', ''Viewer'', (Asset)''Bin'', ''Infobox'', ''Playcontrol'',...//
+* each component view has a distinguishable identity and is connected to and addressable through the UI-Bus
+* it can be hosted only at a dedicated location within one or several specific [[docking panels|GuiDockingPanel]].
+* multiplicity (one, one per window, many) depends on the type of view and needs to be managed.
+* such a view is not just //created// -- rather it needs to be //allocated//
+
+!Allocation of UI component views
+Here, //Allocation// means
+* to constitute the desired element's identity
+* to consider multiplicity and possibly retrieve an existing instance
+* to determine the hosting location
+* possibly to instantiate and register a new instance
+* and finally to configure that instance for the desired role
+The classical example to verify this definition is the //allocation of viewers:// when starting playback of a new media item, we "need a viewer" to show it. But we can not just create yet another viewer window -- rather we need to allocate one of the possible "viewer slots". In fact this is a configurable property of the UI layout employed; sometimes some people need the limitation to one single viewer entity (which might even be external, routed to a beamer or monitor), while other ones request the classical editor layout with two viewer windows side by side, while yet different working styles might exploit a limited set of viewers allocated in stack- or round-robin style.
+
All communication between Proc-Layer and GUI has to be routed through the respective LayerSeparationInterfaces. Following a fundamental design decision within Lumiera, these interface are //intended to be language agnostic// &mdash; forcing them to stick to the least common denominator. Which creates the additional problem of how to create a smooth integration without forcing the architecture into functional decomposition style. To solve this problem, we rely on ''messaging'' rather than on a //business facade// -- our facade interfaces are rather narrow and limited to lifecycle management. In addition, the UI exposes a [[notification facade|GuiNotificationFacade]] for pushing back status information created as result of the edit operations, the build process and the render tasks.
 
@@ -2873,18 +2892,20 @@ In order to build a sensible plan for our timeline structure, we need to investi
 }}}
 
-
+
//Management of dockable content panes//
 Within each top level application window, the usable screen real estate can be split and arranged into a number of standard view building blocks. Each of this //panels// follows a specific preconfigured basic layout -- these are hard coded, yet customisable in detail. There is a finite list of such panel types available:
 * the [[timeline display|GuiTimelineView]]
 * the media viewer
 * asset management
 * information box
+Within the preconfigured layout it is a panel's role to host and incorporate GuiComponentView elements.
+Please note the distinction between UI component view and panel; in many cases there is one of each for a given kind, and these need to be distinguished: e.g. there is the [[timeline view|GuiTimelineView]] and there is the timeline panel, which houses several timelines (as tabs). Or there is the viewer component, which is located within a dedicated viewer panel each.
 
 !Instantiation
 !Placing and addressing of embedded contents
-A specific problem arises insofar other parts of the UI need to create, address and control some UI entities, which at the same time exist as part of a docking panel. This is a problem of crosscutting concerns: UI control and interaction structure should not be mingled with the generic concern to maintain a component as part of a screen layout. Unfortunately, standard UI toolkit sets are designed incredibly naive ways when it comes to interaction design, and the only available alternative is to rely on a framework, which come with a hard-wired philosophy.
-As a result, we're forced to build our UI from components lacking the decision between //ownership and control.//
+A specific problem arises insofar other parts of the UI need to create, address and control some UI entities, which at the same time exist as part of a docking panel. This is a problem of crosscutting concerns: UI control and interaction structure should not be mingled with the generic concern to maintain a component as part of a screen layout. Unfortunately, the design of standard UI toolkit sets is incredibly naive when it comes to interaction design, and the only available alternative is to rely on frameworks, which come with a hard-wired philosophy.
+As a result, we're forced to build our UI from components which fall short on the distinction between //ownership and control.//
 
@@ -3491,7 +3512,7 @@ The concept of a //focus goal// has several ramifications: for one it implies th To create such a system is an ambitious goal. We can not reach it in a single step, since it entails the formation of a whole intermediary layer, on top of the //usual UI mechanics,// yet below the concrete UI interactions. Especially, we'd need to clarify the meaning of //perspective,// we need to decide on the relation of top level frame, individual view, layout, focus and //current location within the UI.// On a second thought, building such a system implies we'll have to live with an intermediary state of evolution, where parts of the new framework are already in place without interfering with common conventional usage of the interface as-is.
-
+
//the top-level controller within the UI.//
 In Lumiera, the structures of the model within the [[Session]] (the so called HighLevelModel) are mapped onto corresponding [[tangible UI entities|UI-Element]], which serve as a front-end to represent those entities towards the user. Within this model, there is a //conceptual root node// -- which logically corresponds to the session itself. This [[root element in model|ModelRootMO]] links together the actual top-level entities, which are the (multiple) timelines, together with the asset management and defaults and rules configuration within the session.
 
@@ -3516,7 +3537,12 @@ The InteractionDirector is part of the model, and thus we have to distinguish be
 
 !Collaborations
 * several global actions are exposed here, like opening the session and creating a new timeline.<br/>Such operations are typically bound into menu and action buttons, and in turn invoke [[commands|CommandHandling]] into the Session
-* some further actions involve the interplay with the [[docking panel manager|GuiDockingPanel]], like e.g. instantiating a new [[timeline display|GuiTimelineView]] into a timeline pane.
+* some further actions involve [[management of docking panels|GuiDockingPanel]], like e.g. instantiating a new [[timeline display|GuiTimelineView]] into a timeline pane.
+* in fact it is the InteractionDirector's job to keep track of [[component views|GuiComponentView]], some of which
+** can exist only once
+** or can exist only once per top level window
+** some might even be required once per window
+** while others may be duplicated locally or globally
 
diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index d9e1892c8..f106355f9 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -306,7 +306,7 @@ - + @@ -341,7 +341,7 @@ - + @@ -2707,13 +2707,14 @@ - + - + + - + @@ -2731,7 +2732,7 @@ - + @@ -2973,7 +2974,7 @@ - + @@ -3000,13 +3001,14 @@ - + - + - + + @@ -3014,7 +3016,7 @@ - + @@ -3432,7 +3434,7 @@ - + @@ -3470,7 +3472,7 @@ - + @@ -3771,6 +3773,9 @@ + + + @@ -3828,13 +3833,14 @@ + - + - + @@ -3856,6 +3862,48 @@ + + + + + + + + + + + + + + + +

+ wie bestimmt? +

+ + +
+ + + + + + + + + + + + + + + + + + + + + @@ -3870,7 +3918,7 @@ - + @@ -5273,6 +5321,15 @@ + + + + + + + + +