diff --git a/src/Gui/CMakeLists.txt b/src/Gui/CMakeLists.txt index ab93d16cac..47ea8eb749 100644 --- a/src/Gui/CMakeLists.txt +++ b/src/Gui/CMakeLists.txt @@ -1079,6 +1079,7 @@ SET(Inventor_CPP_SRCS Inventor/SoFCBoundingBox.cpp Inventor/SoMouseWheelEvent.cpp Inventor/SoFCTransform.cpp + Inventor/SoToggleSwitch.cpp Inventor/Draggers/SoTransformDragger.cpp Inventor/Draggers/SoLinearDragger.cpp Inventor/Draggers/SoPlanarDragger.cpp @@ -1115,6 +1116,7 @@ SET(Inventor_SRCS Inventor/SoFCBoundingBox.h Inventor/SoMouseWheelEvent.h Inventor/SoFCTransform.h + Inventor/SoToggleSwitch.h Inventor/Draggers/SoTransformDragger.h Inventor/Draggers/SoLinearDragger.h Inventor/Draggers/SoPlanarDragger.h diff --git a/src/Gui/Inventor/SoToggleSwitch.cpp b/src/Gui/Inventor/SoToggleSwitch.cpp new file mode 100644 index 0000000000..0fc1694220 --- /dev/null +++ b/src/Gui/Inventor/SoToggleSwitch.cpp @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/**************************************************************************** + * * + * Copyright (c) 2025 Sayantan Deb * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + ***************************************************************************/ + +#include "SoToggleSwitch.h" + +SO_NODE_SOURCE(SoToggleSwitch) + +void SoToggleSwitch::initClass() +{ + SO_NODE_INIT_CLASS(SoToggleSwitch, SoSwitch, "Switch"); +} + +SoToggleSwitch::SoToggleSwitch() +{ + SO_NODE_CONSTRUCTOR(SoToggleSwitch); + SO_NODE_ADD_FIELD(on, (1)); + + whichChild = SO_SWITCH_ALL; +} + +void SoToggleSwitch::toggle() +{ + on = !on.getValue(); +} + +void SoToggleSwitch::notify(SoNotList* notList) +{ + assert(notList); + if (notList->getLastField() == &on) { + whichChild = on.getValue()? SO_SWITCH_ALL : SO_SWITCH_NONE; + } + + inherited::notify(notList); +} diff --git a/src/Gui/Inventor/SoToggleSwitch.h b/src/Gui/Inventor/SoToggleSwitch.h new file mode 100644 index 0000000000..11c9c90dd6 --- /dev/null +++ b/src/Gui/Inventor/SoToggleSwitch.h @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +/**************************************************************************** + * * + * Copyright (c) 2025 Sayantan Deb * + * * + * This file is part of FreeCAD. * + * * + * FreeCAD is free software: you can redistribute it and/or modify it * + * under the terms of the GNU Lesser General Public License as * + * published by the Free Software Foundation, either version 2.1 of the * + * License, or (at your option) any later version. * + * * + * 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with FreeCAD. If not, see * + * . * + * * + ***************************************************************************/ + +#ifndef SO_TOGGLE_SWITCH +#define SO_TOGGLE_SWITCH + +#include +#include + + +/** + * A switch that can be used to show or hide all child nodes + */ +class SoToggleSwitch: public SoSwitch +{ + SO_NODE_HEADER(SoToggleSwitch); + +public: + static void initClass(); + SoToggleSwitch(); + + // the switch is on be default + SoSFBool on; + // toggles the switch state + void toggle(); + +protected: + ~SoToggleSwitch() override = default; + + void notify(SoNotList* notList) override; + +private: + using inherited = SoSwitch; +}; + +#endif /* SO_TOGGLE_SWITCH */ diff --git a/src/Gui/Utilities.h b/src/Gui/Utilities.h index cae7971abe..623165742d 100644 --- a/src/Gui/Utilities.h +++ b/src/Gui/Utilities.h @@ -446,9 +446,16 @@ private: #define FC_SET_SWITCH(__name__, __state__) \ do { \ SoSwitch* sw = SO_GET_ANY_PART(this, __name__, SoSwitch); \ + assert(sw); \ sw->whichChild = __state__; \ } while (0) +#define FC_SET_TOGGLE_SWITCH(__name__, __state__) \ +do { \ + SoToggleSwitch* sw = SO_GET_ANY_PART(this, __name__, SoToggleSwitch); \ + assert(sw); \ + sw->on = __state__; \ +} while (0) struct RotationComponents { float angle;