Skip to content

Commit 51ac15b

Browse files
committed
Allow one clipping plane dock widget per document
1 parent db1469f commit 51ac15b

4 files changed

Lines changed: 99 additions & 14 deletions

File tree

src/Gui/Clipping.cpp

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
***************************************************************************/
2222

2323
#include <limits>
24+
#include <functional>
2425

2526
#include <Inventor/actions/SoGetBoundingBoxAction.h>
2627
#include <Inventor/nodes/SoClipPlane.h>
@@ -29,6 +30,8 @@
2930
#include <QDockWidget>
3031
#include <QPointer>
3132

33+
#include <App/Application.h>
34+
3235
#include "Clipping.h"
3336
#include "ui_Clipping.h"
3437
#include "DockWindowManager.h"
@@ -51,6 +54,10 @@ class Clipping::Private
5154
bool flipY {false};
5255
bool flipZ {false};
5356
SoTimerSensor* sensor;
57+
App::Document* shownOn {nullptr};
58+
QDockWidget* dockWidget {nullptr};
59+
fastsignals::scoped_connection activeDocConnection;
60+
5461
Private()
5562
{
5663
clipX = new SoClipPlane();
@@ -99,7 +106,7 @@ class Clipping::Private
99106

100107
/* TRANSLATOR Gui::Dialog::Clipping */
101108

102-
Clipping::Clipping(Gui::View3DInventor* view, QWidget* parent)
109+
Clipping::Clipping(Gui::View3DInventor* view, App::Document* showOn, QWidget* parent)
103110
: QDialog(parent)
104111
, d(new Private)
105112
{
@@ -124,6 +131,7 @@ Clipping::Clipping(Gui::View3DInventor* view, QWidget* parent)
124131
d->ui.dirZ->setRange(-max, max);
125132
d->ui.dirZ->setSingleStep(0.1f);
126133
d->ui.dirZ->setValue(1.0f);
134+
d->shownOn = showOn;
127135

128136
d->view = view;
129137
View3DInventorViewer* viewer = view->getViewer();
@@ -190,21 +198,23 @@ Clipping::Clipping(Gui::View3DInventor* view, QWidget* parent)
190198
}
191199
}
192200

193-
Clipping* Clipping::makeDockWidget(Gui::View3DInventor* view)
201+
Clipping* Clipping::makeDockWidget(Gui::View3DInventor* view, App::Document* showOn)
194202
{
195203
// embed this dialog into a QDockWidget
196-
auto clipping = new Clipping(view);
204+
auto clipping = new Clipping(view, showOn);
197205
Gui::DockWindowManager* pDockMgr = Gui::DockWindowManager::instance();
198206
QDockWidget* dw = pDockMgr->addDockWindow("Clipping", clipping, Qt::LeftDockWidgetArea);
199207
dw->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
200208
dw->show();
209+
clipping->d->dockWidget = dw;
201210

202211
return clipping;
203212
}
204213

