canvasmanipulator.h

00001 /***************************************************************************
00002  *   Copyright (C) 2004-2005 by David Saxton                               *
00003  *   david@bluehaze.org                                                    *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  ***************************************************************************/
00010 
00011 #ifndef CANVAsmANIPULATOR_H
00012 #define CANVAsmANIPULATOR_H
00013 
00014 #include "eventinfo.h"
00015 
00016 #include <qcanvas.h>
00017 #include <qguardedptr.h>
00018 
00019 class CanvasManipulator;
00020 class Connector;
00021 class CMManager;
00022 class CNItem;
00023 class CNItemGroup;
00024 class EventInfo;
00025 class FlowContainer;
00026 class ICNDocument;
00027 class Item;
00028 class ItemDocument;
00029 class ItemGroup;
00030 class ItemView;
00031 class ManipulatorInfo;
00032 class ManualConnectorDraw;
00033 class MechanicsItem;
00034 class MechanicsGroup;
00035 class MechanicsDocument;
00036 class Node;
00037 class NodeGroup;
00038 class ResizeHandle;
00039 
00040 class QCanvas;
00041 class QCanvasItem;
00042 class QCanvasLine;
00043 class QCanvasRectangle;
00044 class QMouseEvent;
00045 class QTimer;
00046 class QWheelEvent;
00047 
00048 typedef CanvasManipulator*(*CreateManipulatorPtr)( ItemDocument *, CMManager * );
00049 typedef bool(*AcceptManipulationPtr)( uint eventState, uint cmState, uint itemType, uint cnItemType );
00050 typedef QValueList<NodeGroup*> NodeGroupList;
00051 typedef QValueList<QGuardedPtr<Connector> > ConnectorList;
00052 typedef QValueList<QPoint> QPointList;
00053 
00054 class ManipulatorInfo
00055 {
00056 public:
00057         ManipulatorInfo();
00058         AcceptManipulationPtr m_acceptManipulationPtr;
00059         CreateManipulatorPtr m_createManipulatorPtr;
00060 };
00061 typedef QValueList<ManipulatorInfo*> ManipulatorInfoList;
00062 
00063 
00068 class CMManager : public QObject
00069 {
00070 Q_OBJECT
00071 public:
00072         enum EventState
00073         {
00074                 es_right_click =        1 << 0,
00075                 es_ctrl_pressed =       1 << 1
00076         };
00077         enum CMState
00078         {
00079                 cms_repeated_add =      1 << 0,
00080                 cms_manual_route =      1 << 1,
00081                 cms_draw =              1 << 2
00082         };
00083         enum ItemType
00084         {
00085                 it_none =               1 << 0,
00086                 it_node =               1 << 1,
00087                 it_connector =          1 << 2,
00088                 it_pin =                1 << 3,
00089                 it_canvas_item =        1 << 4,
00090                 it_mechanics_item =     1 << 5,
00091                 it_resize_handle =      1 << 6,
00092                 it_drawpart =           1 << 7
00093         };
00094         enum ItemStateInfo
00095         {
00096                 isi_isMovable = 0x2,
00097         };
00098         CMManager( ItemDocument *itemDocument );
00099         ~CMManager();
00103         void mousePressEvent( EventInfo eventInfo );
00107         void mouseReleaseEvent( const EventInfo &eventInfo );
00111         void mouseDoubleClickEvent( const EventInfo &eventInfo );
00115         void mouseMoveEvent( const EventInfo &eventInfo );
00119         void wheelEvent( const EventInfo &eventInfo );
00123         void setCMState( CMState type, bool state );
00127         void cancelCurrentManipulation();
00128         CanvasManipulator * currentManipulator() const { return m_canvasManipulator; }
00129         void setRepeatedAddId( const QString & repeatedId = QString::null );
00130         uint cmState() const { return m_cmState; }
00131         void addManipulatorInfo( ManipulatorInfo *info );
00132         QString repeatedItemId() const { return m_repeatedItemId; }
00133         void setDrawAction( int drawAction );
00134         int drawAction() const { return m_drawAction; }
00135         
00136 public slots:
00137         void slotSetManualRoute( bool manualRoute );
00138         
00139 signals:
00140         void manualRoutingChanged( bool manualRouting );
00141         
00142 protected:
00148         void updateCurrentResizeHandle( ResizeHandle * mouseOver );
00149         CanvasManipulator *m_canvasManipulator;
00150         uint m_cmState;
00151         QString m_repeatedItemId;
00152         ItemDocument *p_itemDocument;
00153         ManipulatorInfoList m_manipulatorInfoList;
00154         QGuardedPtr<Item> p_lastMouseOverItem; // Pointer to the item where the mouse was last over - this is used to determine when mouse
00155         QGuardedPtr<ResizeHandle> p_lastMouseOverResizeHandle;
00156         QGuardedPtr<Item> p_lastItemClicked;
00157         QTimer *m_allowItemScrollTmr; // When a user scrolls on the canvas, we don't want to stop scrolling when the user gets to (e.g.) a scrollable widget. So this timer prevents scrolling a widget for a few hundred milliseconds after a scroll event if it was initiated over the canvas
00158         bool b_allowItemScroll; // See above.
00159         int m_drawAction;
00160         
00161 private slots:
00162         void slotAllowItemScroll() { b_allowItemScroll = true; }
00163 };
00164 
00169 class CanvasManipulator
00170 {
00171 public:
00172         CanvasManipulator( ItemDocument *itemDocument, CMManager *cmManager );
00173         virtual ~CanvasManipulator();
00174         enum Type
00175         {
00176                 RepeatedItemAdd,
00177                 RightClick,
00178                 AutoConnector,
00179                 ManualConnector,
00180                 ItemMove,
00181                 ItemResize,
00182                 MechItemMove,
00183                 Select,
00184                 CanvasResize,
00185                 ItemDrag,
00186                 Draw
00187         };
00188         virtual Type type() const = 0;
00193         virtual bool mousePressedInitial( const EventInfo &/*info*/ ) { return false; }
00199         virtual bool mousePressedRepeat( const EventInfo &/*info*/ ) { return false; };
00204         virtual bool mouseMoved( const EventInfo &/*info*/ ) { return false; };
00209         virtual bool mouseReleased( const EventInfo &/*info*/ ) { return true; }
00210         
00211 protected:
00212         Type m_type;
00213         EventInfo m_eventInfo;
00214         QPoint m_prevPos;
00215         ItemDocument *p_itemDocument;
00216         ICNDocument *p_icnDocument;
00217         MechanicsDocument *p_mechanicsDocument;
00218         QCanvas *p_canvas;
00219         ItemGroup *p_selectList;
00220         CNItemGroup *p_cnItemSelectList;
00221         MechanicsGroup *p_mechItemSelectList;
00222         CNItem *p_cnItemClickedOn;
00223         MechanicsItem *p_mechanicsItemClickedOn;
00224         CMManager *p_cmManager;
00225 };
00226 
00230 class CMRepeatedItemAdd : public CanvasManipulator
00231 {
00232 public:
00233         CMRepeatedItemAdd( ItemDocument *itemDocument, CMManager *cmManager );
00234         virtual ~CMRepeatedItemAdd();
00235         virtual Type type() const { return RepeatedItemAdd; }
00236         
00237         static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00238         static ManipulatorInfo *manipulatorInfo();
00239         static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00240         
00241         virtual bool mousePressedInitial( const EventInfo &info );
00242         virtual bool mousePressedRepeat( const EventInfo &info );
00243         virtual bool mouseMoved( const EventInfo &info );
00244         virtual bool mouseReleased( const EventInfo &info );
00245         
00246 protected:
00247 };
00248 
00252 class CMRightClick : public CanvasManipulator
00253 {
00254 public:
00255         CMRightClick( ItemDocument *itemDocument, CMManager *cmManager );
00256         virtual ~CMRightClick();
00257         virtual Type type() const { return RightClick; }
00258         
00259         static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00260         static ManipulatorInfo *manipulatorInfo();
00261         static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00262         
00263         virtual bool mousePressedInitial( const EventInfo &info );
00264         virtual bool mouseMoved( const EventInfo &info );
00265         virtual bool mouseReleased( const EventInfo &info );
00266         
00267 protected:
00268 };
00269 
00270 
00274 class ConnectorDraw : public CanvasManipulator
00275 {
00276         public:
00277                 ConnectorDraw( ItemDocument *itemDocument, CMManager *cmManager );
00278                 virtual ~ConnectorDraw();
00279                 
00284                 static QColor validConnectionColor();
00285                 
00286         protected:
00291                 Connector * toConnector( Node * node );
00299                 void grabEndStuff( QCanvasItem * endItem, const QPoint & pos, bool posIsExact );
00304                 QPoint toValidPos( const QPoint & clickPos, Connector * clickedConnector ) const;
00305                 
00306                 QGuardedPtr<Node> p_startNode;
00307                 QGuardedPtr<Connector> p_startConnector;
00308                 Node * p_endNode;
00309                 Connector * p_endConnector;
00310                 QPoint startConnectorPoint;
00311 };
00312 
00316 class CMAutoConnector : public ConnectorDraw
00317 {
00318 public:
00319         CMAutoConnector( ItemDocument *itemDocument, CMManager *cmManager );
00320         virtual ~CMAutoConnector();
00321         virtual Type type() const { return AutoConnector; }
00322         
00323         static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00324         static ManipulatorInfo *manipulatorInfo();
00325         static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00326         
00327         virtual bool mousePressedInitial( const EventInfo &info );
00328         virtual bool mouseMoved( const EventInfo &info );
00329         virtual bool mouseReleased( const EventInfo &info );
00330         
00331 protected:
00332         QCanvasLine *m_connectorLine;
00333 };
00334 
00338 class CMManualConnector : public ConnectorDraw
00339 {
00340 public:
00341         CMManualConnector( ItemDocument *itemDocument, CMManager *cmManager );
00342         virtual ~CMManualConnector();
00343         virtual Type type() const { return ManualConnector; }
00344         
00345         static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00346         static ManipulatorInfo *manipulatorInfo();
00347         static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00348         
00349         virtual bool mousePressedInitial( const EventInfo &info );
00350         virtual bool mousePressedRepeat( const EventInfo &info );
00351         virtual bool mouseMoved( const EventInfo &info );
00352         virtual bool mouseReleased( const EventInfo &info );
00353         
00354 protected:
00355         ConnectorList m_fixedRouteConnectors;
00356         ManualConnectorDraw *m_manualConnectorDraw;
00357 };
00358 
00362 class CMItemMove : public CanvasManipulator
00363 {
00364 public:
00365         CMItemMove( ItemDocument *itemDocument, CMManager *cmManager );
00366         virtual ~CMItemMove();
00367         virtual Type type() const { return ItemMove; }
00368         
00369         static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00370         static ManipulatorInfo *manipulatorInfo();
00371         static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00372         
00373         virtual bool mousePressedInitial( const EventInfo &info );
00374         virtual bool mouseMoved( const EventInfo &info );
00375         virtual bool mouseReleased( const EventInfo &info );
00376         
00377 protected:
00378         ConnectorList m_translatableConnectors;
00379         NodeGroupList m_translatableNodeGroups;
00380         FlowContainer *p_flowContainerCandidate;
00381 };
00382 
00386 class CMItemResize : public CanvasManipulator
00387 {
00388 public:
00389         CMItemResize( ItemDocument *itemDocument, CMManager *cmManager );
00390         virtual ~CMItemResize();
00391         virtual Type type() const { return ItemResize; }
00392         
00393         static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00394         static ManipulatorInfo *manipulatorInfo();
00395         static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00396         
00397         virtual bool mousePressedInitial( const EventInfo &info );
00398         virtual bool mouseMoved( const EventInfo &info );
00399         virtual bool mouseReleased( const EventInfo &info );
00400         
00401 protected:
00402         ResizeHandle *p_resizeHandle;
00403         double m_rh_dx;
00404         double m_rh_dy;
00405 };
00406 
00410 class CMMechItemMove : public CanvasManipulator
00411 {
00412 public:
00413         CMMechItemMove( ItemDocument *itemDocument, CMManager *cmManager );
00414         virtual ~CMMechItemMove();
00415         virtual Type type() const { return MechItemMove; }
00416         
00417         static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00418         static ManipulatorInfo *manipulatorInfo();
00419         static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00420         
00421         virtual bool mousePressedInitial( const EventInfo &info );
00422         virtual bool mouseMoved( const EventInfo &info );
00423         virtual bool mouseReleased( const EventInfo &info );
00424         
00425 protected:
00426         uint m_prevClickedOnSM; // Previous select mode of the item that was clicked on
00427 };
00428 
00429 
00433 class SelectRectangle
00434 {
00435         public:
00436                 SelectRectangle( int x, int y, int w, int h, QCanvas *qcanvas );
00437                 ~SelectRectangle();
00438                 
00439                 void setSize( int w, int h );
00440                 QCanvasItemList collisions();
00441                 
00442         protected:
00443                 QCanvasLine *m_topLine;
00444                 QCanvasLine *m_rightLine;
00445                 QCanvasLine *m_bottomLine;
00446                 QCanvasLine *m_leftLine;
00447                 const int m_x;
00448                 const int m_y;
00449                 int m_w;
00450                 int m_h;
00451                 int m_prevCollisions_w;
00452                 int m_prevCollisions_h;
00453                 QCanvasItemList m_prevCollisions;
00454 };
00455 
00459 class CMSelect : public CanvasManipulator
00460 {
00461 public:
00462         CMSelect( ItemDocument *itemDocument, CMManager *cmManager );
00463         virtual ~CMSelect();
00464         virtual Type type() const { return Select; }
00465         
00466         static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00467         static ManipulatorInfo *manipulatorInfo();
00468         static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00469         
00470         virtual bool mousePressedInitial( const EventInfo &info );
00471         virtual bool mouseMoved( const EventInfo &info );
00472         virtual bool mouseReleased( const EventInfo &info );
00473         
00474 protected:
00475         SelectRectangle *m_selectRectangle;
00476 };
00477 
00481 class CMItemDrag : public CanvasManipulator
00482 {
00483 public:
00484         CMItemDrag( ItemDocument *itemDocument, CMManager *cmManager );
00485         virtual ~CMItemDrag();
00486         virtual Type type() const { return ItemDrag; }
00487         
00488         static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00489         static ManipulatorInfo *manipulatorInfo();
00490         static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00491         
00492         virtual bool mousePressedInitial( const EventInfo &info );
00493         virtual bool mouseMoved( const EventInfo &info );
00494         virtual bool mouseReleased( const EventInfo &info );
00495         
00496 protected:
00497         bool b_dragged;
00498 };
00499 
00504 class CanvasEllipseDraw : public QCanvasEllipse
00505 {
00506         public:
00507                 CanvasEllipseDraw( int x, int y, QCanvas * canvas );
00508                 
00509         protected:
00510                 virtual void drawShape( QPainter & p );
00511 };
00512 
00516 class CMDraw : public CanvasManipulator
00517 {
00518         public:
00519                 CMDraw( ItemDocument *itemDocument, CMManager *cmManager );
00520                 virtual ~CMDraw();
00521                 virtual Type type() const { return Draw; }
00522         
00523                 static CanvasManipulator* construct( ItemDocument *itemDocument, CMManager *cmManager );
00524                 static ManipulatorInfo *manipulatorInfo();
00525                 static bool acceptManipulation( uint eventState, uint cmState, uint itemType, uint cnItemType );
00526         
00527                 virtual bool mousePressedInitial( const EventInfo &info );
00528                 virtual bool mouseMoved( const EventInfo &info );
00529                 virtual bool mouseReleased( const EventInfo &info );
00530         
00531         protected:
00532                 QCanvasRectangle * m_pDrawRectangle;
00533                 CanvasEllipseDraw * m_pDrawEllipse;
00534                 QCanvasLine * m_pDrawLine;
00535 };
00536 
00540 class ManualConnectorDraw
00541 {
00542         public:
00543                 ManualConnectorDraw( ICNDocument *_icnDocument, const QPoint &initialPos );
00544                 virtual ~ManualConnectorDraw();
00545                 
00550                 void mouseMoved( const QPoint &pos );
00556                 QCanvasItem * mouseClicked( const QPoint &pos );
00560                 QPointList pointList();
00564                 void setColor( const QColor & color );
00565 
00566         protected:
00567                 void updateConnectorEnds();
00568         
00569                 QValueList<QCanvasLine*> m_connectorLines;
00570                 ICNDocument *icnDocument;
00571         
00572                 bool b_currentVertical;
00573                 bool b_orientationDefined;
00574         
00575                 QPoint m_initialPos;
00576                 QPoint m_previousPos;
00577                 QPoint m_currentPos;
00578         
00579                 QCanvasLine *m_currentCon;
00580                 QCanvasLine *m_previousCon;
00581         
00582                 // The first item that we clicked on
00583                 QCanvasItem *p_initialItem;
00584         
00585                 QColor m_color;
00586 };
00587 
00588 #endif

Generated on Tue May 8 17:05:28 2007 for KTechLab by  doxygen 1.5.1