]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Selection manager added
authorvsv <vitaly.smetannikov@opencascade.com>
Thu, 10 Apr 2014 10:20:58 +0000 (14:20 +0400)
committervsv <vitaly.smetannikov@opencascade.com>
Thu, 10 Apr 2014 10:20:58 +0000 (14:20 +0400)
14 files changed:
src/XGUI/CMakeLists.txt
src/XGUI/XGUI_Constants.h
src/XGUI/XGUI_DataTreeModel.h [new file with mode: 0644]
src/XGUI/XGUI_DocumentDataModel.cpp
src/XGUI/XGUI_DocumentDataModel.h
src/XGUI/XGUI_ObjectsBrowser.cpp
src/XGUI/XGUI_ObjectsBrowser.h
src/XGUI/XGUI_PartDataModel.cpp
src/XGUI/XGUI_PartDataModel.h
src/XGUI/XGUI_SelectionMgr.cpp [new file with mode: 0644]
src/XGUI/XGUI_SelectionMgr.h [new file with mode: 0644]
src/XGUI/XGUI_ViewWindow.cpp
src/XGUI/XGUI_Workshop.cpp
src/XGUI/XGUI_Workshop.h

index e1993f5d903cb6d10d726b6ff526509a80d02660..33d7a9765a2ed09abc61c954a30e158a6b33e050 100644 (file)
@@ -22,6 +22,8 @@ SET(PROJECT_HEADERS
        XGUI_DocumentDataModel.h
        XGUI_PartDataModel.h
        XGUI_ObjectsBrowser.h
+    XGUI_DataTreeModel.h
+    XGUI_SelectionMgr.h
 )
 
 SET(PROJECT_AUTOMOC 
@@ -46,6 +48,7 @@ SET(PROJECT_SOURCES
        XGUI_DocumentDataModel.cpp
        XGUI_PartDataModel.cpp
        XGUI_ObjectsBrowser.cpp
+    XGUI_SelectionMgr.cpp
 )
 
 SET(PROJECT_RESOURCES 
index 643dbbae879e86d2ac9f9b218cb5f4600d58c50a..f523c3ed8c2bca38370c1a8cbd8afeafdd73c3df 100644 (file)
@@ -2,14 +2,19 @@
 #define XGUI_Constants_H
 
 #include <QList>
+#include <ModelAPI_Feature.h>
 
-//! This file contains varioous constants used in the application
+//! This file contains various constants used in the application
 
 
 typedef QList<int> QIntList;       //!< list of int values
 typedef QList<short> QShortList;     //!< list of short int values
 typedef QList<double> QDoubleList;    //!< list of double values
 
+//! Pointer on feature object
+typedef std::shared_ptr<ModelAPI_Feature> FeaturePtr;
+typedef QList<FeaturePtr> QFeatureList; //!< List of features
+
 namespace XGUI
 {
 
diff --git a/src/XGUI/XGUI_DataTreeModel.h b/src/XGUI/XGUI_DataTreeModel.h
new file mode 100644 (file)
index 0000000..3be26bd
--- /dev/null
@@ -0,0 +1,48 @@
+
+
+#ifndef XGUI_DataTreeModel_H
+#define XGUI_DataTreeModel_H
+
+#include <ModelAPI_Document.h>
+#include <QAbstractItemModel>
+
+#include "XGUI_Constants.h"
+
+/**\class XGUI_FeaturesModel
+ * \ingroup GUI
+ * \brief Abstaract class of model object which operates with features data.
+ */
+class XGUI_FeaturesModel : public QAbstractItemModel
+{
+public:
+  XGUI_FeaturesModel(const std::shared_ptr<ModelAPI_Document>& theDocument, QObject* theParent):
+      QAbstractItemModel(theParent), myDocument(theDocument) {}
+
+  //! Returns Feature object by the given Model index.
+  //! Returns 0 if the given index is not index of a feature
+  virtual FeaturePtr feature(const QModelIndex& theIndex) const = 0;
+
+protected:
+  std::shared_ptr<ModelAPI_Document> myDocument;
+};
+
+
+/**\class XGUI_PartModel
+ * \ingroup GUI
+ * \brief Abstaract class of model object which operates with parts data.
+ */
+class XGUI_PartModel : public XGUI_FeaturesModel
+{
+public:
+  XGUI_PartModel(const std::shared_ptr<ModelAPI_Document>& theDocument, QObject* theParent):
+      XGUI_FeaturesModel(theDocument, theParent) {}
+
+      void setPartId(int theId) { myId = theId; }
+
+protected:
+  //! Id of the current part object in the document
+  int myId;
+};
+
+
+#endif
\ No newline at end of file
index ba23d472d96ad5b660d5cdd01126aeb3805a0dfe..0cb6233693614dfebc36e5b5e1b8dfe3c3a4e9eb 100644 (file)
@@ -25,8 +25,7 @@ XGUI_DocumentDataModel::XGUI_DocumentDataModel(QObject* theParent)
   Event_Loop::loop()->registerListener(this, Event_Loop::eventByName(EVENT_FEATURE_UPDATED));
 
   // Create a top part of data tree model
-  myModel = new XGUI_TopDataModel(this);
-  myModel->setDocument(myDocument);
+  myModel = new XGUI_TopDataModel(myDocument, this);
 }
 
 
@@ -46,10 +45,10 @@ void XGUI_DocumentDataModel::processEvent(const Event_Message* theMessage)
       myPartModels.removeLast();
     }
     while (myPartModels.size() < aNbParts) {
-      myPartModels.append(new XGUI_PartDataModel(this));
+      myPartModels.append(new XGUI_PartDataModel(myDocument, this));
     }
     for (int i = 0; i < myPartModels.size(); i++)
-      myPartModels.at(i)->setDocument(myDocument, i);
+      myPartModels.at(i)->setPartId(i);
   }
   clearModelIndexes();
   endResetModel();
