]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Accept/Abort buttons in salome
authorsbh <sergey.belash@opencascade.com>
Fri, 17 Apr 2015 15:21:37 +0000 (18:21 +0300)
committersbh <sergey.belash@opencascade.com>
Fri, 17 Apr 2015 15:21:37 +0000 (18:21 +0300)
src/NewGeom/CMakeLists.txt
src/NewGeom/NewGeom_Module.cpp
src/NewGeom/NewGeom_Module.h
src/NewGeom/NewGeom_NestedButton.cpp [new file with mode: 0644]
src/NewGeom/NewGeom_NestedButton.h [new file with mode: 0644]
src/XGUI/XGUI_ActionsMgr.cpp
src/XGUI/XGUI_OperationMgr.cpp
src/XGUI/XGUI_SalomeConnector.h
src/XGUI/XGUI_Workshop.cpp

index 979269418dfebfbf1c72e1cc791532872c0a6425..70f406e6f2382ef1a90a421d83e82b1efa380b93 100644 (file)
@@ -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
index 50279350e19f198496233c71ed9cde0bcdc72db3..56e7b52025dc11d1a6b1f34564284b38d473523f 100644 (file)
@@ -4,6 +4,7 @@
 #include "NewGeom_Module.h"
 #include "NewGeom_DataModel.h"
 #include "NewGeom_OCCSelector.h"
+#include <NewGeom_NestedButton.h>
 
 #include <XGUI_Workshop.h>
 #include <XGUI_PropertyPanel.h>
@@ -14,6 +15,7 @@
 
 #include <ModuleBase_Operation.h>
 #include <ModuleBase_Preferences.h>
+#include <ModuleBase_ActionInfo.h>
 
 #include <LightApp_Application.h>
 #include <LightApp_SelectionMgr.h>
@@ -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<QAction*>& 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;
 }
 
 
index f8834b760f75057ea9fbd719700c914c7560a0b1..89cfc45a2b1930599685bfedb4dd86f7a5ba7633 100644 (file)
@@ -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<QAction*>& 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 (file)
index 0000000..ff42227
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * NewGeom_NestedButton.cpp
+ *
+ *  Created on: Apr 13, 2015
+ *      Author: sbh
+ */
+
+#include <NewGeom_NestedButton.h>
+
+#include <QAction>
+#include <QFrame>
+#include <QHBoxLayout>
+#include <QToolButton>
+
+NewGeom_NestedButton::NewGeom_NestedButton(QObject* theParent,
+                                           const QList<QAction*>& 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 (file)
index 0000000..7be12d4
--- /dev/null
@@ -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 <QWidgetAction>
+
+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<QAction*>& 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<QAction*> 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_ */
index 129fdb2cfd9db0b6c6fe493c8034fc8dc2ce25f9..bdc91203b025b8dea63c8956eaaeabbbfd8ed10f 100644 (file)
@@ -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));
index 1fe9717fb9bf9f6623b39514ea2c530153f43fa5..dacd82f21309e94748432d0812e3d88dc9c5e504 100644 (file)
@@ -235,9 +235,10 @@ void XGUI_OperationMgr::onAbortOperation()
 void XGUI_OperationMgr::onOperationStarted()
 {
   ModuleBase_Operation* aSenderOperation = dynamic_cast<ModuleBase_Operation*>(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<ModuleBase_Operation*>(sender());
-  emit nestedStateChanged(true);
+  emit nestedStateChanged(myOperations.count() >= 1);
   emit operationCommitted(aSenderOperation);
 }
 
index 414ac4d66d07c793251863a6c5d81c5847ddad4c..312342e14e149a74d59eb5db486851325061f79b 100644 (file)
@@ -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<QAction*>& theNestedActions) = 0;
+
   //! Creates a command in Edit menu of SALOME desktop
   //! \param theId - an id of the feature
   //! \param theTitle - a menu item string
index 42aa97e3000859a3b259ef7c55413428a5ca42b6..2ce90358a4d39955c2befe66419f860d8324ebdc 100644 (file)
@@ -762,8 +762,29 @@ void XGUI_Workshop::addFeature(const std::shared_ptr<Config_FeatureMessage>& the
   QStringList aNestedFeatures =
       QString::fromStdString(theMessage->nestedFeatures()).split(" ", QString::SkipEmptyParts);
   QString aDocKind = QString::fromStdString(theMessage->documentKind());
+  QList<QAction*> 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<Config_FeatureMessage>& 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<QAction*> 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);