ViewSpec: reconsider how to build and structure the DSL (#1126)

...in the light of all the foundation components and frameworks created meanwhile
This commit is contained in:
Fischlurch 2018-02-23 05:07:39 +01:00
parent b6360b2e9c
commit 41b8d12b66
4 changed files with 211 additions and 15 deletions

View file

@ -44,9 +44,7 @@
** a topological tree structure of relevant entities (windows, panels, views,...) -- which is basically the
** service provided by the Navigator; yet this Navigator service can be abstracted into the gui::interact::LocationQuery
** API, and this abstraction allows to keep all the intricacies of navigating concrete UI widgets confined within the
** implementation of the Navigator service. To enable this usage pattern, there is an access functor, to be found at
** gui::interact::locationQuery, which will be installed when the UI starts and disabled on shutdown. This functor
** can be exchanged for the purpose of unit testing.
** implementation of the Navigator service.
**
** @todo WIP 9/2017 early draft ////////////////////////////////////////////////////////////TICKET #1104
**

View file

@ -116,6 +116,16 @@ namespace interact {
/**
* Locator is a functor to resolve to a topological location in the UI-tree.
* It takes a _viewID_ as argument, which actually is more of a typeID to designate
* the kind of view or UI widget, which shall be attached at or retrieved from the
* location resolved through the LocationRule. The latter is essentially what is
* embedded within the Locator functor
*/
using Locator = std::function<UICoord(Literal)>;
/**
* A specification to describe the desired location of a component view within the Lumiera UI.
* ViewSpec is basically a set of [UI coordinates](\ref UICoord), with the additional possibility
@ -137,7 +147,8 @@ namespace interact {
: ViewSpec{UICoord(std::move (coordinates))}
{ }
operator UICoord()
UICoord
operator() (Literal componentID)
{
UNIMPLEMENTED ("resolve a view spec to yield explicit UI coordinates");
}

View file

@ -100,23 +100,23 @@ namespace test {
cout << showSizeof(limitAllocation) <<endl;
// the actual View Specification would then be written as...
ViewSpec locate = UICoord::currentWindow().view("viewID");
ViewSpec locate = UICoord::currentWindow().panel("parentLocation");
Allocator alloc = limitAllocation(3);
// ...and it would be evaluated as follows
UICoord targetLocation = locate;
UICoord targetLocation = locate("viewID");
UICoord realView1 = alloc(targetLocation);
CHECK (1 == allocCounter);
CHECK (realView1 == UICoord::currentWindow().view("viewID").tab(1));
CHECK (string{realView1} == "UI:win-1[perspective]-parentLocation.viewID.#1");
UICoord realView2 = alloc(targetLocation);
CHECK (2 == allocCounter);
CHECK (realView2 == UICoord::currentWindow().view("viewID").tab(2));
CHECK (string{realView2} == "UI:win-1[perspective]-parentLocation.viewID.#2");
CHECK (realView2 != realView1);
UICoord realView3 = alloc(targetLocation);
CHECK (3 == allocCounter);
CHECK (realView3 == UICoord::currentWindow().view("viewID").tab(3));
CHECK (string{realView3} == "UI:win-1[perspective]-parentLocation.viewID.#3");
UICoord realView3b = alloc(targetLocation);
CHECK (3 == allocCounter);

View file

@ -2436,7 +2436,7 @@
<node CREATED="1483921070115" ID="ID_398046799" MODIFIED="1518487921058" TEXT="Prototyp-Service"/>
<node CREATED="1483921132114" ID="ID_1652398711" MODIFIED="1518487921058" TEXT="liefert dekorierte Command-ID"/>
<node CREATED="1483921149368" ID="ID_1028150245" MODIFIED="1518487921058" TEXT="im GUI nur noch Command-IDs"/>
<node CREATED="1483924872930" ID="ID_242219866" MODIFIED="1518840407152">
<node CREATED="1483924872930" ID="ID_242219866" MODIFIED="1519355250156">
<richcontent TYPE="NODE"><html>
<head>
@ -3539,10 +3539,31 @@
<node CREATED="1504833695107" ID="ID_1686159038" MODIFIED="1518487921063" TEXT="in einem Panel zu finden"/>
</node>
</node>
<node CREATED="1519356802243" HGAP="39" ID="ID_1415516084" MODIFIED="1519356884205" TEXT="Komponenten-Zugriff" VSHIFT="16">
<node CREATED="1504393221051" ID="ID_938886823" MODIFIED="1518487921063" TEXT="wie bekommt man eine Objekt-ID?">
<linktarget COLOR="#8e2a4d" DESTINATION="ID_938886823" ENDARROW="Default" ENDINCLINATION="-367;31;" ID="Arrow_ID_265571961" SOURCE="ID_1909730752" STARTARROW="None" STARTINCLINATION="-367;31;"/>
</node>
<node CREATED="1506175115772" FOLDED="true" HGAP="318" ID="ID_1448696607" MODIFIED="1518840357589" VSHIFT="64">
<node CREATED="1519356887367" ID="ID_1139603062" MODIFIED="1519356897033" TEXT="wie findet man den Ort einer Komponente?"/>
<node CREATED="1519356901933" ID="ID_596521684" MODIFIED="1519356913407" TEXT="Verh&#xe4;ltnis ID / Ort">
<node CREATED="1519356920083" ID="ID_723456910" MODIFIED="1519356926342" TEXT="sind orthogonale Schemata">
<node CREATED="1519357047993" ID="ID_1706134856" MODIFIED="1519357059979" TEXT="ID = globale Identit&#xe4;t"/>
<node CREATED="1519357060599" ID="ID_975802429" MODIFIED="1519357070810" TEXT="Ort = Topologie + Typ">
<node CREATED="1519357081868" ID="ID_1484266304" MODIFIED="1519357090975" TEXT="Ortsnamen sind generisch"/>
<node CREATED="1519357091795" ID="ID_68008128" MODIFIED="1519357096374" TEXT="sie werden lokal verstanden"/>
<node CREATED="1519357097154" ID="ID_377787861" MODIFIED="1519357212192" TEXT="lokal als Typangaben interpretiert">
<arrowlink COLOR="#2b4283" DESTINATION="ID_778018274" ENDARROW="Default" ENDINCLINATION="-1752;0;" ID="Arrow_ID_1022345699" STARTARROW="None" STARTINCLINATION="795;544;"/>
</node>
</node>
</node>
<node CREATED="1519356955358" ID="ID_1568727351" MODIFIED="1519356966058" TEXT="ID wird in den Ort eingepflantzt">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519357006055" ID="ID_1652172363" MODIFIED="1519357017238" TEXT="R&#xfc;ckaufl&#xf6;sung ID -&gt; Ort">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node CREATED="1506175115772" FOLDED="true" HGAP="318" ID="ID_1448696607" MODIFIED="1519356681726" VSHIFT="64">
<richcontent TYPE="NODE"><html>
<head>
@ -10168,10 +10189,68 @@
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1517505339663" ID="ID_470503309" MODIFIED="1518487921069" TEXT="DSL-Header restrukturieren">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1517507830918" ID="ID_1112334086" MODIFIED="1518487921069" TEXT="Locator symmetrisch zu Allocator">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1517507830918" ID="ID_1112334086" MODIFIED="1519355815117" TEXT="Locator symmetrisch zu Allocator">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1519355684307" ID="ID_336676610" MODIFIED="1519355726724">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
was <i>ist</i>&#160;der Locator?
</p>
</body>
</html>
</richcontent>
<node CREATED="1519355702409" ID="ID_609593004" MODIFIED="1519355708716" TEXT="eine LocationRule"/>
<node CREATED="1519355709376" ID="ID_142286917" MODIFIED="1519355717530" TEXT="mit Aufruf-Mechanismus"/>
</node>
<node CREATED="1519357904845" ID="ID_691482201" MODIFIED="1519358025396" TEXT="Verwendungs-Schema">
<icon BUILTIN="yes"/>
<node CREATED="1519357910532" ID="ID_1670200821" MODIFIED="1519357988646" TEXT="komplett symmetrisch?">
<icon BUILTIN="button_cancel"/>
<node CREATED="1519357919770" ID="ID_1959314257" MODIFIED="1519357951259" TEXT="zus&#xe4;tzliche Art der Location?">
<icon BUILTIN="button_cancel"/>
</node>
<node CREATED="1519357938272" ID="ID_446182371" MODIFIED="1519357948252" TEXT="Location-Builder">
<icon BUILTIN="button_cancel"/>
</node>
</node>
<node CREATED="1519357953550" ID="ID_1286263958" MODIFIED="1519358021683" TEXT="eine Ebene heben">
<icon BUILTIN="button_ok"/>
<node CREATED="1519357991409" ID="ID_994090473" MODIFIED="1519357999947" TEXT="Bauen per Zuweisung"/>
<node CREATED="1519358000671" ID="ID_49826255" MODIFIED="1519358015345" TEXT="Aufruf mit Typ-ID-Argument"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519358138988" ID="ID_1481930885" MODIFIED="1519358147156" TEXT="Problem: DSL-Mechanik">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1519358154386" ID="ID_1810798001" MODIFIED="1519358201550" TEXT="Allocator wird durch Zuweisen der AlocSpec generiert">
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1519358178623" ID="ID_517547970" MODIFIED="1519358197549" TEXT="beim Locator fehlt ein entsprechendes Gegenst&#xfc;ck">
<icon BUILTIN="flag-pink"/>
</node>
</node>
<node CREATED="1519355735012" ID="ID_241646491" MODIFIED="1519355793090" TEXT="wo entsteht die LocationRule?">
<arrowlink COLOR="#647b96" DESTINATION="ID_1664602603" ENDARROW="Default" ENDINCLINATION="1374;300;" ID="Arrow_ID_947721778" STARTARROW="None" STARTINCLINATION="298;36;"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1517507566761" ID="ID_839496495" MODIFIED="1519347241272">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
Anwendung <i>delegiert</i>&#160;an einen Serivce
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1517507566761" ID="ID_839496495" MODIFIED="1518487921069" TEXT="UILocationSolver">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519355422807" ID="ID_1718427051" MODIFIED="1519355428558" TEXT="Service-Zugang regeln">
<icon BUILTIN="flag-yellow"/>
</node>
<node COLOR="#338800" CREATED="1517507576168" ID="ID_700127725" MODIFIED="1518487921069" TEXT="LocationClause">
@ -10542,6 +10621,19 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519347191513" ID="ID_1058958215" MODIFIED="1519347378142" TEXT="Zugang zum LocationSolver">
<arrowlink COLOR="#33a0d6" DESTINATION="ID_1459009906" ENDARROW="Default" ENDINCLINATION="766;0;" ID="Arrow_ID_393354619" STARTARROW="None" STARTINCLINATION="-338;0;"/>
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519347295051" ID="ID_846050459" MODIFIED="1519347299883" TEXT="im realen UI">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519347289508" ID="ID_723600288" MODIFIED="1519347302587" TEXT="setup f&#xfc;r Unit-Test">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519347266311" ID="ID_1347610352" MODIFIED="1519347277894" TEXT="Funktor-Anwendung implementieren">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
</node>
@ -10552,7 +10644,8 @@
<linktarget COLOR="#8b9e9d" DESTINATION="ID_1945600026" ENDARROW="None" ENDINCLINATION="341;-39;" ID="Arrow_ID_360373706" SOURCE="ID_606655578" STARTARROW="Default" STARTINCLINATION="-302;83;"/>
<icon BUILTIN="flag-pink"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1517506590574" ID="ID_1459009906" MODIFIED="1518487921070" TEXT="hinten herum verdrahten">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1517506590574" ID="ID_1459009906" MODIFIED="1519347362448" TEXT="hinten herum verdrahten">
<linktarget COLOR="#33a0d6" DESTINATION="ID_1459009906" ENDARROW="Default" ENDINCLINATION="766;0;" ID="Arrow_ID_393354619" SOURCE="ID_1058958215" STARTARROW="None" STARTINCLINATION="-338;0;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1517508464896" ID="ID_877224411" MODIFIED="1518487921070" TEXT="generische Aufruf-Schnittstelle">
@ -10610,6 +10703,12 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519355632354" ID="ID_1664602603" MODIFIED="1519355793090" TEXT="wo entsteht die LocationRule?">
<linktarget COLOR="#647b96" DESTINATION="ID_1664602603" ENDARROW="Default" ENDINCLINATION="1374;300;" ID="Arrow_ID_947721778" SOURCE="ID_241646491" STARTARROW="None" STARTINCLINATION="298;36;"/>
<icon BUILTIN="help"/>
<node CREATED="1519355656423" ID="ID_1547517953" MODIFIED="1519355665786" TEXT="in der LocationSpec"/>
<node CREATED="1519355666797" ID="ID_1270620528" MODIFIED="1519355670433" TEXT="vor der LocationSpec"/>
</node>
</node>
<node COLOR="#338800" CREATED="1518312758758" ID="ID_675085959" MODIFIED="1518835387835" TEXT="Schreibweise f&#xfc;r create-Klauseln">
<icon BUILTIN="button_ok"/>
@ -10645,6 +10744,94 @@
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1515631909081" ID="ID_1875881401" MODIFIED="1518487921071" TEXT="Aufrufe auf ViewLocator-API &#xfc;bersetzen">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519354320645" ID="ID_431727101" MODIFIED="1519354329172" TEXT="Verh&#xe4;ltnis zur DSL">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1519354355113" ID="ID_1466028228" MODIFIED="1519354361395" TEXT="die Aloc-Specs delegieren"/>
<node CREATED="1519354365423" ID="ID_1473090391" MODIFIED="1519354379881" TEXT="jede Aloc-Speck entspricht einem Service"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519354380677" ID="ID_1029266700" MODIFIED="1519354394096" TEXT="wer bietet diesen Service?">
<icon BUILTIN="help"/>
<node CREATED="1519355147108" ID="ID_1615393259" MODIFIED="1519355344012" TEXT="in Frage kommen">
<icon BUILTIN="info"/>
<node CREATED="1519355157603" ID="ID_1219922150" MODIFIED="1519355160662" TEXT="ViewLocator"/>
<node CREATED="1519355161347" ID="ID_560748249" MODIFIED="1519355167270" TEXT="Navigator"/>
<node CREATED="1519355186551" ID="ID_1807778011" MODIFIED="1519355191106" TEXT="PanelManager"/>
</node>
<node CREATED="1519355289985" ID="ID_239681113" MODIFIED="1519355336332" TEXT="ViewLocator == Dispatcher">
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="idea"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519355201077" ID="ID_539031017" MODIFIED="1519355238944">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
wer interpretiert
</p>
<p>
UI-Koordinaten
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="help"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519354420343" ID="ID_17801598" MODIFIED="1519354425479" TEXT="Varianten">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519354443485" ID="ID_1474832227" MODIFIED="1519354447748" TEXT="always create">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519354760313" ID="ID_321705251" MODIFIED="1519355264234" TEXT="Umgang mit Duplikaten">
<linktarget COLOR="#807e9b" DESTINATION="ID_321705251" ENDARROW="Default" ENDINCLINATION="85;-104;" ID="Arrow_ID_1030149985" SOURCE="ID_1792932496" STARTARROW="None" STARTINCLINATION="204;-199;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1519354813458" ID="ID_168710453" MODIFIED="1519354818789" TEXT="beiseite schieben"/>
<node CREATED="1519354819473" ID="ID_996615547" MODIFIED="1519354824572" TEXT="Tab innerhalb erzeugen"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519354769960" ID="ID_778018274" MODIFIED="1519357212192" TEXT="Festlegung: was sind die Namen?">
<linktarget COLOR="#2b4283" DESTINATION="ID_778018274" ENDARROW="Default" ENDINCLINATION="-1752;0;" ID="Arrow_ID_1022345699" SOURCE="ID_377787861" STARTARROW="None" STARTINCLINATION="795;544;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1519357238119" ID="ID_490731063" MODIFIED="1519357248970" TEXT="Namen sind Platzhalter-Symbole"/>
<node CREATED="1519357249702" ID="ID_1135871152" MODIFIED="1519357313101">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
um eine <i>Position</i>&#160;zu kennzeichnen
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1519357262332" ID="ID_1067286247" MODIFIED="1519357267471" TEXT="sie sind generisch"/>
<node CREATED="1519357271642" ID="ID_693336166" MODIFIED="1519357284653" TEXT="werden lokal verstanden"/>
<node CREATED="1519357285265" ID="ID_1314676655" MODIFIED="1519357291428" TEXT="Schl&#xfc;ssel-Schlo&#xdf;-Prinzip"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519354459978" ID="ID_1281610608" MODIFIED="1519354465459" TEXT="create or retrieve">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1519354633610" ID="ID_205066693" MODIFIED="1519354645438" TEXT="welches Limit ist notwendig?">
<icon BUILTIN="help"/>
<node CREATED="1519354649560" ID="ID_1983794575" MODIFIED="1519354659843" TEXT="globales Limit">
<node CREATED="1519354660903" ID="ID_1601244663" MODIFIED="1519354670073" TEXT="Suche mit Z&#xe4;hlen"/>
<node CREATED="1519354670949" ID="ID_803401695" MODIFIED="1519354673249" TEXT="Registry"/>
</node>
<node CREATED="1519354677373" ID="ID_1968452476" MODIFIED="1519354680240" TEXT="pro Fenster">
<node CREATED="1519354685828" ID="ID_966759751" MODIFIED="1519354691638" TEXT="genau wie global"/>
</node>
<node CREATED="1519354697578" ID="ID_1780825164" MODIFIED="1519354715139" TEXT="pro Endpunkt">
<node CREATED="1519354849469" ID="ID_1792932496" MODIFIED="1519355264234" TEXT="Variante des create-Mechanismus">
<arrowlink COLOR="#807e9b" DESTINATION="ID_321705251" ENDARROW="Default" ENDINCLINATION="85;-104;" ID="Arrow_ID_1030149985" STARTARROW="None" STARTINCLINATION="204;-199;"/>
</node>
<node CREATED="1519354723262" ID="ID_1902026620" MODIFIED="1519354929283" TEXT="erbt dessen m&#xf6;gliche Auspr&#xe4;gung"/>
</node>
</node>
</node>
</node>
</node>
<node COLOR="#338800" CREATED="1506181875481" ID="ID_941513985" MODIFIED="1518487921071" TEXT="AllocatorSpec">
<icon BUILTIN="button_ok"/>
@ -21133,7 +21320,7 @@
<node CREATED="1492205732389" ID="ID_1080697951" MODIFIED="1518487921090" TEXT="wir k&#xf6;nnen stets gleich triggern"/>
</node>
<node CREATED="1492205741483" ID="ID_1132272888" MODIFIED="1518487921090" TEXT="Command wird sofort nach dem Binden getriggert"/>
<node COLOR="#338800" CREATED="1483925280108" HGAP="30" ID="ID_1479669922" MODIFIED="1518840407152" TEXT="Protokoll-Erweiterung" VSHIFT="8">
<node COLOR="#338800" CREATED="1483925280108" HGAP="30" ID="ID_1479669922" MODIFIED="1519355250156" TEXT="Protokoll-Erweiterung" VSHIFT="8">
<arrowlink COLOR="#e9ba2d" DESTINATION="ID_242219866" ENDARROW="Default" ENDINCLINATION="-940;1675;" ID="Arrow_ID_1617518648" STARTARROW="None" STARTINCLINATION="3436;-1136;"/>
<icon BUILTIN="button_ok"/>
<node CREATED="1483925298713" ID="ID_347702585" MODIFIED="1518487921090" TEXT="Command-Prototyp forken"/>