Clip-Drag: get the gesture logic to work
some bugfixes, but also a notable change: detect the completion of the gesture directly when the button is released; this is necessary, because seemingly we do not get motion_events when no button is pressed, at least not in this test setup based on a Gtk::Button widget.
This commit is contained in:
parent
b5cf8b2303
commit
db3a525d6e
6 changed files with 97 additions and 32 deletions
|
|
@ -36,7 +36,6 @@
|
|||
|
||||
//#include "lib/util.hpp"
|
||||
//#include "lib/symbol.hpp"
|
||||
#include "stage/gtk-base.hpp"
|
||||
#include "lib/depend.hpp"
|
||||
//#include "include/logging.h"
|
||||
#include "include/ui-protocol.hpp"
|
||||
|
|
|
|||
|
|
@ -94,9 +94,9 @@ namespace interact {
|
|||
virtual ~Subject(); ///< this is an interface
|
||||
|
||||
public:
|
||||
virtual Gtk::Widget& exposeWidget() =0;
|
||||
virtual void fireGesture (Symbol cmdID) =0;
|
||||
virtual void gestureOffset (Symbol cmdID, gdouble deltaX, gdouble deltaY) =0;
|
||||
virtual Gtk::Widget& exposeWidget() =0;
|
||||
virtual void fireGesture (Symbol cmdID) =0;
|
||||
virtual void gestureOffset (Symbol cmdID, double deltaX, double deltaY) =0;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -69,6 +69,9 @@ namespace interact {
|
|||
using util::isnil;
|
||||
using util::_Fmt;//////////////////////////////////TODO
|
||||
|
||||
namespace {
|
||||
const gdouble DISTANCE_THRESHOLD = 5.0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
|
|
@ -82,8 +85,13 @@ namespace interact {
|
|||
* controller.
|
||||
*
|
||||
* @todo write type comment...
|
||||
* @remarks tracking of signal connections _is not relevant here,_ since this controller
|
||||
* is managed by the UI backbone and thus ensured to outlive any event processing.
|
||||
* @remarks
|
||||
* - tracking of signal connections _is not relevant here,_ since this controller
|
||||
* is managed by the UI backbone and thus ensured to outlive any event processing.
|
||||
* - this concrete controller handles _all_ drag-relocate gestures for all widgets
|
||||
* - the actual Subject (widget) and command are bound into the signal wiring
|
||||
* - whenever a new gesture possibly starts, we pick up these arguments and
|
||||
* store them into the current gesture state within this object's fields.
|
||||
* @todo WIP-WIP as of /3/2021
|
||||
* ///////////////////////////////////TODO do we need a translation unit interaction-state.cpp (otherwise delete it!)
|
||||
*/
|
||||
|
|
@ -119,11 +127,17 @@ namespace interact {
|
|||
watchButton (GdkEventButton* button_event) noexcept
|
||||
{
|
||||
REQUIRE (button_event);
|
||||
if (button_event->type & GDK_BUTTON_PRESS)
|
||||
if (GDK_BUTTON_PRESS == button_event->type)
|
||||
buttonPressed_ = true;
|
||||
else
|
||||
if (button_event->type & GDK_BUTTON_RELEASE)
|
||||
buttonPressed_ = false;
|
||||
if (GDK_BUTTON_RELEASE == button_event->type)
|
||||
{
|
||||
buttonPressed_ = false;
|
||||
if (isActive())
|
||||
doCompleteGesture();
|
||||
resetState();
|
||||
}
|
||||
std::cerr << _Fmt{"BUTT %s flag=%d"} % buttonPressed_ % button_event->type << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -132,11 +146,7 @@ namespace interact {
|
|||
maybeActivate (Symbol cmdID, Subject& subject, GdkEventMotion* motion_event)
|
||||
{
|
||||
if (not buttonPressed_)
|
||||
{
|
||||
if (isActive())
|
||||
doCompleteGesture();
|
||||
return false; // Event not handled by this controller
|
||||
}
|
||||
REQUIRE (motion_event);
|
||||
std::cerr << _Fmt{"MOVE x=%3.1f y=%3.1f subject=%s"}
|
||||
% motion_event->x
|
||||
|
|
@ -146,9 +156,15 @@ namespace interact {
|
|||
if (not isAnchored())
|
||||
anchor (cmdID, subject, motion_event);
|
||||
if (not isActive())
|
||||
return false;
|
||||
doTrackGesture(motion_event);
|
||||
return true; // Event handled
|
||||
{
|
||||
probeActivation (motion_event);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
doTrackGesture (motion_event);
|
||||
return true; // Event handled
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -174,6 +190,18 @@ namespace interact {
|
|||
this->subject_ = & subject;
|
||||
this->anchorX_ = motion_event->x;
|
||||
this->anchorY_ = motion_event->y;
|
||||
std::cerr << _Fmt{"ANCHOR at x=%3.1f y=%3.1f ('%s')"}
|
||||
% anchorX_
|
||||
% anchorY_
|
||||
% cmdID_
|
||||
<< std::endl;
|
||||
}
|
||||
|
||||
void
|
||||
probeActivation (GdkEventMotion* motion_event)
|
||||
{
|
||||
isInFormation_ = DISTANCE_THRESHOLD < abs (motion_event->x - anchorX_)
|
||||
or DISTANCE_THRESHOLD < abs (motion_event->y - anchorY_);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -190,10 +218,15 @@ namespace interact {
|
|||
doCompleteGesture()
|
||||
{
|
||||
subject_->fireGesture (cmdID_);
|
||||
// return to inactive state
|
||||
}
|
||||
|
||||
void
|
||||
resetState()
|
||||
{
|
||||
isInFormation_ = false;
|
||||
cmdID_ = Symbol::BOTTOM;
|
||||
subject_ = nullptr;
|
||||
anchorX_ = anchorY_ = 0.0;
|
||||
subject_ = nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -236,7 +236,7 @@ namespace timeline {
|
|||
}
|
||||
|
||||
void
|
||||
gestureOffset (Symbol cmdID, gdouble deltaX, gdouble deltaY) override
|
||||
gestureOffset (Symbol cmdID, double deltaX, double deltaY) override
|
||||
{
|
||||
std::cerr << _Fmt{"Gesture(%s) --> Δ := (%3.1f,%3.1f)"}
|
||||
% cmdID
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@
|
|||
|
||||
#include "lib/test/run.hpp"
|
||||
//#include "lib/test/test-helper.hpp"
|
||||
typedef double gdouble; ////////////////////TODO this is a code smell. Test Code should not depend on GTK. Problem is the usage of gdouble for Screen coordinates in cmdt-context.hpp
|
||||
#include "stage/interact/cmd-context.hpp"
|
||||
//#include "lib/idi/entry-id.hpp"
|
||||
//#include "lib/diff/gen-node.hpp"
|
||||
|
|
|
|||
|
|
@ -32802,8 +32802,8 @@
|
|||
<node CREATED="1617912289933" ID="ID_1605333590" MODIFIED="1617912313582" TEXT="dieser bleibt bestehen bis GdkEventButtonRelease"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1617913164868" ID="ID_113135132" MODIFIED="1617919660564" TEXT="einzurichten">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1617913164868" ID="ID_113135132" MODIFIED="1618690916629" TEXT="einzurichten">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1617913214193" ID="ID_51699428" MODIFIED="1617919672112" TEXT="state flags">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
|
|
@ -32826,21 +32826,22 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1617913205146" ID="ID_1972128766" MODIFIED="1617919747441" TEXT="Callback für Motion-Events">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1617913205146" ID="ID_1972128766" MODIFIED="1618690918521" TEXT="Callback für Motion-Events">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1617919712790" ID="ID_886546906" MODIFIED="1617919741084" TEXT="sehe hier die Motion-Events">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1617919725773" ID="ID_309690589" MODIFIED="1617919738379" TEXT="implicit grab funktioniert">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1618499488724" ID="ID_1241205333" MODIFIED="1618499503562" TEXT="Basis schaffen für eine Hysterese">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1618499488724" ID="ID_1241205333" MODIFIED="1618690930013" TEXT="Basis schaffen für eine Hysterese">
|
||||
<linktarget COLOR="#22d66c" DESTINATION="ID_1241205333" ENDARROW="Default" ENDINCLINATION="35;105;" ID="Arrow_ID_1887863096" SOURCE="ID_1184207694" STARTARROW="None" STARTINCLINATION="348;20;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1618499514672" ID="ID_934736120" MODIFIED="1618499526802" TEXT="nicht jede minimale Bewegung soll eine Dragging-Geste auslösen">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1618499530732" ID="ID_1305245635" MODIFIED="1618499549200" TEXT="das bedeutet: Gestenerkennung vorläufig beginnen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#435e98" CREATED="1618499530732" ID="ID_1305245635" MODIFIED="1618690910469" TEXT="das bedeutet: Gestenerkennung vorläufig beginnen">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -32876,7 +32877,7 @@
|
|||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1618672697029" ID="ID_1737377416" MODIFIED="1618672706489" TEXT="Verfolgung und Pos-Updates">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1618675384464" ID="ID_381912051" MODIFIED="1618675399330" TEXT="Zustandslogik der Gesten-Erkennung selber">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
|
|
@ -32932,10 +32933,16 @@
|
|||
<node CREATED="1618677455637" ID="ID_1287724015" MODIFIED="1618678210573" TEXT="Beschluß: Pixel-Koordinaten bleiben in gdouble">
|
||||
<arrowlink COLOR="#798bb0" DESTINATION="ID_389115801" ENDARROW="Default" ENDINCLINATION="1665;148;" ID="Arrow_ID_267819706" STARTARROW="None" STARTINCLINATION="2440;141;"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1618680945551" HGAP="87" ID="ID_1888024059" MODIFIED="1618680976094" TEXT="Problem: erfordert GTK-Include" VSHIFT="10">
|
||||
<node COLOR="#435e98" CREATED="1618680945551" FOLDED="true" HGAP="87" ID="ID_1888024059" MODIFIED="1618691004190" TEXT="Problem: erfordert GTK-Include" VSHIFT="10">
|
||||
<edge COLOR="#ef844b"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1618680980802" ID="ID_1858177352" MODIFIED="1618680998860" TEXT="zumindest für den CmdContext_test ist das ein Problem"/>
|
||||
<node COLOR="#435e98" CREATED="1618690973298" ID="ID_37829159" MODIFIED="1618690986175" TEXT="daher: nicht auf das Subject-Interface">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1618690987320" ID="ID_1868741682" MODIFIED="1618690998458" TEXT="nur für framework-nahen-Code">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -32948,7 +32955,7 @@
|
|||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1618672778615" ID="ID_623020020" MODIFIED="1618681177621" TEXT="Position aktualisieren">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1618681116488" ID="ID_1434451478" MODIFIED="1618681123602" TEXT="Daten an das Subject weitergeben"/>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1618681157532" ID="ID_905364501" MODIFIED="1618681248572" TEXT="Gestenerkennungs-Logik funktioniert noch nicht">
|
||||
<node COLOR="#435e98" CREATED="1618681157532" ID="ID_905364501" MODIFIED="1618690878227" TEXT="Gestenerkennungs-Logik funktioniert noch nicht">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -32957,10 +32964,37 @@
|
|||
<p>
|
||||
sehe nur die MOVE-Meldungen.<br />eigentlich sollte das Subject ebenfalls Meldungen ausspucken
|
||||
</p>
|
||||
<p>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
⟹ mehrere Gründe...<br />
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
bekomme überhaupt kein motion_event, wenn kein Button gedrückt ist. Liegt das daran, daß ich ein Button-Widget zum Testen verwende??
|
||||
</li>
|
||||
<li>
|
||||
unabhängig davon war die Logik auch sonst kaputt. Die Flag isInFormation_ wurde nicht gesetetzt
|
||||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1618690884114" ID="ID_1184207694" MODIFIED="1618690935797" TEXT="Logik jetzt repariert und Hysterese eingebaut">
|
||||
<arrowlink COLOR="#22d66c" DESTINATION="ID_1241205333" ENDARROW="Default" ENDINCLINATION="35;105;" ID="Arrow_ID_1887863096" STARTARROW="None" STARTINCLINATION="348;20;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1618691013997" ID="ID_429908834" MODIFIED="1618691021757" TEXT="Delta an das Subject weitergeben">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1618691023427" ID="ID_1396949384" MODIFIED="1618691041225" TEXT="im Subject in Modell-Koordinaten transformieren">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1618691042073" ID="ID_1909659922" MODIFIED="1618691048993" TEXT="tatsächlich im Canvas verschieben">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -33271,8 +33305,8 @@
|
|||
</html></richcontent>
|
||||
<arrowlink COLOR="#3a8df0" DESTINATION="ID_1618124128" ENDARROW="Default" ENDINCLINATION="-25;-262;" ID="Arrow_ID_539627804" STARTARROW="Default" STARTINCLINATION="-2;35;"/>
|
||||
<node CREATED="1523019258000" HGAP="-51" ID="ID_974158229" MODIFIED="1618678028294" TEXT="Struktur-Schemata" VSHIFT="-16">
|
||||
<linktarget COLOR="#4f5d91" DESTINATION="ID_974158229" ENDARROW="Default" ENDINCLINATION="383;-2505;" ID="Arrow_ID_1832380552" SOURCE="ID_48107354" STARTARROW="None" STARTINCLINATION="-730;103;"/>
|
||||
<linktarget COLOR="#86889b" DESTINATION="ID_974158229" ENDARROW="Default" ENDINCLINATION="-381;-944;" ID="Arrow_ID_1816207037" SOURCE="ID_708518061" STARTARROW="None" STARTINCLINATION="1299;101;"/>
|
||||
<linktarget COLOR="#4f5d91" DESTINATION="ID_974158229" ENDARROW="Default" ENDINCLINATION="383;-2505;" ID="Arrow_ID_1832380552" SOURCE="ID_48107354" STARTARROW="None" STARTINCLINATION="-730;103;"/>
|
||||
<font NAME="SansSerif" SIZE="14"/>
|
||||
<node CREATED="1523019333461" ID="ID_631113825" MODIFIED="1557498707234" TEXT="UI-Element - Hierarchie">
|
||||
<node CREATED="1523019501198" ID="ID_531041967" MODIFIED="1557498707234" TEXT="Systematisches UI-Modell">
|
||||
|
|
|
|||
Loading…
Reference in a new issue