Clip-Drag: draft a solution for handling gestures
...even while keeping the focus to the actual problem at hand, this solution must be built with the larger goal in mind, which is the ability to support various editing gestures, transmitted possibly through several control-systems (mouse, keybindings, pen...) It is obvious that we'll need a dedicated controller for each kind of gesture; what turns out as tricky is to maintain and bind a stateful context and find the correct participants while a specific gesture is under way.
This commit is contained in:
parent
154868e8e2
commit
a64dc9c05f
3 changed files with 398 additions and 6 deletions
|
|
@ -87,6 +87,9 @@ namespace control {
|
|||
* use the embedded #facade factory, which yields a proxy to route any
|
||||
* calls through the lumieraorg_SessionCommand interface
|
||||
* @throws lumiera::error::State when interface is not opened
|
||||
* @todo as of 2/2021 only the #trigger operation is used; if no case for
|
||||
* an elaborated command cycle with binding step and deferred invocation
|
||||
* shows up, we may consider dropping the other operations
|
||||
* @see [Command system](\ref command.hpp)
|
||||
* @see SessionCommandFunction_test
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -71,6 +71,8 @@ namespace control {
|
|||
* Command definition, in case the given ID is not known
|
||||
* as a local command instance. This allows to use the
|
||||
* SessionCommand service without explicit instantiation
|
||||
* @warning this simplified command invocation scheme is intended for
|
||||
* single-threaded use from the UI. It is *not threadsafe*.
|
||||
*/
|
||||
void
|
||||
SessionCommandService::trigger (Symbol cmdID, Rec const& argSeq)
|
||||
|
|
|
|||
|
|
@ -31627,6 +31627,330 @@
|
|||
<node CREATED="1613948811142" ID="ID_1149934346" MODIFIED="1613948873809" TEXT="Verknüpfung von Widgets und InteractionState erfordert einen generischen Adapter"/>
|
||||
<node CREATED="1613949125310" ID="ID_1021022187" MODIFIED="1613949147008" TEXT="die Zustands-Aktualisierungen laufen über direkte Referenzen (nicht den UI-Bus)"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614379765040" ID="ID_1624270915" MODIFIED="1614380579512" TEXT="neuer Anlauf für Kontext-bezogene Commands">
|
||||
<arrowlink COLOR="#5b4964" DESTINATION="ID_1221036425" ENDARROW="Default" ENDINCLINATION="717;-46;" ID="Arrow_ID_1875882072" STARTARROW="None" STARTINCLINATION="586;34;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614380675501" ID="ID_163523275" MODIFIED="1614380716283" TEXT="Leitfrage: was muß ich jetzt konkret anlegen, damit »drag Clip« in dieses Schema paßt?">
|
||||
<icon BUILTIN="help"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614380743899" HGAP="64" ID="ID_715469259" MODIFIED="1614380757248" TEXT="Analyse" VSHIFT="-6">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1614380762451" ID="ID_378231511" MODIFIED="1614380766837" TEXT="Partizipatoren">
|
||||
<node CREATED="1614380786753" ID="ID_1862030818" MODIFIED="1614380792732" TEXT="ClipWidget">
|
||||
<node CREATED="1614380832080" ID="ID_1797079053" MODIFIED="1614380841322" TEXT="muß drag-Start erkennen"/>
|
||||
<node CREATED="1614380867533" ID="ID_833092549" MODIFIED="1614380876261" TEXT="muß dann motion_notify_event weiterleiten"/>
|
||||
</node>
|
||||
<node CREATED="1614380910877" ID="ID_541454007" MODIFIED="1614380915543" TEXT="Timeline-Canvas">
|
||||
<node CREATED="1614380965317" ID="ID_1975329261" MODIFIED="1614380978800" TEXT="muß das betroffene Widget verschieben"/>
|
||||
<node CREATED="1614380979369" ID="ID_1760600349" MODIFIED="1614380989600" TEXT="soll hierzu per Callback angebunden sein"/>
|
||||
</node>
|
||||
<node CREATED="1614381237672" ID="ID_1040735870" MODIFIED="1614381241183" TEXT="ClipPresenter">
|
||||
<node CREATED="1614381242128" ID="ID_511883791" MODIFIED="1614381252290" TEXT="muß zumindest das "SELF" beisteuern"/>
|
||||
<node CREATED="1614381252903" ID="ID_1069833008" MODIFIED="1614381260737" TEXT="könnte am Ende auch das Command absetzen"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614381332132" ID="ID_274933683" MODIFIED="1614381341167" TEXT="noch-unbekannt">
|
||||
<icon BUILTIN="bell"/>
|
||||
<node CREATED="1614381342698" ID="ID_809693332" MODIFIED="1614381384588" TEXT="wer ist für on-demand-Scrolling zuständig?">
|
||||
<icon BUILTIN="help"/>
|
||||
</node>
|
||||
<node CREATED="1614381357868" ID="ID_1867964338" MODIFIED="1614381376540" TEXT="...wenn man einen Clip aus dem sichtbaren Bereich zieht...?"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1614381416016" ID="ID_1165918043" MODIFIED="1614381421355" TEXT="API-Design-Problem">
|
||||
<node CREATED="1614381426919" ID="ID_149858385" MODIFIED="1614381468405" TEXT="der CmdContext ist ein generischer Zugang by-ID"/>
|
||||
<node CREATED="1614381470240" ID="ID_1938759210" MODIFIED="1614381512746" TEXT="am Ende aber behandeln wir eine spezifische Interaktion">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1614381552342" ID="ID_134319916" MODIFIED="1614381561843" TEXT="CmdContext wird entweder ein sehr breites Interface"/>
|
||||
<node CREATED="1614381562642" ID="ID_972576172" MODIFIED="1614389749670" TEXT="oder es wird ein Metasprache-Interface">
|
||||
<arrowlink COLOR="#fbe4a1" DESTINATION="ID_826730643" ENDARROW="Default" ENDINCLINATION="25;-50;" ID="Arrow_ID_354156309" STARTARROW="None" STARTINCLINATION="-227;15;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1614382663099" ID="ID_826730643" MODIFIED="1614389739519" TEXT="Lösungsidee: den Kontext als eine Sammlung von Rollen deuten">
|
||||
<linktarget COLOR="#fbe4a1" DESTINATION="ID_826730643" ENDARROW="Default" ENDINCLINATION="25;-50;" ID="Arrow_ID_354156309" SOURCE="ID_972576172" STARTARROW="None" STARTINCLINATION="-227;15;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1614384116295" ID="ID_1776177560" MODIFIED="1614384119969" TEXT="Beispiele">
|
||||
<node CREATED="1614384121198" ID="ID_2774291" MODIFIED="1614384129725" TEXT="Event-Quelle"/>
|
||||
<node CREATED="1614384215162" ID="ID_1829307481" MODIFIED="1614384217061" TEXT="Subjekt"/>
|
||||
<node CREATED="1614388125553" ID="ID_1734736450" MODIFIED="1614388160288" TEXT="FeedbackMove(x,y)"/>
|
||||
<node CREATED="1614388133920" ID="ID_295955902" MODIFIED="1614388155250" TEXT="FeedbackDisplay(msg)"/>
|
||||
<node CREATED="1614388168531" ID="ID_185828283" MODIFIED="1614388187058" TEXT="FeedbackHighlight()"/>
|
||||
</node>
|
||||
<node CREATED="1614389527598" ID="ID_1604040360" MODIFIED="1614389758762" TEXT="Problem hierbei">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1614389534082" ID="ID_80971854" MODIFIED="1614389541702" TEXT="Verklammerung mit einer Identität"/>
|
||||
<node CREATED="1614389542530" ID="ID_318980247" MODIFIED="1614390448104" TEXT="Vielzahl von Subjekten und Identitäten"/>
|
||||
</node>
|
||||
<node CREATED="1614390858247" ID="ID_1423481025" MODIFIED="1614390883649" TEXT="Kontrast: naive Lösung">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node CREATED="1614390886131" ID="ID_1752630658" MODIFIED="1614390896133" TEXT="die Logik wird beim Subjekt untergebracht"/>
|
||||
<node CREATED="1614390897026" ID="ID_78418004" MODIFIED="1614390913995" TEXT="Subjekt muß (sich) mit allen Partizipatoren verdrahten"/>
|
||||
<node CREATED="1614391053221" ID="ID_285566042" MODIFIED="1614391083520" TEXT="Konsequenz: enge Kopplung, verteilte Logik">
|
||||
<icon BUILTIN="clanbomber"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614391106909" ID="ID_829290263" MODIFIED="1614391113925" TEXT="Ausarbeitung dieser Lösung">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1614391126643" ID="ID_339143488" MODIFIED="1614391152827" TEXT="Grundlage">
|
||||
<node CREATED="1614391153839" ID="ID_1357502282" MODIFIED="1614391168548" TEXT="CmdContext ist ein Metasprache-Interface">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1614391170141" ID="ID_832546901" MODIFIED="1614391190901" TEXT="es erlaubt, eine fest vorgegebene Auswahl an Rollen zu registrieren"/>
|
||||
<node CREATED="1614391193833" ID="ID_1074859407" MODIFIED="1614391217868" TEXT="es erlaubt, einzelne Instanzen zu deregistrieren"/>
|
||||
</node>
|
||||
<node CREATED="1614391222237" ID="ID_1021447273" MODIFIED="1614391253965" TEXT="jedes einzelne Interaktionsmuster ist individuell ausprogrammiert">
|
||||
<node CREATED="1614391255630" ID="ID_1652285552" MODIFIED="1614391268915" TEXT="das bedeutet: es gibt ein implizites Protokoll"/>
|
||||
<node CREATED="1614391269807" ID="ID_236795034" MODIFIED="1614391284866" TEXT="es wird Registrierung der genau passenden Rollen-Adapter unterstellt"/>
|
||||
<node CREATED="1614391304259" ID="ID_1592976230" MODIFIED="1614391351824" TEXT="es muß Verdrahtungs-Hooks geben">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
nachdem sich eine Instanz einer Rolle gemeldet hat, kann der Hook sie individuell verknüpfen, typischerweise als Lambda
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1614391489665" ID="ID_1919040945" MODIFIED="1614391495581" TEXT="Verklammerung">
|
||||
<node CREATED="1614391506656" ID="ID_1004859029" MODIFIED="1614391520280" TEXT="Event-Quelle muß mit einem Subjekt ausgezeichnet werden"/>
|
||||
<node CREATED="1614391615637" ID="ID_1108644497" MODIFIED="1614391627843" TEXT="zur Event-Quelle wird eine Closure gebildet">
|
||||
<node CREATED="1614391628734" ID="ID_1671010257" MODIFIED="1614391663130" TEXT="und zwar für den konkreten Typ der Interaktion">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
also nicht generisch, sondern die spezifische Closure für z.B. den Fall drag-Clip
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1614391673368" ID="ID_205779868" MODIFIED="1614391685758" TEXT="diese Closure bestimmt, auf welche Events überhaupt gehört wird"/>
|
||||
<node CREATED="1614391691166" ID="ID_367156594" MODIFIED="1614391711156" TEXT="d.h. zur Event-Quelle gibt es ein generisches Element wie z.B. GTK-Widget"/>
|
||||
<node CREATED="1614391738263" ID="ID_1536053997" MODIFIED="1614391793230" TEXT="hier entsteht also eine Verquickung mit dem konkreten Framework">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
naja... sie besteht schon von Anfang an, insofern das Event-Konzept, wie auch die konkrete Quelle, ohnehin an das UI-Framework gebunden sind
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1614391836482" ID="ID_1023680019" MODIFIED="1614391943348" TEXT="diese Closure enthält die konkrete Gesten-Erkennung">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
im Beispiel: in dieser Closure wird zunächste eine Verdrahtung auf das button_down-Event angelegt. Wenn diese aktiviert wird, schaltet die die Beobachtung eines ebenfalls vorsorglich verdrahteten motion_notify_event ein, sowie analog das Warten auf ein button_up
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</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="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;"/>
|
||||
</node>
|
||||
<node CREATED="1614460100690" ID="ID_570431649" MODIFIED="1614460113953" TEXT="dann sorgt Sigc bereits für die Deregistrierung"/>
|
||||
<node CREATED="1614460114904" ID="ID_1615356307" MODIFIED="1614460143452" TEXT="und da ein totes Widget keine Events mehr sendet, kann man den Eintrag "hängen" lassen">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1614460159682" ID="ID_1054817075" MODIFIED="1614460237067" TEXT="das eigentliche Verhaltensmuster ist komplett Event-getrieben">
|
||||
<linktarget COLOR="#6c87a6" DESTINATION="ID_1054817075" ENDARROW="Default" ENDINCLINATION="-7;-84;" ID="Arrow_ID_1471465547" SOURCE="ID_1366205359" STARTARROW="None" STARTINCLINATION="-115;9;"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1614475571869" ID="ID_1751028671" MODIFIED="1614543472364" TEXT="wie kann die Verklammerung realisiert werden?">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1614475601650" ID="ID_205574857" MODIFIED="1614543459768" TEXT="allein über die Signal-Bindung ...">
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1614475633677" ID="ID_486152583" MODIFIED="1614475643040" TEXT="geht das überhaupt?"/>
|
||||
<node CREATED="1614475655498" ID="ID_1837268445" MODIFIED="1614536263567" TEXT="Subjekt müßte dann als Parameter in den Handler mit eingespeist werden">
|
||||
<node CREATED="1614475677163" ID="ID_1901993329" MODIFIED="1614475719301" TEXT="d.h. es gäbe nur eine generische Handler-Funktion"/>
|
||||
<node CREATED="1614475736604" ID="ID_1260840315" MODIFIED="1614475769271" TEXT="und irgendwo (im Signal-Binding) ist ein Slot mit der Closure gespeichert"/>
|
||||
</node>
|
||||
<node CREATED="1614475793975" ID="ID_260944164" MODIFIED="1614543467968" TEXT="dann müßte man aber auch alles über den Subject/Adapter machen können">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1614475835082" ID="ID_1955774576" MODIFIED="1614475841413" TEXT="den bisherigen Offset abrufen"/>
|
||||
<node CREATED="1614475842001" ID="ID_347860364" MODIFIED="1614475873560" TEXT="das aktuelle Delta aufschlagen"/>
|
||||
<node CREATED="1614475874415" ID="ID_797516713" MODIFIED="1614475881762" TEXT="damit einen neuen Offset speichern"/>
|
||||
<node CREATED="1614475938076" ID="ID_1703634175" MODIFIED="1614475990529" TEXT="alte Position abrufen"/>
|
||||
<node CREATED="1614475991149" ID="ID_384791921" MODIFIED="1614475999767" TEXT="mit dem Offset daraus eine neue Position"/>
|
||||
<node CREATED="1614476000827" ID="ID_1072166447" MODIFIED="1614476006449" TEXT="Widget dorthin verschieben"/>
|
||||
<node CREATED="1614476007299" ID="ID_1457812219" MODIFIED="1614476017287" TEXT="schließlich den finalen Offset erfassen"/>
|
||||
<node CREATED="1614476017872" ID="ID_397556906" MODIFIED="1614476038242" TEXT="diesen umwandeln in den Parameter-Raum (z.B. zeitliche Verschiebung)"/>
|
||||
<node CREATED="1614476038998" ID="ID_148450923" MODIFIED="1614476054048" TEXT="und dieses Ergebnis in das Command binden"/>
|
||||
<node CREATED="1614476058668" ID="ID_1803344399" MODIFIED="1614476066270" TEXT="das Command an den Bus übergeben"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1614536448697" ID="ID_1492057742" MODIFIED="1614543456614" TEXT="ein Kontext pro Subjekt">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1614536709750" ID="ID_186439136" MODIFIED="1614536736791" TEXT="in der Closure der Signal-Bindung steckt dann (nur) ein "this"-Pointer"/>
|
||||
<node CREATED="1614539609634" ID="ID_603639357" MODIFIED="1614539653942" TEXT="die Daten zur Gesten-Erkennung und -Verfolgung sind in jedem Kontext aufgedoppelt">
|
||||
<node CREATED="1614539908164" ID="ID_1719873670" MODIFIED="1614539911410" TEXT="Subjekt"/>
|
||||
<node CREATED="1614539912070" ID="ID_246551713" MODIFIED="1614539915273" TEXT="Startposition"/>
|
||||
<node CREATED="1614539918495" ID="ID_1406833293" MODIFIED="1614539926951" TEXT="aktuelle Pos oder Delta"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1614540333938" ID="ID_498563982" MODIFIED="1614543450376" TEXT="Widget steuert die Drag-Geste selber">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1614540397688" ID="ID_622503022" MODIFIED="1614540432520" TEXT="es verwendet hierfür einen generischen Adapter">
|
||||
<node CREATED="1614540445834" ID="ID_1198534535" MODIFIED="1614540458487" TEXT="dieser braucht dann aber einen Backpointer auf das Widget"/>
|
||||
<node CREATED="1614540483740" ID="ID_479333673" MODIFIED="1614540507714" TEXT="jeder Adapter hat seine eigenen Zustands-Variablen"/>
|
||||
<node CREATED="1614540516104" ID="ID_1112342686" MODIFIED="1614540538846" TEXT="und ein Backpointer auf das Subjekt wird auch noch benötigt"/>
|
||||
</node>
|
||||
<node CREATED="1614540567402" ID="ID_178069710" MODIFIED="1614540584842" TEXT="oder es enthält die Logik direkt ausprogrammiert"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1614540589382" ID="ID_1190969110" MODIFIED="1614541775944" TEXT="Fazit">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1614540612570" ID="ID_1031352571" MODIFIED="1614540626133" TEXT="Verklammerung über die Signalbindung ist die beste Lösung"/>
|
||||
<node CREATED="1614540719919" ID="ID_103729106" MODIFIED="1614540833729" TEXT="spart Storage und hält die Logik zentral"/>
|
||||
<node CREATED="1614540912673" ID="ID_1808809074" MODIFIED="1614540942883" TEXT="Subjekt muß aber auch Zugang zum Widget und zur Position bieten"/>
|
||||
<node CREATED="1614541813489" ID="ID_1805140351" MODIFIED="1614541823710" TEXT="Installation des Bindings muß vom Subjekt ausgehen">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1614543013138" ID="ID_1830318279" MODIFIED="1614543025940" TEXT="problematisch mit der bestehenden Implementierung"/>
|
||||
<node CREATED="1614543026767" ID="ID_1302795590" MODIFIED="1614543817770" TEXT="bisher ist das ClipDelegate relativ eigenständig bzgl. Anzeigestil">
|
||||
<arrowlink COLOR="#f45679" DESTINATION="ID_1754386766" ENDARROW="Default" ENDINCLINATION="93;-23;" ID="Arrow_ID_367937676" STARTARROW="None" STARTINCLINATION="-164;8;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614543493162" ID="ID_1473378249" MODIFIED="1614543505465" TEXT="mit der bestehenden Implementierung verbinden">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1614543561632" ID="ID_1754386766" MODIFIED="1614543810211" TEXT="diverse Widersprüche und Spannungen">
|
||||
<linktarget COLOR="#f45679" DESTINATION="ID_1754386766" ENDARROW="Default" ENDINCLINATION="93;-23;" ID="Arrow_ID_367937676" SOURCE="ID_1302795590" STARTARROW="None" STARTINCLINATION="-164;8;"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1614543836195" ID="ID_937435961" MODIFIED="1614543924536" TEXT="Koordinaten im Widget dargestellt als Domain-Werte (Zeit)">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
die Umrechnung Zeit → Pixel habe ich im CanvasHook versteckt
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<node CREATED="1614545300952" ID="ID_1467191869" MODIFIED="1614545455246" TEXT="Lösung-1: Übersetzungs-Service bereitstellen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
das bedeutet:<br />
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
wenn im Event explizite Koordinaten vorkommen, dann müssen diese sofort umgerechnet werden in eine Zeit
|
||||
</li>
|
||||
<li>
|
||||
aus der gegenwärtig im Clip gespeicherten Zeit ergibt sich dann ein Delta
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<node CREATED="1614545483516" ID="ID_586854382" MODIFIED="1614545519119" TEXT="Vorsicht: Unterscheide Screen-Koordinaten vs. Canvas-Koordinaten"/>
|
||||
<node CREATED="1614545520061" ID="ID_421638066" MODIFIED="1614545552889" TEXT="das kann eigentlich nur der Canvas implementieren">
|
||||
<icon BUILTIN="forward"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1614545319978" ID="ID_819484059" MODIFIED="1614546053325" TEXT="Lösung-2: Drag-Geste manipuliert nur die Pixel/Canvas-Koordinaten">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</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.
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<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>
|
||||
</node>
|
||||
<node CREATED="1614543982261" ID="ID_268537549" MODIFIED="1614544001288" TEXT="der ClipPresenter hat keinen direkten Zugriff auf das konkrete ClipDelegate"/>
|
||||
<node CREATED="1614544072432" ID="ID_624148025" MODIFIED="1614544294924" TEXT="der Anzeigestil wird relativ autonom im ClipDelegate gewählt">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...wobei das auch noch halbfertig ist; später einmal muß es hier eine Abstimmung mit dem Layout-Manager geben, aber diese Abstimmung sollte eigentlich nicht über den ClipPresenter laufen
|
||||
</p>
|
||||
</body>
|
||||
</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>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614547936791" ID="ID_972139852" MODIFIED="1614547946332" TEXT="Lösungskompromiß suchen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<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"/>
|
||||
<node CREATED="1614548621184" ID="ID_313965279" MODIFIED="1614548638025" TEXT="dann muß das ClipDelegate-API entsprechend erweitert werden"/>
|
||||
<node CREATED="1614548720714" ID="ID_1355759542" MODIFIED="1614548742103" TEXT="trotzdem ungelöst: Zeitpunkt der Registrierung für den Drag-Mechanismus"/>
|
||||
<node CREATED="1614548979543" ID="ID_950023949" MODIFIED="1614549014231" TEXT="paßt insgesamt schlecht ins Konzept: Gesten sind reine GUI-Mechanik"/>
|
||||
</node>
|
||||
<node CREATED="1614548586972" ID="ID_1092961950" MODIFIED="1614549022486" TEXT="oder das Widget?">
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1614548745039" ID="ID_1301052915" MODIFIED="1614548763432" TEXT="dann ist (mindestens) ein Backlink auf das Subjekt notwendig"/>
|
||||
<node CREATED="1614548782314" ID="ID_1708909721" MODIFIED="1614548792788" TEXT="ansonsten könnte aber das Widget autonom agieren">
|
||||
<node CREATED="1614548816117" ID="ID_934774711" MODIFIED="1614548839550" TEXT="sofern man alles dynamische Positionieren in den Canvas verlagert"/>
|
||||
<node CREATED="1614548843386" ID="ID_1197536023" MODIFIED="1614548864523" TEXT="der Canvas müßte sich dann also als Partizipant beim CmdContext registrieren">
|
||||
<node CREATED="1614548871925" ID="ID_1738624566" MODIFIED="1614548889914" TEXT="Vorsicht... es gibt nicht nur einen Canvas">
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</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"/>
|
||||
<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">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
insofern wir die Storage nur einmal, im jeweilgen CmdContext der Geste vorsehen müssen
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1614549465737" ID="ID_1592517509" MODIFIED="1614549474705" TEXT="bleibt zu lösen...">
|
||||
<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>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -36019,7 +36343,7 @@
|
|||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1488674659521" ID="ID_1283697108" MODIFIED="1561827465687" TEXT="Problem: Instanz-Management">
|
||||
<node COLOR="#435e98" CREATED="1488674659521" FOLDED="true" ID="ID_1283697108" MODIFIED="1561827465687" TEXT="Problem: Instanz-Management">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1488674675895" ID="ID_1414738474" MODIFIED="1518487921091" TEXT="benannt oder anonyom">
|
||||
<icon BUILTIN="help"/>
|
||||
|
|
@ -36082,7 +36406,7 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1488675785223" ID="ID_134788782" MODIFIED="1561827465692" TEXT="Aufgaben">
|
||||
<node COLOR="#338800" CREATED="1488675785223" FOLDED="true" ID="ID_134788782" MODIFIED="1561827465692" TEXT="Lösung schaffen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1488675788278" ID="ID_241828684" MODIFIED="1518487921091" TEXT="wer erzeugt die Instanz?">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -36284,7 +36608,8 @@
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<arrowlink COLOR="#6b709e" DESTINATION="ID_131071232" ENDARROW="Default" ENDINCLINATION="275;0;" ID="Arrow_ID_1369499964" STARTARROW="Default" STARTINCLINATION="275;0;"/>
|
||||
<icon BUILTIN="bell"/>
|
||||
</node>
|
||||
<node CREATED="1488940519518" ID="ID_1875791797" MODIFIED="1488940533992" TEXT="bei nächster Anfrage wird CmdInstanceManager daher neue Instanz anlegen"/>
|
||||
</node>
|
||||
|
|
@ -36375,6 +36700,46 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614379178320" ID="ID_1221036425" MODIFIED="1614380579512" TEXT="komplexe Aktionen mit Satzcharakter und Kontext">
|
||||
<linktarget COLOR="#5b4964" DESTINATION="ID_1221036425" ENDARROW="Default" ENDINCLINATION="717;-46;" ID="Arrow_ID_1875882072" SOURCE="ID_1624270915" STARTARROW="None" STARTINCLINATION="586;34;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1614379221818" ID="ID_970302446" MODIFIED="1614379248300" TEXT="zunächst wurde nur eine »point and shot«-Lösung realisiert">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1614379249966" ID="ID_1395628620" MODIFIED="1614379269183" TEXT="feste verdrahtete Command-ID"/>
|
||||
<node CREATED="1614379269938" ID="ID_487933301" MODIFIED="1614379285059">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
nur eine Art <i>remote procedure call</i>
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614379298743" ID="ID_1608963281" MODIFIED="1614379434193" TEXT="Frage: muß das UI-Bus-Protokoll erweiter werden?">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...und das heißt auch, wo werden die Aussage-Sätze gebildet?<br />wird das Formen von kontextbezogenen Anweisungen im UI-Bus-Protokoll eigens verankert, oder erfolgt dies komplett intern im Stage-Layer?
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="help"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614379467852" ID="ID_327990233" MODIFIED="1614379593877" TEXT="das heißt auch: Aufsammeln der Kontext-Information ― wer und wie?">
|
||||
<icon BUILTIN="help"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614379530868" ID="ID_131071232" MODIFIED="1614379614382" TEXT="werden Parameter sofort übersetzt, oder schrittweise aufgesammelt?">
|
||||
<linktarget COLOR="#6b709e" DESTINATION="ID_131071232" ENDARROW="Default" ENDINCLINATION="275;0;" ID="Arrow_ID_1369499964" SOURCE="ID_130562988" STARTARROW="Default" STARTINCLINATION="275;0;"/>
|
||||
<icon BUILTIN="help"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1488674268407" ID="ID_284516869" MODIFIED="1518487921092" TEXT="Parameter">
|
||||
<node CREATED="1488937542963" ID="ID_853531623" MODIFIED="1518487921092" TEXT="passiert im InvocationStateManager"/>
|
||||
<node CREATED="1488937551514" ID="ID_1024843173" MODIFIED="1518487921092" TEXT="es könnte Binde-Regeln geben"/>
|
||||
|
|
@ -37312,6 +37677,9 @@
|
|||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1492281675557" ID="ID_1256848300" MODIFIED="1518487921093" TEXT="InvocationState mit Callbacks">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1614378714385" ID="ID_1301868924" MODIFIED="1614378743497" TEXT="Adapter für Event-Quellen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1492463479663" ID="ID_1449859033" MODIFIED="1518487921093" TEXT="#1096 passing object IDs">
|
||||
|
|
@ -38040,9 +38408,9 @@
|
|||
<node CREATED="1489719178053" ID="ID_1509284806" MODIFIED="1489719184696" TEXT="hat Cmd-ID + eigene ID"/>
|
||||
<node CREATED="1489719186276" ID="ID_929080602" MODIFIED="1489719196230" TEXT="kann entscheiden ob ausführbar"/>
|
||||
<node CREATED="1489719200330" ID="ID_840062807" MODIFIED="1489719208197" TEXT="hat Argument-Accessor"/>
|
||||
<node COLOR="#5e427f" CREATED="1489719212976" HGAP="-52" ID="ID_949699860" MODIFIED="1489719253576" TEXT="noch offen" VSHIFT="45">
|
||||
<node COLOR="#5e427f" CREATED="1489719212976" HGAP="-52" ID="ID_949699860" MODIFIED="1614373195459" TEXT="noch offen" VSHIFT="45">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<icon BUILTIN="closed"/>
|
||||
<node CREATED="1489719257426" ID="ID_1618753270" MODIFIED="1576282357977" TEXT="wer erzeugt den InvocationTrail">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
|
@ -53791,6 +54159,25 @@
|
|||
</node>
|
||||
</node>
|
||||
<node CREATED="1477785856731" ID="ID_63204089" MODIFIED="1557498707238" TEXT="Rückgabewert: true == fertig behandelt"/>
|
||||
<node CREATED="1614466718256" FOLDED="true" ID="ID_1861948898" LINK="https://developer.gnome.org/libsigc++-tutorial/stable/" MODIFIED="1614467271110" TEXT="beruht auf Lib SigC++">
|
||||
<node CREATED="1614466752396" ID="ID_741341742" MODIFIED="1614466766212" TEXT="diese unterstützt inzwischen voll C++11 (incl Lambdas)"/>
|
||||
<node CREATED="1614466921957" ID="ID_427930105" MODIFIED="1614467268405" TEXT="Thema: track and detach slots">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1614466956096" ID="ID_1002681236" MODIFIED="1614466978183" TEXT="Signal könnte Slot auf einem bereits toten Objekt aufrufen">
|
||||
<icon BUILTIN="clanbomber"/>
|
||||
</node>
|
||||
<node CREATED="1614466978880" ID="ID_1226117301" MODIFIED="1614467017795" TEXT="sigc::trackable : Basisklasse für Objekte, die Slots automatisch deaktivieren"/>
|
||||
<node CREATED="1614467041725" ID="ID_1616467014" MODIFIED="1614467059518" TEXT="slot(mem_fun(stigc::trackable, ....)">
|
||||
<node CREATED="1614467070937" ID="ID_651462037" MODIFIED="1614467085686" TEXT="dieser wird nicht mehr aufgerufen nach dem das Trackable tot ist"/>
|
||||
<node CREATED="1614467086284" ID="ID_1708957515" MODIFIED="1614467105649" TEXT="analog für alle Verbindungen via <signal>.connect()"/>
|
||||
</node>
|
||||
<node CREATED="1614467221680" ID="ID_1190660197" MODIFIED="1614467233958" TEXT="alternativ kann man lambdas direkt anschließen">
|
||||
<node CREATED="1614467235118" ID="ID_1908157491" MODIFIED="1614467242637" TEXT="dann gibt es aber kein Tracking"/>
|
||||
<node CREATED="1614467243390" ID="ID_162571863" MODIFIED="1614467252868" TEXT="se sei denn, man verwendet sigc::track_obj"/>
|
||||
<node CREATED="1614467253912" ID="ID_230224690" LINK="https://developer.gnome.org/libsigc++/stable/group__track__obj.html" MODIFIED="1614467260623" TEXT="siehe Beispiel in der Doku"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1504215708147" ID="ID_975007807" MODIFIED="1557498707238" TEXT="Widget">
|
||||
<node CREATED="1535630469053" ID="ID_608304313" MODIFIED="1557498707238" TEXT="konkret...">
|
||||
|
|
@ -54299,7 +54686,7 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1477788816168" ID="ID_904860978" MODIFIED="1518487921100" TEXT="documentation">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1477788823751" ID="ID_111966354" LINK="https://developer.gnome.org/gtkmm-tutorial/stable/chapter-drawingarea.html.en" MODIFIED="1518487921100" TEXT="read the custom drawing chapter">
|
||||
<node CREATED="1477788823751" ID="ID_111966354" LINK="https://developer.gnome.org/gtkmm-tutorial/stable/chapter-drawingarea.html.en" MODIFIED="1614467022336" TEXT="read the custom drawing chapter">
|
||||
<arrowlink DESTINATION="ID_1600280983" ENDARROW="Default" ENDINCLINATION="893;0;" ID="Arrow_ID_1707544457" STARTARROW="None" STARTINCLINATION="893;0;"/>
|
||||
</node>
|
||||
<node CREATED="1477788855234" ID="ID_426069181" LINK="https://developer.gnome.org/gtkmm-tutorial/stable/sec-custom-widgets.html.en" MODIFIED="1518487921100" TEXT="read the example code of a custom widget">
|
||||
|
|
|
|||
Loading…
Reference in a new issue