@@ -156,4 +155,11 @@ void XGUI_DocumentDataModel::clearModelIndexes()
   for (aIt = myIndexes.constBegin(); aIt != myIndexes.constEnd(); ++aIt) 
     delete (*aIt);
   myIndexes.clear();
+}
+
+FeaturePtr XGUI_DocumentDataModel::feature(const QModelIndex& theIndex) const
+{
+  QModelIndex aIndex = toSourceModel(theIndex);
+  const XGUI_FeaturesModel* aModel = dynamic_cast<const XGUI_FeaturesModel*>(aIndex.model());
+  return aModel->feature(aIndex);
 }
\ No newline at end of file
index 6e4a8969e522bb222fa059607512cce2b82256dd..8c57a61de938e29f1cb6ad635bfc7a0b826963f7 100644 (file)
@@ -2,13 +2,15 @@
 #ifndef XGUI_DocumentDataModel_H
 #define XGUI_DocumentDataModel_H
 
+#include "XGUI_Constants.h"
+
 #include <QAbstractItemModel>
 #include <Event_Listener.h>
 
 #include <QList>
 
 class ModelAPI_Document;
-class XGUI_PartDataModel;
+class XGUI_PartModel;
 class XGUI_TopDataModel;
 
 /**\class XGUI_DocumentDataModel
@@ -43,6 +45,10 @@ public:
 
   virtual bool hasChildren(const QModelIndex& theParent = QModelIndex()) const;
 
+  //! Returns Feature object by the given Model index.
+  //! Returns 0 if the given index is not index of a feature
+  FeaturePtr feature(const QModelIndex& theIndex) const;
+
 private:
 
   //! Converts QModelIndex of this model to QModelIndex of a one of sub-models.
@@ -64,7 +70,7 @@ private:
   XGUI_TopDataModel* myModel;
 
   //! Data models for Parts data tree representation (one data model per a one part)
-  QList<XGUI_PartDataModel*> myPartModels;
+  QList<XGUI_PartModel*> myPartModels;
 
   //! List of saved QModelIndexes created by sub-models
   QList<QModelIndex*> myIndexes;
index 53e804401cecb169be6f7608e1175694737d2900..8355754d6bbd70e88ce846d07e3b9992cf00603c 100644 (file)
@@ -5,8 +5,11 @@ XGUI_ObjectsBrowser::XGUI_ObjectsBrowser(QWidget* theParent)
   : QTreeView(theParent)
 {
   setHeaderHidden(true);
-  XGUI_DocumentDataModel* aDocModel = new XGUI_DocumentDataModel(this);
-  setModel(aDocModel);
+  myDocModel = new XGUI_DocumentDataModel(this);
+  setModel(myDocModel);
+
+  connect(selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), 
+    this, SLOT(onSelectionChanged(const QItemSelection&, const QItemSelection&)));
 }
 
 
@@ -14,3 +17,18 @@ XGUI_ObjectsBrowser::~XGUI_ObjectsBrowser()
 {
 }
 
+
+
+void XGUI_ObjectsBrowser::onSelectionChanged(const QItemSelection& theSelected, 
+                                             const QItemSelection& theDeselected)
+{
+  mySelectedData.clear();
+  QModelIndexList aIndexes = selectionModel()->selectedIndexes();
+  QModelIndexList::const_iterator aIt;
+  for (aIt = aIndexes.constBegin(); aIt != aIndexes.constEnd(); ++aIt) {
+    FeaturePtr aFeature = myDocModel->feature(*aIt);
+    if (aFeature)
+      mySelectedData.append(aFeature);
+  }
+  emit selectionChanged();
+}
\ No newline at end of file
index c2d56ee389e136eee5becd9c448a410a4565ac98..dff46d5aeb5ae6a7948adcf2842321041b8bb6b5 100644 (file)
@@ -2,6 +2,8 @@
 #ifndef XGUI_ObjectsBrowser_H
 #define XGUI_ObjectsBrowser_H
 
+#include "XGUI_Constants.h"
+
 #include <QTreeView>
 
 class XGUI_DocumentDataModel;
@@ -13,11 +15,21 @@ public:
   XGUI_ObjectsBrowser(QWidget* theParent);
   virtual ~XGUI_ObjectsBrowser();
 
-  QAbstractItemModel* dataModel() const { return myDocModel; }
+  XGUI_DocumentDataModel* dataModel() const { return myDocModel; }
+
+  QFeatureList selectedData() const { return mySelectedData; }
+
+signals:
+  void selectionChanged();
+
+
+private slots:
+  void onSelectionChanged(const QItemSelection& theSelected, const QItemSelection& theDeselected);
 
 private:
+  XGUI_DocumentDataModel* myDocModel;
 
-  QAbstractItemModel* myDocModel;
+  QFeatureList mySelectedData;
 };
 
 #endif
\ No newline at end of file
index f48a27a7c72c594c44b00bf6bce54d91cf011042..4f8423f467634fcd188ac81f492b49879251e2af 100644 (file)
@@ -9,8 +9,8 @@
 
 #include <QIcon>
 
-XGUI_TopDataModel::XGUI_TopDataModel(QObject* theParent)
-  : QAbstractItemModel(theParent)
+XGUI_TopDataModel::XGUI_TopDataModel(const std::shared_ptr<ModelAPI_Document>& theDocument, QObject* theParent)
+  : XGUI_FeaturesModel(theDocument, theParent)
 {
 }
   
@@ -124,12 +124,26 @@ bool XGUI_TopDataModel::hasChildren(const QModelIndex& theParent) const
   return rowCount(theParent) > 0;
 }
 
+FeaturePtr XGUI_TopDataModel::feature(const QModelIndex& theIndex) const
+{
+  switch (theIndex.internalId()) {
+  case ParamsFolder:
+  case ConstructFolder:
+    return 0;
+  case ParamObject:
+    return myDocument->feature(PARAMETERS_GROUP, theIndex.row());
+  case ConstructObject:
+    return myDocument->feature(CONSTRUCTIONS_GROUP, theIndex.row());
+  }
+  return 0;
+}
+
 
 //******************************************************************
 //******************************************************************
 //******************************************************************
-XGUI_PartDataModel::XGUI_PartDataModel(QObject* theParent)
-  : QAbstractItemModel(theParent)
+XGUI_PartDataModel::XGUI_PartDataModel(const std::shared_ptr<ModelAPI_Document>& theDocument, QObject* theParent)
+  : XGUI_PartModel(theDocument, theParent)
 {
 }
 
@@ -239,8 +253,7 @@ QModelIndex XGUI_PartDataModel::index(int theRow, int theColumn, const QModelInd
 
 QModelIndex XGUI_PartDataModel::parent(const QModelIndex& theIndex) const
 {
-  int aId = (int)theIndex.internalId();
-  switch (aId) {
+  switch (theIndex.internalId()) {
   case MyRoot:
     return QModelIndex();
   case ParamsFolder:
@@ -264,4 +277,20 @@ std::shared_ptr<ModelAPI_Document> XGUI_PartDataModel::featureDocument() const
 {
   std::shared_ptr<ModelAPI_Feature> aFeature = myDocument->feature(PARTS_GROUP, myId);
   return aFeature->data()->docRef("PartDocument")->value();
-}
\ No newline at end of file
+}
+
+FeaturePtr XGUI_PartDataModel::feature(const QModelIndex& theIndex) const
+{
+  switch (theIndex.internalId()) {
+  case MyRoot:
+    return myDocument->feature(PARTS_GROUP, myId);
+  case ParamsFolder:
+  case ConstructFolder:
+    return 0;
+  case ParamObject:
+    return featureDocument()->feature(PARAMETERS_GROUP, theIndex.row());
+  case ConstructObject:
+    return featureDocument()->feature(CONSTRUCTIONS_GROUP, theIndex.row());
+  }
+  return 0;
+}
index c8fb16629d307d475a52e6cc27b24b7d5ffe325f..559f007329ec32dbb8c2037854234aa73c65492a 100644 (file)
@@ -2,28 +2,19 @@
 #ifndef XGUI_PartDataModel_H
 #define XGUI_PartDataModel_H
 
-#include <QAbstractItemModel>
-
-class ModelAPI_Feature;
-class ModelAPI_Document; 
+#include "XGUI_DataTreeModel.h"
 
 /**\class XGUI_TopDataModel
  * \ingroup GUI
  * \brief This is a data model for Object Browser (QTreeView).
  * It represents only upper part of data tree (non-parts tree items)
  */