205214
/** Destroys the object and frees any allocated resources */
206215
Clipping::~Clipping()
207216
{
217+
d->activeDocConnection.disconnect();
208218
d->node->removeChild(d->clipX);
209219
d->node->removeChild(d->clipY);
210220
d->node->removeChild(d->clipZ);
@@ -216,6 +226,8 @@ Clipping::~Clipping()
216226
void Clipping::setupConnections()
217227
{
218228
// clang-format off
229+
d->activeDocConnection = App::GetApplication().signalActiveDocument.connect(
230+
std::bind(&Clipping::onActiveDocument, this, std::placeholders::_1));
219231
connect(d->ui.groupBoxX, &QGroupBox::toggled,
220232
this, &Clipping::onGroupBoxXToggled);
221233
connect(d->ui.groupBoxY, &QGroupBox::toggled,
@@ -259,7 +271,18 @@ void Clipping::reject()
259271
dw->deleteLater();
260272
}
261273
}
262-
274+
void Clipping::onActiveDocument(const App::Document& doc)
275+
{
276+
if (!d || !d->dockWidget) {
277+
return;
278+
}
279+
if (&doc == d->shownOn) {
280+
d->dockWidget->show();
281+
}
282+
else {
283+
d->dockWidget->hide();
284+
}
285+
}
263286
void Clipping::onGroupBoxXToggled(bool on)
264287
{
265288
if (on) {

src/Gui/Clipping.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
#include <QDialog>
2727
#include <FCGlobal.h>
2828

29+
namespace App
30+
{
31+
class Document;
32+
}
33+
2934
namespace Gui
3035
{
3136
class View3DInventor;
@@ -40,12 +45,13 @@ class GuiExport Clipping: public QDialog
4045
Q_OBJECT
4146

4247
public:
43-
static Clipping* makeDockWidget(Gui::View3DInventor*);
44-
Clipping(Gui::View3DInventor* view, QWidget* parent = nullptr);
48+
static Clipping* makeDockWidget(Gui::View3DInventor*, App::Document* showOn);
49+
Clipping(Gui::View3DInventor* view, App::Document* showOn, QWidget* parent = nullptr);
4550
~Clipping() override;
4651

4752
protected:
4853
void setupConnections();
54+
void onActiveDocument(const App::Document& doc);
4955
void onGroupBoxXToggled(bool);
5056
void onGroupBoxYToggled(bool);
5157
void onGroupBoxZToggled(bool);

src/Gui/CommandView.cpp

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
***************************************************************************/
2222

2323
#include <sstream>
24+
#include <vector>
25+
#include <tuple>
26+
2427
#include <Inventor/events/SoMouseButtonEvent.h>
2528
#include <Inventor/nodes/SoOrthographicCamera.h>
2629
#include <Inventor/nodes/SoPerspectiveCamera.h>
@@ -640,7 +643,34 @@ void StdCmdFreezeViews::languageChange()
640643
// Std_ToggleClipPlane
641644
//===========================================================================
642645

643-
DEF_STD_CMD_AC(StdCmdToggleClipPlane)
646+
class StdCmdToggleClipPlane: public Gui::Command
647+
{
648+
public:
649+
StdCmdToggleClipPlane();
650+
virtual ~StdCmdToggleClipPlane()
651+
{}
652+
virtual const char* className() const
653+
{
654+
return "StdCmdToggleClipPlane";
655+
}
656+
657+
protected:
658+
virtual void activated(int iMsg);
659+
virtual bool isActive(void);
660+
virtual Gui::Action* createAction(void);
661+
662+
private:
663+
StdCmdToggleClipPlane(const StdCmdToggleClipPlane&) = delete;
664+
StdCmdToggleClipPlane(StdCmdToggleClipPlane&&) = delete;
665+
StdCmdToggleClipPlane& operator=(const StdCmdToggleClipPlane&) = delete;
666+
StdCmdToggleClipPlane& operator=(StdCmdToggleClipPlane&&) = delete;
667+
668+
void garbageCollect();
669+
bool hasClipping(App::Document* doc) const;
670+
671+
private:
672+
std::vector<std::pair<App::Document*, QPointer<Gui::Dialog::Clipping>>> clippings;
673+
};
644674

645675
StdCmdToggleClipPlane::StdCmdToggleClipPlane()
646676
: Command("Std_ToggleClipPlane")
@@ -663,11 +693,15 @@ Action* StdCmdToggleClipPlane::createAction()
663693
void StdCmdToggleClipPlane::activated(int iMsg)
664694
{
665695
Q_UNUSED(iMsg);
666-
static QPointer<Gui::Dialog::Clipping> clipping = nullptr;
667-
if (!clipping) {
696+
App::Document* doc = getActiveDocument();
697+
if (!doc) {
698+
return;
699+
}
700+
garbageCollect(); // remove dead pointers
701+
if (!hasClipping(doc)) {
668702
auto view = qobject_cast<View3DInventor*>(getMainWindow()->activeWindow());
669703
if (view) {
670-
clipping = Gui::Dialog::Clipping::makeDockWidget(view);
704+
clippings.push_back(std::make_pair(doc, Gui::Dialog::Clipping::makeDockWidget(view, doc)));
671705
}
672706
}
673707
}
@@ -678,6 +712,31 @@ bool StdCmdToggleClipPlane::isActive()
678712
return view ? true : false;
679713
}
680714

715+
void StdCmdToggleClipPlane::garbageCollect()
716+
{
717+
// We assume the vector to be small
718+
std::vector<std::pair<App::Document*, QPointer<Gui::Dialog::Clipping>>> newClippings;
719+
newClippings.reserve(clippings.size());
720+
std::copy_if(
721+
clippings.begin(),
722+
clippings.end(),
723+
std::back_inserter(newClippings),
724+
[](const std::pair<App::Document*, QPointer<Gui::Dialog::Clipping>>& clipPair) -> bool {
725+
return clipPair.second != nullptr;
726+
}
727+
);
728+
clippings = newClippings;
729+
}
730+
bool StdCmdToggleClipPlane::hasClipping(App::Document* doc) const
731+
{
732+
return std::ranges::find(
733+
clippings,
734+
doc,
735+
&std::pair<App::Document*, QPointer<Gui::Dialog::Clipping>>::first
736+
)
737+
!= clippings.end();
738+
}
739+
681740
//===========================================================================
682741
// StdCmdDrawStyle
683742
//===========================================================================

src/Mod/PartDesign/Gui/ViewProvider.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,7 @@ bool ViewProvider::setEdit(int ModNum)
172172
}
173173
}
174174

175-
auto editDoc = Gui::Application::Instance->editDocument([this](Gui::Document* editdoc) {
176-
return editdoc->getEditViewProvider() == this;
177-
});
178-
Gui::Control().showDialog(featureDlg, editDoc->getDocument());
175+
Gui::Control().showDialog(featureDlg);
179176
return true;
180177
}
181178
else {

0 commit comments

Comments
 (0)