From 4e9ce2a95c42fc2c33c8d7de75c26f2208bf73b7 Mon Sep 17 00:00:00 2001 From: sbh Date: Fri, 17 Apr 2015 18:21:37 +0300 Subject: [PATCH] Accept/Abort buttons in salome --- src/NewGeom/CMakeLists.txt | 2 + src/NewGeom/NewGeom_Module.cpp | 46 ++++++++++++--- src/NewGeom/NewGeom_Module.h | 4 ++ src/NewGeom/NewGeom_NestedButton.cpp | 84 ++++++++++++++++++++++++++++ src/NewGeom/NewGeom_NestedButton.h | 45 +++++++++++++++ src/XGUI/XGUI_ActionsMgr.cpp | 1 + src/XGUI/XGUI_OperationMgr.cpp | 9 +-- src/XGUI/XGUI_SalomeConnector.h | 7 +++ src/XGUI/XGUI_Workshop.cpp | 37 +++++++----- 9 files changed, 210 insertions(+), 25 deletions(-) create mode 100644 src/NewGeom/NewGeom_NestedButton.cpp create mode 100644 src/NewGeom/NewGeom_NestedButton.h diff --git a/src/NewGeom/CMakeLists.txt b/src/NewGeom/CMakeLists.txt index 979269418..70f406e6f 100644 --- a/src/NewGeom/CMakeLists.txt +++ b/src/NewGeom/CMakeLists.txt @@ -9,6 +9,7 @@ SET(PROJECT_HEADERS NewGeom_DataModel.h NewGeom_OCCSelector.h NewGeom_SalomeViewer.h + NewGeom_NestedButton.h ) SET(PROJECT_AUTOMOC @@ -20,6 +21,7 @@ SET(PROJECT_SOURCES NewGeom_DataModel.cpp NewGeom_OCCSelector.cpp NewGeom_SalomeViewer.cpp + NewGeom_NestedButton.cpp ) SET(PROJECT_RESOURCES diff --git a/src/NewGeom/NewGeom_Module.cpp b/src/NewGeom/NewGeom_Module.cpp index 50279350e..56e7b5202 100644 --- a/src/NewGeom/NewGeom_Module.cpp +++ b/src/NewGeom/NewGeom_Module.cpp @@ -4,6 +4,7 @@ #include "NewGeom_Module.h" #include "NewGeom_DataModel.h" #include "NewGeom_OCCSelector.h" +#include #include #include @@ -14,6 +15,7 @@ #include #include +#include #include #include @@ -302,6 +304,16 @@ CAM_DataModel* NewGeom_Module::createDataModel() return aDataModel; } +QAction* NewGeom_Module::addFeature(const QString& theWBName, const ActionInfo& theInfo) +{ + return addFeature(theWBName, + theInfo.id, + theInfo.text, + theInfo.toolTip, + theInfo.icon, + theInfo.shortcut); +} + //****************************************************** QAction* NewGeom_Module::addFeature(const QString& theWBName, const QString& theId, const QString& theTitle, const QString& theTip, @@ -322,17 +334,37 @@ QAction* NewGeom_Module::addFeature(const QString& theWBName, const QString& the aAction->setData(theId); int aItemId = createMenu(aId, aMenu, -1, 10); int aToolId = createTool(aId, aTool); + return aAction; } -QAction* NewGeom_Module::addFeature(const QString& theWBName, const ActionInfo& theInfo) + +QAction* NewGeom_Module::addNestedFeature(const QString& theWBName, + const ActionInfo& theInfo, + const QList& theNestedActions) { - return addFeature(theWBName, - theInfo.id, - theInfo.text, - theInfo.toolTip, - theInfo.icon, - theInfo.shortcut); + int aMenu = createMenu(theWBName, -1, -1, 50); + int aTool = createTool(theWBName); + + int aId = myActionsList.size(); + myActionsList.append(theInfo.id); + SUIT_Desktop* aDesk = application()->desktop(); + NewGeom_NestedButton* anAction = new NewGeom_NestedButton(aDesk, theNestedActions); + anAction->setData(theInfo.id); + anAction->setCheckable(theInfo.checkable); + anAction->setChecked(theInfo.checked); + anAction->setEnabled(theInfo.enabled); + anAction->setVisible(theInfo.visible); + anAction->setIcon(theInfo.icon); + anAction->setText(theInfo.text); + anAction->setToolTip(theInfo.toolTip); + anAction->setShortcut(theInfo.shortcut); + anAction->setFont(theInfo.font); + + //int aItemId = createMenu(aId, aMenu, -1, 10); + int aToolId = createTool(anAction, aTool, aId); + + return anAction; } diff --git a/src/NewGeom/NewGeom_Module.h b/src/NewGeom/NewGeom_Module.h index f8834b760..89cfc45a2 100644 --- a/src/NewGeom/NewGeom_Module.h +++ b/src/NewGeom/NewGeom_Module.h @@ -57,6 +57,10 @@ Q_OBJECT virtual QAction* addFeature(const QString& theWBName, const ActionInfo& theInfo); + virtual QAction* addNestedFeature(const QString& theWBName, + const ActionInfo& theInfo, + const QList& theNestedActions); + virtual QAction* addDesktopCommand(const QString& theId, const QString& theTitle, const QString& theTip, const QIcon& theIcon, const QKeySequence& theKeys, bool isCheckable, diff --git a/src/NewGeom/NewGeom_NestedButton.cpp b/src/NewGeom/NewGeom_NestedButton.cpp new file mode 100644 index 000000000..ff42227ce --- /dev/null +++ b/src/NewGeom/NewGeom_NestedButton.cpp @@ -0,0 +1,84 @@ +/* + * NewGeom_NestedButton.cpp + * + * Created on: Apr 13, 2015 + * Author: sbh + */ + +#include + +#include +#include +#include +#include + +NewGeom_NestedButton::NewGeom_NestedButton(QObject* theParent, + const QList& theNestedActions) +: QWidgetAction(theParent), + myNestedActions(theNestedActions), + myAdditionalButtonsWidget(0), + myButtonFrame(0), + myThisButton(0) +{ +} + +NewGeom_NestedButton::~NewGeom_NestedButton() +{ +} + +void NewGeom_NestedButton::showAdditionalButtons(bool isShow) +{ + myAdditionalButtonsWidget->setVisible(isShow); + if (isShow) { + myButtonFrame->setFrameStyle(QFrame::WinPanel); + myButtonFrame->setFrameShadow(QFrame::Sunken); + myThisButton->setAutoRaise(false); + } else { + myButtonFrame->setFrameStyle(QFrame::NoFrame); + myButtonFrame->setFrameShadow(QFrame::Plain); + myThisButton->setAutoRaise(true); + } +} + +QWidget * NewGeom_NestedButton::createWidget(QWidget * theParent) +{ + myButtonFrame = new QFrame(theParent); + QHBoxLayout* aBoxLay = new QHBoxLayout(myButtonFrame); + aBoxLay->setContentsMargins(2, 0, 0, 0); + aBoxLay->setSpacing(1); + + myThisButton = new QToolButton(myButtonFrame); + myThisButton->setDefaultAction(this); + myThisButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + aBoxLay->addWidget(myThisButton, 1); + + myAdditionalButtonsWidget = new QWidget(myButtonFrame); + QHBoxLayout* aAdditionalBoxLay = new QHBoxLayout(myAdditionalButtonsWidget); + aAdditionalBoxLay->setContentsMargins(0, 0, 0, 0); + aAdditionalBoxLay->setSpacing(1); + foreach (QAction* eachAct, myNestedActions) { + QToolButton* aButton = new QToolButton(myButtonFrame); + aButton->setDefaultAction(eachAct); + aButton->setAutoRaise(true); + aAdditionalBoxLay->addWidget(aButton); + } + myAdditionalButtonsWidget->setLayout(aAdditionalBoxLay); + aBoxLay->addWidget(myAdditionalButtonsWidget); + + myButtonFrame->setLayout(aBoxLay); + + showAdditionalButtons(false); + connect(this, SIGNAL(toggled(bool)), this, SLOT(showAdditionalButtons(bool))); + connect(this, SIGNAL(changed()), this, SLOT(actionStateChanged())); + return myButtonFrame; +} + +void NewGeom_NestedButton::actionStateChanged() +{ + if (isEnabled()) { + QString s = "true"; + } else { + QString s = "false"; + } + +} diff --git a/src/NewGeom/NewGeom_NestedButton.h b/src/NewGeom/NewGeom_NestedButton.h new file mode 100644 index 000000000..7be12d491 --- /dev/null +++ b/src/NewGeom/NewGeom_NestedButton.h @@ -0,0 +1,45 @@ +/* + * NewGeom_NestedButton.h + * + * Created on: Apr 13, 2015 + * Author: sbh + */ + +#ifndef SRC_NEWGEOM_NEWGEOM_NESTEDBUTTON_H_ +#define SRC_NEWGEOM_NEWGEOM_NESTEDBUTTON_H_ + +#include + +class QFrame; +class QAction; +class QWidget; +class QToolButton; + +/*! + * \ingroup Salome + * Custom (nested) button in salome mode. + */ +class NewGeom_NestedButton : public QWidgetAction +{ + Q_OBJECT + public: + NewGeom_NestedButton(QObject *parent, const QList& theNestedActions); + virtual ~NewGeom_NestedButton(); + + public slots: + /// Shows/hides the additional buttons widget + void showAdditionalButtons(bool); + void actionStateChanged(); + + protected: + /// Creates the button representation + virtual QWidget * createWidget(QWidget * theParent); + + private: + QList myNestedActions; ///< list of nested actions + QWidget* myAdditionalButtonsWidget; ///< widget to precess additional buttons visibility + QFrame* myButtonFrame; ///< frame arround button representation + QToolButton* myThisButton; ///< main button +}; + +#endif /* SRC_NEWGEOM_NEWGEOM_NESTEDBUTTON_H_ */ diff --git a/src/XGUI/XGUI_ActionsMgr.cpp b/src/XGUI/XGUI_ActionsMgr.cpp index 129fdb2cf..bdc91203b 100644 --- a/src/XGUI/XGUI_ActionsMgr.cpp +++ b/src/XGUI/XGUI_ActionsMgr.cpp @@ -299,6 +299,7 @@ void XGUI_ActionsMgr::setNestedStackEnabled(ModuleBase_Operation* theOperation) return; FeaturePtr aFeature = theOperation->feature(); QString aFeatureId = QString::fromStdString(aFeature->getKind()); + setActionEnabled(aFeatureId, true); setNestedCommandsEnabled(true, aFeatureId); setNestedStackEnabled(myOperationMgr->previousOperation(theOperation)); diff --git a/src/XGUI/XGUI_OperationMgr.cpp b/src/XGUI/XGUI_OperationMgr.cpp index 1fe9717fb..dacd82f21 100644 --- a/src/XGUI/XGUI_OperationMgr.cpp +++ b/src/XGUI/XGUI_OperationMgr.cpp @@ -235,9 +235,10 @@ void XGUI_OperationMgr::onAbortOperation() void XGUI_OperationMgr::onOperationStarted() { ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); - if (myOperations.count() == 1) { - emit nestedStateChanged(false); - } + + bool isNestedOk = (myOperations.count() >= 1) && + myOperations.at(0)->isValid(); + emit nestedStateChanged(isNestedOk); emit operationStarted(aSenderOperation); } @@ -250,7 +251,7 @@ void XGUI_OperationMgr::onOperationAborted() void XGUI_OperationMgr::onOperationCommitted() { ModuleBase_Operation* aSenderOperation = dynamic_cast(sender()); - emit nestedStateChanged(true); + emit nestedStateChanged(myOperations.count() >= 1); emit operationCommitted(aSenderOperation); } diff --git a/src/XGUI/XGUI_SalomeConnector.h b/src/XGUI/XGUI_SalomeConnector.h index 414ac4d66..312342e14 100644 --- a/src/XGUI/XGUI_SalomeConnector.h +++ b/src/XGUI/XGUI_SalomeConnector.h @@ -40,6 +40,13 @@ class XGUI_EXPORT XGUI_SalomeConnector virtual QAction* addFeature(const QString& theWBName, const ActionInfo& theInfo) = 0; + //! Creates a feature (command) in SALOME desktop + //! \param theWBName - name of toolbar (workbench) + //! \param theInfo - information about action (icon, text, etc) + virtual QAction* addNestedFeature(const QString& theWBName, + const ActionInfo& theInfo, + const QList& theNestedActions) = 0; + //! Creates a command in Edit menu of SALOME desktop //! \param theId - an id of the feature //! \param theTitle - a menu item string diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp index 42aa97e30..2ce90358a 100644 --- a/src/XGUI/XGUI_Workshop.cpp +++ b/src/XGUI/XGUI_Workshop.cpp @@ -762,8 +762,29 @@ void XGUI_Workshop::addFeature(const std::shared_ptr& the QStringList aNestedFeatures = QString::fromStdString(theMessage->nestedFeatures()).split(" ", QString::SkipEmptyParts); QString aDocKind = QString::fromStdString(theMessage->documentKind()); + QList aNestedActList; + bool isColumnButton = !aNestedFeatures.isEmpty(); + if (isColumnButton) { + QString aNestedActions = QString::fromStdString(theMessage->actionsWhenNested()); + if (aNestedActions.contains("accept")) { + QAction* anAction = myActionsMgr->operationStateAction(XGUI_ActionsMgr::AcceptAll, NULL); + connect(anAction, SIGNAL(triggered()), myOperationMgr, SLOT(commitAllOperations())); + aNestedActList << anAction; + } + if (aNestedActions.contains("abort")) { + QAction* anAction = myActionsMgr->operationStateAction(XGUI_ActionsMgr::AbortAll, NULL); + connect(anAction, SIGNAL(triggered()), myOperationMgr, SLOT(abortAllOperations())); + aNestedActList << anAction; + } + } + if (isSalomeMode()) { - QAction* aAction = salomeConnector()->addFeature(aWchName, aFeatureInfo); + QAction* aAction; + if (isColumnButton) { + aAction = salomeConnector()->addNestedFeature(aWchName, aFeatureInfo, aNestedActList); + } else { + aAction = salomeConnector()->addFeature(aWchName, aFeatureInfo); + } salomeConnector()->setNestedActions(aFeatureInfo.id, aNestedFeatures); salomeConnector()->setDocumentKind(aFeatureInfo.id, aDocKind); @@ -794,19 +815,7 @@ void XGUI_Workshop::addFeature(const std::shared_ptr& the // Enrich created button with accept/abort buttons if necessary AppElements_Button* aButton = aCommand->button(); if (aButton->isColumnButton()) { - QString aNestedActions = QString::fromStdString(theMessage->actionsWhenNested()); - QList anActList; - if (aNestedActions.contains("accept")) { - QAction* anAction = myActionsMgr->operationStateAction(XGUI_ActionsMgr::AcceptAll, aButton); - connect(anAction, SIGNAL(triggered()), myOperationMgr, SLOT(commitAllOperations())); - anActList << anAction; - } - if (aNestedActions.contains("abort")) { - QAction* anAction = myActionsMgr->operationStateAction(XGUI_ActionsMgr::AbortAll, aButton); - connect(anAction, SIGNAL(triggered()), myOperationMgr, SLOT(abortAllOperations())); - anActList << anAction; - } - aButton->setAdditionalButtons(anActList); + aButton->setAdditionalButtons(aNestedActList); } myActionsMgr->addCommand(aCommand); myModule->actionCreated(aCommand); -- 2.39.2