From a441cb95c862ff495d3c5358d5d6fa99cc51a731 Mon Sep 17 00:00:00 2001 From: wmayer Date: Thu, 9 Jan 2020 11:26:30 +0100 Subject: [PATCH] fixes #0004244: Std_SetAppearance always appears on a corner of the secondary monitor --- src/Gui/CommandView.cpp | 11 +++++- src/Gui/DlgDisplayPropertiesImp.cpp | 59 ++++++++++++++++++++++++----- src/Gui/DlgDisplayPropertiesImp.h | 33 ++++++++++++++-- 3 files changed, 90 insertions(+), 13 deletions(-) diff --git a/src/Gui/CommandView.cpp b/src/Gui/CommandView.cpp index 1e23e2ecea..14f1912562 100644 --- a/src/Gui/CommandView.cpp +++ b/src/Gui/CommandView.cpp @@ -1078,17 +1078,26 @@ StdCmdSetAppearance::StdCmdSetAppearance() void StdCmdSetAppearance::activated(int iMsg) { Q_UNUSED(iMsg); +#if 0 static QPointer dlg = 0; if (!dlg) - dlg = new Gui::Dialog::DlgDisplayPropertiesImp(getMainWindow()); + dlg = new Gui::Dialog::DlgDisplayPropertiesImp(true, getMainWindow()); dlg->setModal(false); dlg->setAttribute(Qt::WA_DeleteOnClose); dlg->show(); +#else + Gui::Control().showDialog(new Gui::Dialog::TaskDisplayProperties()); +#endif } bool StdCmdSetAppearance::isActive(void) { +#if 0 return Gui::Selection().size() != 0; +#else + return (Gui::Control().activeDialog() == nullptr) && + (Gui::Selection().size() != 0); +#endif } //=========================================================================== diff --git a/src/Gui/DlgDisplayPropertiesImp.cpp b/src/Gui/DlgDisplayPropertiesImp.cpp index 7fd46c5f2b..3b2b9925d0 100644 --- a/src/Gui/DlgDisplayPropertiesImp.cpp +++ b/src/Gui/DlgDisplayPropertiesImp.cpp @@ -64,6 +64,7 @@ class DlgDisplayPropertiesImp::Private typedef boost::signals2::connection DlgDisplayPropertiesImp_Connection; public: Ui::DlgDisplayProperties ui; + bool floating; DlgDisplayPropertiesImp_Connection connectChangedObject; }; @@ -74,7 +75,7 @@ public: * The dialog will by default be modeless, unless you set 'modal' to * true to construct a modal dialog. */ -DlgDisplayPropertiesImp::DlgDisplayPropertiesImp(QWidget* parent, Qt::WindowFlags fl) +DlgDisplayPropertiesImp::DlgDisplayPropertiesImp(bool floating, QWidget* parent, Qt::WindowFlags fl) : QDialog( parent, fl ) , d(new Private) { @@ -83,6 +84,7 @@ DlgDisplayPropertiesImp::DlgDisplayPropertiesImp(QWidget* parent, Qt::WindowFlag d->ui.changePlot->hide(); d->ui.buttonLineColor->setModal(false); d->ui.buttonColor->setModal(false); + d->floating = floating; std::vector views = getSelection(); setDisplayModes(views); @@ -97,11 +99,13 @@ DlgDisplayPropertiesImp::DlgDisplayPropertiesImp(QWidget* parent, Qt::WindowFlag setLineTransparency(views); // embed this dialog into a dockable widget container - Gui::DockWindowManager* pDockMgr = Gui::DockWindowManager::instance(); - QDockWidget* dw = pDockMgr->addDockWindow("Display properties", this, Qt::AllDockWidgetAreas); - dw->setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable); - dw->setFloating(true); - dw->show(); + if (floating) { + Gui::DockWindowManager* pDockMgr = Gui::DockWindowManager::instance(); + QDockWidget* dw = pDockMgr->addDockWindow("Display properties", this, Qt::AllDockWidgetAreas); + dw->setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetFloatable); + dw->setFloating(true); + dw->show(); + } Gui::Selection().Attach(this); @@ -120,6 +124,11 @@ DlgDisplayPropertiesImp::~DlgDisplayPropertiesImp() Gui::Selection().Detach(this); } +void DlgDisplayPropertiesImp::showDefaultButtons(bool ok) +{ + d->ui.buttonBox->setVisible(ok); +} + void DlgDisplayPropertiesImp::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { @@ -224,9 +233,11 @@ void DlgDisplayPropertiesImp::slotChangedObject(const Gui::ViewProvider& obj, */ void DlgDisplayPropertiesImp::reject() { - // closes the dock window - Gui::DockWindowManager* pDockMgr = Gui::DockWindowManager::instance(); - pDockMgr->removeDockWindow(this); + if (d->floating) { + // closes the dock window + Gui::DockWindowManager* pDockMgr = Gui::DockWindowManager::instance(); + pDockMgr->removeDockWindow(this); + } QDialog::reject(); } @@ -626,5 +637,35 @@ std::vector DlgDisplayPropertiesImp::getSelection() const return views; } +// ---------------------------------------------------------------------------- + +/* TRANSLATOR Gui::Dialog::TaskDisplayProperties */ + +TaskDisplayProperties::TaskDisplayProperties() +{ + this->setButtonPosition(TaskDisplayProperties::South); + widget = new DlgDisplayPropertiesImp(false); + widget->showDefaultButtons(false); + taskbox = new Gui::TaskView::TaskBox(QPixmap(), widget->windowTitle(),true, 0); + taskbox->groupLayout()->addWidget(widget); + Content.push_back(taskbox); +} + +TaskDisplayProperties::~TaskDisplayProperties() +{ + // automatically deleted in the sub-class +} + +QDialogButtonBox::StandardButtons TaskDisplayProperties::getStandardButtons() const +{ + return QDialogButtonBox::Close; +} + +bool TaskDisplayProperties::reject() +{ + widget->reject(); + return (widget->result() == QDialog::Rejected); +} + #include "moc_DlgDisplayPropertiesImp.cpp" diff --git a/src/Gui/DlgDisplayPropertiesImp.h b/src/Gui/DlgDisplayPropertiesImp.h index 81ddb52c21..1b82e8c043 100644 --- a/src/Gui/DlgDisplayPropertiesImp.h +++ b/src/Gui/DlgDisplayPropertiesImp.h @@ -28,7 +28,9 @@ #include #include -#include "Selection.h" +#include +#include +#include #include namespace App @@ -54,11 +56,13 @@ class DlgDisplayPropertiesImp : public QDialog, Q_OBJECT public: - DlgDisplayPropertiesImp(QWidget* parent = nullptr, Qt::WindowFlags fl = 0); + DlgDisplayPropertiesImp(bool floating, QWidget* parent = nullptr, Qt::WindowFlags fl = 0); ~DlgDisplayPropertiesImp(); /// Observer message from the Selection void OnChange(Gui::SelectionSingleton::SubjectType &rCaller, Gui::SelectionSingleton::MessageType Reason); + void showDefaultButtons(bool); + void reject(); private Q_SLOTS: void on_changeMaterial_activated(int); @@ -78,7 +82,6 @@ protected: private: void slotChangedObject(const Gui::ViewProvider&, const App::Property& Prop); - void reject(); void setDisplayModes(const std::vector&); void setMaterial(const std::vector&); void setColorPlot(const std::vector&); @@ -96,6 +99,30 @@ private: std::unique_ptr d; }; +class TaskDisplayProperties : public Gui::TaskView::TaskDialog +{ + Q_OBJECT + +public: + TaskDisplayProperties(); + ~TaskDisplayProperties(); + +public: + bool reject(); + + bool isAllowedAlterDocument(void) const + { return true; } + bool isAllowedAlterView(void) const + { return true; } + bool isAllowedAlterSelection(void) const + { return true; } + QDialogButtonBox::StandardButtons getStandardButtons() const; + +private: + DlgDisplayPropertiesImp* widget; + Gui::TaskView::TaskBox* taskbox; +}; + } // namespace Dialog } // namespace Gui