diff --git a/src/lib/format-util.hpp b/src/lib/format-util.hpp index 4af0f391c..32bc9ab27 100644 --- a/src/lib/format-util.hpp +++ b/src/lib/format-util.hpp @@ -273,6 +273,9 @@ namespace util { _RangeIter(IT&& srcIter) : iter(std::forward(srcIter)) { } + _RangeIter(IT const& srcIter) + : iter(srcIter) + { } }; } @@ -298,7 +301,7 @@ namespace util { std::function toString = [] (Val const& val) { return str(val); }; - _RangeIter range(std::forward(coll)); + _RangeIter range(std::forward(coll)); auto strings = lib::transformIterator(range.iter, toString); if (!strings) return ""; diff --git a/tests/gui/abstract-tangible-test.cpp b/tests/gui/abstract-tangible-test.cpp index 6c1cdad1f..3e90f084e 100644 --- a/tests/gui/abstract-tangible-test.cpp +++ b/tests/gui/abstract-tangible-test.cpp @@ -57,7 +57,7 @@ //#include -//#include +#include //#include //#include @@ -67,8 +67,8 @@ using lib::idi::EntryID; //using boost::lexical_cast; //using util::contains; //using std::string; -//using std::cout; -//using std::endl; +using std::cout; +using std::endl; @@ -156,12 +156,12 @@ namespace test { CHECK (!mock.isTouched()); CHECK (!mock.isExpanded()); - mock.markMsg("dolorem ipsum quia dolor sit amet consectetur adipisci velit."); - CHECK (mock.verifyNote("Msg")); - CHECK (mock.verifyCall("noteMsg")); - CHECK (mock.verifyCall("noteMsg").arg("lorem ipsum")); - CHECK (mock.verifyCall("noteMsg").argMatch("dolor.+dolor\\s+")); - CHECK (mock.verifyMatch("Rec\\(note.+kind = Msg.+msg = dolorem ipsum")); + mock.markMsg("qui dolorem ipsum quia dolor sit amet consectetur adipisci velit."); + CHECK (mock.verifyMark("Message", "dolor")); + CHECK (mock.verifyCall("doMsg")); + CHECK (mock.verifyCall("doMsg").arg("lorem ipsum")); + CHECK (mock.verifyCall("doMsg").argMatch("dolor.+dolor\\s+")); + CHECK (mock.verifyMatch("Rec\\(mark.+ID = Message.+\\{.+lorem ipsum")); EventLog log = mock.getLog(); log.verify("ctor") @@ -179,6 +179,9 @@ namespace test { bar.joinLog(mock); foo.joinLog(mock); + cout << "____Event-Log________________\n" + << util::join(mock.getLog(), "\n") + << "\n───╼━━━━━━━━━╾────────────────"< #include @@ -66,7 +69,11 @@ namespace test{ // using util::isnil; // using lib::idi::EntryID; // using lib::diff::Record; + using lib::Symbol; using std::string; + using std::cout; + using std::cerr; + using std::endl; /** @@ -108,7 +115,7 @@ namespace test{ log_.call(this->identify(), "expand", yes); virgin_ = false; expanded_ = yes; - log_.event(expanded_? "expanded" : "collapsed"); + log_.event (expanded_? "expanded" : "collapsed"); return true; } @@ -127,25 +134,33 @@ namespace test{ virtual void doMsg (string text) override { - UNIMPLEMENTED ("mock doMsg"); + log_.call (this->identify(), "doMsg", text); + cout << this->identify() << " <-- Message(\""<identify(), "doErr", text); + cerr << this->identify() << " <-- Error(\""<identify(), "doFlash"); + cout << this->identify() << " <-- Flash!" <identify(), "doMark"); + cout << this->identify() << " <-- state-mark = "<< string(mark) < -
+
While our UI widgets are implemented the standard way as proposed by [[GTKmm|http://www.gtkmm.org/en/documentation.html]], some key elements -- which are especially relevant for the anatomy and mechanics of the interface at a whole -- are made to conform to a common interface and behaviour protocol. {{red{WIP 11/15 work out gradually what this protocol is all about}}}. #975
 As a starting point, we know
 * there is a backbone structure known as the UI-Bus
@@ -8417,12 +8417,14 @@ These manipulations in itself do not constitute an action. But there typically i
 
 A special case of state marking is the presentation of transient feedback. Such feedback is pushed from "somewhere" towards given elements, which react through an implementation dependent visual state change (flushing, colour change, marker icon). If such state marking is to be persistent, the interface element has in turn to send a specific state mark. An example would be a permanent error flag with a explanatory text showed in mouse over. Which in turn means there can also be sweeping state reset messages, which are to be broadcasted: A general "reset", an indication to collapse everything, or to clear pending error flags.
 
-And finally, there are the //essential updates// -- any changes in the model //for real.// These are sent as notifications just to some top level element, expecting this element to request a diff and to recursively mutate contents into shape.
+And finally, there are the //essential updates// -- any changes in the model //for real.//
+These are sent as notifications just to some top level element, expecting this element to request a diff and to mutate contents into shape recursively.
 
 
 !Interactions
-;new
-:connect to an existing term, supply the {{{EntryID}}} of the new element
+;lifecycle
+:connect to an existing term, supply the {{{EntryID}}} of the new element.
+:automatically detach at end of life.
 ;act
 :send a GenNode representing the action
 ;note
@@ -8431,8 +8433,8 @@ And finally, there are the //essential updates// -- any changes in the model //f
 :receive a GenNode representing the //feedback// or replayed //state mark//
 ;signals
 :the individual element exposes some generic signal slots
-:* slotExpand prompts the element to transition into expanded / unfolded state. If this state is sticky, the element should answer with a ''mark''
-:* slotReveal prompts the element to bring the indicated child into sight
+:* slotExpand prompts the element to transition into expanded / unfolded state. If this state is to be sticky, the element answers with a ''state mark''
+:* slotReveal prompts the element to bring the indicated child into sight. Typically, this request will "bubble up" recursively.
 :these slots are defined to be {{{sigc::trackable}}} for automated disconnection (&rarr; see [[#940|http://issues.lumiera.org/ticket/940#comment:3]] for an explanation)
 ;diff
 :ask to retrieve a diff, which
@@ -8448,7 +8450,7 @@ While the above definitions might seem more or less obvious and reasonable, ther
 &rarr; [[Command handling (Proc-Layer)|CommandHandling]]
 
 !!!actual implementation of command invocation
-The {{{InvocationTrail}}} of an command is actually just a tag object, wrapping the command definition ID. In a first step, when the arguments can be closed, a {{{Record}}} with suitable bindings is created and wrapped into a {{{GenNode}}} corresponding to the command. This compound is sent over the UI-Bus, marking the command ready for execution. From this point on, just the {{{InvocationTrail}}} is passed to enable the trigger sites. When it is triggered, just a "bang!" message with the command ID is sent over the bus. An command instance can be re-used, as long as it is structurally the same as before, and as log as there is no possible collision with a similar, but differently parametrised instantiation process.
+A command's {{{InvocationTrail}}} is in fact just some tag object, wrapping the command definition ID. In a first step, when the command's arguments can be //closed,// a {{{Record}}} with suitable argument bindings is created and wrapped into a {{{GenNode}}} corresponding to the command. We should note that these bindings typically also entail to specify the //subject of the command.// This binding compound is sent over the UI-Bus, marking the command ready for execution. From this point on, just the {{{InvocationTrail}}} is passed to enable the trigger sites. When it is actually triggered, a simple "bang!" message with the command ID is sent over the bus. A given command instance may be re-used, as long as it is structurally the same as before, and as log as there is no possible collision with a similar, but differently parametrised instantiation process.
 
diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index 9df85fc81..482a54d7d 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -185,6 +185,23 @@ + + + + + + + + + +

+ ...wird sinnvoll im Rahmen von InteractionControl +

+ + +
+ +
@@ -204,7 +221,7 @@ - + @@ -215,7 +232,8 @@

- + +
@@ -404,8 +422,8 @@
- - + +