UiElement: decide upon the design variant to use for expand() / reveal() (#1162)
This commit is contained in:
parent
1f98895a89
commit
551920e952
4 changed files with 348 additions and 46 deletions
|
|
@ -1,5 +1,6 @@
|
|||
Coding Policies within UI-Layer
|
||||
===============================
|
||||
:Toc:
|
||||
|
||||
NOTE: for the time being, this is a loose collection of
|
||||
Conventions and Policies deemed adequate for work
|
||||
|
|
@ -40,6 +41,40 @@ should prefer using `lib::Depend<ServiceInterface>`, and install the correspondi
|
|||
via `lib::DependInject<ServiceInterface>::ServiceInstance<ServiceImpl>`.
|
||||
|
||||
|
||||
Behaviour patterns
|
||||
------------------
|
||||
|
||||
Parent Containers
|
||||
~~~~~~~~~~~~~~~~~
|
||||
A _Parent Container_ is an object managing a collection of children, with respect to
|
||||
the structure of _tangible UI elements._ Irrespective if this container is also a
|
||||
`Gtk::Container` widget, or ``just'' a controller. The key point to turn something
|
||||
into a _Parent Container_ is the fact that this entity creates the children
|
||||
in response to a (population) diff message.
|
||||
|
||||
.Responsibilities
|
||||
- a _Parent Container_ has to wire each child properly, so to enable the adequate
|
||||
use of the UI element protocol. This includes
|
||||
|
||||
** to ensure the child is attached to the UI-Bus (usually enforced by ctor call)
|
||||
** to install a suitable `Expander` functor if the child supports expand/collapse
|
||||
** to install a suitable `Revealer` when it is relevant for the child to be brought
|
||||
into sight in response to some message (e.g. to indicate error state).
|
||||
|
||||
- whenever a child is detached from the container, you need to _ensure it is destroyed_
|
||||
right away, before there is any chance of processing some other UI event.footnote:[
|
||||
Invoking the destructor triggers a lot of magic here, especially it causes the child
|
||||
to be properly detached from signals. We want to ensure this happens as soon as the
|
||||
child is taken out of service. Do not use an ``can collect garbage later'' approach.]
|
||||
|
||||
Error handling
|
||||
~~~~~~~~~~~~~~
|
||||
Be aware that GTK is written in C. And while GTKmm has some safeguards in place,
|
||||
better be sure no exception can emanate from event handling code.
|
||||
|
||||
WARNING: [red]#TODO#: probably we'll need a common wrapper to do so...
|
||||
|
||||
|
||||
Code organisation
|
||||
-----------------
|
||||
GTK is massive and compilation times tend to be problematic in the UI-Layer.
|
||||
|
|
|
|||
93
src/gui/model/expander-revealer.hpp
Normal file
93
src/gui/model/expander-revealer.hpp
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
EXPANDER-REVEALER.hpp - functor components for standard UI element actions
|
||||
|
||||
Copyright (C) Lumiera.org
|
||||
2018, Hermann Vosseler <Ichthyostega@web.de>
|
||||
|
||||
This program 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.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
/** @file expander-revealer.hpp
|
||||
** Helper components to implement some standard UI-element actions by installing a functor.
|
||||
**
|
||||
** ## Interactions
|
||||
**
|
||||
** @see [UI-Element protocol](\ref tangible.hpp)
|
||||
** @see \ref BusTerm_test
|
||||
**
|
||||
*/
|
||||
|
||||
|
||||
#ifndef GUI_MODEL_EXPANDER_REVEALER_H
|
||||
#define GUI_MODEL_EXPANDER_REVEALER_H
|
||||
|
||||
|
||||
#include "lib/error.hpp"
|
||||
//#include "lib/idi/entry-id.hpp"
|
||||
//#include "lib/symbol.hpp"
|
||||
|
||||
#include <functional>
|
||||
//#include <utility>
|
||||
//#include <string>
|
||||
|
||||
|
||||
namespace gui {
|
||||
namespace model {
|
||||
|
||||
// using std::string;
|
||||
// using lib::Symbol;
|
||||
|
||||
|
||||
/**
|
||||
* Functor component to support the default implementation of expanding/collapsing.
|
||||
*/
|
||||
class Expander
|
||||
{
|
||||
public:
|
||||
protected:
|
||||
|
||||
|
||||
Expander()
|
||||
{ }
|
||||
|
||||
public:
|
||||
|
||||
protected:
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Functor component to support the default implementation of revealing an UI-Element.
|
||||
*/
|
||||
class Revealer
|
||||
{
|
||||
public:
|
||||
protected:
|
||||
|
||||
|
||||
Revealer()
|
||||
{ }
|
||||
|
||||
public:
|
||||
|
||||
protected:
|
||||
};
|
||||
|
||||
|
||||
|
||||
}} // namespace gui::model
|
||||
#endif /*GUI_MODEL_EXPANDER_REVEALER_H*/
|
||||
|
|
@ -105,7 +105,7 @@
|
|||
** - **act**: send a \ref GenNode representing the action
|
||||
** - **note**: _send_ a GenNode representing the _state mark_
|
||||
** - **mark**: _receive_ a GenNode representing the _feedback,_ a replayed _state mark_ or _generic message._
|
||||
** - **diff**: ask to retrieve a diff, which
|
||||
** - **diff**: prompt the element to retrieve a diff, which
|
||||
** - either is an incremental status update
|
||||
** - or is a from-scratch reconfiguration
|
||||
**
|
||||
|
|
@ -133,6 +133,7 @@
|
|||
#include "lib/error.hpp"
|
||||
#include "lib/nocopy.hpp"
|
||||
#include "gui/ctrl/bus-term.hpp"
|
||||
#include "gui/model/expander-revealer.hpp"
|
||||
#include "lib/diff/diff-mutable.hpp"
|
||||
#include "lib/idi/entry-id.hpp"
|
||||
#include "lib/symbol.hpp"
|
||||
|
|
|
|||
|
|
@ -1789,15 +1789,15 @@
|
|||
<p>der Parent-Container ist für das expand/collapse zuständig</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535634032601" ID="ID_964641889" MODIFIED="1535646954908" TEXT="Design-Problem: sich expandieren">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1535634032601" ID="ID_964641889" MODIFIED="1535731317069" TEXT="Design-Problem: sich expandieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1535634116925" ID="ID_1129948550" MODIFIED="1535634126600" TEXT="Voraussetzung: unser Widget-Protokoll">
|
||||
<node CREATED="1535634127852" ID="ID_317106359" MODIFIED="1535634136126" TEXT="enthält eine expand()-Methode"/>
|
||||
<node CREATED="1535636097808" ID="ID_1540209936" MODIFIED="1535636109795" TEXT="Unterschied Widget / Controller ?">
|
||||
<icon BUILTIN="help"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1535636169439" FOLDED="true" ID="ID_631287309" MODIFIED="1535646972760" TEXT="zwei Modelle denkbar">
|
||||
<node CREATED="1535636169439" FOLDED="true" ID="ID_631287309" MODIFIED="1535731360335" TEXT="zwei Modelle denkbar">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1535636219312" ID="ID_1940674226" MODIFIED="1535636242077" TEXT="Widget ist Expander">
|
||||
<icon BUILTIN="full-1"/>
|
||||
|
|
@ -1908,10 +1908,38 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1535731363267" ID="ID_603236457" MODIFIED="1535731485315" TEXT="Lösung">
|
||||
<arrowlink COLOR="#5f8cc1" DESTINATION="ID_447101734" ENDARROW="Default" ENDINCLINATION="22;-23;" ID="Arrow_ID_272345450" STARTARROW="None" STARTINCLINATION="-97;-5;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1535731373978" ID="ID_182280315" MODIFIED="1535731492690" TEXT="Widget hält einen Expander-Funktor"/>
|
||||
<node CREATED="1535731402126" ID="ID_1177558244" MODIFIED="1535731498221" TEXT="damit ist eine Standard-Impl von Tangible::doExpand() möglich">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535638412517" ID="ID_447101734" MODIFIED="1535646941006" TEXT="Adapter-Interfaces entwerfen">
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535638412517" ID="ID_447101734" MODIFIED="1535731461556" TEXT="Adapter-Interfaces entwerfen">
|
||||
<arrowlink COLOR="#709eaf" DESTINATION="ID_316446199" ENDARROW="Default" ENDINCLINATION="-354;-490;" ID="Arrow_ID_1105268233" STARTARROW="None" STARTINCLINATION="-3385;0;"/>
|
||||
<linktarget COLOR="#5f8cc1" DESTINATION="ID_447101734" ENDARROW="Default" ENDINCLINATION="22;-23;" ID="Arrow_ID_272345450" SOURCE="ID_603236457" STARTARROW="None" STARTINCLINATION="-97;-5;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535725900392" ID="ID_489679545" MODIFIED="1535725913903" TEXT="Expander">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535725906647" ID="ID_1380126396" MODIFIED="1535725914798" TEXT="Revealer">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535726065753" ID="ID_578786610" MODIFIED="1535726072346" TEXT="default-Impl doExpand()">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535726077504" ID="ID_1806068721" MODIFIED="1535726084288" TEXT="prüfen: canExpand">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535726086631" ID="ID_1753268128" MODIFIED="1535726090655" TEXT="Expander aufrufen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535725923421" ID="ID_298871659" MODIFIED="1535725936028" TEXT="Expander geeignet verdrahten">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1535725940226" ID="ID_162482468" MODIFIED="1535725949205" TEXT="validiert das Design"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -1966,13 +1994,25 @@
|
|||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1534722011622" ID="ID_232472679" MODIFIED="1534722142986" TEXT="revealYourself">
|
||||
<linktarget COLOR="#af6a8f" DESTINATION="ID_232472679" ENDARROW="Default" ENDINCLINATION="94;307;" ID="Arrow_ID_634173548" SOURCE="ID_898428560" STARTARROW="None" STARTINCLINATION="859;27;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535726017256" ID="ID_899234988" MODIFIED="1535726030336" TEXT="default-Impl doReveal()">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535726035309" ID="ID_1034773573" MODIFIED="1535726044126" TEXT="prüfen canReveal">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1534722040354" ID="ID_633013" MODIFIED="1534722061920" TEXT="eigennen show/hide-Status erkennen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1534722062911" ID="ID_1134044414" MODIFIED="1534722072607" TEXT="braucht Parent-Link">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535726053483" ID="ID_628118697" MODIFIED="1535726058196" TEXT="Revealer aufrufen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1534722073526" ID="ID_1428186731" MODIFIED="1534722090132" TEXT="parent.reveal(this)">
|
||||
</node>
|
||||
<node CREATED="1534722062911" ID="ID_1134044414" MODIFIED="1535725975155" TEXT="braucht Parent-Link">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
</node>
|
||||
<node CREATED="1534722073526" ID="ID_1428186731" MODIFIED="1535725979353" TEXT="parent.reveal(this)">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1535725982021" ID="ID_858097581" MODIFIED="1535725997876" TEXT="Revealer geeignet verdrahten">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -18544,17 +18584,97 @@
|
|||
</node>
|
||||
<node CREATED="1535639052671" ID="ID_1134562624" MODIFIED="1535639073976" TEXT="Expander">
|
||||
<node CREATED="1535639110104" ID="ID_712715565" MODIFIED="1535639113355" TEXT="bool-Testbar"/>
|
||||
<node CREATED="1535639114727" ID="ID_1791716176" MODIFIED="1535639125769" TEXT="expand(yes)"/>
|
||||
<node CREATED="1535639129085" ID="ID_723131136" MODIFIED="1535639132713" TEXT="collapse()"/>
|
||||
<node CREATED="1535725570140" ID="ID_39824556" MODIFIED="1535725586590" TEXT="canExpand()"/>
|
||||
<node CREATED="1535639114727" ID="ID_1791716176" MODIFIED="1535725472597" TEXT="Funktions-Operator(bool expand)"/>
|
||||
</node>
|
||||
<node CREATED="1535639174623" ID="ID_1755607605" MODIFIED="1535639177466" TEXT="Revealer">
|
||||
<node CREATED="1535639337897" ID="ID_1186867690" MODIFIED="1535639379927" TEXT="defineRevealable(ID)"/>
|
||||
<node CREATED="1535639368981" ID="ID_220149026" MODIFIED="1535639375736" TEXT="isRevealable(ID)"/>
|
||||
<node CREATED="1535639517897" ID="ID_1175119585" MODIFIED="1535639523892" TEXT="reveal(ID)"/>
|
||||
<node CREATED="1535640911061" ID="ID_777387548" MODIFIED="1535640922887" TEXT="reveal(canvasX,canvasY)"/>
|
||||
<node CREATED="1535639368981" ID="ID_220149026" MODIFIED="1535725407546">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
<i>nicht</i> bool-Testbar
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
ganz bewußt verzichten wir darauf,
|
||||
</p>
|
||||
<p>
|
||||
festzustellen, ob ein Kind gegenwärtig zugänglich (revealed) ist.
|
||||
</p>
|
||||
<p>
|
||||
Denn dies auf dem API zu exponieren bringt keinen Mehrwehrt.
|
||||
</p>
|
||||
<p>
|
||||
Letztlich ist das ein lokales Detail des Layout-Managers.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
Es ist nicht Sache des client-Codes, auf einem Widget ein anderes Verhalten auszulösen,
|
||||
</p>
|
||||
<p>
|
||||
wenn es nicht sichtbar ist. Denn Sichtbarkeit gehört zur UI-Mechanik und geht den Client nix an
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1535655039395" ID="ID_1646511082" MODIFIED="1535655045412" TEXT="Diskussion">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1535725591561" ID="ID_1362809449" MODIFIED="1535725594837" TEXT="canReveal()"/>
|
||||
<node CREATED="1535639517897" ID="ID_1175119585" MODIFIED="1535725607419" TEXT="Funktions-Operator(void) == reveal"/>
|
||||
<node CREATED="1535640911061" ID="ID_777387548" MODIFIED="1535725678665" TEXT="reveal(canvasX,canvasY) auf dem Layout-Manager"/>
|
||||
</node>
|
||||
<node CREATED="1535640932722" FOLDED="true" ID="ID_1411372901" MODIFIED="1535723883504" TEXT="NavScope">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<icon BUILTIN="hourglass"/>
|
||||
<node CREATED="1535654864507" ID="ID_976171939" MODIFIED="1535654872624" TEXT="erst mal nur so eine Idee....">
|
||||
<icon BUILTIN="hourglass"/>
|
||||
</node>
|
||||
<node CREATED="1535654895926" ID="ID_518978388" MODIFIED="1535655662803" TEXT="zwei Fliegen mit einer Klappe">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
<node CREATED="1535654884104" ID="ID_1335278492" MODIFIED="1535654995472" TEXT="könnte für den ViewLocator nützlich sein">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...denn dort fehlt noch die konkrete Implementierung,
|
||||
</p>
|
||||
<p>
|
||||
welche die Monaden-Baum-Repräsentation schließlich
|
||||
</p>
|
||||
<p>
|
||||
auf konkrete Widgets abbildet. Das ist viel Arbeit, und es ließe sich vereinfachen,
|
||||
</p>
|
||||
<p>
|
||||
wenn für gewisse Knoten erkannt werden kann, daß sie einen NavScope darstellen;
|
||||
</p>
|
||||
<p>
|
||||
denn dann gäbe es eine Implementierung "von der Stange"
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1535723854290" ID="ID_333598922" MODIFIED="1535723874600" TEXT="fällt aus diesem Thema heraus">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1535655039395" FOLDED="true" ID="ID_1646511082" MODIFIED="1535725225038" TEXT="Diskussion">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1535655065175" ID="ID_702941818" MODIFIED="1535655069235" TEXT="Symmetrie?">
|
||||
<node CREATED="1535655118800" ID="ID_1058761508" MODIFIED="1535655127308" TEXT="Expander ist nur pro Komponente">
|
||||
<icon BUILTIN="smily_bad"/>
|
||||
|
|
@ -18562,8 +18682,26 @@
|
|||
<node CREATED="1535655136902" ID="ID_126171743" MODIFIED="1535655170274" TEXT="Wunsch: Mix-ins in NavScope-Interface kombinieren">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node CREATED="1535723351533" ID="ID_909635517" MODIFIED="1535723375219">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
aber die Operationen sind <i>der Sache nach</i> nicht symmetrisch
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1535655069967" ID="ID_340217269" MODIFIED="1535655076674" TEXT="Expander und Revealer als Proxy?">
|
||||
<node CREATED="1535725181176" ID="ID_1947404851" MODIFIED="1535725210681" TEXT="ins Kind verlagert lassen sie sich jedoch symmetrisieren">
|
||||
<icon BUILTIN="forward"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1535655069967" FOLDED="true" ID="ID_340217269" MODIFIED="1535725176627" TEXT="Expander und Revealer als Proxy?">
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
<node CREATED="1535655293760" ID="ID_1318206385" MODIFIED="1535655302082" TEXT="Syntax?">
|
||||
<node CREATED="1535655199741" ID="ID_942388081" MODIFIED="1535655235119" TEXT="scope.getExpander(ID).expand(false)">
|
||||
<icon BUILTIN="help"/>
|
||||
|
|
@ -18602,40 +18740,75 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1535724509562" ID="ID_833385943" MODIFIED="1535724515909" TEXT="Implementierungs-Modell">
|
||||
<node CREATED="1535724523160" FOLDED="true" ID="ID_1440345421" MODIFIED="1535725153382" TEXT="Parent-Container führt Index">
|
||||
<icon BUILTIN="full-1"/>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1535724838670" ID="ID_1787800884" MODIFIED="1535724867702" TEXT="das Kind wird dort per ID registriert"/>
|
||||
<node CREATED="1535724882528" ID="ID_1169954047" MODIFIED="1535724888883" TEXT="per ID bekommt man einen...">
|
||||
<node CREATED="1535724890399" ID="ID_1544051424" MODIFIED="1535724893410" TEXT="Expander-Proxy"/>
|
||||
<node CREATED="1535724894022" ID="ID_91331753" MODIFIED="1535724897842" TEXT="Revealer-Proxy"/>
|
||||
</node>
|
||||
<node CREATED="1535722960729" ID="ID_303674498" MODIFIED="1535722964125" TEXT="Abwägung"/>
|
||||
<node CREATED="1535640932722" ID="ID_1411372901" MODIFIED="1535655004304" TEXT="NavScope">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1535654864507" ID="ID_976171939" MODIFIED="1535654872624" TEXT="erst mal nur so eine Idee....">
|
||||
<node CREATED="1535724910940" ID="ID_1389683609" MODIFIED="1535724922199" TEXT="das Kind hält eine Referenz auf seinen Parent"/>
|
||||
</node>
|
||||
<node CREATED="1535724555244" ID="ID_336857888" MODIFIED="1535724635442" TEXT="Parent-Container konfiguriert Funktor in das Kind">
|
||||
<icon BUILTIN="full-2"/>
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1535724936297" ID="ID_947922423" MODIFIED="1535724966529" TEXT="die default-Impl des Kindes enthält Storage für diese Funktoren"/>
|
||||
<node CREATED="1535724976291" ID="ID_1742203413" MODIFIED="1535724996837" TEXT="beim Einbinden in einen Container verdrahtet dieser die Funktoren"/>
|
||||
<node CREATED="1535724997873" ID="ID_493457848" MODIFIED="1535725010507" TEXT="und aktiviert damit ggfs die Fähigkeit Expand/Reveal"/>
|
||||
<node CREATED="1535725011710" ID="ID_206250793" MODIFIED="1535725020409" TEXT="das Kind kennt seinen Parent nicht"/>
|
||||
</node>
|
||||
<node CREATED="1535724570738" FOLDED="true" ID="ID_1785171345" MODIFIED="1535725155045" TEXT="Funktor ist in Mix-in im Kind gespeichert">
|
||||
<icon BUILTIN="full-3"/>
|
||||
<icon BUILTIN="hourglass"/>
|
||||
<node CREATED="1535725026621" ID="ID_1063803104" MODIFIED="1535725041437" TEXT="Erweiterung zur Lösung">
|
||||
<icon BUILTIN="full-2"/>
|
||||
</node>
|
||||
<node CREATED="1535654895926" ID="ID_518978388" MODIFIED="1535655662803" TEXT="zwei Fliegen mit einer Klappe">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
<node CREATED="1535725048130" ID="ID_1987768737" MODIFIED="1535725075314" TEXT="die Funktor-Storage wird in das Kind als Mix-in eingebaut"/>
|
||||
<node CREATED="1535725076142" ID="ID_904760905" MODIFIED="1535725093936" TEXT="dieser Mix-In überschreibt auch die default-NOP-Implementierung"/>
|
||||
<node CREATED="1535725100803" ID="ID_1869635653" MODIFIED="1535725113085" TEXT="man könnte auf Typ-Ebene Capabilities prüfen"/>
|
||||
<node CREATED="1535725117080" ID="ID_417282292" MODIFIED="1535725140662" TEXT="diese Lösung erscheit cool, aber im Moment übertrieben">
|
||||
<icon BUILTIN="smiley-oh"/>
|
||||
</node>
|
||||
<node CREATED="1535654884104" ID="ID_1335278492" MODIFIED="1535654995472" TEXT="könnte für den ViewLocator nützlich sein">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...denn dort fehlt noch die konkrete Implementierung,
|
||||
</p>
|
||||
<p>
|
||||
welche die Monaden-Baum-Repräsentation schließlich
|
||||
</p>
|
||||
<p>
|
||||
auf konkrete Widgets abbildet. Das ist viel Arbeit, und es ließe sich vereinfachen,
|
||||
</p>
|
||||
<p>
|
||||
wenn für gewisse Knoten erkannt werden kann, daß sie einen NavScope darstellen;
|
||||
</p>
|
||||
<p>
|
||||
denn dann gäbe es eine Implementierung "von der Stange"
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1535722960729" FOLDED="true" ID="ID_303674498" MODIFIED="1535725812302" TEXT="Abwägung">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1535723619257" ID="ID_1146060205" MODIFIED="1535723638348" TEXT="Ich folge dem appeal der Funktor-Lösung">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1535723641150" ID="ID_945428972" MODIFIED="1535723664351" TEXT="die beiden Fälle werden symmetrisch gemacht..."/>
|
||||
<node CREATED="1535723665347" ID="ID_243620982" MODIFIED="1535723693571" TEXT="...indem sie als Funktor direkt in das Widget verlagert sind"/>
|
||||
<node CREATED="1535723705158" ID="ID_1284580377" MODIFIED="1535723721479" TEXT="das API reveal(ID) auf dem Parent entfällt ersatzlos"/>
|
||||
<node CREATED="1535723722763" ID="ID_751870134" MODIFIED="1535723735461" TEXT="das Herstellen der Funktoren wird ein Implementierungs-Detail"/>
|
||||
<node CREATED="1535725684749" ID="ID_711293491" MODIFIED="1535725797751" TEXT="bubble-Up pasiert somit nur noch implizit">
|
||||
<node CREATED="1535725711241" ID="ID_1059426307" MODIFIED="1535725743161" TEXT="sofern der Parent-Container seinen eigenen Revealer aufrufen kann"/>
|
||||
<node CREATED="1535725744085" ID="ID_1761380382" MODIFIED="1535725770365" TEXT="dagegen das reveal(canvasX,canvasY) wird explizit auf den Layout-Manager verschoben"/>
|
||||
<node CREATED="1535725771305" ID="ID_988494427" MODIFIED="1535725789821" TEXT="...welcher somit explizit an geeigneter Stelle verdrahtet sein muß">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1535723783155" ID="ID_1961294443" MODIFIED="1535725808284" TEXT="Konsequenz: die Idee mit den Mix-ins gebe ich auf">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1535723904043" HGAP="12" ID="ID_878787948" MODIFIED="1535725871700" TEXT="Struktur">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1535723916153" ID="ID_91381589" MODIFIED="1535723927220" TEXT="Tangible bekommt einen Expander und einen Revealer"/>
|
||||
<node CREATED="1535723930631" ID="ID_1166620864" MODIFIED="1535723955464" TEXT="default-konstruiert sind diese Funktionen deaktiviert"/>
|
||||
<node CREATED="1535723958404" ID="ID_1293339775" MODIFIED="1535723973358" TEXT="es gibt hierfür ein Konfigurations-API">
|
||||
<node CREATED="1535723978137" ID="ID_1758020852" MODIFIED="1535724000466" TEXT="installExpander(lambda, lambda)"/>
|
||||
<node CREATED="1535723987360" ID="ID_1134664898" MODIFIED="1535723995651" TEXT="installRevealer(lambda)"/>
|
||||
</node>
|
||||
<node CREATED="1535724283280" ID="ID_316168549" MODIFIED="1535724371580" TEXT="ein Container-Parent hat die Pflicht, diese Funktoren ggfs zu installieren">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1535724349855" ID="ID_782260645" MODIFIED="1535724369173" TEXT="aus einer Hierarchie herausgenommene Widgets sind unverzüglich zu zerstören">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue