Gui: add SoToggleSwitch class

update
This commit is contained in:
captain0xff
2025-07-06 23:28:52 +05:30
parent cd8ddd1b9b
commit d109100ced
4 changed files with 119 additions and 0 deletions

View File

@@ -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

View File

@@ -0,0 +1,54 @@
// SPDX-License-Identifier: LGPL-2.1-or-later
/****************************************************************************
* *
* Copyright (c) 2025 Sayantan Deb <sayantandebin[at]gmail.com> *
* *
* 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 *
* <https://www.gnu.org/licenses/>. *
* *
***************************************************************************/
#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);
}

View File

@@ -0,0 +1,56 @@
// SPDX-License-Identifier: LGPL-2.1-or-later
/****************************************************************************
* *
* Copyright (c) 2025 Sayantan Deb <sayantandebin[at]gmail.com> *
* *
* 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 *
* <https://www.gnu.org/licenses/>. *
* *
***************************************************************************/
#ifndef SO_TOGGLE_SWITCH
#define SO_TOGGLE_SWITCH
#include <Inventor/fields/SoSFBool.h>
#include <Inventor/nodes/SoSwitch.h>
/**
* 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 */

View File

@@ -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;