From a8a44aab0a0f148f82348ee27522d8d6d5d33eca Mon Sep 17 00:00:00 2001 From: Roy-043 Date: Tue, 15 Jul 2025 20:29:44 +0200 Subject: [PATCH] Draft: fix handling of MouseDelay The MouseDelay sets a point value to None. In some cases this point was then still used resulting in attribute errors. See: https://github.com/FreeCAD/FreeCAD/issues/19531#issuecomment-2651341711 --- src/Mod/Draft/draftguitools/gui_arcs.py | 2 ++ src/Mod/Draft/draftguitools/gui_beziers.py | 4 ++++ src/Mod/Draft/draftguitools/gui_ellipses.py | 2 ++ src/Mod/Draft/draftguitools/gui_mirror.py | 2 ++ src/Mod/Draft/draftguitools/gui_offset.py | 2 ++ src/Mod/Draft/draftguitools/gui_points.py | 4 ++++ src/Mod/Draft/draftguitools/gui_polygons.py | 2 ++ src/Mod/Draft/draftguitools/gui_rectangles.py | 2 ++ src/Mod/Draft/draftguitools/gui_rotate.py | 2 ++ src/Mod/Draft/draftguitools/gui_snapper.py | 4 ++++ src/Mod/Draft/draftguitools/gui_splines.py | 2 ++ src/Mod/Draft/draftguitools/gui_trimex.py | 2 ++ 12 files changed, 30 insertions(+) diff --git a/src/Mod/Draft/draftguitools/gui_arcs.py b/src/Mod/Draft/draftguitools/gui_arcs.py index 4f9b03ac0d..0d145c7cd9 100644 --- a/src/Mod/Draft/draftguitools/gui_arcs.py +++ b/src/Mod/Draft/draftguitools/gui_arcs.py @@ -143,6 +143,8 @@ class Arc(gui_base_original.Creator): if arg["Type"] == "SoKeyboardEvent": if arg["Key"] == "ESCAPE": self.finish() + elif not self.ui.mouse: + pass elif arg["Type"] == "SoLocation2Event": # mouse movement detection self.point, ctrlPoint, info = gui_tool_utils.getPoint(self, arg) # this is to make sure radius is what you see on screen diff --git a/src/Mod/Draft/draftguitools/gui_beziers.py b/src/Mod/Draft/draftguitools/gui_beziers.py index dcc907f70a..62b3c48fbd 100644 --- a/src/Mod/Draft/draftguitools/gui_beziers.py +++ b/src/Mod/Draft/draftguitools/gui_beziers.py @@ -93,6 +93,8 @@ class BezCurve(gui_lines.Line): if arg["Key"] == "ESCAPE": self.finish() return + if not self.ui.mouse: + return if arg["Type"] == "SoLocation2Event": # mouse movement detection self.point, ctrlPoint, info = gui_tool_utils.getPoint(self, arg, noTracker=True) # existing points + this pointer position @@ -283,6 +285,8 @@ class CubicBezCurve(gui_lines.Line): if arg["Key"] == "ESCAPE": self.finish() return + if not self.ui.mouse: + return if arg["Type"] == "SoLocation2Event": # mouse movement detection self.point, ctrlPoint, info = gui_tool_utils.getPoint(self, arg, noTracker=True) if (len(self.node) - 1) % self.degree == 0 and len(self.node) > 2: diff --git a/src/Mod/Draft/draftguitools/gui_ellipses.py b/src/Mod/Draft/draftguitools/gui_ellipses.py index 89a4eafdf1..2db338df0c 100644 --- a/src/Mod/Draft/draftguitools/gui_ellipses.py +++ b/src/Mod/Draft/draftguitools/gui_ellipses.py @@ -163,6 +163,8 @@ class Ellipse(gui_base_original.Creator): if arg["Type"] == "SoKeyboardEvent": if arg["Key"] == "ESCAPE": self.finish() + elif not self.ui.mouse: + pass elif arg["Type"] == "SoLocation2Event": # mouse movement detection self.point, ctrlPoint, info = gui_tool_utils.getPoint(self, arg, noTracker=True) self.rect.update(self.point) diff --git a/src/Mod/Draft/draftguitools/gui_mirror.py b/src/Mod/Draft/draftguitools/gui_mirror.py index e710c85fba..4f670fc4ff 100644 --- a/src/Mod/Draft/draftguitools/gui_mirror.py +++ b/src/Mod/Draft/draftguitools/gui_mirror.py @@ -133,6 +133,8 @@ class Mirror(gui_base_original.Modifier): if arg["Type"] == "SoKeyboardEvent": if arg["Key"] == "ESCAPE": self.finish() + elif not self.ui.mouse: + pass elif arg["Type"] == "SoLocation2Event": # mouse movement detection self.point, ctrlPoint, info = gui_tool_utils.getPoint(self, arg) if len(self.node) > 0: diff --git a/src/Mod/Draft/draftguitools/gui_offset.py b/src/Mod/Draft/draftguitools/gui_offset.py index f814385d7e..57d1262ab7 100644 --- a/src/Mod/Draft/draftguitools/gui_offset.py +++ b/src/Mod/Draft/draftguitools/gui_offset.py @@ -161,6 +161,8 @@ class Offset(gui_base_original.Modifier): if arg["Type"] == "SoKeyboardEvent": if arg["Key"] == "ESCAPE": self.finish() + elif not self.ui.mouse: + pass elif arg["Type"] == "SoLocation2Event": self.point, ctrlPoint, info = gui_tool_utils.getPoint(self, arg) if (gui_tool_utils.hasMod(arg, gui_tool_utils.get_mod_constrain_key()) diff --git a/src/Mod/Draft/draftguitools/gui_points.py b/src/Mod/Draft/draftguitools/gui_points.py index 33c0c3412d..1861bed8de 100644 --- a/src/Mod/Draft/draftguitools/gui_points.py +++ b/src/Mod/Draft/draftguitools/gui_points.py @@ -79,6 +79,8 @@ class Point(gui_base_original.Creator): It should automatically update the coordinates in the widgets of the task panel. """ + if not self.ui.mouse: + return event = event_cb.getEvent() mousepos = event.getPosition().getValue() ctrl = event.wasCtrlDown() @@ -101,6 +103,8 @@ class Point(gui_base_original.Creator): It should act as if the Enter key was pressed, or the OK button was pressed in the task panel. """ + if not self.ui.mouse: + return if event_cb: event = event_cb.getEvent() if (event.getState() != coin.SoMouseButtonEvent.DOWN or diff --git a/src/Mod/Draft/draftguitools/gui_polygons.py b/src/Mod/Draft/draftguitools/gui_polygons.py index 8a2d41ef1f..8871f513c7 100644 --- a/src/Mod/Draft/draftguitools/gui_polygons.py +++ b/src/Mod/Draft/draftguitools/gui_polygons.py @@ -113,6 +113,8 @@ class Polygon(gui_base_original.Creator): if arg["Type"] == "SoKeyboardEvent": if arg["Key"] == "ESCAPE": self.finish() + elif not self.ui.mouse: + pass elif arg["Type"] == "SoLocation2Event": # mouse movement detection self.point, ctrlPoint, info = gui_tool_utils.getPoint(self, arg) self.polygonTrack.update(ctrlPoint) diff --git a/src/Mod/Draft/draftguitools/gui_rectangles.py b/src/Mod/Draft/draftguitools/gui_rectangles.py index 637d0545a7..3336c6a339 100644 --- a/src/Mod/Draft/draftguitools/gui_rectangles.py +++ b/src/Mod/Draft/draftguitools/gui_rectangles.py @@ -158,6 +158,8 @@ class Rectangle(gui_base_original.Creator): if arg["Type"] == "SoKeyboardEvent": if arg["Key"] == "ESCAPE": self.finish() + elif not self.ui.mouse: + pass elif arg["Type"] == "SoLocation2Event": # mouse movement detection self.point, ctrlPoint, info = gui_tool_utils.getPoint(self, arg, noTracker=True) self.rect.update(self.point) diff --git a/src/Mod/Draft/draftguitools/gui_rotate.py b/src/Mod/Draft/draftguitools/gui_rotate.py index 3363cc2749..824036b324 100644 --- a/src/Mod/Draft/draftguitools/gui_rotate.py +++ b/src/Mod/Draft/draftguitools/gui_rotate.py @@ -102,6 +102,8 @@ class Rotate(gui_base_original.Modifier): """ if arg["Type"] == "SoKeyboardEvent" and arg["Key"] == "ESCAPE": self.finish() + elif not self.ui.mouse: + pass elif arg["Type"] == "SoLocation2Event": self.handle_mouse_move_event(arg) elif (arg["Type"] == "SoMouseButtonEvent" diff --git a/src/Mod/Draft/draftguitools/gui_snapper.py b/src/Mod/Draft/draftguitools/gui_snapper.py index 3e73fba62d..59ccc48160 100644 --- a/src/Mod/Draft/draftguitools/gui_snapper.py +++ b/src/Mod/Draft/draftguitools/gui_snapper.py @@ -1395,6 +1395,8 @@ class Snapper: self.callbackMove = None def move(event_cb): + if not self.ui.mouse: + return event = event_cb.getEvent() mousepos = event.getPosition() ctrl = event.wasCtrlDown() @@ -1421,6 +1423,8 @@ class Snapper: accept() def click(event_cb): + if not self.ui.mouse: + return event = event_cb.getEvent() if event.getButton() == 1: if event.getState() == coin.SoMouseButtonEvent.DOWN: diff --git a/src/Mod/Draft/draftguitools/gui_splines.py b/src/Mod/Draft/draftguitools/gui_splines.py index fccc23dbd3..2bfe92e3d5 100644 --- a/src/Mod/Draft/draftguitools/gui_splines.py +++ b/src/Mod/Draft/draftguitools/gui_splines.py @@ -85,6 +85,8 @@ class BSpline(gui_lines.Line): if arg["Key"] == "ESCAPE": self.finish() return + if not self.ui.mouse: + return if arg["Type"] == "SoLocation2Event": # mouse movement detection self.point, ctrlPoint, info = gui_tool_utils.getPoint(self, arg, noTracker=True) self.bsplinetrack.update(self.node + [self.point]) diff --git a/src/Mod/Draft/draftguitools/gui_trimex.py b/src/Mod/Draft/draftguitools/gui_trimex.py index 9fdb3c1a8d..4bcec87311 100644 --- a/src/Mod/Draft/draftguitools/gui_trimex.py +++ b/src/Mod/Draft/draftguitools/gui_trimex.py @@ -201,6 +201,8 @@ class Trimex(gui_base_original.Modifier): if arg["Type"] == "SoKeyboardEvent": if arg["Key"] == "ESCAPE": self.finish() + elif not self.ui.mouse: + pass elif arg["Type"] == "SoLocation2Event": # mouse movement detection self.shift = gui_tool_utils.hasMod(arg, gui_tool_utils.get_mod_constrain_key()) self.alt = gui_tool_utils.hasMod(arg, gui_tool_utils.get_mod_alt_key())