summaryrefslogtreecommitdiffstats
path: root/src/resizeoverlay.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/resizeoverlay.h')
-rw-r--r--src/resizeoverlay.h276
1 files changed, 276 insertions, 0 deletions
diff --git a/src/resizeoverlay.h b/src/resizeoverlay.h
new file mode 100644
index 0000000..c71e6de
--- /dev/null
+++ b/src/resizeoverlay.h
@@ -0,0 +1,276 @@
+/***************************************************************************
+ * Copyright (C) 2005 by David Saxton *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ ***************************************************************************/
+
+#ifndef RESIZEOVERLAY_H
+#define RESIZEOVERLAY_H
+
+// This file contains class definitions for different types of resizing and rotating
+
+#include <qcanvas.h>
+#include <qguardedptr.h>
+#include <qmap.h>
+#include <qobject.h>
+#include <qvaluelist.h>
+
+class MechanicsItem;
+class ResizeHandle;
+class ResizeOverlay;
+class QEvent;
+
+typedef QMap< int, QGuardedPtr<ResizeHandle> > ResizeHandleMap;
+
+/**
+@author David Saxton
+*/
+class ResizeHandle : public QObject, public QCanvasRectangle
+{
+ Q_OBJECT
+public:
+ /**
+ * Convenience enumeration for resize handle positioning. Note: this class
+ * does not make use of the values in this enumeration - it is just
+ * provided here for use by other classes.
+ */
+ enum ResizeHandlePosition
+ {
+ rhp_none,
+ rhp_topLeft,
+ rhp_topMiddle,
+ rhp_topRight,
+ rhp_middleRight,
+ rhp_bottomRight,
+ rhp_bottomMiddle,
+ rhp_bottomLeft,
+ rhp_middleLeft,
+ rhp_center,
+ rhp_start,
+ rhp_end
+ };
+
+ enum DrawType
+ {
+ // Draws a simple rectangle
+ dt_point_rect,
+
+ // Crosshair
+ dt_point_crosshair,
+
+ // Straight arrows in various directions
+ dt_resize_forwardsDiagonal,
+ dt_resize_backwardsDiagonal,
+ dt_resize_vertical,
+ dt_resize_horizontal,
+
+ // Arrows as part of an arc
+ dt_rotate_topLeft,
+ dt_rotate_topRight,
+ dt_rotate_bottomRight,
+ dt_rotate_bottomLeft
+ };
+
+ ResizeHandle( ResizeOverlay *resizeOverlay, int id, DrawType drawType, int xsnap, int ysnap );
+ ~ResizeHandle();
+
+ int id() const { return m_id; }
+ int rtti() const;
+
+ void setDrawType( DrawType drawType );
+ void moveRH( double x, double y );
+ void setHover( bool hover );
+
+ static const QPixmap& handlePixmap( DrawType drawType, bool hover );
+
+ virtual QPointArray areaPoints () const;
+
+public slots:
+ void slotMoveByX( double dx ) { moveBy( dx, 0 ); }
+ void slotMoveByY( double dy ) { moveBy( 0, dy ); }
+
+signals:
+ void rhMovedBy( int id, double dx, double dy );
+ void rhMovedByX( double dx );
+ void rhMovedByY( double dy );
+
+protected:
+ virtual void drawShape( QPainter &p );
+ DrawType m_drawType;
+ bool b_hover; // If true, then paint resize handle for mouse hovering over
+ int m_id;
+ int m_xsnap;
+ int m_ysnap;
+ ResizeOverlay *p_resizeOverlay;
+
+};
+typedef QValueList<ResizeHandle*> ResizeHandleList;
+
+/**
+@author David Saxton
+*/
+class ResizeOverlay : public QObject
+{
+ Q_OBJECT
+public:
+ ResizeOverlay( Item *parent );
+ ~ResizeOverlay();
+
+ Item *parentItem() const { return p_item; }
+
+ /**
+ * Shows / hides the resize handles. They are hidden by default.
+ */
+ void showResizeHandles( bool show );
+ /**
+ * Sets the visibility. Visibility is true by default.
+ */
+ void setVisible( bool visible );
+ /**
+ * Reinherit this function to determine whether the X coordinate of the spot
+ * that the resize handle has moved into is valid or not
+ */
+ virtual bool isValidXPos( ResizeHandle *rh ) { Q_UNUSED(rh); return true; }
+ /**
+ * Reinherit this function to determine whether the Y coordinate of the spot
+ * that the resize handle has moved into is valid or not
+ */
+ virtual bool isValidYPos( ResizeHandle *rh ) { Q_UNUSED(rh); return true; }
+
+public slots:
+ void slotMoveAllResizeHandles( double dx, double dy );
+
+protected slots:
+ virtual void slotResizeHandleMoved( int id, double dx, double dy ) = 0;
+
+protected:
+ /**
+ * Connects up the given resize handles so that they are always kept at the
+ * same horizontal coordinate
+ */
+ void syncX( ResizeHandle *rh1, ResizeHandle *rh2 );
+ void syncX( ResizeHandle *rh1, ResizeHandle *rh2, ResizeHandle *rh3 );
+ /**
+ * Connects up the given resize handles so that they are always kept at the
+ * same vertical coordinate
+ */
+ void syncY( ResizeHandle *rh1, ResizeHandle *rh2 );
+ void syncY( ResizeHandle *rh1, ResizeHandle *rh2, ResizeHandle *rh3 );
+ /**
+ * Returns a pointer to the ResizeHandle with the given id, or 0 if no such
+ * handle exists
+ */
+ ResizeHandle *resizeHandle( int id );
+ /**
+ * Creates and attaches the resize handle with the given DrawType. If a
+ * ResizeHandle with the given id exists, will return a pointer to that
+ * instead
+ */
+ ResizeHandle *createResizeHandle( int id, ResizeHandle::DrawType drawType, int xsnap = 1, int ysnap = 1 );
+ /**
+ * Removes the resize handle with the given id
+ */
+ void removeResizeHandle( int id );
+
+ Item *p_item;
+ ResizeHandleMap m_resizeHandleMap;
+ bool b_showResizeHandles;
+ bool b_visible;
+};
+
+
+/**
+@author David Saxton
+*/
+class MechanicsItemOverlay : public ResizeOverlay
+{
+Q_OBJECT
+public:
+ MechanicsItemOverlay( MechanicsItem *parent );
+ ~MechanicsItemOverlay();
+
+public slots:
+ void slotUpdateResizeHandles();
+
+protected slots:
+ virtual void slotResizeHandleMoved( int id, double dx, double dy );
+
+protected:
+ ResizeHandle *m_tl;
+ ResizeHandle *m_tm;
+ ResizeHandle *m_tr;
+ ResizeHandle *m_mr;
+ ResizeHandle *m_br;
+ ResizeHandle *m_bm;
+ ResizeHandle *m_bl;
+ ResizeHandle *m_ml;
+ ResizeHandle *m_mm;
+ MechanicsItem *p_mechanicsItem;
+};
+
+
+/**
+@author David Saxton
+*/
+class RectangularOverlay : public ResizeOverlay
+{
+Q_OBJECT
+public:
+ RectangularOverlay( Item *item, int xsnap = 1, int ysnap = 1 );
+ void removeTopMiddle();
+ void removeBotMiddle();
+ /**
+ * Get the size rectangle from the position of the handles. If the size
+ * is invalid (e.g. the parent Item does not consider it a valid size,
+ * then *ok is set to false; otherwise to true.
+ * @returns the sizerect, regardless of whether or not it is valid
+ */
+ QRect getSizeRect( bool *ok = 0l, bool *widthOk = 0l, bool *heightOk = 0l ) const;
+ virtual bool isValidXPos( ResizeHandle *rh );
+ virtual bool isValidYPos( ResizeHandle *rh );
+
+public slots:
+ void slotUpdateResizeHandles();
+
+protected slots:
+ virtual void slotResizeHandleMoved( int id, double dx, double dy );
+
+protected:
+ ResizeHandle *m_tl;
+ ResizeHandle *m_tm;
+ ResizeHandle *m_tr;
+ ResizeHandle *m_mr;
+ ResizeHandle *m_br;
+ ResizeHandle *m_bm;
+ ResizeHandle *m_bl;
+ ResizeHandle *m_ml;
+};
+
+
+/**
+@author David Saxton
+*/
+class LineOverlay : public ResizeOverlay
+{
+ Q_OBJECT
+ public:
+ LineOverlay( Item * parent );
+ QPoint startPoint() const;
+ QPoint endPoint() const;
+
+ public slots:
+ void slotUpdateResizeHandles();
+
+ protected slots:
+ virtual void slotResizeHandleMoved( int id, double dx, double dy );
+
+ protected:
+ ResizeHandle * m_pStart;
+ ResizeHandle * m_pEnd;
+};
+
+#endif