UI-top-level: wiring in accordance to the new global context

this pretty much resolves most of the uncertainities:
we now get a set of mutually dependent services, each of which
is aware of each other member's capabilities, but accesses those
only through this partner's API
This commit is contained in:
Fischlurch 2017-02-14 03:31:12 +01:00
parent f8eb640dd7
commit e94b294121
9 changed files with 79 additions and 78 deletions

View file

@ -37,8 +37,8 @@
#include "gui/gtk-lumiera.hpp"
#include "gui/config-keys.hpp"
#include "gui/workspace/global-ctx.hpp"
#include "gui/workspace/workspace-window.hpp"
#include "gui/workspace/ui-manager.hpp"
#include "gui/dialog/render.hpp"
#include "gui/dialog/preferences-dialog.hpp"
#include "gui/dialog/name-chooser.hpp"
@ -47,6 +47,7 @@
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
#include <boost/noncopyable.hpp>
#include <functional>
#include <vector>
@ -78,15 +79,13 @@ namespace workspace {
* user action events.
*/
class Actions
: boost::noncopyable
{
/**reference to the MainWindow which owns this helper */
using GetWindow = function<WorkspaceWindow&()>;
GetWindow getWorkspaceWindow;
GlobalCtx& globalCtx_;
public:
Actions (GetWindow how_to_access_current_window)
: getWorkspaceWindow(how_to_access_current_window)
Actions (GlobalCtx& globals)
: globalCtx_{globals}
, is_updating_action_state(false)
{ }
@ -233,6 +232,12 @@ namespace workspace {
private: /* ===== Internals ===== */
WorkspaceWindow&
getWorkspaceWindow()
{
return globalCtx_.windowList_.findActiveWindow();
}
/**
* Populates a uiManager with actions for the Show Panel menu.

View file

@ -54,10 +54,9 @@
#ifndef GUI_WORKSPACE_GLOBAL_CTX_H
#define GUI_WORKSPACE_GLOBAL_CTX_H
#include "gui/gtk-lumiera.hpp"
#include "gui/gtk-base.hpp"
#include "gui/ui-bus.hpp"
#include "gui/workspace/ui-manager.hpp"
#include "gui/workspace/actions.hpp"
#include "gui/workspace/window-list.hpp"
#include "gui/workspace/interaction-director.hpp"
@ -89,7 +88,6 @@ namespace workspace {
InteractionDirector director_;
WindowList windowList_;
Actions actions_;
public:
@ -101,7 +99,6 @@ namespace workspace {
, uiManager_{manager}
, director_{*this}
, windowList_{*this}
, actions_{*this}
{ }
private:

View file

@ -27,6 +27,7 @@
#include "gui/gtk-base.hpp"
#include "gui/workspace/global-ctx.hpp"
#include "gui/workspace/interaction-director.hpp"
#include "gui/ui-bus.hpp"
#include "gui/ctrl/bus-term.hpp"
@ -53,8 +54,9 @@ namespace workspace {
{ }
InteractionDirector::InteractionDirector (UiBus& bus)
: model::Controller(proc::mobject::session::Root::getID(), bus.getAccessPoint())
InteractionDirector::InteractionDirector (GlobalCtx& globals)
: model::Controller(proc::mobject::session::Root::getID(), globals.uiBus_.getAccessPoint())
, globalCtx_(globals)
{ }

View file

@ -72,6 +72,7 @@ namespace workspace {
//class Actions;
//class WindowList;
class GlobalCtx;
@ -83,6 +84,8 @@ namespace workspace {
: public model::Controller
{
GlobalCtx& globalCtx_;
////TODO: what is the model equivalent represented here???
/** set up a binding to allow some top-level UI state
@ -92,7 +95,7 @@ namespace workspace {
void buildMutator (lib::diff::TreeMutator::Handle) override;
public:
InteractionDirector (UiBus& bus);
InteractionDirector (GlobalCtx&);
~InteractionDirector ();

View file

@ -35,6 +35,7 @@
#include "gui/config-keys.hpp"
#include "gui/workspace/ui-manager.hpp"
#include "gui/workspace/global-ctx.hpp"
#include "gui/workspace/actions.hpp"
#include "gui/workspace/workspace-window.hpp"
#include "lib/searchpath.hpp"
#include "lib/util.hpp"
@ -70,6 +71,7 @@ namespace workspace {
UiManager::UiManager (UiBus& bus)
: Gtk::UIManager()
, globals_{new GlobalCtx{bus, *this}}
, actions_{new Actions{*globals_}}
, iconSearchPath_{Config::get (KEY_ICON_PATH)}
, resourceSerachPath_{Config::get (KEY_UIRES_PATH)}
{
@ -104,8 +106,8 @@ namespace workspace {
void
UiManager::createApplicationWindow()
{
if (windowList_->empty())
windowList_->newWindow();
if (globals_->windowList_.empty())
globals_->windowList_.newWindow();
}

View file

@ -63,6 +63,7 @@ namespace workspace {
using std::string;
class GlobalCtx;
class Actions;
@ -78,6 +79,7 @@ namespace workspace {
{
unique_ptr<GlobalCtx> globals_;
unique_ptr<Actions> actions_;
string iconSearchPath_;
string resourceSerachPath_;

View file

@ -27,7 +27,7 @@
*/
#include "gui/workspace/ui-manager.hpp"
#include "gui/workspace/global-ctx.hpp"
#include "gui/workspace/window-list.hpp"
#include "gui/workspace/workspace-window.hpp"
#include "lib/util.hpp"
@ -45,8 +45,8 @@ namespace workspace {
WindowList::WindowList (UiManager& uiManager)
: uiManager_{uiManager}
WindowList::WindowList (GlobalCtx& globals)
: globalCtx_{globals}
, windowList_{}
{ }
@ -54,7 +54,7 @@ namespace workspace {
void
WindowList::newWindow ()
{
PWindow window (new WorkspaceWindow{uiManager_});
PWindow window (new WorkspaceWindow{globalCtx_.uiManager_});
REQUIRE(window);
window->signal_delete_event().connect(sigc::mem_fun(
@ -149,7 +149,7 @@ namespace workspace {
void
WindowList::updateCloseWindowInMenus()
{
uiManager_.allowCloseWindow ( 1 < windowList_.size());
globalCtx_.uiManager_.allowCloseWindow ( 1 < windowList_.size());
}

View file

@ -49,7 +49,7 @@ namespace gui {
namespace workspace {
class UiManager;
class GlobalCtx;
class WorkspaceWindow;
using std::list;
@ -64,12 +64,12 @@ namespace workspace {
{
using PWindow = std::shared_ptr<WorkspaceWindow>;
UiManager& uiManager_;
GlobalCtx& globalCtx_;
list<PWindow> windowList_;
public:
WindowList (UiManager&);
WindowList (GlobalCtx&);
bool empty() const;

View file

@ -1670,10 +1670,6 @@
<node CREATED="1485562029644" ID="ID_1022779645" MODIFIED="1485562063560" TEXT="wieder das Problem mit dem BInden der Actions">
<arrowlink DESTINATION="ID_530209145" ENDARROW="Default" ENDINCLINATION="-17;-195;" ID="Arrow_ID_626063593" STARTARROW="None" STARTINCLINATION="9;270;"/>
<icon BUILTIN="messagebox_warning"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1485917478469" ID="ID_1209137422" MODIFIED="1486768047985" TEXT="WIP">
<arrowlink COLOR="#e22029" DESTINATION="ID_596101447" ENDARROW="Default" ENDINCLINATION="42;-201;" ID="Arrow_ID_45514601" STARTARROW="Default" STARTINCLINATION="8;84;"/>
<icon BUILTIN="flag-pink"/>
</node>
</node>
</node>
<node CREATED="1485550992299" ID="ID_1685125156" MODIFIED="1485917505214" TEXT="es blocken">
@ -1835,8 +1831,9 @@
</body>
</html></richcontent>
<node CREATED="1485903041262" ID="ID_997327941" MODIFIED="1485903044082" TEXT="Fokus"/>
<node CREATED="1485903046613" ID="ID_1041890737" MODIFIED="1485917548794" TEXT="aktuelles Fenster">
<node COLOR="#338800" CREATED="1485903046613" ID="ID_1041890737" MODIFIED="1487039206991" TEXT="aktuelles Fenster">
<linktarget COLOR="#375a84" DESTINATION="ID_1041890737" ENDARROW="Default" ENDINCLINATION="177;-181;" ID="Arrow_ID_373431525" SOURCE="ID_1089795419" STARTARROW="None" STARTINCLINATION="245;-68;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1485903652236" ID="ID_1692258488" MODIFIED="1485903657033" TEXT="WindowList">
<icon BUILTIN="idea"/>
</node>
@ -1848,18 +1845,17 @@
<node CREATED="1485904072812" ID="ID_829657223" MODIFIED="1485904083263" TEXT="property_is_active">
<icon BUILTIN="help"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1485917438428" HGAP="23" ID="ID_596101447" MODIFIED="1486768047985" TEXT="L&#xf6;sung ausarbeiten" VSHIFT="26">
<linktarget COLOR="#e22029" DESTINATION="ID_596101447" ENDARROW="Default" ENDINCLINATION="42;-201;" ID="Arrow_ID_45514601" SOURCE="ID_1209137422" STARTARROW="Default" STARTINCLINATION="8;84;"/>
<icon BUILTIN="flag-pink"/>
<node CREATED="1486767955575" ID="ID_217312514" MODIFIED="1486767963725" TEXT="InteractionDirector verwenden">
<icon BUILTIN="idea"/>
<node CREATED="1487039156100" ID="ID_1966427611" MODIFIED="1487039199394" TEXT="implementiert durch die WindowList">
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1487039170930" ID="ID_1408455006" MODIFIED="1487039195521" TEXT="Actions wei&#xdf;, da&#xdf; es dort implemieriert ist">
<icon BUILTIN="button_ok"/>
</node>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1485917582383" HGAP="163" ID="ID_394170572" MODIFIED="1486063798743" TEXT="TODO: Struktur" VSHIFT="-30">
<icon BUILTIN="pencil"/>
<node COLOR="#338800" CREATED="1485917582383" HGAP="163" ID="ID_394170572" MODIFIED="1487038954920" TEXT="Struktur" VSHIFT="-30">
<icon BUILTIN="button_ok"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1485917587927" ID="ID_891876702" MODIFIED="1485917622265" TEXT="wohin kommen jetzt die Funktionen, die gebunden werden">
<icon BUILTIN="help"/>
</node>
@ -1947,14 +1943,40 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1486067362505" HGAP="26" ID="ID_264522454" MODIFIED="1486067383244" TEXT="globaler Ui-Kontext (Verdrahtung)" VSHIFT="24">
<node CREATED="1487039062273" ID="ID_956599122" MODIFIED="1487039111466" TEXT="Zust&#xe4;ndigkeit">
<icon BUILTIN="yes"/>
<node CREATED="1487039071039" ID="ID_1884426258" MODIFIED="1487039079075" TEXT="Herstellen des Hauptmen&#xfc;s"/>
<node CREATED="1487039079759" ID="ID_471335369" MODIFIED="1487039083905" TEXT="Binden der Aktionen"/>
<node CREATED="1487039084285" ID="ID_555104373" MODIFIED="1487039096040" TEXT="Closure f&#xfc;r die Aktionen"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1487039098836" ID="ID_199078620" MODIFIED="1487039106012" TEXT="ggfs: Exceptions fangen">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1486767972445" ID="ID_1855585608" MODIFIED="1486767979672" TEXT="kann UiManager verwenden"/>
<node CREATED="1486767980548" ID="ID_921703593" MODIFIED="1486767985503" TEXT="kann InteractionDirector verwenden"/>
</node>
</node>
<node CREATED="1487039113306" ID="ID_1405514231" MODIFIED="1487039135190" TEXT="Einbindung">
<icon BUILTIN="button_ok"/>
<node CREATED="1487039118001" ID="ID_244074852" MODIFIED="1487039125444" TEXT="globaler Kontext"/>
<node CREATED="1487039125984" ID="ID_622974182" MODIFIED="1487039133027" TEXT="wei&#xdf;, welche Aktion wohin zu delegieren ist"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1485898796393" ID="ID_1217726538" MODIFIED="1485898814419" TEXT="#1069 how to refer to the current window">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1485555902731" ID="ID_55451880" MODIFIED="1485555951678" TEXT="#1070 how to bind session commands into UI actions">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1485549081728" ID="ID_1122969153" MODIFIED="1485549214471" TEXT="globale Aktionen">
<arrowlink COLOR="#824f68" DESTINATION="ID_826011549" ENDARROW="Default" ENDINCLINATION="-678;-1180;" ID="Arrow_ID_1373278707" STARTARROW="Default" STARTINCLINATION="670;252;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node CREATED="1485909456513" ID="ID_576215675" MODIFIED="1485909490512" TEXT="top-level-Verdrahtung">
<node CREATED="1485909560027" ID="ID_1949656657" MODIFIED="1487039010986" TEXT="baut den UI-Rahen auf"/>
<node CREATED="1485909491412" ID="ID_1205077540" MODIFIED="1487039041806" TEXT="macht die Applikation betriebsbereit">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1486942467620" HGAP="151" ID="ID_1761000392" MODIFIED="1486945029916" TEXT="Alternativen" VSHIFT="14">
<icon BUILTIN="help"/>
<node CREATED="1486942493208" ID="ID_805305597" MODIFIED="1487034053842" TEXT="alles via InteractionDirector">
<node CREATED="1486942493208" FOLDED="true" ID="ID_805305597" MODIFIED="1487038959265" TEXT="alles via InteractionDirector">
<icon BUILTIN="button_cancel"/>
<node CREATED="1486944032334" ID="ID_1959218653" MODIFIED="1486944046824" TEXT="er macht ohnehin fast alles">
<icon BUILTIN="smily_bad"/>
@ -1980,8 +2002,7 @@
das <i>verschiebt</i>&#160;das Problem nur
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node CREATED="1487034078974" ID="ID_796487731" MODIFIED="1487034094280" TEXT="verletzt das single responsibility pattern"/>
</node>
@ -2023,50 +2044,19 @@
</node>
</node>
</node>
<node CREATED="1486942533939" ID="ID_1309437882" MODIFIED="1486942567350" TEXT="einzelne Closures explizit">
<node CREATED="1486942533939" FOLDED="true" ID="ID_1309437882" MODIFIED="1487038961538" TEXT="einzelne Closures explizit">
<icon BUILTIN="button_cancel"/>
<node CREATED="1486942574333" ID="ID_189848820" MODIFIED="1486942580399" TEXT="das l&#xe4;uft auf ein Delegate hinaus"/>
<node CREATED="1486942583053" ID="ID_1367249768" MODIFIED="1486942592343" TEXT="...und das w&#xe4;re der InteractionDirector"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1486945035981" ID="ID_1398884933" MODIFIED="1486945137155" TEXT="entscheidende Frage...">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1486945046380" ID="ID_367702215" MODIFIED="1486945075196" TEXT="wie m&#xe4;chtig ist der InteractionDirector?">
<icon BUILTIN="help"/>
</node>
<node CREATED="1486945056714" ID="ID_1262672065" MODIFIED="1486945077375" TEXT="was ist die Kernaufgabe des InteractionDirectors?">
<icon BUILTIN="help"/>
</node>
<node CREATED="1486945084902" HGAP="26" ID="ID_406331121" MODIFIED="1486945097777" TEXT="daran entscheidet sich" VSHIFT="24">
<icon BUILTIN="idea"/>
<node CREATED="1486945099213" ID="ID_1118933657" MODIFIED="1486945109359" TEXT="ob alles an ihn delegiert wird"/>
<node CREATED="1486945110091" ID="ID_1820336322" MODIFIED="1486945124685" TEXT="oder ob es einen globalen Kontext gibt">
<node CREATED="1486945126721" ID="ID_804526091" MODIFIED="1487033614682" TEXT="und das k&#xf6;nnte dann der UiManager sein"/>
</node>
</node>
</node>
<node CREATED="1487034156380" ID="ID_1632778987" MODIFIED="1487034161495" TEXT="globaler Kontext">
<node CREATED="1487034156380" HGAP="27" ID="ID_1632778987" MODIFIED="1487038973690" TEXT="globaler Kontext" VSHIFT="30">
<icon BUILTIN="yes"/>
<node CREATED="1487034162275" ID="ID_28375182" MODIFIED="1487034171926" TEXT="wenige, eng zusammenarbeitende Objekte"/>
<node CREATED="1487034172393" ID="ID_1167812745" MODIFIED="1487034180237" TEXT="...von denen doch jedes seine Aufgabe hat"/>
<node CREATED="1487034180712" ID="ID_1371598611" MODIFIED="1487034193170" TEXT="und jedes genau wei&#xdf;, was die andern k&#xf6;nnen"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1485898796393" ID="ID_1217726538" MODIFIED="1485898814419" TEXT="#1069 how to refer to the current window">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1485555902731" ID="ID_55451880" MODIFIED="1485555951678" TEXT="#1070 how to bind session commands into UI actions">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1485549081728" ID="ID_1122969153" MODIFIED="1485549214471" TEXT="globale Aktionen">
<arrowlink COLOR="#824f68" DESTINATION="ID_826011549" ENDARROW="Default" ENDINCLINATION="-678;-1180;" ID="Arrow_ID_1373278707" STARTARROW="Default" STARTINCLINATION="670;252;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node CREATED="1485909456513" ID="ID_576215675" MODIFIED="1485909490512" TEXT="top-level-Verdrahtung">
<node CREATED="1485909491412" ID="ID_1205077540" MODIFIED="1485909496247" TEXT="h&#xe4;lt WindowList"/>
<node CREATED="1485909496860" ID="ID_1365340983" MODIFIED="1485909504422" TEXT="h&#xe4;lt Actions"/>
<node CREATED="1485909560027" ID="ID_1949656657" MODIFIED="1485909569270" TEXT="baut den UI-Rahen auf"/>
</node>
<node CREATED="1485454243767" ID="ID_3699127" MODIFIED="1485454247467" TEXT="konsistentes UI">
<node CREATED="1485454248335" ID="ID_623536019" MODIFIED="1485454252273" TEXT="globales Men&#xfc;"/>
<node CREATED="1485454259637" ID="ID_432211008" MODIFIED="1485454262840" TEXT="globale Toolbar"/>
@ -2095,7 +2085,7 @@
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1486768073223" HGAP="38" ID="ID_1457876217" MODIFIED="1486768136745" TEXT="konkret" VSHIFT="16">
<icon BUILTIN="flag-pink"/>
<node CREATED="1486768080502" ID="ID_1759740464" MODIFIED="1486768086425" TEXT="Binden f&#xfc;r globale Aktionen"/>
<node CREATED="1486768080502" ID="ID_1759740464" MODIFIED="1487039233982" TEXT="Binde-Kontext f&#xfc;r globale Aktionen"/>
<node CREATED="1486768086869" ID="ID_173538981" MODIFIED="1486768096616" TEXT="Idee/Konzept f&#xfc;r kontextabh&#xe4;ngige Aktionen"/>
</node>
</node>