From 5d3f9cac3f1db12e5e42eae5a8e551c9c5a0ed26 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 21 Jan 2025 23:26:46 +0100 Subject: [PATCH] Measure: Implement quick measure as command and make it toggable The quick measure can considerably slow down the system when selecting part elements. With this change the user is able to turn off this bottleneck. --- src/Gui/Workbench.cpp | 3 +- src/Mod/Measure/Gui/AppMeasureGui.cpp | 5 -- src/Mod/Measure/Gui/Command.cpp | 66 +++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/src/Gui/Workbench.cpp b/src/Gui/Workbench.cpp index e1ce0534ab..c6eefc3ddf 100644 --- a/src/Gui/Workbench.cpp +++ b/src/Gui/Workbench.cpp @@ -723,6 +723,7 @@ MenuItem* StdWorkbench::setupMenuBar() const << "Separator"; #endif *tool << "Std_Measure" + << "Std_QuickMeasure" << "Std_UnitsCalculator" << "Separator" << "Std_ViewLoadImage" @@ -812,7 +813,7 @@ ToolBarItem* StdWorkbench::setupToolBars() const auto view = new ToolBarItem( root ); view->setCommand("View"); *view << "Std_ViewFitAll" << "Std_ViewFitSelection" << "Std_ViewGroup" << "Std_AlignToSelection" - << "Separator" << "Std_DrawStyle" << "Std_TreeViewActions" << "Std_Measure"; + << "Separator" << "Std_DrawStyle" << "Std_TreeViewActions" << "Std_Measure" << "Std_QuickMeasure"; // Individual views auto individualViews = new ToolBarItem(root, ToolBarItem::DefaultVisibility::Hidden); diff --git a/src/Mod/Measure/Gui/AppMeasureGui.cpp b/src/Mod/Measure/Gui/AppMeasureGui.cpp index 7283fc9bcb..e282e00f9c 100644 --- a/src/Mod/Measure/Gui/AppMeasureGui.cpp +++ b/src/Mod/Measure/Gui/AppMeasureGui.cpp @@ -32,7 +32,6 @@ #include #include "DlgPrefsMeasureAppearanceImp.h" -#include "QuickMeasure.h" #include "QuickMeasurePy.h" #include "ViewProviderMeasureAngle.h" #include "ViewProviderMeasureDistance.h" @@ -112,9 +111,5 @@ PyMOD_INIT_FUNC(MeasureGui) Base::Interpreter().addType(&MeasureGui::QuickMeasurePy::Type, mod, "QuickMeasure"); - // Create a QuickMeasure instance - auto measure = new MeasureGui::QuickMeasure(QApplication::instance()); - Q_UNUSED(measure) - PyMOD_Return(mod); } diff --git a/src/Mod/Measure/Gui/Command.cpp b/src/Mod/Measure/Gui/Command.cpp index 2a138080fa..5f78fd85eb 100644 --- a/src/Mod/Measure/Gui/Command.cpp +++ b/src/Mod/Measure/Gui/Command.cpp @@ -20,8 +20,13 @@ **************************************************************************/ #include "PreCompiled.h" +#ifndef _PreComp_ +#include +#endif +#include #include +#include #include #include #include @@ -30,6 +35,7 @@ #include #include +#include "QuickMeasure.h" #include "TaskMeasure.h" @@ -76,6 +82,65 @@ bool StdCmdMeasure::isActive() return false; } + +class StdCmdQuickMeasure: public Gui::Command +{ +public: + StdCmdQuickMeasure() + : Command("Std_QuickMeasure") + { + sGroup = "Measure"; + sMenuText = QT_TR_NOOP("&Quick measure"); + sToolTipText = QT_TR_NOOP("Toggle quick measure"); + sWhatsThis = "Std_QuickMeasure"; + sStatusTip = QT_TR_NOOP("Toggle quick measure"); + accessParameter(); + } + ~StdCmdQuickMeasure() override = default; + StdCmdQuickMeasure(const StdCmdQuickMeasure&) = delete; + StdCmdQuickMeasure(StdCmdQuickMeasure&&) = delete; + StdCmdQuickMeasure& operator=(const StdCmdQuickMeasure&) = delete; + StdCmdQuickMeasure& operator=(StdCmdQuickMeasure&&) = delete; + + const char* className() const override + { + return "StdCmdQuickMeasure"; + } + +protected: + void activated(int iMsg) override + { + if (parameter.isValid()) { + parameter->SetBool("EnableQuickMeasure", iMsg > 0); + } + + if (iMsg == 0) { + quickMeasure.reset(); + } + else { + quickMeasure = std::make_unique(QApplication::instance()); + } + } + Gui::Action* createAction() override + { + Gui::Action* action = Gui::Command::createAction(); + action->setCheckable(true); + action->setChecked(parameter->GetBool("EnableQuickMeasure", false)); + return action; + } + void accessParameter() + { + // clang-format off + parameter = App::GetApplication().GetUserParameter(). + GetGroup("BaseApp/Preferences/Mod/Measure"); + // clang-format on + } + +private: + std::unique_ptr quickMeasure; + ParameterGrp::handle parameter; +}; + void CreateMeasureCommands() { Gui::CommandManager& rcCmdMgr = Gui::Application::Instance->commandManager(); @@ -83,4 +148,5 @@ void CreateMeasureCommands() auto cmd = new StdCmdMeasure(); cmd->initAction(); rcCmdMgr.addCommand(cmd); + rcCmdMgr.addCommand(new StdCmdQuickMeasure); }