1 // Copyright (C) 2013-2016 CEA/DEN, EDF R&D, OPEN CASCADE
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #ifndef GRAPHICSVIEW_VIEWPORT_H
21 #define GRAPHICSVIEW_VIEWPORT_H
23 #include "GraphicsView.h"
25 #include "GraphicsView_Defs.h"
27 #include <QGraphicsView>
32 class GraphicsView_Object;
33 class GraphicsView_Scene;
36 Class : GraphicsView_ViewPort
37 Description : View port of the graphics view
39 class GRAPHICSVIEW_API GraphicsView_ViewPort : public QGraphicsView
51 WheelScaling = 0x0004,
52 EditFlags = Dragging | Pulling | WheelScaling,
54 TraceBoundingRect = 0x0008,
55 DraggingByMiddleButton = 0x0010,
56 ImmediateContextMenu = 0x0020,
57 ImmediateSelection = 0x0040,
60 Q_DECLARE_FLAGS( InteractionFlags, InteractionFlag )
65 BS_Selection = 0x0001, // and highlighting
66 BS_Dragging = 0x0002 // currently unused
69 enum ViewLabelPosition
79 GraphicsView_ViewPort( QWidget* theParent );
80 virtual ~GraphicsView_ViewPort();
83 GraphicsView_Scene* getScene() { return myScene; }
84 void addItem( QGraphicsItem* theItem );
85 bool isItemAdded( QGraphicsItem* theItem );
86 void removeItem( QGraphicsItem* theItem );
89 enum SortType { NoSorting, SelectedFirst, SortByZLevel };
90 GraphicsView_ObjectList getObjects( SortType theSortType = NoSorting ) const;
92 QRectF objectsBoundingRect( bool theOnlyVisible = false ) const;
94 QImage dumpView( bool theWholeScene = false,
95 QSizeF theSize = QSizeF() );
97 bool dumpViewToPSFormat(const QString& fileName);
101 void setSceneGap( double theSceneGap );
102 void setFitAllGap( double theFitAllGap );
105 int interactionFlags() const;
106 bool hasInteractionFlag( InteractionFlag theFlag );
107 void setInteractionFlag( InteractionFlag theFlag,
108 bool theIsEnabled = true );
109 void setInteractionFlags( InteractionFlags theFlags );
112 void setViewLabelPosition( ViewLabelPosition thePosition,
113 bool theIsForced = false );
114 void setViewLabelText( const QString& theText );
116 // displaying mouse position (currently, overlaps with view label feature)
117 void setMousePositionEnabled( bool theState );
119 // background / foreground
120 QColor backgroundColor() const;
121 void setBackgroundColor( const QColor& theColor );
123 bool isForegroundEnabled() const { return myIsForegroundEnabled; }
124 void setForegroundEnabled( bool theState );
126 QSizeF foregroundSize() const { return myForegroundSize; }
127 void setForegroundSize( const QSizeF& theRect );
129 double foregroundMargin() const { return myForegroundMargin; }
130 void setForegroundMargin( double theMargin );
132 QColor foregroundColor() const { return myForegroundColor; }
133 void setForegroundColor( const QColor& theColor );
135 QColor foregroundFrameColor() const { return myForegroundFrameColor; }
136 void setForegroundFrameColor( const QColor& theColor );
138 double foregroundFrameLineWidth() const { return myForegroundFrameLineWidth; }
139 void setForegroundFrameLineWidth( double theLineWidth );
141 void updateForeground();
144 void setGridEnabled( bool theState );
145 void setGridCellSize( int theCellSize );
146 void setGridLineStyle( int theLineStyle );
147 void setGridLineColor( const QColor& theLineColor );
152 void pan( double theDX, double theDY );
153 void setCenter( double theX, double theY );
154 void zoom( double theX1, double theY1, double theX2, double theY2 );
155 void fitRect( const QRectF& theRect );
157 void fitAll( bool theKeepScale = false );
160 bool isTransforming() const { return myIsTransforming; }
162 void applyTransform();
164 int zoomCoeff() const { return myZoomCoeff; }
165 void setZoomCoeff( const int& theZoomCoeff );
168 BlockStatus currentBlock();
171 virtual void highlight( double theX, double theY );
172 void clearHighlighted();
174 GraphicsView_Object* getHighlightedObject() const { return myHighlightedObject; }
177 virtual int select( const QRectF& theRect, bool theIsAppend );
178 void clearSelected();
179 void setSelected( GraphicsView_Object* theObject );
181 int nbSelected() const;
185 GraphicsView_Object* selectedObject();
187 const GraphicsView_ObjectList& getSelectedObjects() const { return mySelectedObjects; }
189 // rectangle selection
190 void startSelectByRect( int x, int y );
191 void drawSelectByRect( int x, int y );
192 void finishSelectByRect();
193 bool isSelectByRect() const;
194 QRect selectionRect();
197 void prepareToSketch( bool theStatus );
198 bool isPrepareToSketch();
199 void startSketching( const QPointF& thePoint,
201 void drawSketching( const QPointF& thePoint );
202 void finishSketching( bool theStatus );
203 bool isSketching( bool* theIsPath = 0 ) const;
206 bool isDragging() { return myIsDragging; }
208 bool isDraggingSelectedByLeftButton() const { return myDraggingSelectedByLeftButton; }
209 void setDraggingSelectedByLeftButton( const bool& theValue );
212 bool startPulling( const QPointF& );
213 void drawPulling( const QPointF& );
214 void finishPulling( bool theStatus );
215 bool isPulling() const { return myIsPulling; }
218 bool cancelCurrentOperation();
221 static void createCursors();
222 static void destroyCursors();
223 static QCursor* getDefaultCursor() { return defCursor; }
224 static QCursor* getHandCursor() { return handCursor; }
225 static QCursor* getPanCursor() { return panCursor; }
226 static QCursor* getPanglCursor() { return panglCursor; }
227 static QCursor* getZoomCursor() { return zoomCursor; }
228 static QCursor* getSketchCursor() { return sketchCursor; }
231 void onBoundingRectChanged();
234 void onKeyEvent( QKeyEvent* );
235 void onMouseEvent( QGraphicsSceneMouseEvent* );
236 void onWheelEvent( QGraphicsSceneWheelEvent* );
237 void onContextMenuEvent( QGraphicsSceneContextMenuEvent* );
240 virtual void scrollContentsBy( int theDX, int theDY );
243 void vpKeyEvent( QKeyEvent* );
244 void vpMouseEvent( QGraphicsSceneMouseEvent* );
245 void vpWheelEvent( QGraphicsSceneWheelEvent* );
246 void vpContextMenuEvent( QGraphicsSceneContextMenuEvent* );
248 void vpSketchingFinished( QPainterPath );
250 void vpObjectBeforeMoving();
251 void vpObjectAfterMoving( bool );
257 void dragObjects( QGraphicsSceneMouseEvent* );
261 static QCursor* defCursor;
262 static QCursor* handCursor;
263 static QCursor* panCursor;
264 static QCursor* panglCursor;
265 static QCursor* zoomCursor;
266 static QCursor* sketchCursor;
270 GraphicsView_Scene* myScene;
273 GraphicsView_ObjectList myObjects;
276 InteractionFlags myInteractionFlags;
279 ViewLabel* myViewLabel;
280 ViewLabelPosition myViewLabelPosition;
281 QGridLayout* myViewLabelLayout;
283 // displaying mouse position (currently, overlaps with view label feature)
284 bool myIsMousePositionEnabled;
287 bool myIsForegroundEnabled;
288 QSizeF myForegroundSize;
289 double myForegroundMargin;
290 QColor myForegroundColor;
291 QColor myForegroundFrameColor;
292 double myForegroundFrameLineWidth;
293 QGraphicsRectItem* myForegroundItem;
296 bool myIsGridEnabled;
299 QColor myGridLineColor;
300 QGraphicsPathItem* myGridItem;
303 bool myIsTransforming;
304 QTransform myCurrentTransform;
307 GraphicsView_Object* myHighlightedObject;
310 bool myIsHighlighting;
313 GraphicsView_ObjectList mySelectedObjects;
314 int mySelectionIterator;
316 // rectangle selection
317 QRubberBand* myRectBand;
318 QPoint myFirstSelectionPoint;
319 QPoint myLastSelectionPoint;
320 bool myAreSelectionPointsInitialized;
323 QGraphicsPathItem* mySketchingItem;
324 QPointF mySketchingPoint;
325 bool myIsPrepareToSketch;
327 bool myIsSketchingByPath;
331 QPointF myDragPosition;
332 bool myIsDragPositionInitialized;
333 bool myDraggingSelectedByLeftButton;
337 GraphicsView_Object* myPullingObject;
340 QCursor myStoredCursor;
342 // zoom diagonal coefficient
346 Q_DECLARE_OPERATORS_FOR_FLAGS( GraphicsView_ViewPort::InteractionFlags )