-class XGUI_TopDataModel : public QAbstractItemModel
+class XGUI_TopDataModel : public XGUI_FeaturesModel
 {
   Q_OBJECT
 public:
-  XGUI_TopDataModel(QObject* theParent);
+  XGUI_TopDataModel(const std::shared_ptr<ModelAPI_Document>& theDocument, QObject* theParent);
   virtual ~XGUI_TopDataModel();
-  //! Set a document object
-  virtual void setDocument(const std::shared_ptr<ModelAPI_Document>& theDoc)
-  {
-    myDocument = theDoc;
-  }
 
   // Reimplementation from QAbstractItemModel
   virtual QVariant data(const QModelIndex& theIndex, int theRole) const;
@@ -40,6 +31,10 @@ public:
 
   virtual bool hasChildren(const QModelIndex& theParent = QModelIndex()) const;
 
+  //! Returns Feature object by the given Model index.
+  //! Returns 0 if the given index is not index of a feature
+  virtual FeaturePtr feature(const QModelIndex& theIndex) const;
+
 private:
   //! Types of QModelIndexes
   enum DataIds {
@@ -49,8 +44,6 @@ private:
     ConstructObject
   };
 
-  //! Document object
-  std::shared_ptr<ModelAPI_Document> myDocument;
 };
 
 
@@ -59,20 +52,13 @@ private:
  * \brief This is a data model for Object Browser (QTreeView).
  * It represents data tree only of a one part
  */
-class XGUI_PartDataModel : public QAbstractItemModel
+class XGUI_PartDataModel : public XGUI_PartModel
 {
   Q_OBJECT
 public:
-  XGUI_PartDataModel(QObject* theParent);
+  XGUI_PartDataModel(const std::shared_ptr<ModelAPI_Document>& theDocument, QObject* theParent);
   virtual ~XGUI_PartDataModel();
 
-  //! Set a document object and Id of a part in the document
-  virtual void setDocument(const std::shared_ptr<ModelAPI_Document>& theDoc, int theId)
-  {
-    myDocument = theDoc;
-    myId = theId;
-  }
-
   // Reimplementation from QAbstractItemModel
   virtual QVariant data(const QModelIndex& theIndex, int theRole) const;
   virtual QVariant headerData(int section, Qt::Orientation orientation,
@@ -88,6 +74,10 @@ public:
 
   virtual bool hasChildren(const QModelIndex& theParent = QModelIndex()) const;
 
+  //! Returns Feature object by the given Model index.
+  //! Returns 0 if the given index is not index of a feature
+  virtual FeaturePtr feature(const QModelIndex& theIndex) const;
+
 private: 
   std::shared_ptr<ModelAPI_Document> featureDocument() const;
 
@@ -100,11 +90,6 @@ private:
     ConstructObject
   };
 
-  //! Document object
-  std::shared_ptr<ModelAPI_Document> myDocument;
-
-  //! Id of the current part object in the document
-  int myId;
 };
 
 #endif
\ No newline at end of file
diff --git a/src/XGUI/XGUI_SelectionMgr.cpp b/src/XGUI/XGUI_SelectionMgr.cpp
new file mode 100644 (file)
index 0000000..9d1d1e7
--- /dev/null
@@ -0,0 +1,40 @@
+#include "XGUI_SelectionMgr.h"
+#include "XGUI_Workshop.h"
+#include "XGUI_MainWindow.h"
+#include "XGUI_ObjectsBrowser.h"
+
+#include <ModelAPI_Feature.h>
+#include <ModelAPI_PluginManager.h>
+#include <ModelAPI_AttributeDocRef.h>
+#include <ModelAPI_Object.h>
+
+
+
+XGUI_SelectionMgr::XGUI_SelectionMgr(XGUI_Workshop* theParent) :
+  QObject(theParent), myWorkshop(theParent)
+{
+  XGUI_ObjectsBrowser* aObjBrowser = myWorkshop->mainWindow()->objectBrowser();
+
+  connect(aObjBrowser, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
+}
+
+
+XGUI_SelectionMgr::~XGUI_SelectionMgr()
+{
+}
+
+void XGUI_SelectionMgr::onSelectionChanged()
+{
+  XGUI_ObjectsBrowser* aObjBrowser = myWorkshop->mainWindow()->objectBrowser();
+  mySelectedData = aObjBrowser->selectedData();
+  
+  // Set current document
+  if (mySelectedData.size() > 0) {
+    FeaturePtr aFeature = mySelectedData.first();
+
+    std::shared_ptr<ModelAPI_PluginManager> aMgr = ModelAPI_PluginManager::get();
+    aMgr->setCurrentDocument(aFeature->data()->docRef("PartDocument")->value());
+  }
+
+  emit selectionChanged();
+}
\ No newline at end of file
diff --git a/src/XGUI/XGUI_SelectionMgr.h b/src/XGUI/XGUI_SelectionMgr.h
new file mode 100644 (file)
index 0000000..5f50ca3
--- /dev/null
@@ -0,0 +1,31 @@
+#ifndef XGUI_SelectionMgr_H
+#define XGUI_SelectionMgr_H
+
+#include "XGUI_Constants.h"
+#include <QObject>
+
+class XGUI_Workshop;
+
+class XGUI_SelectionMgr : public QObject
+{
+  Q_OBJECT
+public:
+  XGUI_SelectionMgr(XGUI_Workshop* theParent);
+  virtual ~XGUI_SelectionMgr();
+
+  QFeatureList selectedData() const { return mySelectedData; }
+
+
+signals:
+  void selectionChanged();
+
+public slots:
+  void onSelectionChanged();
+
+private:
+  XGUI_Workshop* myWorkshop;
+
+  QFeatureList mySelectedData;
+};
+
+#endif;
\ No newline at end of file
index ef9e5403f79a03ffae3fac7e7fc16cceadae7c8b..9f8edf365ccedd48e89d31f8c2de66715d3e0e57 100644 (file)
@@ -961,9 +961,9 @@ void XGUI_ViewWindow::dumpView()
 
     Handle(Visual3d_View) a3dView = myViewPort->getView()->View();
     if (aFmt == "PS")
-      a3dView->Export(strdup(qPrintable(aFileName)), Graphic3d_EF_PostScript);
+      a3dView->Export(_strdup(qPrintable(aFileName)), Graphic3d_EF_PostScript);
     else if (aFmt == "EPS")
-      a3dView->Export(strdup(qPrintable(aFileName)), Graphic3d_EF_EnhPostScript);
+      a3dView->Export(_strdup(qPrintable(aFileName)), Graphic3d_EF_EnhPostScript);
     else
       aPicture.save( aFileName, aFmt.toLatin1() );
     QApplication::restoreOverrideCursor();
index d92350a07d418b7ffb5fd7c293ce5c2922914400..e5552b506793d76400f266c4de951d2269b37119 100644 (file)
@@ -9,6 +9,7 @@
 #include "XGUI_Workshop.h"
 #include "XGUI_Viewer.h"
 #include "XGUI_WidgetFactory.h"
+#include "XGUI_SelectionMgr.h"
 
 #include <ModelAPI_PluginManager.h>
 #include <ModelAPI_Feature.h>
@@ -43,6 +44,7 @@ XGUI_Workshop::XGUI_Workshop()
   myPartSetModule(NULL)
 {
   myMainWindow = new XGUI_MainWindow();
+  mySelector = new XGUI_SelectionMgr(this);
 }
 
 //******************************************************
index 6628d12ef566d640ede3b1b2b0dd785cd3c9d5e8..16c5425431e84a38f96446511712afededd8fe71 100644 (file)
@@ -13,6 +13,7 @@ class XGUI_MainWindow;
 class XGUI_Command;
 class XGUI_Module;
 class XGUI_Workbench;
+class XGUI_SelectionMgr;
 class ModuleBase_Operation;
 
 class Config_FeatureMessage;
@@ -39,6 +40,9 @@ public:
     return myMainWindow;
   }
 
+  //! Returns selection manager object
+  XGUI_SelectionMgr* selector() const { return mySelector; }
+
   //! Creates and adds a new workbench (menu group) with the given name and returns it
   XGUI_Workbench* addWorkbench(const QString& theName);
 
@@ -68,6 +72,8 @@ private:
   XGUI_MainWindow* myMainWindow;
   XGUI_Module* myPartSetModule;
 
+  XGUI_SelectionMgr* mySelector;
+
   ModuleBase_Operation* myCurrentOperation;
 };