Prechádzať zdrojové kódy

Gui Button mouse undown

Arthur Yefimov 3 rokov pred
rodič
commit
d7c1bf5be8
2 zmenil súbory, kde vykonal 50 pridanie a 1 odobranie
  1. 40 1
      Programs/Gui.Mod
  2. 10 0
      Programs/TestGui.Mod

+ 40 - 1
Programs/Gui.Mod

@@ -14,6 +14,7 @@ TYPE
   END;
 
   DrawHandler* = PROCEDURE (W: Widget; x, y: INTEGER);
+  MouseMoveHandler* = PROCEDURE (W: Widget; x, y, btn: INTEGER);
   MouseDownHandler* = PROCEDURE (W: Widget; x, y, btn: INTEGER);
   MouseUpHandler* = PROCEDURE (W: Widget; x, y, btn: INTEGER);
   ClickHandler* = PROCEDURE (W: Widget);
@@ -36,6 +37,7 @@ TYPE
     prev*, next*: Widget;
     draw*: DrawHandler;
     (* Event Handlers *)
+    onMouseMove*: MouseMoveHandler;
     onMouseDown*: MouseDownHandler;
     onMouseUp*: MouseUpHandler;
     onClick*: ClickHandler;
@@ -61,6 +63,11 @@ VAR
 
 (* Widget *)
 
+PROCEDURE SetOnMouseMove*(W: Widget; handler: MouseMoveHandler);
+BEGIN
+  W.onMouseMove := handler
+END SetOnMouseMove;
+
 PROCEDURE SetOnMouseDown*(W: Widget; handler: MouseDownHandler);
 BEGIN
   W.onMouseDown := handler
@@ -84,6 +91,7 @@ BEGIN
   w.visible := TRUE;
   w.enabled := TRUE;
   w.draw := NIL;
+  w.onMouseMove := NIL;
   w.onMouseDown := NIL;
   w.onMouseUp := NIL;
   w.onClick := NIL;
@@ -179,6 +187,13 @@ RETURN font END GetFont;
 
 (* General *)
 
+PROCEDURE TriggerOnMouseMove*(W: Widget; x, y, btn: INTEGER);
+BEGIN
+  IF (W # NIL) & (W.onMouseMove # NIL) THEN
+    W.onMouseMove(W, x, y, btn)
+  END
+END TriggerOnMouseMove;
+
 PROCEDURE TriggerOnMouseDown*(W: Widget; x, y, btn: INTEGER);
 BEGIN
   IF (W # NIL) & (W.onMouseDown # NIL) THEN
@@ -229,6 +244,27 @@ BEGIN
   END
 END WindowToWidgetXY;
 
+PROCEDURE HandleMouseMoveEvent*(e: G.Event);
+VAR W: Widget;
+  x, y: INTEGER;
+BEGIN
+  x := e.x; y := e.y;
+  IF globalWin.curMouseDownWidget # NIL THEN
+    W := globalWin.curMouseDownWidget;
+    WindowToWidgetXY(W, x, y);
+    IF (x >= 0) & (y >= 0) & (W.w > x) & (W.h > y) (*& (e.button = 1)*) THEN
+      INCL(W.state, down)
+    ELSE EXCL(W.state, down)
+    END
+  ELSE
+    W := FindWidgetUnderMouse(globalWin, x, y);
+  END;
+  IF W # NIL THEN
+    INCL(W.state, hover); (* Mark button as being mouse-hovered *) (*!FIXME not done yet*)
+    TriggerOnMouseMove(W, x, y, e.button)
+  END
+END HandleMouseMoveEvent;
+
 PROCEDURE HandleMouseDownEvent*(e: G.Event);
 VAR W: Widget;
   x, y: INTEGER;
@@ -248,6 +284,7 @@ VAR W: Widget;
 BEGIN
   x := e.x; y := e.y;
   W := globalWin.curMouseDownWidget;
+  globalWin.curMouseDownWidget := NIL;
   IF W # NIL THEN
     WindowToWidgetXY(W, x, y);
     EXCL(W.state, down);
@@ -260,7 +297,9 @@ END HandleMouseUpEvent;
 
 PROCEDURE HandleEvent(e: G.Event);
 BEGIN
-  IF e.type = G.mouseDown THEN
+  IF e.type = G.mouseMove THEN
+    HandleMouseMoveEvent(e)
+  ELSIF e.type = G.mouseDown THEN
     HandleMouseDownEvent(e)
   ELSIF e.type = G.mouseUp THEN
     HandleMouseUpEvent(e)

+ 10 - 0
Programs/TestGui.Mod

@@ -15,6 +15,15 @@ BEGIN
   INC(W.tag)
 END BtnOnClick;
 
+PROCEDURE MyButtonMouseMove(W: Gui.Widget; x, y, btn: INTEGER);
+VAR s: ARRAY 30 OF CHAR;
+BEGIN
+  Int.Str(x, s);
+  Strings.Append(':', s);
+  Int.Append(y, s);
+  Gui.SetText(W, s)
+END MyButtonMouseMove;
+
 PROCEDURE MyButtonMouseDown(W: Gui.Widget; x, y, btn: INTEGER);
 VAR s: ARRAY 30 OF CHAR;
 BEGIN
@@ -45,6 +54,7 @@ BEGIN
   win := Gui.NewWindow(320, 200);
 
   btn := B.NewButton(110, 24, 'Нажми меня');
+  Gui.SetOnMouseMove(btn, MyButtonMouseMove);
   Gui.SetOnMouseDown(btn, MyButtonMouseDown);
   Gui.SetOnMouseUp(btn, MyButtonMouseUp);
   Gui.SetOnClick(btn, BtnOnClick);