]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Improvement of selection mechanism - presentations are selected taking into account...
authorouv <ouv@opencascade.com>
Thu, 12 Aug 2010 07:37:04 +0000 (07:37 +0000)
committerouv <ouv@opencascade.com>
Thu, 12 Aug 2010 07:37:04 +0000 (07:37 +0000)
src/GLViewer/GLViewer_Context.cxx
src/GLViewer/GLViewer_Context.h
src/GLViewer/GLViewer_Drawer.cxx
src/GLViewer/GLViewer_Drawer.h
src/GLViewer/GLViewer_Object.cxx
src/GLViewer/GLViewer_Object.h

index 984e537261e749a1352dbdbad9f6ace98d46532a..e76eb0ea994147074a42c94360a82f7c15d25d48 100644 (file)
@@ -505,7 +505,7 @@ int GLViewer_Context::insertObject( GLViewer_Object* object, bool display, bool
 
     if( isActive )
     {
-        myActiveObjects.append( object );
+        insertObjectToList( object );
         if( display )
         {
             //QRect* rect = object->getRect()->toQRect();
@@ -514,7 +514,7 @@ int GLViewer_Context::insertObject( GLViewer_Object* object, bool display, bool
         }
     }
     else
-        myInactiveObjects.append( object );
+        insertObjectToList( object, false );
 
     return myActiveObjects.count() + myInactiveObjects.count();
 }
@@ -532,14 +532,14 @@ bool GLViewer_Context::replaceObject( GLViewer_Object* oldObject, GLViewer_Objec
   if( myActiveObjects.contains( oldObject ) )
   {
     myActiveObjects.removeAll( oldObject );
-    myActiveObjects.append( newObject );
+    insertObjectToList( newObject );
     return true;
   }
 
   if( myInactiveObjects.contains( oldObject ) )
   {
     myInactiveObjects.removeAll( oldObject );
-    myInactiveObjects.append( newObject );
+    insertObjectToList( newObject, false );
     return true;
   }
 
@@ -700,7 +700,7 @@ bool GLViewer_Context::setActive( GLViewer_Object* theObject )
     return false;
 
   myInactiveObjects.removeAll( theObject );
-  myActiveObjects.append( theObject );
+  insertObjectToList( theObject );
   return true;
 }
 
@@ -714,6 +714,24 @@ bool GLViewer_Context::setInactive( GLViewer_Object* theObject )
     return false;
 
   myActiveObjects.removeAll( theObject );
-  myInactiveObjects.append( theObject );
+  insertObjectToList( theObject, false );
   return true;
 }
+
+/*!
+  Inserts the object to the corresponding list to the position based on its priority
+  \param theObject - object to be inserted
+  \param isActive - true if needs inserting object in active list
+*/
+void GLViewer_Context::insertObjectToList( GLViewer_Object* theObject, bool isActive )
+{
+  int aPriority = theObject->getPriority();
+
+  ObjList& anObjList = isActive ? myActiveObjects : myInactiveObjects;
+  ObjList::Iterator anIter = anObjList.begin(), anIterEnd = anObjList.end();
+  for( ; anIter != anIterEnd; anIter++ )
+    if( (*anIter)->getPriority() > aPriority )
+      break;
+
+  anObjList.insert( anIter, theObject );
+}
index 0e583c1fb3b682584701944092aba924bfa11576..3ec2ecfed130cfc020eb0ec3891fdd037356a49b 100644 (file)
@@ -156,6 +156,10 @@ public:
   //! A function installing to theObject inactive status
   bool                  setInactive( GLViewer_Object* theObject );
 
+protected:
+  //! Inserts the object to the corresponding list to the position based on its priority
+  void                  insertObjectToList( GLViewer_Object* theObject, bool isActive = true );
+
 protected:
   //! Flag of updating viewer after highlight
   /*!
index b4ed40a262fdab36c17e98a82fb69e7ad898d31c..ec365e067ad961807a82049e2fc8a4b7842ce837 100644 (file)
@@ -483,7 +483,6 @@ GLViewer_Drawer::GLViewer_Drawer()
   myObjects.clear();
   myTextList = 0/*-1*/;
   myObjectType = "GLViewer_Object";
-  myPriority = 0;
   myTextFormat = DTF_BITMAP;
   myTextScale = 0.125;
 }
@@ -497,6 +496,18 @@ GLViewer_Drawer::~GLViewer_Drawer()
   glDeleteLists( myTextList, 1 );
 }
 
+/*!
+  Returns object priority
+*/
+int GLViewer_Drawer::getPriority() const
+{
+  if( !myObjects.isEmpty() )
+    if( GLViewer_Object* anObject = myObjects.first() )
+      return anObject->getPriority();
+  return 0;
+}
+
+
 /*!
   Clears all generated textures
 */
index 56f3d21f499b90d2e9ea72be8a75c720961224ee..853ca8edc9cbdb1cb4a53f4173a9a77311268509 100644 (file)
@@ -233,7 +233,7 @@ public:
   QString                         getObjectType() const { return myObjectType; }
 
   //! Returns object priority
-  int                             getPriority() const { return myPriority; }
+  int                             getPriority() const;
 
        //! The function enables and disables antialiasing in Open GL (for points, lines and polygons).
        void                            setAntialiasing(const bool on);
@@ -428,8 +428,6 @@ protected:
   
   //! Type of supporting object
   QString                         myObjectType;
-  //! Dislay priority
-  int                             myPriority;
 
   //! Default font for drawGLText() method
   QFont                           myFont;
index 40234b8862ae789c8de45b372fb8c6c1b621b225..2cdb4242e02357ec37351bd8e17c10151b796fa3 100644 (file)
@@ -53,6 +53,8 @@ GLViewer_Object::GLViewer_Object()
   myAspectLine = new GLViewer_AspectLine();
   myType = "GLViewer_Object";
 
+  myPriority = 0;
+
   myOwner = NULL;
   myDrawer = NULL;
 
@@ -81,14 +83,6 @@ GLViewer_Object::~GLViewer_Object()
     delete myAspectLine;
 }
 
-/*!
-  \return priority of object
-*/
-int GLViewer_Object::getPriority() const
-{
-    return myDrawer ? myDrawer->getPriority() : 0;
-}
-
 /*!
   \return true if object is inside rectangle
   \param theRect - rectangle
index d2bc9845cca57036fb506a49a171dbc5e4041725..e946154dcbf399cbff9751d6ddde88264f5f201b 100644 (file)
@@ -178,7 +178,7 @@ public:
   QString                   getName() const { return myName; } 
   
   //! Returns object priority
-  virtual int               getPriority() const;
+  virtual int               getPriority() const { return myPriority; }
 
   //! Moves object per by recomputing
   /*!
@@ -295,6 +295,9 @@ protected:
   //! Line aspect for object presentation
   GLViewer_AspectLine*      myAspectLine;
   
+  //! Display priority
+  int                       myPriority;
+
   //! Objet tool tip text
   QString                   myToolTipText;
   //! HTML object tool tip status