Clip-Drag: reshape that solution to avoid abundance of cross-links
...since it would be problematic, so store the prospective context data for any conceivable gesture within each Widget possibly addressed by that gesture. After some mulling over, today it finally occurred to me, that I already solved a similar problem for the layout management, and the very structure of ViewModel vs. Widget vs. Canvas settles around that solution. Thus we could try to expand that structure -- which means that the gesture context is only created *late*, when the gesture starts; and then the *subject* should be reponsible to collect and establish the context for the gesture and feed it to the gesture-controller, not the other way round
This commit is contained in:
parent
a64dc9c05f
commit
e3f64d1c3c
1 changed files with 160 additions and 9 deletions
|
|
@ -31759,7 +31759,7 @@
|
|||
</node>
|
||||
<node CREATED="1614460011582" ID="ID_952822551" MODIFIED="1614460030108" TEXT="tatsächlich wird auf Dauer nur das Subjekt benötigt">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1614460032928" ID="ID_1290991040" MODIFIED="1614460064068" TEXT="die Event-Quelle dient nur dazu, das Reaktionsmuster zu Verdrahten"/>
|
||||
<node CREATED="1614460032928" ID="ID_1290991040" MODIFIED="1614460064068" TEXT="die Event-Quelle dient nur dazu, das Reaktionsmuster zu verdrahten"/>
|
||||
<node CREATED="1614460064989" ID="ID_1051234344" MODIFIED="1614460079097" TEXT="als Event-Quelle genügt eine Gtk::Widget-Referenz">
|
||||
<node CREATED="1614460082069" ID="ID_1366205359" MODIFIED="1614460235413" TEXT="man kann alles auf Signale aufbauen">
|
||||
<arrowlink COLOR="#6c87a6" DESTINATION="ID_1054817075" ENDARROW="Default" ENDINCLINATION="-7;-84;" ID="Arrow_ID_1471465547" STARTARROW="None" STARTINCLINATION="-115;9;"/>
|
||||
|
|
@ -31846,7 +31846,8 @@
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<node CREATED="1614545300952" ID="ID_1467191869" MODIFIED="1614545455246" TEXT="Lösung-1: Übersetzungs-Service bereitstellen">
|
||||
<linktarget COLOR="#6c97d3" DESTINATION="ID_937435961" ENDARROW="Default" ENDINCLINATION="144;280;" ID="Arrow_ID_1259911083" SOURCE="ID_369222912" STARTARROW="None" STARTINCLINATION="-332;20;"/>
|
||||
<node CREATED="1614545300952" ID="ID_1467191869" MODIFIED="1614545455246" TEXT="Lösung-1: per Übersetzungs-Service direkt manipulieren">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -31862,10 +31863,22 @@
|
|||
<li>
|
||||
aus der gegenwärtig im Clip gespeicherten Zeit ergibt sich dann ein Delta
|
||||
</li>
|
||||
<li>
|
||||
dieses Delta wird sofort auf den Clip angewendet
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
Am Ende der Geste steht die neue Zeit-Position fertig im Clip und wird von dort per Command in den Steam-Layer gesendet. Später, nach der Verarbeitung in der Session kommt ein Update über den UI-Bus, welches die Position überschreibt und infolgedessen ggfs auch nochmal das Widget verschiebt
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<node CREATED="1614545483516" ID="ID_586854382" MODIFIED="1614545519119" TEXT="Vorsicht: Unterscheide Screen-Koordinaten vs. Canvas-Koordinaten"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1615558216850" ID="ID_351359335" MODIFIED="1615558243862" TEXT="Kennzeichnung: Geste manipuliert UI-Modell; es gibt kein "Zurück"">
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node CREATED="1614545483516" ID="ID_586854382" MODIFIED="1614545519119" TEXT="Vorsicht: Unterscheide Screen-Koordinaten vs. Canvas-Koordinaten">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node CREATED="1614545520061" ID="ID_421638066" MODIFIED="1614545552889" TEXT="das kann eigentlich nur der Canvas implementieren">
|
||||
<icon BUILTIN="forward"/>
|
||||
</node>
|
||||
|
|
@ -31877,12 +31890,33 @@
|
|||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...das heißt, durch die Drag-Geste entstehen vorübergehend lokal inkonsistente Koordinaten; der nächste DisplayEvaluation-Pass würde dies wieder beseitigen. Dieser Ansatz wäre rein logisch der konsktentere Weg, denn erst durch eine Rückmeldung von der Session wird eine neue Position auch offiziell. Allerdings müßte man bei diesem Ansatz vorsichtig vorgehen, und mögliche Interferenzen mit der DisplayEvaluation und dem Layout-Managment bedenken; besonders wenn man eine weite Strecke zurücklegt, könnte es passieren, daß der Clip dann plötzlich aus der Anzeige verschwindet und den Fokus verliert, weil eine DisplayEvaluation ihn wieder an seine gegenwärtig nominelle Position geschoben hat.
|
||||
...das heißt, durch die Drag-Geste entstehen vorübergehend lokal inkonsistente Koordinaten; der nächste DisplayEvaluation-Pass würde dies wieder beseitigen. Dieser Ansatz wäre rein logisch der konsistentere Weg, denn erst durch eine Rückmeldung von der Session wird eine neue Position auch offiziell. Allerdings müßte man bei diesem Ansatz vorsichtig vorgehen, und mögliche Interferenzen mit der DisplayEvaluation und dem Layout-Managment bedenken; besonders wenn man eine weite Strecke zurücklegt, könnte es passieren, daß der Clip dann plötzlich aus der Anzeige verschwindet und den Fokus verliert, weil eine DisplayEvaluation ihn wieder an seine gegenwärtig nominelle Position geschoben hat.
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#cf927e" DESTINATION="ID_819484059" ENDARROW="Default" ENDINCLINATION="30;162;" ID="Arrow_ID_713111774" SOURCE="ID_1040288867" STARTARROW="None" STARTINCLINATION="-23;-182;"/>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1615558187255" ID="ID_1107620857" MODIFIED="1615558212485" TEXT="Kennzeichnung: Geste als reine Manipulation von UI-Zustand">
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node CREATED="1614546132968" ID="ID_1588362914" MODIFIED="1614546175118" TEXT="auch in diesem Fall zumindest eine Übersetzung Screen→Canvas Koordinaten "/>
|
||||
<node CREATED="1614546235626" ID="ID_1042308082" MODIFIED="1614546278044" TEXT="am Ende brauchen wir dann auch noch die Metrik vom Layout(Canvas), für das Zeit-Delta"/>
|
||||
<node CREATED="1615558270517" ID="ID_295152392" MODIFIED="1615558374895" TEXT="Widersprüchliche Ownership der UI-Position">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
gehört er nun dem Layout-Manager, oder gehört er der Geste?
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node CREATED="1615558355906" ID="ID_36290343" MODIFIED="1615558371149" TEXT="Interferenz mit der DisplayEvaluation">
|
||||
<icon BUILTIN="clanbomber"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1614543982261" ID="ID_268537549" MODIFIED="1614544001288" TEXT="der ClipPresenter hat keinen direkten Zugriff auf das konkrete ClipDelegate"/>
|
||||
|
|
@ -31899,9 +31933,22 @@
|
|||
</html></richcontent>
|
||||
<node CREATED="1614544489998" ID="ID_1208107119" MODIFIED="1614544503226" TEXT="...und davon hängt aber ab, ob eine Drag-Geste überhaupt möglich ist"/>
|
||||
</node>
|
||||
<node CREATED="1615558696844" ID="ID_1299483978" MODIFIED="1615558784590" TEXT="Ende der Geste muß zuverlässig erkannt werden">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...sonst bleibt ein inkonsistender Zustand irgendwo "hängen".<br />Leider ist das nun das bekanntermaßen unlösbare Problem eines sicheren Verbindungsabbaus, und wir müssen uns deshalb mit einem Timeout, oder re-check-Mechanismus behelfen
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614547936791" ID="ID_972139852" MODIFIED="1614547946332" TEXT="Lösungskompromiß suchen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614547936791" ID="ID_972139852" MODIFIED="1615563862998" TEXT="Lösungskompromiß suchen">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1614548567759" ID="ID_1502155745" MODIFIED="1614548579105" TEXT="klären welche Entität führt">
|
||||
<node CREATED="1614548580160" ID="ID_1068834365" MODIFIED="1614549019860" TEXT="das Subject (Presenter)?">
|
||||
<icon BUILTIN="closed"/>
|
||||
|
|
@ -31923,8 +31970,8 @@
|
|||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614549056549" ID="ID_202229623" MODIFIED="1614549072636" TEXT="wieder das lästige Problem mit den vielen Querlinks">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1614549074954" ID="ID_1803715980" MODIFIED="1614549087844" TEXT="hatte das grade beim Layout mühsam niedergekämpft"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1614549074954" ID="ID_1803715980" MODIFIED="1614549087844" TEXT="hatte das kürzlich erst beim Layout mühsam niedergekämpft"/>
|
||||
<node CREATED="1614549303989" ID="ID_228758963" MODIFIED="1614549326657" TEXT="Idee: jeweils beim Beginn einer Geste den Kontext etablieren">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1614549430019" ID="ID_1189932533" MODIFIED="1614549464686" TEXT="das löst (nur) das Storage-Problem">
|
||||
|
|
@ -31940,13 +31987,117 @@
|
|||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1614549465737" ID="ID_1592517509" MODIFIED="1614549474705" TEXT="bleibt zu lösen...">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614549465737" ID="ID_1592517509" MODIFIED="1614549474705" TEXT="bleibt zu lösen...">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1614549475656" ID="ID_1108253772" MODIFIED="1614549505036" TEXT="gegeben ein Widget ⟹ wer ist das Subject(Presenter)?"/>
|
||||
<node CREATED="1614549505881" ID="ID_1111066543" MODIFIED="1614549522610" TEXT="gegeben ein Widget ⟹ welcher Canvas managt das Layout?"/>
|
||||
<node COLOR="#435e98" CREATED="1614865416841" ID="ID_369222912" MODIFIED="1615558812749" TEXT="Entscheidung zur Übersetzung in Domain-Werte">
|
||||
<arrowlink COLOR="#6c97d3" DESTINATION="ID_937435961" ENDARROW="Default" ENDINCLINATION="144;280;" ID="Arrow_ID_1259911083" STARTARROW="None" STARTINCLINATION="-332;20;"/>
|
||||
<node CREATED="1615558454300" ID="ID_1040288867" MODIFIED="1615558819335" TEXT="Entscheidung fällt gegen Lösung-2">
|
||||
<arrowlink COLOR="#cf927e" DESTINATION="ID_819484059" ENDARROW="Default" ENDINCLINATION="30;162;" ID="Arrow_ID_713111774" STARTARROW="None" STARTINCLINATION="-23;-182;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1615558821048" ID="ID_553122702" MODIFIED="1615559148819">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
die Konsequenz aus Lösung-1 ist aber nicht <i>wirklich abwegig</i>
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
Warum möchte man denn überhaupt eine Geste "abbrechen können"?
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
weil sie versehentlich ausgelöst wurde
|
||||
</li>
|
||||
<li>
|
||||
weil man besorgt ist, ein bereits Erreichtes dadurch "kaputt" zu machen
|
||||
</li>
|
||||
<li>
|
||||
weil man ein «UNDO« nicht zuverlässig sieht
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
Die Konsequenz daraus ist dann, daß das UI von Lumiera stets offen, non-modal und manipulierbar ist. Und die zweite Konsequenz ist, daß wir ein klar und <b>zuverlässig steuerbares</b> «UNDO» brauchen.
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1615561656493" ID="ID_1379998024" MODIFIED="1615563798670" TEXT="Analyse und Lösungssuche">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1615561662796" ID="ID_997009920" MODIFIED="1615561681046" TEXT="klar ist...">
|
||||
<node CREATED="1615561682058" ID="ID_1964677732" MODIFIED="1615561698859" TEXT="sobald die Geste startet..."/>
|
||||
<node CREATED="1615561699447" ID="ID_1546726168" MODIFIED="1615561719329">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
..brauchen wir Widget <i>und </i>Subject <i>und </i>Canvas
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1615561804761" ID="ID_1425406746" MODIFIED="1615561837841" TEXT="und das Event-Binding braucht zumindest den Gesten-Controller"/>
|
||||
<node CREATED="1615561875768" ID="ID_989749499" MODIFIED="1615561888969" TEXT="..plus einen Context-Indicator"/>
|
||||
</node>
|
||||
<node CREATED="1615563494951" ID="ID_1331675338" MODIFIED="1615563508330" TEXT="nun erscheine eine Lösung naheliegend">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1615563510172" ID="ID_1273139871" MODIFIED="1615563531003" TEXT="speichere im Binding den Gesten-Controller + das Subject"/>
|
||||
<node CREATED="1615563531896" ID="ID_1041794659" MODIFIED="1615563551170" TEXT="bei Start der Geste: das Subjekt bringt den Kontext bei...">
|
||||
<node CREATED="1615563552422" ID="ID_276415471" MODIFIED="1615563561233" TEXT="es kennt das Widget"/>
|
||||
<node CREATED="1615563561965" ID="ID_765212431" MODIFIED="1615563568584" TEXT="und das Widget kennt den Canvas"/>
|
||||
</node>
|
||||
<node CREATED="1615563610750" ID="ID_1241019416" MODIFIED="1615563624318" TEXT="der Canvas dient damit nur zur Metrik-Übersetzung"/>
|
||||
<node CREATED="1615563630412" ID="ID_1025610010" MODIFIED="1615563683159" TEXT="das Widget wird direkt per CanvasHook verschoben"/>
|
||||
</node>
|
||||
<node CREATED="1615563869355" ID="ID_411566224" MODIFIED="1615563956504" TEXT="Zeiger verwenden, und keine Registry">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
Registry hat zusätzlichen Overhead (sowohl Speicher, alsauch Management) und ist nur sinnvoll, wenn eine ID in mehreren Objekten vorkommt, oder die ID aus mehreren Thread-Kontexten benötigt wird
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1615563757154" ID="ID_1223828386" MODIFIED="1615563849447" TEXT="diese Lösung erscheint tragfähig und kohärent">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...insofern sie genau an die Struktur anbaut, welche ich schon zur Lösung der Querbeziehungen für das Layout genutzt habe
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<arrowlink COLOR="#3363bf" DESTINATION="ID_1714668959" ENDARROW="Default" ENDINCLINATION="36;-129;" ID="Arrow_ID_794903503" STARTARROW="None" STARTINCLINATION="-320;19;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1615563740336" ID="ID_1714668959" MODIFIED="1615563782709" TEXT="Lösungs-Skizze für Clip-Drag erstellen">
|
||||
<linktarget COLOR="#3363bf" DESTINATION="ID_1714668959" ENDARROW="Default" ENDINCLINATION="36;-129;" ID="Arrow_ID_794903503" SOURCE="ID_1223828386" STARTARROW="None" STARTINCLINATION="-320;19;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue