diff --git a/src/Mod/Draft/CMakeLists.txt b/src/Mod/Draft/CMakeLists.txt
index 5d3a234361..2b903053fe 100644
--- a/src/Mod/Draft/CMakeLists.txt
+++ b/src/Mod/Draft/CMakeLists.txt
@@ -97,6 +97,7 @@ SET(Draft_GUI_tools
draftguitools/gui_trackers.py
draftguitools/gui_edit.py
draftguitools/gui_lineops.py
+ draftguitools/gui_togglemodes.py
draftguitools/README.md
)
diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py
index e76434bb95..b59b4dedea 100644
--- a/src/Mod/Draft/DraftTools.py
+++ b/src/Mod/Draft/DraftTools.py
@@ -80,6 +80,8 @@ import draftguitools.gui_planeproxy
from draftguitools.gui_lineops import FinishLine
from draftguitools.gui_lineops import CloseLine
from draftguitools.gui_lineops import UndoLine
+from draftguitools.gui_togglemodes import ToggleConstructionMode
+from draftguitools.gui_togglemodes import ToggleContinueMode
# import DraftFillet
import drafttaskpanels.task_shapestring as task_shapestring
import drafttaskpanels.task_scale as task_scale
@@ -4124,30 +4126,6 @@ class Scale(Modifier):
for ghost in self.ghosts:
ghost.finalize()
-class ToggleConstructionMode():
- """The Draft_ToggleConstructionMode FreeCAD command definition"""
-
- def GetResources(self):
- return {'Pixmap' : 'Draft_Construction',
- 'MenuText': QtCore.QT_TRANSLATE_NOOP("Draft_ToggleConstructionMode", "Toggle Construction Mode"),
- 'Accel' : "C, M",
- 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_ToggleConstructionMode", "Toggles the Construction Mode for next objects.")}
-
- def Activated(self):
- FreeCADGui.draftToolBar.constrButton.toggle()
-
-
-class ToggleContinueMode():
- """The Draft_ToggleContinueMode FreeCAD command definition"""
-
- def GetResources(self):
- return {'Pixmap' : 'Draft_Rotate',
- 'MenuText': QtCore.QT_TRANSLATE_NOOP("Draft_ToggleContinueMode", "Toggle Continue Mode"),
- 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_ToggleContinueMode", "Toggles the Continue Mode for next commands.")}
-
- def Activated(self):
- FreeCADGui.draftToolBar.toggleContinue()
-
class Drawing(Modifier):
"""The Draft Drawing command definition"""
@@ -5444,8 +5422,6 @@ FreeCADGui.addCommand('Draft_Slope',Draft_Slope())
FreeCADGui.addCommand('Draft_Stretch',Stretch())
# context commands
-FreeCADGui.addCommand('Draft_ToggleConstructionMode',ToggleConstructionMode())
-FreeCADGui.addCommand('Draft_ToggleContinueMode',ToggleContinueMode())
FreeCADGui.addCommand('Draft_ApplyStyle',ApplyStyle())
FreeCADGui.addCommand('Draft_ToggleDisplayMode',ToggleDisplayMode())
FreeCADGui.addCommand('Draft_AddToGroup',AddToGroup())
diff --git a/src/Mod/Draft/Resources/Draft.qrc b/src/Mod/Draft/Resources/Draft.qrc
index 5e0c16a03b..45efb36c65 100644
--- a/src/Mod/Draft/Resources/Draft.qrc
+++ b/src/Mod/Draft/Resources/Draft.qrc
@@ -20,6 +20,7 @@
icons/Draft_CircularArray.svgicons/Draft_Clone.svgicons/Draft_Construction.svg
+ icons/Draft_Continue.svgicons/Draft_CubicBezCurve.svgicons/Draft_Cursor.svgicons/Draft_DelPoint.svg
diff --git a/src/Mod/Draft/Resources/icons/Draft_Continue.svg b/src/Mod/Draft/Resources/icons/Draft_Continue.svg
new file mode 100644
index 0000000000..519d134230
--- /dev/null
+++ b/src/Mod/Draft/Resources/icons/Draft_Continue.svg
@@ -0,0 +1,146 @@
+
+
diff --git a/src/Mod/Draft/draftguitools/gui_togglemodes.py b/src/Mod/Draft/draftguitools/gui_togglemodes.py
new file mode 100644
index 0000000000..e0eb690ae4
--- /dev/null
+++ b/src/Mod/Draft/draftguitools/gui_togglemodes.py
@@ -0,0 +1,153 @@
+# ***************************************************************************
+# * (c) 2009, 2010 Yorik van Havre *
+# * (c) 2009, 2010 Ken Cline *
+# * (c) 2020 Eliud Cabrera Castillo *
+# * *
+# * This file is part of the FreeCAD CAx development system. *
+# * *
+# * This program is free software; you can redistribute it and/or modify *
+# * it under the terms of the GNU Lesser General Public License (LGPL) *
+# * as published by the Free Software Foundation; either version 2 of *
+# * the License, or (at your option) any later version. *
+# * for detail see the LICENCE text file. *
+# * *
+# * FreeCAD is distributed in the hope that it will be useful, *
+# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+# * GNU Library General Public License for more details. *
+# * *
+# * You should have received a copy of the GNU Library General Public *
+# * License along with FreeCAD; if not, write to the Free Software *
+# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
+# * USA *
+# * *
+# ***************************************************************************
+"""Provides tools to control the mode of other tools in the Draft Workbench.
+
+For example, a construction mode, and a continue mode to repeat commands.
+"""
+## @package gui_togglemodes
+# \ingroup DRAFT
+# \brief Provides certain mode operations of the Draft Workbench.
+from PySide.QtCore import QT_TRANSLATE_NOOP
+
+import FreeCADGui as Gui
+import Draft_rc
+import draftguitools.gui_base as gui_base
+from draftutils.messages import _msg
+from draftutils.translate import _tr
+
+# The module is used to prevent complaints from code checkers (flake8)
+True if Draft_rc.__name__ else False
+
+
+class BaseMode(gui_base.GuiCommandSimplest):
+ """Base class for mode context GuiCommands.
+
+ This is inherited by the other GuiCommand classes to run
+ a set of similar actions when changing modes.
+
+ It inherits `GuiCommandSimplest` to set up the document
+ and other behavior. See this class for more information.
+ """
+
+ def Activated(self, mode="None"):
+ """Execute when the command is called.
+
+ Parameters
+ ----------
+ action: str
+ Indicates the type of mode to switch to.
+ It can be `'construction'` or `'continue'`.
+ """
+ super().Activated()
+
+ if hasattr(Gui, "draftToolBar"):
+ _ui = Gui.draftToolBar
+ else:
+ _msg(_tr("No active Draft Toolbar."))
+ return
+
+ if _ui is not None:
+ if mode == "construction" and hasattr(_ui, "constrButton"):
+ _ui.constrButton.toggle()
+ elif mode == "continue":
+ _ui.toggleContinue()
+
+
+class ToggleConstructionMode(BaseMode):
+ """GuiCommand for the Draft_ToggleConstructionMode tool.
+
+ When construction mode is active, the following objects created
+ will be included in the construction group, and will be drawn
+ with the specified color and properties.
+ """
+
+ def __init__(self):
+ super().__init__(name=_tr("Construction mode"))
+
+ def GetResources(self):
+ """Set icon, menu and tooltip."""
+ _menu = "Toggle construction mode"
+ _tip = ("Toggles the Construction mode.\n"
+ "When this is active, the following objects created "
+ "will be included in the construction group, "
+ "and will be drawn with the specified color "
+ "and properties.")
+
+ d = {'Pixmap': 'Draft_Construction',
+ 'MenuText': QT_TRANSLATE_NOOP("Draft_ToggleConstructionMode",
+ _menu),
+ 'Accel': "C, M",
+ 'ToolTip': QT_TRANSLATE_NOOP("Draft_ToggleConstructionMode",
+ _tip)}
+ return d
+
+ def Activated(self):
+ """Execute when the command is called.
+
+ It calls the `toggle()` method of the construction button
+ in the `DraftToolbar` class.
+ """
+ super().Activated(mode="construction")
+
+
+Gui.addCommand('Draft_ToggleConstructionMode', ToggleConstructionMode())
+
+
+class ToggleContinueMode(BaseMode):
+ """GuiCommand for the Draft_ToggleContinueMode tool.
+
+ When continue mode is active, any drawing tool that is terminated
+ will automatically start again. This can be used to draw several
+ objects one after the other in succession.
+ """
+
+ def __init__(self):
+ super().__init__(name=_tr("Continue mode"))
+
+ def GetResources(self):
+ """Set icon, menu and tooltip."""
+ _menu = "Toggle continue mode"
+ _tip = ("Toggles the Continue mode.\n"
+ "When this is active, any drawing tool that is terminated "
+ "will automatically start again.\n"
+ "This can be used to draw several objects "
+ "one after the other in succession.")
+
+ d = {'Pixmap': 'Draft_Continue',
+ 'MenuText': QT_TRANSLATE_NOOP("Draft_ToggleContinueMode",
+ _menu),
+ 'ToolTip': QT_TRANSLATE_NOOP("Draft_ToggleContinueMode",
+ _tip)}
+ return d
+
+ def Activated(self):
+ """Execute when the command is called.
+
+ It calls the `toggleContinue()` method of the `DraftToolbar` class.
+ """
+ super().Activated(mode="continue")
+
+
+Gui.addCommand('Draft_ToggleContinueMode', ToggleContinueMode())