OPTION(SALOME_USE_PV3DVIEWER "Enable ParaView3D visualization (Optionally in classic configurations)" ON)
OPTION(SALOME_USE_GLVIEWER "Enable OpenGL visualization (Mandatory in classic configurations)" ON)
OPTION(SALOME_USE_GRAPHICSVIEW "Enable GraphicsView visualization (Mandatory in classic configurations)" ON)
+OPTION(SALOME_USE_QTVIEWER "Enable Qt viewer visualization (Mandatory in classic configurations)" ON)
OPTION(SALOME_USE_PYVIEWER "Enable Python viewer (Mandatory in classic configurations)" ON)
OPTION(SALOME_USE_PLOT2DVIEWER "Enable Plot2D visualization (Mandatory in classic configurations)" ON)
OPTION(SALOME_USE_PYCONSOLE "Enable Python GUI interface (Mandatory in classic configurations)" ON)
CMAKE_DEPENDENT_OPTION(SALOME_USE_SALOMEOBJECT "Enable Salome Object (Mandatory in classic configurations)" ON
"SALOME_LIGHT_ONLY" ON)
-MARK_AS_ADVANCED(SALOME_LIGHT_ONLY SALOME_USE_VTKVIEWER SALOME_USE_GRAPHICSVIEW SALOME_USE_PVVIEWER)
+MARK_AS_ADVANCED(SALOME_LIGHT_ONLY SALOME_USE_VTKVIEWER SALOME_USE_GRAPHICSVIEW SALOME_USE_QTVIEWER SALOME_USE_PVVIEWER)
MARK_AS_ADVANCED(SALOME_USE_SALOMEOBJECT SALOME_USE_OCCVIEWER SALOME_USE_GLVIEWER SALOME_USE_PLOT2DVIEWER)
MARK_AS_ADVANCED(SALOME_USE_PYCONSOLE SALOME_USE_QXGRAPHVIEWER SALOME_USE_PYVIEWER SALOME_USE_PV3DVIEWER)
ADD_DEFINITIONS("-DDISABLE_GRAPHICSVIEW")
ENDIF()
+# - Qt viewer: no prereqs
+IF (NOT SALOME_USE_QTVIEWER)
+ ADD_DEFINITIONS("-DDISABLE_QTVIEWER")
+ENDIF()
+
# - Python editor: no prereqs
IF (NOT SALOME_USE_PYVIEWER)
ADD_DEFINITIONS("-DDISABLE_PYVIEWER")
GraphicsView)
ENDIF(SALOME_USE_GRAPHICSVIEW)
+# QtViewer specific targets:
+IF(SALOME_USE_QTVIEWER)
+ LIST(APPEND _${PROJECT_NAME}_exposed_targets
+ QtViewer)
+ENDIF(SALOME_USE_QTVIEWER)
+
# PyEditor/Viewer specific targets:
IF(SALOME_USE_PYVIEWER)
LIST(APPEND _${PROJECT_NAME}_exposed_targets
SET(SALOME_USE_PV3DVIEWER @SALOME_USE_PV3DVIEWER@)
SET(SALOME_USE_PLOT2DVIEWER @SALOME_USE_PLOT2DVIEWER@)
SET(SALOME_USE_GRAPHICSVIEW @SALOME_USE_GRAPHICSVIEW@)
+SET(SALOME_USE_QTVIEWER @SALOME_USE_QTVIEWER@)
SET(SALOME_USE_QXGRAPHVIEWER @SALOME_USE_QXGRAPHVIEWER@)
SET(SALOME_USE_PVVIEWER @SALOME_USE_PVVIEWER@)
SET(SALOME_USE_PYVIEWER @SALOME_USE_PYVIEWER@)
IF (NOT SALOME_USE_GRAPHICSVIEW)
LIST(APPEND GUI_DEFINITIONS "-DDISABLE_GRAPHICSVIEW")
ENDIF()
+IF (NOT SALOME_USE_QTVIEWER)
+ LIST(APPEND GUI_DEFINITIONS "-DDISABLE_QTVIEWER")
+ENDIF()
IF (NOT SALOME_USE_PVVIEWER)
LIST(APPEND GUI_DEFINITIONS "-DDISABLE_PVVIEWER")
ENDIF()
ADD_SUBDIRECTORY(GraphicsView)
ENDIF(SALOME_USE_GRAPHICSVIEW)
+# Qt viewer
+##
+IF(SALOME_USE_QTVIEWER)
+ ADD_SUBDIRECTORY(QtViewer)
+ENDIF(SALOME_USE_QTVIEWER)
+
# ParaView Viewer
IF(SALOME_USE_PVVIEWER)
ADD_SUBDIRECTORY(PVViewer)
IF(SALOME_USE_GRAPHICSVIEW)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/GraphicsView)
ENDIF()
+IF(SALOME_USE_QTVIEWER)
+ INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/QtViewer)
+ENDIF()
IF(SALOME_USE_PYVIEWER)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/PyEditor)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/PyViewer)
IF(SALOME_USE_GRAPHICSVIEW)
LIST(APPEND _link_LIBRARIES GraphicsView)
ENDIF()
+IF(SALOME_USE_QTVIEWER)
+ LIST(APPEND _link_LIBRARIES QtViewer)
+ENDIF()
IF(SALOME_USE_PYVIEWER)
LIST(APPEND _link_LIBRARIES PyEditor PyViewer)
ENDIF()
IF(SALOME_USE_GRAPHICSVIEW)
LIST(APPEND _moc_HEADERS LightApp_GVSelector.h)
ENDIF()
+IF(SALOME_USE_QTVIEWER)
+ LIST(APPEND _moc_HEADERS LightApp_QTVSelector.h)
+ENDIF()
IF(SALOME_USE_OCCVIEWER)
LIST(APPEND _moc_HEADERS LightApp_OCCSelector.h)
ENDIF()
IF(SALOME_USE_GRAPHICSVIEW)
LIST(APPEND _other_SOURCES LightApp_GVSelector.cxx)
ENDIF()
+IF(SALOME_USE_QTVIEWER)
+ LIST(APPEND _other_SOURCES LightApp_QTVSelector.cxx)
+ENDIF()
IF(SALOME_USE_OCCVIEWER)
LIST(APPEND _other_SOURCES LightApp_OCCSelector.cxx)
ENDIF()
#include "LightApp_GVSelector.h"
#endif
+#ifndef DISABLE_QTVIEWER
+ #include "QtViewer_Viewer.h"
+ #include "QtViewer_ViewManager.h"
+ #include "LightApp_QTVSelector.h"
+#endif
+
#ifndef DISABLE_PVVIEWER
#include "PVViewer_ViewManager.h"
#include "PVViewer_ViewWindow.h"
#ifndef DISABLE_PV3DVIEWER
createActionForViewer( NewPV3DViewId, newWinMenu, QString::number( 8 ), Qt::ALT+Qt::Key_3 );
#endif
+#ifndef DISABLE_QTVIEWER
+ createActionForViewer( NewQtViewId, newWinMenu, QString::number( 9 ), Qt::ALT+Qt::Key_Q );
+#endif
createAction( RenameId, tr( "TOT_RENAME" ), QIcon(), tr( "MEN_DESK_RENAME" ), tr( "PRP_RENAME" ),
Qt::ALT+Qt::SHIFT+Qt::Key_R, desk, false, this, SLOT( onRenameWindow() ) );
type = GraphicsView_Viewer::Type();
break;
#endif
+#ifndef DISABLE_QTVIEWER
+ case NewQtViewId:
+ type = QtViewer_Viewer::Type();
+ break;
+#endif
#ifndef DISABLE_PVVIEWER
case NewPVViewId:
type = PVViewer_Viewer::Type();
a->setEnabled( activeStudy() );
#endif
+#ifndef DISABLE_QTVIEWER
+ a = action( NewQtViewId );
+ if( a )
+ a->setEnabled( activeStudy() );
+#endif
+
#ifndef DISABLE_PVVIEWER
a = action( NewPVViewId );
if( a )
new LightApp_GVSelector( (GraphicsView_Viewer*)viewMgr->getViewModel(), mySelMgr );
}
#endif
+#ifndef DISABLE_QTVIEWER
+ if( vmType == QtViewer_Viewer::Type() )
+ {
+ viewMgr = new QtViewer_ViewManager( activeStudy(), desktop() );
+ new LightApp_QTVSelector( (QtViewer_Viewer*)viewMgr->getViewModel(), mySelMgr );
+ }
+#endif
#ifndef DISABLE_PVVIEWER
if( vmType == PVViewer_Viewer::Type() )
{
CloseId, CloseAllId, GroupAllId,
PreferencesId, MRUId, ModulesListId,
NewGLViewId, NewPlot2dId, NewOCCViewId, NewVTKViewId,
- NewQxSceneViewId, NewGraphicsViewId, NewPVViewId, NewPyViewerId, NewPV3DViewId, StyleId, FullScreenId,
+ NewQxSceneViewId, NewGraphicsViewId, NewQtViewId, NewPVViewId, NewPyViewerId, NewPV3DViewId, StyleId, FullScreenId,
WebSiteId, ForumId, VideosId, TutorialsId,
UserID };
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "LightApp_QTVSelector.h"
+
+#include "LightApp_DataOwner.h"
+
+#include <QtViewer_Object.h>
+#include <QtViewer_ViewPort.h>
+#include <QtViewer_Viewer.h>
+
+LightApp_QTVSelector::LightApp_QTVSelector( QtViewer_Viewer* theViewer,
+ SUIT_SelectionMgr* theSelMgr )
+: SUIT_Selector( theSelMgr, theViewer ),
+ myViewer( theViewer )
+{
+ connect( theViewer, SIGNAL( selectionChanged() ),
+ this, SLOT( onSelectionChanged() ) );
+}
+
+LightApp_QTVSelector::~LightApp_QTVSelector()
+{
+}
+
+QString LightApp_QTVSelector::type() const
+{
+ return QtViewer_Viewer::Type();
+}
+
+void LightApp_QTVSelector::getSelection( SUIT_DataOwnerPtrList& theList ) const
+{
+ if ( !myViewer )
+ return;
+
+ if( QtViewer_ViewPort* aViewport = myViewer->getActiveViewPort() )
+ {
+ foreach (QGraphicsItem *item, aViewport->scene()->selectedItems())
+ {
+ if (QtViewer_Object* obj = dynamic_cast<QtViewer_Object*>(item))
+ {
+ LightApp_DataOwner* owner = dynamic_cast<LightApp_DataOwner*>( obj->owner() );
+ if ( owner )
+ theList.append( SUIT_DataOwnerPtr( new LightApp_DataOwner( owner->entry() ) ) );
+ }
+ }
+ }
+}
+
+void LightApp_QTVSelector::setSelection( const SUIT_DataOwnerPtrList& theList)
+{
+ if ( !myViewer )
+ return;
+
+ QMap<QString, int> aSelected;
+ for ( SUIT_DataOwnerPtrList::const_iterator itr = theList.begin(); itr != theList.end(); ++itr )
+ {
+ const LightApp_DataOwner* owner = dynamic_cast<const LightApp_DataOwner*>( (*itr).operator->() );
+
+ if ( owner )
+ aSelected.insert( owner->entry(), 0 );
+ }
+
+ if( QtViewer_ViewPort* aViewport = myViewer->getActiveViewPort() )
+ {
+ foreach (QGraphicsItem *item, aViewport->items())
+ {
+ if (QtViewer_Object* obj = dynamic_cast<QtViewer_Object*>(item))
+ {
+ LightApp_DataOwner* owner = dynamic_cast<LightApp_DataOwner*>( obj->owner() );
+ bool sel = owner && aSelected.contains(owner->entry());
+ obj->setSelected(sel);
+ }
+ }
+ }
+}
+
+void LightApp_QTVSelector::onSelectionChanged()
+{
+ selectionChanged();
+}
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef LIGHTAPP_QTVSELECTOR_H
+#define LIGHTAPP_QTVSELECTOR_H
+
+#include "LightApp.h"
+
+#include <QObject>
+#include <SUIT_Selector.h>
+#include <SUIT_DataOwner.h>
+
+class QtViewer_Viewer;
+
+class LIGHTAPP_EXPORT LightApp_QTVSelector : public QObject, public SUIT_Selector
+{
+ Q_OBJECT
+
+public:
+ LightApp_QTVSelector( QtViewer_Viewer*, SUIT_SelectionMgr* );
+ virtual ~LightApp_QTVSelector();
+
+ virtual QString type() const;
+
+protected:
+ virtual void getSelection( SUIT_DataOwnerPtrList& ) const;
+ virtual void setSelection( const SUIT_DataOwnerPtrList& );
+
+protected slots:
+ void onSelectionChanged();
+
+protected:
+ QtViewer_Viewer* myViewer;
+};
+
+#endif
<parameter name="SPlot2d" value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
<parameter name="GLViewer" value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
<parameter name="GraphicsView" value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
+ <parameter name="QtViewer" value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
<parameter name="OCCViewer" value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
<parameter name="VTKViewer" value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
<parameter name="PVViewer" value="${GUI_ROOT_DIR}/share/salome/resources/gui"/>
<source>NEW_WINDOW_8</source>
<translation>ParaView&3D view</translation>
</message>
+ <message>
+ <source>NEW_WINDOW_9</source>
+ <translation>Q&t view</translation>
+ </message>
<message>
<source>CREATING_NEW_WINDOW</source>
<translation>Create new %1</translation>
<source>NEW_WINDOW_7</source>
<translation>Vue P&ython</translation>
</message>
+ <message>
+ <source>NEW_WINDOW_8</source>
+ <translation>ParaView&3D view</translation>
+ </message>
+ <message>
+ <source>NEW_WINDOW_9</source>
+ <translation>Q&t view</translation>
+ </message>
<message>
<source>CREATING_NEW_WINDOW</source>
<translation>Créer une nouvelle %1</translation>
--- /dev/null
+# Copyright (C) 2012-2023 CEA, EDF, OPEN CASCADE
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+INCLUDE(UseQtExt)
+
+# --- options ---
+
+# additional include directories
+INCLUDE_DIRECTORIES(
+ ${QT_INCLUDES}
+ ${PROJECT_SOURCE_DIR}/src/Qtx
+ ${PROJECT_SOURCE_DIR}/src/SUIT
+ ${PROJECT_SOURCE_DIR}/src/ImageComposer
+)
+
+# additional preprocessor / compiler flags
+ADD_DEFINITIONS(${QT_DEFINITIONS})
+
+# libraries to link to
+SET(_link_LIBRARIES ${QT_LIBRARIES} qtx suit ImageComposer)
+
+# --- headers ---
+
+# header files / to be processed by moc
+SET(_moc_HEADERS
+ QtViewer_Scene.h
+ QtViewer_Selector.h
+ QtViewer_ViewFrame.h
+ QtViewer_ViewManager.h
+ QtViewer_ViewPort.h
+ QtViewer_Viewer.h
+)
+
+# header files / no moc processing
+SET(_other_HEADERS
+ QtViewer.h
+ QtViewer_Object.h
+)
+
+# header files / to install
+SET(QtViewer_HEADERS ${_moc_HEADERS} ${_other_HEADERS})
+
+# --- resources ---
+
+# resource files / to be processed by lrelease
+SET(_ts_RESOURCES
+ resources/QtViewer_images.ts
+ resources/QtViewer_msg_en.ts
+ resources/QtViewer_msg_fr.ts
+ resources/QtViewer_msg_ja.ts
+)
+
+# resource files / static
+SET(_other_RESOURCES
+ resources/qtviewer_cursor_zoom.png
+ resources/qtviewer_dump.png
+ resources/qtviewer_fitall.png
+ resources/qtviewer_fitarea.png
+ resources/qtviewer_fitselect.png
+ resources/qtviewer_glpan.png
+ resources/qtviewer_pan.png
+ resources/qtviewer_reset.png
+ resources/qtviewer_rotate.png
+ resources/qtviewer_zoom.png
+)
+
+# --- sources ---
+
+# sources / moc wrappings
+QT_WRAP_MOC(_moc_SOURCES ${_moc_HEADERS})
+
+# sources / static
+SET(_other_SOURCES
+ QtViewer_Object.cxx
+ QtViewer_Scene.cxx
+ QtViewer_Selector.cxx
+ QtViewer_ViewFrame.cxx
+ QtViewer_ViewManager.cxx
+ QtViewer_ViewPort.cxx
+ QtViewer_Viewer.cxx
+)
+
+# sources / to compile
+SET(QtViewer_SOURCES ${_other_SOURCES} ${_moc_SOURCES})
+
+# --- rules ---
+
+ADD_LIBRARY(QtViewer ${QtViewer_SOURCES})
+TARGET_LINK_LIBRARIES(QtViewer ${_link_LIBRARIES})
+INSTALL(TARGETS QtViewer EXPORT ${PROJECT_NAME}TargetGroup DESTINATION ${SALOME_INSTALL_LIBS})
+
+INSTALL(FILES ${QtViewer_HEADERS} DESTINATION ${SALOME_INSTALL_HEADERS})
+QT_INSTALL_TS_RESOURCES("${_ts_RESOURCES}" "${SALOME_GUI_INSTALL_RES_DATA}")
+
+INSTALL(FILES ${_other_RESOURCES} DESTINATION ${SALOME_GUI_INSTALL_RES_DATA})
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifdef WIN32
+
+#if defined QTVIEWER_EXPORTS || defined QtViewer_EXPORTS
+#define QTVIEWER_API __declspec(dllexport)
+#else
+#define QTVIEWER_API __declspec(dllimport)
+#endif
+
+#else
+#define QTVIEWER_API
+#endif // WIN32
+
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QtViewer_Object.h"
+
+//=======================================================================
+// Name : QtViewer_Object
+// Purpose : Constructor
+//=======================================================================
+QtViewer_Object::QtViewer_Object( QGraphicsItem* theParent )
+: QGraphicsItem( theParent )
+{
+}
+
+//=======================================================================
+// Name : QtViewer_Object
+// Purpose : Destructor
+//=======================================================================
+QtViewer_Object::~QtViewer_Object()
+{
+}
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef QTVIEWER_OBJECT_H
+#define QTVIEWER_OBJECT_H
+
+#include "QtViewer.h"
+#include <QGraphicsItem>
+
+class SUIT_DataOwner;
+/*
+ Class : QtViewer_Object
+ Description : Base class for all objects displayed at the scene
+*/
+class QTVIEWER_API QtViewer_Object : public QGraphicsItem
+{
+public:
+ QtViewer_Object( QGraphicsItem* theParent = nullptr );
+ ~QtViewer_Object();
+
+ const QString& getName() const { return myName; }
+ virtual void setName( const QString& theName ) { myName = theName; }
+
+ SUIT_DataOwner* owner() const { return myOwner; }
+ void setOwner( SUIT_DataOwner* owner ) { myOwner = owner; }
+
+protected:
+ SUIT_DataOwner* myOwner;
+ QString myName;
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QtViewer_Scene.h"
+
+//=======================================================================
+// Name : QtViewer_Scene
+// Purpose : Constructor
+//=======================================================================
+QtViewer_Scene::QtViewer_Scene( QObject* theParent )
+: QGraphicsScene( theParent )
+{
+}
+
+//=======================================================================
+// Name : QtViewer_Scene
+// Purpose : Destructor
+//=======================================================================
+QtViewer_Scene::~QtViewer_Scene()
+{
+}
+
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef QTVIEWER_SCENE_H
+#define QTVIEWER_SCENE_H
+
+#include "QtViewer.h"
+#include <QGraphicsScene>
+
+class QGraphicsRectItem;
+
+/*
+ Class : QtViewer_Scene
+ Description : Scene of the graphics view
+*/
+class QTVIEWER_API QtViewer_Scene : public QGraphicsScene
+{
+ Q_OBJECT
+
+public:
+ QtViewer_Scene( QObject* theParent = 0 );
+ ~QtViewer_Scene();
+};
+#endif
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QtViewer_Selector.h"
+#include "QtViewer_Viewer.h"
+
+//=======================================================================
+// Name : QtViewer_Selector
+// Purpose : Constructor
+//=======================================================================
+QtViewer_Selector::QtViewer_Selector(QtViewer_Viewer* theViewer)
+: QObject( nullptr ),
+ myViewer(theViewer)
+{
+}
+
+//=======================================================================
+// Name : QtViewer_Selector
+// Purpose : Destructor
+//=======================================================================
+QtViewer_Selector::~QtViewer_Selector()
+{
+}
+
+//================================================================
+// Function : select
+// Purpose :
+//================================================================
+void QtViewer_Selector::select( const QRectF& selRect)
+{
+ emit selSelectionDone();
+}
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef QTVIEWER_SELECTOR_H
+#define QTVIEWER_SELECTOR_H
+
+#include "QtViewer.h"
+
+#include <QObject>
+#include <QRectF>
+
+class QtViewer_Viewer;
+
+/*
+ Class : QtViewer_Selector
+ Description : Selector of the graphics view
+*/
+class QTVIEWER_API QtViewer_Selector : public QObject
+{
+ Q_OBJECT
+
+public:
+ QtViewer_Selector(QtViewer_Viewer*);
+ ~QtViewer_Selector();
+
+public:
+
+ virtual void select(const QRectF&);
+
+signals:
+ void selSelectionDone();
+
+protected:
+ QtViewer_Viewer* myViewer;
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QtViewer_ViewFrame.h"
+
+#include "QtViewer_Viewer.h"
+#include "QtViewer_ViewPort.h"
+
+#include <QtxAction.h>
+#include <QtxActionToolMgr.h>
+#include <QtxMultiAction.h>
+#include <QtxToolBar.h>
+
+#include <SUIT_Desktop.h>
+#include <SUIT_MessageBox.h>
+#include <SUIT_Session.h>
+#include <SUIT_ResourceMgr.h>
+
+#include <QColor>
+#include <QFrame>
+#include <QFileDialog>
+
+#include <QWheelEvent>
+#include <QHBoxLayout>
+#include <QImage>
+#include <QMouseEvent>
+#include <QString>
+#include <QWheelEvent>
+
+//=======================================================================
+// Name : QtViewer_ViewFrame
+// Purpose : Constructor
+//=======================================================================
+QtViewer_ViewFrame::QtViewer_ViewFrame( SUIT_Desktop* d, QtViewer_Viewer* vw, QWidget* w )
+: SUIT_ViewWindow( d ),
+ myViewer( vw )
+{
+ QFrame* aFrame = new QFrame( this );
+ setCentralWidget( aFrame );
+
+ QBoxLayout* aLayout = new QHBoxLayout( aFrame );
+ aLayout->setMargin( 0 );
+ aLayout->setSpacing( 0 );
+
+ if( w )
+ myViewPort = dynamic_cast<QtViewer_ViewPort*>(w);
+ else
+ myViewPort = new QtViewer_ViewPort( aFrame );
+
+ aLayout->addWidget( myViewPort );
+ createActions();
+ createToolBar();
+
+ connect( myViewPort, SIGNAL( vpKeyEvent( QKeyEvent* ) ),
+ this, SLOT( keyEvent( QKeyEvent* ) ) );
+ connect( myViewPort, SIGNAL( vpMouseEvent( QMouseEvent* ) ),
+ this, SLOT( mouseEvent( QMouseEvent* ) ) );
+ connect( myViewPort, SIGNAL( vpWheelEvent( QWheelEvent* ) ),
+ this, SLOT( wheelEvent( QWheelEvent* ) ) );
+ connect( myViewPort, SIGNAL( vpContextMenuEvent( QContextMenuEvent* ) ),
+ this, SLOT( contextMenuEvent( QContextMenuEvent* ) ) );
+}
+
+//=======================================================================
+// Name : QtViewer_ViewFrame
+// Purpose : Destructor
+//=======================================================================
+QtViewer_ViewFrame::~QtViewer_ViewFrame()
+{
+}
+
+//================================================================
+// Function : createActions
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::createActions()
+{
+ SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
+ QtxAction* anAction;
+
+ // Dump view
+ anAction = new QtxAction( tr( "MNU_DUMP_VIEW" ),
+ aResMgr->loadPixmap( "QtViewer", tr( "ICON_QTV_DUMP" ) ),
+ tr( "MNU_DUMP_VIEW" ), 0, this );
+ anAction->setStatusTip( tr( "DSC_DUMP_VIEW" ) );
+ connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onDumpView() ) );
+ toolMgr()->registerAction( anAction, DumpId );
+
+ // FitAll
+ anAction = new QtxAction( tr( "MNU_FITALL" ),
+ aResMgr->loadPixmap( "QtViewer", tr( "ICON_QTV_FITALL" ) ),
+ tr( "MNU_FITALL" ), 0, this );
+ anAction->setStatusTip( tr( "DSC_FITALL" ) );
+ connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewFitAll() ) );
+ toolMgr()->registerAction( anAction, FitAllId );
+
+ // FitRect
+ anAction = new QtxAction( tr( "MNU_FITRECT" ),
+ aResMgr->loadPixmap( "QtViewer", tr( "ICON_QTV_FITAREA" ) ),
+ tr( "MNU_FITRECT" ), 0, this );
+ anAction->setStatusTip( tr( "DSC_FITRECT" ) );
+ connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewFitArea() ) );
+ toolMgr()->registerAction( anAction, FitRectId );
+
+ // FitSelect
+ anAction = new QtxAction( tr( "MNU_FITSELECT" ),
+ aResMgr->loadPixmap( "QtViewer", tr( "ICON_QTV_FITSELECT" ) ),
+ tr( "MNU_FITSELECT" ), 0, this );
+ anAction->setStatusTip( tr( "DSC_FITSELECT" ) );
+ connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewFitSelect() ) );
+ toolMgr()->registerAction( anAction, FitSelectId );
+
+ // Zoom
+ anAction = new QtxAction( tr( "MNU_ZOOM_VIEW" ),
+ aResMgr->loadPixmap( "QtViewer", tr( "ICON_QTV_ZOOM" ) ),
+ tr( "MNU_ZOOM_VIEW" ), 0, this );
+ anAction->setStatusTip( tr( "DSC_ZOOM_VIEW" ) );
+ connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewZoom() ) );
+ toolMgr()->registerAction( anAction, ZoomId );
+
+ // Panning
+ anAction = new QtxAction( tr( "MNU_PAN_VIEW" ),
+ aResMgr->loadPixmap( "QtViewer", tr( "ICON_QTV_PAN" ) ),
+ tr( "MNU_PAN_VIEW" ), 0, this );
+ anAction->setStatusTip( tr( "DSC_PAN_VIEW" ) );
+ connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewPan() ) );
+ toolMgr()->registerAction( anAction, PanId );
+
+ // Global Panning
+ anAction = new QtxAction( tr( "MNU_GLOBALPAN_VIEW" ),
+ aResMgr->loadPixmap( "QtViewer", tr( "ICON_QTV_GLOBALPAN" ) ),
+ tr( "MNU_GLOBALPAN_VIEW" ), 0, this );
+ anAction->setStatusTip( tr( "DSC_GLOBALPAN_VIEW" ) );
+ connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewGlobalPan() ) );
+ toolMgr()->registerAction( anAction, GlobalPanId );
+}
+
+//================================================================
+// Function : createToolBar
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::createToolBar()
+{
+ int tid = toolMgr()->createToolBar( tr("LBL_TOOLBAR_LABEL"), // title (language-dependant)
+ QString( "QtViewerViewOperations" ), // name (language-independant)
+ false ); // disable floatable toolbar
+ toolMgr()->append( DumpId, tid );
+
+ QtxMultiAction* aScaleAction = new QtxMultiAction( this );
+ aScaleAction->insertAction( toolMgr()->action( FitAllId ) );
+ aScaleAction->insertAction( toolMgr()->action( FitRectId ) );
+ aScaleAction->insertAction( toolMgr()->action( FitSelectId ) );
+ aScaleAction->insertAction( toolMgr()->action( ZoomId ) );
+ toolMgr()->append( aScaleAction, tid );
+
+ QtxMultiAction* aPanAction = new QtxMultiAction( this );
+ aPanAction->insertAction( toolMgr()->action( PanId ) );
+ aPanAction->insertAction( toolMgr()->action( GlobalPanId ) );
+ toolMgr()->append( aPanAction, tid );
+
+ toolMgr()->append( toolMgr()->action( ResetId ), tid );
+}
+
+//================================================================
+// Function : dumpView
+// Purpose :
+//================================================================
+QImage QtViewer_ViewFrame::dumpView()
+{
+ return myViewPort->dumpView();
+}
+
+//================================================================
+// Function : dumpViewToFormat
+// Purpose :
+//================================================================
+bool QtViewer_ViewFrame::dumpViewToFormat( const QImage& image, const QString& fileName, const QString& format )
+{
+ bool isOK = myViewPort->dumpViewToFormat(fileName, format);
+ if( !isOK )
+ isOK = SUIT_ViewWindow::dumpViewToFormat( image, fileName, format );
+ return isOK;
+}
+
+//================================================================
+// Function : getVisualParameters
+// Purpose :
+//================================================================
+QString QtViewer_ViewFrame::getVisualParameters()
+{
+ QTransform aTransform = myViewPort->transform();
+
+ QString aString;
+ aString.asprintf( "%.3f*%.3f*%.3f*%.3f*%.3f*%.3f*%.3f*%.3f*%.3f",
+ aTransform.m11(), aTransform.m12(), aTransform.m13(),
+ aTransform.m21(), aTransform.m22(), aTransform.m23(),
+ aTransform.m31(), aTransform.m32(), aTransform.m33() );
+ return aString;
+}
+
+//================================================================
+// Function : setVisualParameters
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::setVisualParameters( const QString& theParameters )
+{
+ QStringList aList = theParameters.split( '*' );
+ if( aList.size() < 9 )
+ return;
+
+ bool anIsOk[9];
+ QTransform aTransform( aList[0].toDouble( &anIsOk[0] ),
+ aList[1].toDouble( &anIsOk[1] ),
+ aList[2].toDouble( &anIsOk[2] ),
+ aList[3].toDouble( &anIsOk[3] ),
+ aList[4].toDouble( &anIsOk[4] ),
+ aList[5].toDouble( &anIsOk[5] ),
+ aList[6].toDouble( &anIsOk[6] ),
+ aList[7].toDouble( &anIsOk[7] ),
+ aList[8].toDouble( &anIsOk[8] ) );
+ for( int i = 0; i < 9; i++ )
+ if( !anIsOk[ i ] )
+ return;
+
+ myViewPort->setTransform(aTransform);
+}
+
+//================================================================
+// Function : onViewPan
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::onViewPan()
+{
+ myViewer->pan();
+}
+
+//================================================================
+// Function : onViewZoom
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::onViewZoom()
+{
+ myViewer->zoom();
+}
+
+//================================================================
+// Function : onViewFitAll
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::onViewFitAll()
+{
+ myViewer->fitAll();
+}
+
+//================================================================
+// Function : onViewFitArea
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::onViewFitArea()
+{
+ myViewer->fitArea();
+}
+
+//================================================================
+// Function : onViewFitSelect
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::onViewFitSelect()
+{
+ myViewer->fitSelect();
+}
+
+//================================================================
+// Function : onViewGlobalPan
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::onViewGlobalPan()
+{
+ myViewer->globalPan();
+}
+
+//================================================================
+// Function : onViewReset
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::onViewReset()
+{
+}
+
+//================================================================
+// Function : keyEvent
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::keyEvent( QKeyEvent* e )
+{
+ switch ( e->type() )
+ {
+ case QEvent::KeyPress:
+ emit keyPressed( e );
+ break;
+ case QEvent::KeyRelease:
+ emit keyReleased( e );
+ break;
+ default:
+ break;
+ }
+}
+
+//================================================================
+// Function : mouseEvent
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::mouseEvent( QMouseEvent* e )
+{
+ switch ( e->type() )
+ {
+ case QEvent::MouseButtonPress:
+ emit mousePressed( e );
+ break;
+ case QEvent::MouseMove:
+ emit mouseMoving( e );
+ break;
+ case QEvent::MouseButtonRelease:
+ emit mouseReleased( e );
+ break;
+ case QEvent::MouseButtonDblClick:
+ emit mouseDoubleClicked( e );
+ break;
+ default:
+ break;
+ }
+}
+//================================================================
+// Function : wheelEvent
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::wheelEvent( QWheelEvent* e )
+{
+ switch ( e->type() )
+ {
+ case QEvent::Wheel:
+ emit wheeling( e );
+ break;
+ default:
+ break;
+ }
+}
+
+//================================================================
+// Function : contextMenuEvent
+// Purpose :
+//================================================================
+void QtViewer_ViewFrame::contextMenuEvent( QContextMenuEvent* e )
+{
+ emit contextMenuRequested(e);
+}
+
+/*!
+ \brief Handle show event.
+
+ Emits Show() signal.
+
+ \param theEvent show event
+*/
+void QtViewer_ViewFrame::showEvent( QShowEvent* theEvent )
+{
+ emit Show( theEvent );
+}
+
+/*!
+ \brief Handle hide event.
+
+ Emits Hide() signal.
+
+ \param theEvent hide event
+*/
+void QtViewer_ViewFrame::hideEvent( QHideEvent* theEvent )
+{
+ emit Hide( theEvent );
+}
+
+/*!
+ \return filters for image files
+*/
+QString QtViewer_ViewFrame::filter() const
+{
+ QStringList filters = SUIT_ViewWindow::filter().split( ";;", Qt::SkipEmptyParts );
+ filters << tr("POSTSCRIPT_FILES");
+ return filters.join( ";;" );
+}
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef QTVIEWER_VIEWFRAME_H
+#define QTVIEWER_VIEWFRAME_H
+
+#include "QtViewer.h"
+
+#include <SUIT_ViewWindow.h>
+#include <QPainterPath>
+
+class QContextMenuEvent;
+
+class QAction;
+
+class SUIT_Desktop;
+
+class QtViewer_Viewer;
+class QtViewer_ViewPort;
+
+/*
+ Class : QtViewer_ViewFrame
+ Description : View frame of the graphics view
+*/
+class QTVIEWER_API QtViewer_ViewFrame : public SUIT_ViewWindow
+{
+ Q_OBJECT
+
+public:
+ enum { DumpId, FitAllId, FitRectId, FitSelectId, ZoomId, PanId, GlobalPanId, ResetId };
+
+public:
+ QtViewer_ViewFrame( SUIT_Desktop*, QtViewer_Viewer*, QWidget* w = nullptr );
+ ~QtViewer_ViewFrame();
+
+ QtViewer_Viewer* getViewer() const { return myViewer; }
+ QtViewer_ViewPort* getViewPort() const { return myViewPort; }
+
+ virtual QImage dumpView();
+
+ virtual QString getVisualParameters();
+ virtual void setVisualParameters( const QString& theParameters );
+
+public slots:
+ virtual void showEvent( QShowEvent* );
+ virtual void hideEvent( QHideEvent* );
+
+protected slots:
+ void onViewPan();
+ void onViewZoom();
+ void onViewFitAll();
+ void onViewFitArea();
+ void onViewFitSelect();
+ void onViewGlobalPan();
+ void onViewReset();
+
+private slots:
+ void keyEvent( QKeyEvent* );
+ void mouseEvent( QMouseEvent* );
+ void wheelEvent( QWheelEvent* );
+ void contextMenuEvent( QContextMenuEvent* );
+
+signals:
+ void keyPressed( QKeyEvent* );
+ void keyReleased( QKeyEvent* );
+ void mousePressed( QMouseEvent* );
+ void mouseMoving( QMouseEvent* );
+ void mouseReleased( QMouseEvent* );
+ void mouseDoubleClicked( QMouseEvent* );
+ void wheeling( QWheelEvent* );
+
+ void sketchingFinished( QPainterPath );
+
+ void Show( QShowEvent* );
+ void Hide( QHideEvent* );
+
+protected:
+ virtual void createActions();
+ virtual void createToolBar();
+ virtual QString filter() const;
+ virtual bool dumpViewToFormat( const QImage&, const QString& fileName, const QString& format );
+
+private:
+ QtViewer_Viewer* myViewer;
+ QtViewer_ViewPort* myViewPort;
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QtViewer_ViewManager.h"
+#include "QtViewer_Viewer.h"
+
+//=======================================================================
+// Name : QtViewer_ViewManager
+// Purpose : Constructor
+//=======================================================================
+QtViewer_ViewManager::QtViewer_ViewManager( SUIT_Study* theStudy,
+ SUIT_Desktop* theDesktop,
+ SUIT_ViewModel* theModel )
+: SUIT_ViewManager( theStudy, theDesktop,
+ theModel ? theModel : new QtViewer_Viewer("QtViewer") )
+{
+ setTitle( tr( "QTVIEWER_TITLE" ) );
+}
+
+//=======================================================================
+// Name : QtViewer_ViewManager
+// Purpose : Destructor
+//=======================================================================
+QtViewer_ViewManager::~QtViewer_ViewManager()
+{
+}
+
+//================================================================
+// Function : getViewer
+// Purpose :
+//================================================================
+QtViewer_Viewer* QtViewer_ViewManager::getViewer()
+{
+ return dynamic_cast<QtViewer_Viewer*>( getViewModel() );
+}
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef QTVIEWER_VIEWMANAGER_H
+#define QTVIEWER_VIEWMANAGER_H
+
+#include "QtViewer.h"
+#include <SUIT_ViewManager.h>
+
+class QtViewer_Viewer;
+
+/*
+ Class : QtViewer_ViewManager
+ Description : View manager of the graphics view
+*/
+class QTVIEWER_API QtViewer_ViewManager : public SUIT_ViewManager
+{
+ Q_OBJECT
+
+public:
+ QtViewer_ViewManager( SUIT_Study* theStudy,
+ SUIT_Desktop* theDesktop,
+ SUIT_ViewModel* theModel = 0 );
+ virtual ~QtViewer_ViewManager();
+
+ QtViewer_Viewer* getViewer();
+};
+#endif
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QtViewer_ViewPort.h"
+#include "QtViewer_Scene.h"
+#include <QGraphicsItem>
+#include <QRubberBand>
+#include <QMouseEvent>
+#include <QCursor>
+#include <QScrollBar>
+#include <QPainter>
+#include <QPrinter>
+
+#include "SUIT_ResourceMgr.h"
+#include "SUIT_Session.h"
+
+//=======================================================================
+// Name : QtViewer_ViewPort
+// Purpose : Constructor
+//=======================================================================
+QtViewer_ViewPort::QtViewer_ViewPort( QWidget* theParent )
+: QGraphicsView( theParent )
+{
+ setScene(new QtViewer_Scene(this));
+
+ setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+
+ setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
+
+ setMouseTracking( true );
+ setFocusPolicy( Qt::StrongFocus );
+
+ myFitAllGap = 40;
+
+ myRectBand = nullptr;
+ myRectBandStart = QPoint();
+ myRectBandEnd = QPoint();
+ fittingArea = false;
+
+ zooming = false;
+ previousPos = QPoint();
+
+ panning = false;
+ globalPanning = false;
+
+ SUIT_ResourceMgr* rmgr = SUIT_Session::session()->resourceMgr();
+ zoomCursor = new QCursor( rmgr->loadPixmap( "QtViewer", tr( "ICON_QTV_CURSOR_ZOOM" ) ) );
+}
+
+//=======================================================================
+// Name : QtViewer_ViewPort
+// Purpose : Destructor
+//=======================================================================
+QtViewer_ViewPort::~QtViewer_ViewPort()
+{
+ delete zoomCursor;
+ zoomCursor = nullptr;
+}
+
+void QtViewer_ViewPort::addItem( QGraphicsItem* theItem )
+{
+ scene()->addItem(theItem);
+}
+
+void QtViewer_ViewPort::fitAll()
+{
+ QRectF aRect;
+ foreach (QGraphicsItem* item, scene()->items())
+ {
+ if (item->isVisible())
+ aRect = aRect.united(item->boundingRect());
+ }
+
+ fitInView( aRect.adjusted(-myFitAllGap, -myFitAllGap, myFitAllGap, myFitAllGap), Qt::KeepAspectRatio);
+}
+
+void QtViewer_ViewPort::fitSelect()
+{
+ if (scene()->selectedItems().isEmpty())
+ return;
+
+ QRectF selectionRect;
+ foreach (QGraphicsItem *item, scene()->selectedItems())
+ selectionRect = selectionRect.united(item->sceneBoundingRect());
+
+ if(!selectionRect.isNull())
+ fitInView(selectionRect.adjusted(-myFitAllGap, -myFitAllGap, myFitAllGap, myFitAllGap), Qt::KeepAspectRatio);
+}
+
+void QtViewer_ViewPort::fitRect(const QRectF& theRect)
+{
+ fitInView(theRect, Qt::KeepAspectRatio);
+}
+
+QRect QtViewer_ViewPort::selectionRect()
+{
+ if (myRectBand)
+ {
+ QRect aRect;
+ aRect.setLeft(qMin( myRectBandStart.x(), myRectBandEnd.x()));
+ aRect.setTop(qMin( myRectBandStart.y(), myRectBandEnd.y()));
+ aRect.setRight(qMax( myRectBandStart.x(), myRectBandEnd.x()));
+ aRect.setBottom(qMax( myRectBandStart.y(), myRectBandEnd.y()));
+ return aRect;
+ }
+ return QRect();
+}
+
+void QtViewer_ViewPort::startDrawingRect( int x, int y )
+{
+ myRectBandStart = QPoint(x,y);
+
+ if (!myRectBand)
+ {
+ myRectBand = new QRubberBand(QRubberBand::Rectangle, this);
+ myRectBand->setGeometry(QRect(myRectBandStart, QSize()));
+ myRectBand->show();
+ }
+}
+
+void QtViewer_ViewPort::drawingRect( int x, int y )
+{
+ myRectBandEnd = QPoint(x,y);
+ myRectBand->setGeometry(QRect(myRectBandStart, myRectBandEnd).normalized());
+}
+
+void QtViewer_ViewPort::finishDrawingRect()
+{
+ myRectBand->hide();
+
+ QRectF selectionRect = mapToScene(myRectBand->geometry()).boundingRect();
+
+ if (fittingArea)
+ fitInView(selectionRect, Qt::KeepAspectRatio);
+ else
+ {
+ QList<QGraphicsItem *> selectedItems = scene()->items(selectionRect, Qt::IntersectsItemShape);
+ for (QGraphicsItem *item : selectedItems)
+ item->setSelected(true);
+ }
+
+ myRectBandStart = QPoint();
+ myRectBandEnd = QPoint();
+ delete myRectBand;
+ myRectBand = nullptr;
+}
+
+void QtViewer_ViewPort::updateSceneRect(const QRectF &rect)
+{
+}
+
+void QtViewer_ViewPort::mousePressEvent(QMouseEvent *event)
+{
+ if (!zooming && !panning && !globalPanning && items(event->pos()).count()==0 && (event->buttons() & Qt::LeftButton))
+ {
+ startDrawingRect(event->pos().x(), event->pos().y());
+ }
+
+ if (globalPanning)
+ {
+ QPoint p0 = viewport()->rect().center();
+ QPoint p1 = event->pos();
+ double deltaX = p0.x() - p1.x();
+ double deltaY = p0.y() - p1.y();
+
+ pan(deltaX, -deltaY);
+ }
+ QGraphicsView::mousePressEvent(event);
+ emit vpMouseEvent(event);
+}
+
+
+void QtViewer_ViewPort::mouseMoveEvent(QMouseEvent *event)
+{
+ if ((event->modifiers() & Qt::ShiftModifier) && (event->buttons() & Qt::LeftButton))
+ activateZoomAction();
+
+ if (event->buttons() & Qt::MiddleButton)
+ activatePanAction();
+
+ if (panning && event->buttons() & (Qt::LeftButton | Qt::MiddleButton))
+ {
+ QPoint currentPos = event->pos();
+
+ if (!previousPos.isNull())
+ {
+ double deltaX = currentPos.x() - previousPos.x();
+ double deltaY = currentPos.y() - previousPos.y();
+
+ pan(deltaX, -deltaY);
+
+ }
+ previousPos = currentPos;
+
+ }
+ else if (zooming && (event->buttons() & Qt::LeftButton))
+ {
+ QPoint currentPos = event->pos();
+ if (!previousPos.isNull())
+ {
+ int deltaX = currentPos.x() - previousPos.x();
+ double scaleFactor = deltaX>0 ? 1.1 : 0.9;
+ scale(scaleFactor, scaleFactor);
+ }
+ previousPos = currentPos;
+ }
+ else if (myRectBand)
+ drawingRect(event->pos().x(), event->pos().y());
+
+ QGraphicsView::mouseMoveEvent(event);
+ emit vpMouseEvent(event);
+}
+
+void QtViewer_ViewPort::mouseReleaseEvent(QMouseEvent *event)
+{
+ if (myRectBand)
+ finishDrawingRect();
+
+ clearActions();
+ QGraphicsView::mouseReleaseEvent(event);
+ emit vpMouseEvent(event);
+}
+
+void QtViewer_ViewPort::resizeEvent(QResizeEvent *event)
+{
+ QSize oldSize = event->oldSize();
+ QSize newSize = event->size();
+
+ qreal w = static_cast<qreal>(newSize.width());
+ qreal h = static_cast<qreal>(newSize.height());
+
+ qreal w0 = static_cast<qreal>(oldSize.width());
+ qreal h0 = static_cast<qreal>(oldSize.height());
+
+ qreal widthRatio = w/w0;
+ qreal heightRatio = h/h0;
+
+ if (widthRatio>0 && heightRatio>0)
+ {
+ qreal scaleFactor = w<h ? widthRatio : heightRatio;
+ scale(scaleFactor, scaleFactor);
+ }
+
+ QGraphicsView::resizeEvent(event);
+}
+
+void QtViewer_ViewPort::wheelEvent(QWheelEvent *event)
+{
+ int delta = event->angleDelta().y();
+ double scaleFactor = delta>0 ? 1.1 : 0.9;
+ scale(scaleFactor, scaleFactor);
+}
+
+void QtViewer_ViewPort::keyPressEvent(QKeyEvent *event)
+{
+ if (event->key() == Qt::Key_Escape)
+ clearActions();
+
+ QGraphicsView::keyPressEvent(event);
+}
+
+void QtViewer_ViewPort::clearActions()
+{
+ setCursor(Qt::ArrowCursor);
+ fittingArea = false;
+ zooming = false;
+ panning = false;
+ globalPanning = false;
+ previousPos = QPoint();
+}
+
+void QtViewer_ViewPort::activateZoomAction()
+{
+ zooming = true;
+ fittingArea = false;
+ panning = false;
+ globalPanning = false;
+ setCursor(*zoomCursor);
+}
+
+void QtViewer_ViewPort::activateFitAreaAction()
+{
+ fittingArea = true;
+ zooming = false;
+ panning = false;
+ globalPanning = false;
+ setCursor(Qt::PointingHandCursor);
+}
+
+void QtViewer_ViewPort::activatePanAction()
+{
+ panning = true;
+ fittingArea = false;
+ zooming = false;
+ globalPanning = false;
+ setCursor(Qt::SizeAllCursor);
+}
+
+void QtViewer_ViewPort::activateGlobalPanAction()
+{
+ globalPanning = true;
+ panning = false;
+ fittingArea = false;
+ zooming = false;
+ setCursor(Qt::CrossCursor);
+}
+
+void QtViewer_ViewPort::pan( double theDX, double theDY )
+{
+ if( QScrollBar* aHBar = horizontalScrollBar() )
+ {
+ int aNewValue = aHBar->value() - theDX;
+ if( aNewValue < aHBar->minimum() )
+ aHBar->setMinimum( aNewValue );
+ if( aNewValue > aHBar->maximum() )
+ aHBar->setMaximum( aNewValue );
+
+ aHBar->setValue( aHBar->value() - theDX );
+ }
+ if( QScrollBar* aVBar = verticalScrollBar() )
+ {
+ int aNewValue = aVBar->value() + theDY;
+ if( aNewValue < aVBar->minimum() )
+ aVBar->setMinimum( aNewValue );
+ if( aNewValue > aVBar->maximum() )
+ aVBar->setMaximum( aNewValue );
+ aVBar->setValue( aVBar->value() + theDY );
+ }
+}
+
+//================================================================
+// Function : dumpView
+// Purpose :
+//================================================================
+QImage QtViewer_ViewPort::dumpView( bool theWholeScene,
+ QSizeF theSize )
+{
+ QPixmap screenshot = viewport()->grab();
+ return screenshot.toImage();
+}
+
+bool QtViewer_ViewPort::dumpViewToFormat(const QString& fileName, const QString& format)
+{
+ if( format!="PS" && format!="EPS" )
+ return false;
+
+ QPrinter printer(QPrinter::ScreenResolution);
+ printer.setOutputFormat(QPrinter::NativeFormat);
+ printer.setOutputFileName(fileName);
+
+ QPainter painter;
+ if (!painter.begin(&printer))
+ return false;
+
+ render(&painter);
+ if (!painter.end())
+ return false;
+
+ return true;
+}
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef QTVIEWER_VIEWPORT_H
+#define QTVIEWER_VIEWPORT_H
+
+#include "QtViewer.h"
+#include <QGraphicsView>
+
+class QRubberBand;
+
+/*
+ Class : QtViewer_ViewPort
+ Description : View port of the graphics view
+*/
+class QTVIEWER_API QtViewer_ViewPort : public QGraphicsView
+{
+ Q_OBJECT
+
+public:
+ QtViewer_ViewPort(QWidget* theParent);
+ ~QtViewer_ViewPort();
+
+ void addItem(QGraphicsItem* theItem);
+
+ void fitAll();
+ void fitSelect();
+ void fitRect(const QRectF& theRect);
+ void pan(double theDX, double theDY);
+
+ // rectangle selection
+ void startDrawingRect(int x, int y);
+ void drawingRect(int x, int y);
+ void finishDrawingRect();
+ QRect selectionRect();
+
+ void activateZoomAction();
+ void activateFitAreaAction();
+ void activatePanAction();
+ void activateGlobalPanAction();
+
+ QImage dumpView(bool theWholeScene = false, QSizeF theSize = QSizeF());
+ bool dumpViewToFormat(const QString& fileName, const QString& format);
+
+
+signals:
+ void vpMouseEvent(QMouseEvent*);
+
+
+public slots:
+ virtual void updateSceneRect(const QRectF &rect);
+
+protected:
+
+ virtual void mousePressEvent(QMouseEvent *event);
+ virtual void mouseMoveEvent(QMouseEvent *event);
+ virtual void mouseReleaseEvent(QMouseEvent *event);
+ virtual void resizeEvent(QResizeEvent *event);
+ virtual void wheelEvent(QWheelEvent *event);
+ virtual void keyPressEvent(QKeyEvent *event);
+
+ void clearActions();
+
+private:
+
+ double myFitAllGap;
+ QRubberBand* myRectBand;
+ QPoint myRectBandStart;
+ QPoint myRectBandEnd;
+
+ bool fittingArea;
+ bool zooming;
+ bool panning;
+ bool globalPanning;
+ QPoint previousPos;
+ QCursor* zoomCursor;
+};
+
+#endif
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "QtViewer_Viewer.h"
+
+#include "QtViewer_Selector.h"
+#include "QtViewer_Scene.h"
+#include "QtViewer_ViewFrame.h"
+#include "QtViewer_ViewPort.h"
+
+#include <SUIT_ViewManager.h>
+
+#include <QColorDialog>
+#include <QWheelEvent>
+#include <QKeyEvent>
+#include <QMenu>
+
+
+//=======================================================================
+// Name : QtViewer_Viewer
+// Purpose : Constructor
+//=======================================================================
+QtViewer_Viewer::QtViewer_Viewer( const QString& /*title*/, QWidget* widget )
+: SUIT_ViewModel(),
+ mySelector( 0 ),
+ myWidget( widget )
+{
+}
+
+//=======================================================================
+// Name : QtViewer_Viewer
+// Purpose : Destructor
+//=======================================================================
+QtViewer_Viewer::~QtViewer_Viewer()
+{
+ delete mySelector;
+}
+
+QtViewer_ViewFrame* QtViewer_Viewer::createViewFrame( SUIT_Desktop* theDesktop, QWidget* theWidget )
+{
+ return new QtViewer_ViewFrame( theDesktop, this, theWidget );
+}
+
+//================================================================
+// Function : createView
+// Purpose :
+//================================================================
+SUIT_ViewWindow* QtViewer_Viewer::createView( SUIT_Desktop* theDesktop )
+{
+ QtViewer_ViewFrame* aViewFrame = createViewFrame( theDesktop, myWidget );
+
+ connect( aViewFrame, SIGNAL( keyPressed( QKeyEvent* ) ),
+ this, SLOT( onKeyEvent( QKeyEvent* ) ) );
+
+ connect( aViewFrame, SIGNAL( keyReleased( QKeyEvent* ) ),
+ this, SLOT( onKeyEvent( QKeyEvent* ) ) );
+
+ connect( aViewFrame, SIGNAL( mousePressed( QMouseEvent* ) ),
+ this, SLOT( onMouseEvent( QMouseEvent* ) ) );
+
+ connect( aViewFrame, SIGNAL( mouseMoving( QMouseEvent* ) ),
+ this, SLOT( onMouseEvent( QMouseEvent* ) ) );
+
+ connect( aViewFrame, SIGNAL( mouseReleased( QMouseEvent* ) ),
+ this, SLOT( onMouseEvent( QMouseEvent* ) ) );
+ return aViewFrame;
+}
+
+//================================================================
+// Function : contextMenuPopup
+// Purpose :
+//================================================================
+void QtViewer_Viewer::contextMenuPopup( QMenu* thePopup )
+{
+ if( thePopup->actions().count() > 0 )
+ thePopup->addSeparator();
+
+ thePopup->addAction(tr("CHANGE_BGCOLOR"), this, SLOT(onChangeBgColor()));
+}
+
+//================================================================
+// Function : getSelector
+// Purpose :
+//================================================================
+QtViewer_Selector* QtViewer_Viewer::getSelector()
+{
+ if( !mySelector )
+ {
+ mySelector = new QtViewer_Selector( this );
+ if( mySelector )
+ connect( mySelector, SIGNAL(selSelectionDone()), this, SLOT( onSelectionDone()));
+ }
+ return mySelector;
+}
+
+//================================================================
+// Function : getActiveView
+// Purpose :
+//================================================================
+QtViewer_ViewFrame* QtViewer_Viewer::getActiveView() const
+{
+ if( SUIT_ViewManager* aViewManager = getViewManager() )
+ return dynamic_cast<QtViewer_ViewFrame*>( aViewManager->getActiveView() );
+ return nullptr;
+}
+
+//================================================================
+// Function : getActiveViewPort
+// Purpose :
+//================================================================
+QtViewer_ViewPort* QtViewer_Viewer::getActiveViewPort() const
+{
+ if( QtViewer_ViewFrame* aViewFrame = getActiveView() )
+ return aViewFrame->getViewPort();
+ return nullptr;
+}
+
+//================================================================
+// Function : getActiveScene
+// Purpose :
+//================================================================
+QtViewer_Scene* QtViewer_Viewer::getActiveScene() const
+{
+ if( QtViewer_ViewPort* aViewPort = getActiveViewPort() )
+ return dynamic_cast<QtViewer_Scene*>( aViewPort->scene() );
+ return nullptr;
+}
+
+//================================================================
+// Function : onKeyEvent
+// Purpose :
+//================================================================
+void QtViewer_Viewer::onKeyEvent( QKeyEvent* e )
+{
+ switch( e->type() )
+ {
+ case QEvent::KeyPress:
+ handleKeyPress( e );
+ break;
+ case QEvent::KeyRelease:
+ handleKeyRelease( e );
+ break;
+ default: break;
+ }
+}
+
+//================================================================
+// Function : onMouseEvent
+// Purpose :
+//================================================================
+void QtViewer_Viewer::onMouseEvent(QMouseEvent* e)
+{
+ switch( e->type() )
+ {
+ case QEvent::MouseButtonPress:
+ handleMousePress(e);
+ break;
+ case QEvent::MouseMove:
+ handleMouseMove(e);
+ break;
+ case QEvent::MouseButtonRelease:
+ handleMouseRelease(e);
+ break;
+ default: break;
+ }
+}
+//================================================================
+// Function : onWheelEvent
+// Purpose :
+//================================================================
+void QtViewer_Viewer::onWheelEvent(QWheelEvent* e)
+{
+ switch(e->type())
+ {
+ case QEvent::Wheel:
+ handleWheel(e);
+ break;
+ default: break;
+ }
+}
+
+//================================================================
+// Function : handleKeyPress
+// Purpose :
+//================================================================
+void QtViewer_Viewer::handleKeyPress( QKeyEvent* e )
+{
+ Q_UNUSED(e);
+}
+
+//================================================================
+// Function : handleKeyRelease
+// Purpose :
+//================================================================
+void QtViewer_Viewer::handleKeyRelease(QKeyEvent* e)
+{
+ Q_UNUSED(e);
+}
+
+//================================================================
+// Function : handleMousePress
+// Purpose :
+//================================================================
+void QtViewer_Viewer::handleMousePress(QMouseEvent* e)
+{
+ Q_UNUSED(e);
+}
+
+void QtViewer_Viewer::handleWheel(QWheelEvent* e)
+{
+ Q_UNUSED(e);
+}
+
+//================================================================
+// Function : handleMouseMove
+// Purpose :
+//================================================================
+void QtViewer_Viewer::handleMouseMove(QMouseEvent* e)
+{
+ Q_UNUSED(e);
+}
+
+//================================================================
+// Function : handleMouseRelease
+// Purpose :
+//================================================================
+void QtViewer_Viewer::handleMouseRelease(QMouseEvent* e)
+{
+ QtViewer_ViewPort* aViewPort = getActiveViewPort();
+ if ( getSelector() )
+ getSelector()->select(aViewPort->selectionRect());
+}
+
+//================================================================
+// Function : onChangeBgColor
+// Purpose :
+//================================================================
+
+void QtViewer_Viewer::onChangeBgColor()
+{
+ if( QtViewer_ViewPort* aViewPort = getActiveViewPort() )
+ {
+ QColor aColor = QColorDialog::getColor( aColor, aViewPort );
+
+ if (aColor.isValid())
+ aViewPort->setBackgroundBrush(QBrush(aColor));
+ }
+}
+
+//================================================================
+// Function : onSelectionDone
+// Purpose :
+//================================================================
+void QtViewer_Viewer::onSelectionDone()
+{
+ emit selectionChanged();
+}
+
+//================================================================
+// Function : fitAll
+// Purpose :
+//================================================================
+void QtViewer_Viewer::fitAll()
+{
+ if (QtViewer_ViewPort* aViewPort = getActiveViewPort())
+ aViewPort->fitAll();
+}
+
+//================================================================
+// Function : fitSelect
+// Purpose :
+//================================================================
+void QtViewer_Viewer::fitSelect()
+{
+ if (QtViewer_ViewPort* aViewPort = getActiveViewPort())
+ aViewPort->fitSelect();
+}
+
+//================================================================
+// Function : fitArea
+// Purpose :
+//================================================================
+void QtViewer_Viewer::fitArea()
+{
+ if (QtViewer_ViewPort* aViewPort = getActiveViewPort())
+ aViewPort->activateFitAreaAction();
+}
+
+//================================================================
+// Function : zoom
+// Purpose :
+//================================================================
+void QtViewer_Viewer::zoom()
+{
+ if (QtViewer_ViewPort* aViewPort = getActiveViewPort())
+ aViewPort->activateZoomAction();
+}
+
+//================================================================
+// Function : pan
+// Purpose :
+//================================================================
+void QtViewer_Viewer::pan()
+{
+ if (QtViewer_ViewPort* aViewPort = getActiveViewPort())
+ aViewPort->activatePanAction();
+}
+
+//================================================================
+// Function : globalPan
+// Purpose :
+//================================================================
+void QtViewer_Viewer::globalPan()
+{
+ if (QtViewer_ViewPort* aViewPort = getActiveViewPort())
+ {
+ aViewPort->fitAll();
+ aViewPort->activateGlobalPanAction();
+ }
+}
--- /dev/null
+// Copyright (C) 2013-2023 CEA, EDF, OPEN CASCADE
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef QTVIEWER_VIEWER_H
+#define QTVIEWER_VIEWER_H
+
+#include "QtViewer.h"
+#include <SUIT_ViewModel.h>
+
+class QKeyEvent;
+class QMouseEvent;
+class QWheelEvent;
+
+class SUIT_ViewWindow;
+
+class QtViewer_Selector;
+class QtViewer_Scene;
+class QtViewer_ViewFrame;
+class QtViewer_ViewPort;
+
+/*
+ Class : QtViewer_Viewer
+ Description : View model of the graphics view
+*/
+class QTVIEWER_API QtViewer_Viewer: public SUIT_ViewModel
+{
+ Q_OBJECT
+
+public:
+ QtViewer_Viewer(const QString& title, QWidget* widget = nullptr);
+ ~QtViewer_Viewer();
+
+public:
+ virtual SUIT_ViewWindow* createView(SUIT_Desktop*);
+
+ virtual QString getType() const { return Type(); }
+ static QString Type() { return "QtViewer"; }
+
+ virtual void contextMenuPopup(QMenu*);
+
+public:
+ QtViewer_Selector* getSelector();
+
+ QtViewer_ViewFrame* getActiveView() const;
+ QtViewer_ViewPort* getActiveViewPort() const;
+ QtViewer_Scene* getActiveScene() const;
+
+ void fitAll();
+ void fitSelect();
+ void fitArea();
+ void zoom();
+ void pan();
+ void globalPan();
+
+signals:
+ void selectionChanged();
+
+protected:
+
+ virtual QtViewer_ViewFrame* createViewFrame(SUIT_Desktop* theDesktop, QWidget* theWidget);
+
+protected slots:
+ virtual void onKeyEvent(QKeyEvent*);
+ virtual void onMouseEvent(QMouseEvent*);
+ virtual void onWheelEvent(QWheelEvent*);
+
+ virtual void onSelectionDone();
+ virtual void onChangeBgColor();
+
+protected:
+ virtual void handleKeyPress(QKeyEvent*);
+ virtual void handleKeyRelease(QKeyEvent*);
+ virtual void handleMouseMove(QMouseEvent*);
+ virtual void handleMousePress(QMouseEvent*);
+ virtual void handleMouseRelease(QMouseEvent*);
+ virtual void handleWheel(QWheelEvent*);
+
+protected:
+ QtViewer_Selector* mySelector;
+ QWidget* myWidget;
+};
+
+#endif
--- /dev/null
+<!DOCTYPE TS><TS>
+<context>
+ <name>QtViewer_ViewFrame</name>
+ <message>
+ <source>ICON_QTV_DUMP</source>
+ <translation>qtviewer_dump.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_ZOOM</source>
+ <translation>qtviewer_zoom.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_PAN</source>
+ <translation>qtviewer_pan.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_GLOBALPAN</source>
+ <translation>qtviewer_glpan.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_FITALL</source>
+ <translation>qtviewer_fitall.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_FITSELECT</source>
+ <translation>qtviewer_fitselect.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_RESET</source>
+ <translation>qtviewer_reset.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_FITAREA</source>
+ <translation>qtviewer_fitarea.png</translation>
+ </message>
+ <message>
+ <source>ICON_QTV_ROTATE</source>
+ <translation>qtviewer_rotate.png</translation>
+ </message>
+</context>
+<context>
+ <name>QtViewer_ViewPort</name>
+ <message>
+ <source>ICON_QTV_CURSOR_ZOOM</source>
+ <translation>qtviewer_cursor_zoom.png</translation>
+ </message>
+</context>
+</TS>
--- /dev/null
+<!DOCTYPE TS>
+<TS>
+ <context>
+ <name>QtViewer_ViewFrame</name>
+ <message>
+ <source>DSC_DUMP_VIEW</source>
+ <translation>Saves the active view in the image file</translation>
+ </message>
+ <message>
+ <source>DSC_FITALL</source>
+ <translation>Fit all objects inside the view frame</translation>
+ </message>
+ <message>
+ <source>DSC_FITRECT</source>
+ <translation>Fit area within the view frame</translation>
+ </message>
+ <message>
+ <source>DSC_FITSELECT</source>
+ <translation>Fit area of selection within the view frame</translation>
+ </message>
+ <message>
+ <source>DSC_GLOBALPAN_VIEW</source>
+ <translation>Selection of a new center of the view</translation>
+ </message>
+ <message>
+ <source>DSC_PAN_VIEW</source>
+ <translation>Pan the view</translation>
+ </message>
+ <message>
+ <source>DSC_RESET_VIEW</source>
+ <translation>Reset view point</translation>
+ </message>
+ <message>
+ <source>DSC_ZOOM_VIEW</source>
+ <translation>Zoom the view</translation>
+ </message>
+ <message>
+ <source>LBL_TOOLBAR_LABEL</source>
+ <translation>View Operations</translation>
+ </message>
+ <message>
+ <source>MNU_DUMP_VIEW</source>
+ <translation>Dump</translation>
+ </message>
+ <message>
+ <source>MNU_FITALL</source>
+ <translation>Fit All</translation>
+ </message>
+ <message>
+ <source>MNU_FITRECT</source>
+ <translation>Fit Area</translation>
+ </message>
+ <message>
+ <source>MNU_FITSELECT</source>
+ <translation>Fit Selection</translation>
+ </message>
+ <message>
+ <source>MNU_GLOBALPAN_VIEW</source>
+ <translation>Global Pan</translation>
+ </message>
+ <message>
+ <source>MNU_PAN_VIEW</source>
+ <translation>Pan</translation>
+ </message>
+ <message>
+ <source>MNU_RESET_VIEW</source>
+ <translation>Reset</translation>
+ </message>
+ <message>
+ <source>MNU_ZOOM_VIEW</source>
+ <translation>Zoom</translation>
+ </message>
+ <message>
+ <source>POSTSCRIPT_FILES</source>
+ <translation>PostScript files (*.ps *.eps)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QtViewer_Viewer</name>
+ <message>
+ <source>CHANGE_BGCOLOR</source>
+ <translation>Change background...</translation>
+ </message>
+ <message>
+ <source>ADD_IMAGE</source>
+ <translation>Add image</translation>
+ </message>
+ <message>
+ <source>REMOVE_IMAGES</source>
+ <translation>Remove image(s)</translation>
+ </message>
+ <message>
+ <source>BRING_TO_FRONT</source>
+ <translation>Bring to front</translation>
+ </message>
+ <message>
+ <source>SEND_TO_BACK</source>
+ <translation>Send to back</translation>
+ </message>
+ <message>
+ <source>BRING_FORWARD</source>
+ <translation>Bring forward</translation>
+ </message>
+ <message>
+ <source>SEND_BACKWARD</source>
+ <translation>Send backward</translation>
+ </message>
+ <message>
+ <source>PROPERTIES</source>
+ <translation>Properties</translation>
+ </message>
+ <message>
+ <source>TEST_FUSE_OPERATOR</source>
+ <translation>Test Fuse operator</translation>
+ </message>
+ <message>
+ <source>TEST_CROP_OPERATOR</source>
+ <translation>Test Crop operator</translation>
+ </message>
+ </context>
+ <context>
+ <name>QtViewer_ViewManager</name>
+ <message>
+ <source>QTVIEWER_TITLE</source>
+ <translation>Qt scene:%M - viewer:%V</translation>
+ </message>
+ </context>
+</TS>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr" sourcelanguage="en">
+<context>
+ <name>QtViewer_ViewFrame</name>
+ <message>
+ <source>DSC_DUMP_VIEW</source>
+ <translation>Sauver la scène actuelle au fichier image</translation>
+ </message>
+ <message>
+ <source>DSC_FITALL</source>
+ <translation>Redimensionner la scène pour montrer tous les objets </translation>
+ </message>
+ <message>
+ <source>DSC_FITRECT</source>
+ <translation>Redimensionner la scène pour ne montrer que sa partie choisie par l'encadré</translation>
+ </message>
+ <message>
+ <source>DSC_FITSELECT</source>
+ <translation>Redimensionner la scène pour montrer la sélection.</translation>
+ </message>
+ <message>
+ <source>DSC_GLOBALPAN_VIEW</source>
+ <translation>Sélection d'un nouveau centre de la vue</translation>
+ </message>
+ <message>
+ <source>DSC_PAN_VIEW</source>
+ <translation>Redimensionner la vue</translation>
+ </message>
+ <message>
+ <source>DSC_RESET_VIEW</source>
+ <translation>Restaurer le point de vue</translation>
+ </message>
+ <message>
+ <source>DSC_ZOOM_VIEW</source>
+ <translation>Zoom</translation>
+ </message>
+ <message>
+ <source>LBL_TOOLBAR_LABEL</source>
+ <translation>Opérations de visualisation</translation>
+ </message>
+ <message>
+ <source>MNU_DUMP_VIEW</source>
+ <translation>Sauver la scène</translation>
+ </message>
+ <message>
+ <source>MNU_FITALL</source>
+ <translation>Montrer tout</translation>
+ </message>
+ <message>
+ <source>MNU_FITRECT</source>
+ <translation>Montrer l'encadré</translation>
+ </message>
+ <message>
+ <source>MNU_FITSELECT</source>
+ <translation>Ajuster la sélection</translation>
+ </message>
+ <message>
+ <source>MNU_GLOBALPAN_VIEW</source>
+ <translation>Panoramique Globale</translation>
+ </message>
+ <message>
+ <source>MNU_PAN_VIEW</source>
+ <translation>Redimensionner la vue</translation>
+ </message>
+ <message>
+ <source>MNU_RESET_VIEW</source>
+ <translation>Restaurer</translation>
+ </message>
+ <message>
+ <source>MNU_ZOOM_VIEW</source>
+ <translation>Zoom</translation>
+ </message>
+ <message>
+ <source>POSTSCRIPT_FILES</source>
+ <translation>Fichiers PostScript (*.ps *.eps)</translation>
+ </message>
+</context>
+<context>
+ <name>QtViewer_Viewer</name>
+ <message>
+ <source>TEST_CROP_OPERATOR</source>
+ <translation>Test Crop operator</translation>
+ </message>
+ <message>
+ <source>TEST_FUSE_OPERATOR</source>
+ <translation>Test Fuse operator</translation>
+ </message>
+ <message>
+ <source>PROPERTIES</source>
+ <translation>Propriétés</translation>
+ </message>
+ <message>
+ <source>SEND_BACKWARD</source>
+ <translation>Afficher derrière</translation>
+ </message>
+ <message>
+ <source>BRING_FORWARD</source>
+ <translation>Afficher devant</translation>
+ </message>
+ <message>
+ <source>SEND_TO_BACK</source>
+ <translation>Afficher au fond</translation>
+ </message>
+ <message>
+ <source>BRING_TO_FRONT</source>
+ <translation>Afficher au premier plan</translation>
+ </message>
+ <message>
+ <source>REMOVE_IMAGES</source>
+ <translation>Supprimer image(s)</translation>
+ </message>
+ <message>
+ <source>ADD_IMAGE</source>
+ <translation>Ajouter une image</translation>
+ </message>
+ <message>
+ <source>CHANGE_BGCOLOR</source>
+ <translation>Changer l'arrière-plan...</translation>
+ </message>
+</context>
+<context>
+ <name>QtViewer_ViewManager</name>
+ <message>
+ <source>QTVIEWER_TITLE</source>
+ <translation> Scène Qt:%M - visualisation:%V</translation>
+ </message>
+</context>
+</TS>
--- /dev/null
+<?xml version="1.0"?>
+<!DOCTYPE TS>
+<TS language="ja" sourcelanguage="en">
+ <context>
+ <name>QtViewer_ViewFrame</name>
+ <message>
+ <source>DSC_DUMP_VIEW</source>
+ <translation>アクティブビューの画像を保存</translation>
+ </message>
+ <message>
+ <source>DSC_FITALL</source>
+ <translation>ビューの枠内にすべてのオブジェクトをフィットする</translation>
+ </message>
+ <message>
+ <source>DSC_FITRECT</source>
+ <translation>領域をビューの枠内にフィットする</translation>
+ </message>
+ <message>
+ <source>DSC_FITSELECT</source>
+ <translation>選択領域をビューの枠内にフィットする</translation>
+ </message>
+ <message>
+ <source>DSC_GLOBALPAN_VIEW</source>
+ <translation>ビューの新しい中心の選択</translation>
+ </message>
+ <message>
+ <source>DSC_PAN_VIEW</source>
+ <translation>ビューの回転</translation>
+ </message>
+ <message>
+ <source>DSC_RESET_VIEW</source>
+ <translation>ビューのリセット</translation>
+ </message>
+ <message>
+ <source>DSC_ZOOM_VIEW</source>
+ <translation>ビューの拡大</translation>
+ </message>
+ <message>
+ <source>LBL_TOOLBAR_LABEL</source>
+ <translation>ビューの操作</translation>
+ </message>
+ <message>
+ <source>MNU_DUMP_VIEW</source>
+ <translation>表示状態の保存</translation>
+ </message>
+ <message>
+ <source>MNU_FITALL</source>
+ <translation>全表示</translation>
+ </message>
+ <message>
+ <source>MNU_FITRECT</source>
+ <translation>領域にフィット</translation>
+ </message>
+ <message>
+ <source>MNU_FITSELECT</source>
+ <translation>選択範囲をズーム</translation>
+ </message>
+ <message>
+ <source>MNU_GLOBALPAN_VIEW</source>
+ <translation>グローバル回転</translation>
+ </message>
+ <message>
+ <source>MNU_PAN_VIEW</source>
+ <translation>回転</translation>
+ </message>
+ <message>
+ <source>MNU_RESET_VIEW</source>
+ <translation>リセット</translation>
+ </message>
+ <message>
+ <source>MNU_ZOOM_VIEW</source>
+ <translation>ズーム</translation>
+ </message>
+ <message>
+ <source>POSTSCRIPT_FILES</source>
+ <translation>PostScript files (*.ps *.eps)</translation>
+ </message>
+ </context>
+ <context>
+ <name>QtViewer_Viewer</name>
+ <message>
+ <source>CHANGE_BGCOLOR</source>
+ <translation>背景の変更.</translation>
+ </message>
+ <message>
+ <source>ADD_IMAGE</source>
+ <translation>画像の追加</translation>
+ </message>
+ <message>
+ <source>REMOVE_IMAGES</source>
+ <translation>画像の削除</translation>
+ </message>
+ <message>
+ <source>BRING_TO_FRONT</source>
+ <translation>最前面へ移動</translation>
+ </message>
+ <message>
+ <source>SEND_TO_BACK</source>
+ <translation>最背面へ移動</translation>
+ </message>
+ <message>
+ <source>BRING_FORWARD</source>
+ <translation>前面へ移動</translation>
+ </message>
+ <message>
+ <source>SEND_BACKWARD</source>
+ <translation>背面へ移動</translation>
+ </message>
+ <message>
+ <source>PROPERTIES</source>
+ <translation>プロパティ</translation>
+ </message>
+ <message>
+ <source>TEST_FUSE_OPERATOR</source>
+ <translation>結合のテスト</translation>
+ </message>
+ <message>
+ <source>TEST_CROP_OPERATOR</source>
+ <translation>トリムのテスト</translation>
+ </message>
+ </context>
+ <context>
+ <name>QtViewer_ViewManager</name>
+ <message>
+ <source>QTVIEWER_TITLE</source>
+ <translation>グラフィックシーン:%M - ビューワ:%V</translation>
+ </message>
+ </context>
+</TS>