1 /***************************************************************************
2  *                                                                         *
3  *   copyright : (C) 2007 The University of Toronto                        *
4  *                   netterfield@astro.utoronto.ca                         *
5  *                                                                         *
6  *   This program is free software; you can redistribute it and/or modify  *
7  *   it under the terms of the GNU General Public License as published by  *
8  *   the Free Software Foundation; either version 2 of the License, or     *
9  *   (at your option) any later version.                                   *
10  *                                                                         *
11  ***************************************************************************/
12 
13 #ifndef VIEWITEM_H
14 #define VIEWITEM_H
15 
16 #include <QObject>
17 #include <QGraphicsRectItem>
18 #include <QGraphicsSceneContextMenuEvent>
19 #include <QXmlStreamWriter>
20 #include <QHash>
21 #include <QAction>
22 #include <QMimeData>
23 
24 #include "namedobject.h"
25 #include "kst_export.h"
26 #include "viewcommand.h"
27 #include "view.h"
28 #include "curveplacement.h"
29 //#include "sharedptr.h"
30 #include "application.h"
31 #include "tabwidget.h"
32 
33 namespace Kst {
34 
35 class DialogPage;
36 class ViewGridLayout;
37 class ViewItem;
38 class ViewItemDialog;
39 class ScriptInterface;
40 
41 typedef QList<ViewItem *> ViewItemList;
42 
43 class ViewItem : public QObject, public NamedObject, public QGraphicsRectItem
44 {
45   Q_OBJECT
46   public:
47     friend class DialogLauncherSI;
48     friend class ViewItemSI;
49     enum GripMode {
50       Move    = 1,
51       Resize  = 2,
52       Scale   = 4,
53       Rotate  = 8
54     };
55     Q_DECLARE_FLAGS(GripModes, GripMode)
56 
57     enum ActiveGrip {
58       NoGrip          = 1,
59       TopLeftGrip     = 2,
60       TopRightGrip    = 4,
61       BottomRightGrip = 8,
62       BottomLeftGrip  = 16,
63       TopMidGrip      = 32,
64       RightMidGrip    = 64,
65       BottomMidGrip   = 128,
66       LeftMidGrip     = 256
67     };
68     Q_DECLARE_FLAGS(ActiveGrips, ActiveGrip)
69 
70     enum CreationState {
71       None,
72       InProgress,
73       Completed
74     };
75 
76     explicit ViewItem(View *parent);
77     virtual ~ViewItem();
78 
79     virtual void save(QXmlStreamWriter &xml);
80     bool parse(QXmlStreamReader &xml, bool &validChildTag);
81     enum { Type = UserType + 1 };
type()82     int type() const { return Type; }
83 
setTypeName(const QString & name)84     void setTypeName(const QString& name) { _typeName = name; }
typeName()85     const QString typeName() const { return _typeName; }
86 
87     // for dialog defaults
88     virtual const QString defaultsGroupName() const = 0;
89 
90     // for view item dialogs
hasStroke()91     virtual bool hasStroke() const {return false;}
hasBrush()92     virtual bool hasBrush() const {return false;}
hasFont()93     virtual bool hasFont() const {return false;}
94 
setFont(const QFont & f,const QColor & c)95     virtual void setFont(const QFont &f, const QColor &c) {return;}
96 
97     View* view() const;
98     void setView(View*);
99 
100     ViewItem *parentViewItem() const;
101     void setParentViewItem(ViewItem *parent);
102 
103     virtual void updateRelativeSize(bool force_data = false);
104     virtual void updateDataRelativeRect(bool force = false);
105 
106     void moveTo(const QPointF& pos);
107 
relativeHeight()108     qreal relativeHeight() const { return _parentRelativeHeight; }
setRelativeHeight(const qreal height)109     void setRelativeHeight(const qreal height) { _parentRelativeHeight = height; }
relativeWidth()110     qreal relativeWidth() const { return _parentRelativeWidth; }
setRelativeWidth(const qreal width)111     void setRelativeWidth(const qreal width) { _parentRelativeWidth = width; }
112 
relativeCenter()113     QPointF relativeCenter() const { return _parentRelativeCenter; }
setRelativeCenter(const QPointF center)114     void setRelativeCenter(const QPointF center) { _parentRelativeCenter = center; }
relativePosition()115     QPointF relativePosition() const { return _parentRelativePosition; }
setRelativePosition(const QPointF pos)116     void setRelativePosition(const QPointF pos) { _parentRelativePosition = pos; }
setRelativeLeft(const QPointF & pos)117     void setRelativeLeft(const QPointF &pos) { _parentRelativeLeft = pos;}
relativeRight()118     QPointF relativeRight() const {return _parentRelativeRight;}
setRelativeRight(const QPointF & pos)119     void setRelativeRight(const QPointF &pos) { _parentRelativeRight = pos;}
120 
dataRelativeRect()121     QRectF dataRelativeRect() const { return _dataRelativeRect;}
setDataRelativeRect(QRectF r)122     void setDataRelativeRect(QRectF r) { _dataRelativeRect = r;}
123 
124     void setItemPos(qreal x, qreal y);
125     void setItemSize(qreal w, qreal h = -10.0);
126 
127     qreal rotationAngle() const;
128     qreal rotationAngleRadians() const;
129 
130     GripMode gripMode() const;
131     void setGripMode(GripMode mode);
132 
133     GripModes allowedGripModes() const;
134     void setAllowedGripModes(GripModes modes);
135     bool isAllowed(GripMode mode) const;
136 
fixedSize()137     bool fixedSize() const { return _fixedSize; }
setFixedSize(bool fixedSize)138     void setFixedSize(bool fixedSize) { _fixedSize = fixedSize; }
139 
lockAspectRatio()140     bool lockAspectRatio() const { return _lockAspectRatio; }
setLockAspectRatio(bool lockAspectRatio)141     void setLockAspectRatio(bool lockAspectRatio) { _lockAspectRatio = lockAspectRatio; }
142 
lockAspectRatioFixed()143     bool lockAspectRatioFixed() const { return _lockAspectRatioFixed; }
setLockAspectRatioFixed(bool enable)144     void setLockAspectRatioFixed(bool enable) { _lockAspectRatioFixed = enable; }
145 
hasStaticGeometry()146     bool hasStaticGeometry() const { return _hasStaticGeometry; }
setHasStaticGeometry(bool hasStaticGeometry)147     void setHasStaticGeometry(bool hasStaticGeometry ) { _hasStaticGeometry = hasStaticGeometry; }
148 
lockParent()149     bool lockParent() const { return _lockParent; }
setLockParent(bool lockParent)150     void setLockParent(bool lockParent ) { _lockParent = lockParent; }
151 
skipNextParentCheck()152     bool skipNextParentCheck() const { return _skipNextParentCheck; }
setSkipNextParentCheck(bool skipNextParentCheck)153     void setSkipNextParentCheck(bool skipNextParentCheck) { _skipNextParentCheck = skipNextParentCheck; }
154 
allowsLayout()155     bool allowsLayout() const { return _allowsLayout; }
setAllowsLayout(bool allowsLayout)156     void setAllowsLayout(bool allowsLayout ) { _allowsLayout = allowsLayout; }
157 
isHighlighted()158     bool isHighlighted() const { return _highlighted; }
setHighlighted(bool highlighted)159     void setHighlighted(bool highlighted ) { _highlighted = highlighted; }
160 
lockPosToData()161     bool lockPosToData() const {return _lockPosToData; }
162 
163     //NOTE This should be used in place of QGraphicsRectItem::setRect()...
164     QRectF viewRect() const;
165     void setViewRect(const QRectF &viewRect, bool automaticChange = false);
166     void setViewRect(qreal x, qreal y, qreal width, qreal height, bool automaticChange = false);
167 
width()168     qreal width() const { return viewRect().normalized().width(); }
height()169     qreal height() const { return viewRect().normalized().height(); }
170 
171     ActiveGrip activeGrip() const;
172     void setActiveGrip(ActiveGrip grip);
173 
174     ActiveGrips allowedGrips() const;
175     void setAllowedGrips(ActiveGrips grips);
176     bool isAllowed(ActiveGrip grip) const;
177 
178     virtual QSizeF sizeOfGrip() const;
179     virtual QPainterPath grips() const;
180 
181     virtual QRectF selectBoundingRect() const;
182     virtual QRectF gripBoundingRect() const;
183 
184     virtual QRectF boundingRect() const;
185     virtual QPainterPath shape() const;
itemShape()186     virtual QPainterPath itemShape() const { return QGraphicsRectItem::shape(); }
187     virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
188     virtual void paint(QPainter *painter);
189 
190     virtual void paintChildItems(QPainter &painter);
191 
dialogPages()192     virtual QList<DialogPage*> dialogPages() const { return QList<DialogPage*>(); }
193 
centerOfRotation()194     virtual QPointF centerOfRotation() const { return rect().center(); }
195 
isHovering()196     bool isHovering() const { return _hovering; }
197 
acceptsChildItems()198     bool acceptsChildItems() const { return _acceptsChildItems; }
setAcceptsChildItems(bool acceptsChildItems)199     void setAcceptsChildItems(bool acceptsChildItems) { _acceptsChildItems = acceptsChildItems; }
200 
layoutMargins()201     QSizeF layoutMargins() const { return _layoutMargins; }
setLayoutMargins(const QSizeF margins)202     void setLayoutMargins(const QSizeF margins) { _layoutMargins = margins; }
203 
layoutSpacing()204     QSizeF layoutSpacing() const { return _layoutSpacing; }
setLayoutSpacing(const QSizeF spacing)205     void setLayoutSpacing(const QSizeF spacing) { _layoutSpacing = spacing; }
206 
207     //This is a workaround for context menu bug in Qt4.3 graphicsview
acceptsContextMenuEvents()208     bool acceptsContextMenuEvents() const
209     { return _acceptsContextMenuEvents; }
setAcceptsContextMenuEvents(bool acceptsContextMenuEvents)210     void setAcceptsContextMenuEvents(bool acceptsContextMenuEvents)
211     { _acceptsContextMenuEvents = acceptsContextMenuEvents; }
212 
213     virtual bool tryShortcut(const QString &keySequence);
214     virtual QPainterPath checkBox() const;
215     virtual QPainterPath tiedZoomCheck() const;
tiedZoomSize()216     virtual QSizeF tiedZoomSize() const { return QSizeF(checkBox().controlPointRect().size() * 1.5); }
217 
isTiedZoom()218     virtual bool isTiedZoom() const { return (_isXTiedZoom || _isYTiedZoom); }
isXTiedZoom()219     virtual bool isXTiedZoom() const { return _isXTiedZoom; }
isYTiedZoom()220     virtual bool isYTiedZoom() const { return _isYTiedZoom; }
221     virtual void setTiedZoom(bool tiedXZoom, bool tiedYZoom, bool checkAllTied = true);
222 
supportsTiedZoom()223     virtual bool supportsTiedZoom() const { return _supportsTiedZoom; }
224     virtual void setSupportsTiedZoom(const bool supports);
225 
226 
zoomOnlyMode()227     View::ZoomOnlyMode zoomOnlyMode() const { return _zoomOnlyMode; }
setZoomOnly(View::ZoomOnlyMode val)228     void setZoomOnly(View::ZoomOnlyMode val) { _zoomOnlyMode = val; }
229 
creationState()230     CreationState creationState() const { return _creationState; }
231 
setItemPen(const QPen & pen)232     virtual void setItemPen(const QPen & pen) { storePen(pen); }
setItemBrush(const QBrush & brush)233     virtual void setItemBrush(const QBrush & brush) { setBrush(brush); }
234 
235     template<class T> static T* retrieveItem(const QString &name);
236 
237     template<class T> static QList<T *> getItems(bool include_hidden=false);
238 
239    // TODO: Remove, needed only for a Qt 4.3 bug workaround
doSceneEvent(QGraphicsSceneContextMenuEvent * event)240     bool doSceneEvent(QGraphicsSceneContextMenuEvent *event) {
241       return sceneEvent(event);
242     }
243 
244     virtual bool isMaximized();
245     QPointF dropHotSpot;
246 
247     void normalizePosition();
248 
249     virtual void applyDialogDefaultsFill(bool default_no_fill = false);
250     virtual void applyDialogDefaultsStroke(bool default_no_pen = false);
251     void applyDialogDefaultsLockPosToData();
252 
253     virtual void applyDataLockedDimensions();
254     virtual bool dataPosLockable() const;
255 
256     QRectF parentRect() const;
257 
storePen(const QPen & pen)258     void storePen(const QPen &pen) {_storedPen = pen; setPen(pen);}
storedPen()259     QPen storedPen() const { return _storedPen;}
260 
261     virtual ScriptInterface *createScriptInterface();
262 
263     ScriptInterface *scriptInterface();
264 
265     virtual bool updateViewItemParent(bool force_toplevel = false);
266 
267   Q_SIGNALS:
268     void geometryChanged();
269     void creationComplete();
270     void relativeSizeUpdated();
271 
272   /*FIXME these should be made private for only undo commands to access*/
273   public Q_SLOTS:
274     virtual void edit();
275     virtual void raise();
276     virtual void lower();
277     virtual void createAutoLayout();
278     virtual void createProtectedLayout();
279     virtual void createCustomLayout(int columns = 0);
createOneColLayout()280     virtual void createOneColLayout() {createCustomLayout(1);}
createTwoColLayout()281     virtual void createTwoColLayout() {createCustomLayout(2);}
createThreeColLayout()282     virtual void createThreeColLayout() {createCustomLayout(3);}
283     virtual void sharePlots(QPainter *painter, bool creation);
284     virtual void remove();
285     void resizeTopLeft(const QPointF &offset);
286     void resizeTopRight(const QPointF &offset);
287     void resizeBottomLeft(const QPointF &offset);
288     void resizeBottomRight(const QPointF &offset);
289     void resizeTop(qreal offset);
290     void resizeBottom(qreal offset);
291     void resizeLeft(qreal offset);
292     void resizeRight(qreal offset);
293     void setTopLeft(const QPointF &point);
294     void setTopRight(const QPointF &point);
295     void setBottomLeft(const QPointF &point);
296     void setBottomRight(const QPointF &point);
297     void setTop(qreal y);
298     void setBottom(qreal y);
299     void setLeft(qreal x);
300     void setRight(qreal x);
301     void setLockPosToData(bool lockPosToData);
customDimensionsTab()302     virtual bool customDimensionsTab() {return false;}
303 
clearEditDialogPtr()304     virtual void clearEditDialogPtr() {_editDialog = 0;}
305   protected:
306     virtual QPainterPath topLeftGrip() const;
307     virtual QPainterPath topRightGrip() const;
308     virtual QPainterPath bottomRightGrip() const;
309     virtual QPainterPath bottomLeftGrip() const;
310     virtual QPainterPath topMidGrip() const;
311     virtual QPainterPath rightMidGrip() const;
312     virtual QPainterPath bottomMidGrip() const;
313     virtual QPainterPath leftMidGrip() const;
314     QTransform selectTransform() const;
315     bool transformToRect(const QRectF &from, const QRectF &to);
316     bool transformToRect(const QPolygonF &from, const QPolygonF &to);
317     void rotateTowards(const QPointF &corner, const QPointF &point);
318     QPointF lockOffset(const QPointF &offset, qreal ratio, bool oddCorner) const;
319     GripMode nextGripMode(GripMode currentMode) const;
320     void addTitle(QMenu *menu) const;
321     void registerShortcut(QAction *action);
322     void reRegisterShortcut();
323 
324     QString descriptionTip() const;
325 
326   protected Q_SLOTS:
327     virtual void creationPolygonChanged(View::CreationEvent event);
328     void creationPolygonChangedFixedAspect(View::CreationEvent even, qreal aspect);
329 
330   protected:
331     virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
332     virtual void addToMenuForContextEvent(QMenu &menu);
333     virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
334     virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
335     virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
336     virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
337     virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event);
338     virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
339     virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
340     virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value);
341 
342 
343     QAction *_editAction;
344     QAction *_deleteAction;
345     QAction *_raiseAction;
346     QAction *_lowerAction;
347     QAction *_autoLayoutAction;
348     QAction *_protectedLayoutAction;
349     QAction *_customLayoutAction;
350     QAction *_oneColumnLayoutAction;
351     QAction *_twoColumnLayoutAction;
352     QAction *_threeColumnLayoutAction;
353     QAction *_lockPosToDataAction;
354 
355     bool _isXTiedZoom;
356     bool _isYTiedZoom;
357     bool _plotMaximized;
358 
359   private Q_SLOTS:
360     void viewMouseModeChanged(View::MouseMode oldMode);
361     void updateView();
362 
363   protected:
364   public:
365     virtual void updateChildGeometry(const QRectF &oldParentRect, const QRectF &newParentRect);
366   protected:
367     virtual QString _automaticDescriptiveName() const;
368     virtual void _initializeShortName();
369     QPointF dragStartPosition;
370     void startDragging(QWidget *widget, const QPointF& hotspot);
371     ActiveGrip _activeGrip;
372     QRectF _dataRelativeRect;
373     QPointF _originalPosition;
374     QPointF _parentRelativeCenter;
375     QPointF _parentRelativePosition;
376     QPointF _parentRelativeLeft;
377     QPointF _parentRelativeRight;
378     qreal _parentRelativeHeight, _parentRelativeWidth;
dpi()379     const double dpi() { return _dpi;}
380 
381   private:
382     GripMode _gripMode;
383     GripModes _allowedGripModes;
384     CreationState _creationState;
385     QString _typeName;
386     View::ZoomOnlyMode _zoomOnlyMode;
387     bool _supportsTiedZoom;
388     bool _fixedSize;
389     bool _lockAspectRatio;
390     bool _lockAspectRatioFixed;
391     bool _hasStaticGeometry;
392     bool _lockParent;
393     bool _skipNextParentCheck;
394     bool _allowsLayout;
395     bool _hovering;
396     bool _acceptsChildItems;
397     bool _acceptsContextMenuEvents;
398     bool _updatingLayout;
399     bool _highlighted;
400     QRectF _originalRect;
401     QTransform _originalTransform;
402     QLineF _normalLine;
403     QLineF _rotationLine;
404     ActiveGrips _allowedGrips;
405     QTransform _rotationTransform;
406     QHash<QString, QAction*> _shortcutMap;
407 
408     bool _lockPosToData;
409 
410     QSizeF _layoutMargins, _layoutSpacing;
411 
412     // use view() / setView(View*)
413     QObject* parent() const;
414     void setParent(QObject*);
415 
416     // use setParentViewItem(ViewItem*)
417     void setParentItem(QGraphicsItem*);
418 
419     ViewItemDialog *_editDialog;
420     QPen _storedPen;
421     ScriptInterface *_interface;
422     double _dpi;
423 };
424 
425 Q_DECLARE_OPERATORS_FOR_FLAGS(ViewItem::GripModes)
426 Q_DECLARE_OPERATORS_FOR_FLAGS(ViewItem::ActiveGrips)
427 
428 #ifndef QT_NO_DEBUG_STREAM
429 QDebug operator<<(QDebug, ViewItem*);
430 #endif
431 
432 class ViewItemCommand : public QUndoCommand
433 {
434   public:
435     ViewItemCommand(ViewItem *item, const QString &text, bool addToStack = true, QUndoCommand *parent = 0);
436     virtual ~ViewItemCommand();
437 
438   protected:
439     QPointer<ViewItem> _item;
440 };
441 
442 class CreateCommand : public QObject, public ViewCommand
443 {
444   Q_OBJECT
445   public:
446     explicit CreateCommand(const QString &text, QUndoCommand *parent = 0);
447     CreateCommand(View *view, const QString &text, QUndoCommand *parent = 0);
448     virtual ~CreateCommand();
449 
450     virtual void undo();
451     virtual void redo();
452     virtual void createItem();
453 
item()454     ViewItem *item() const { return _item; }
455 
456   public Q_SLOTS:
457     virtual void creationComplete();
458 
459   protected:
460     QPointer<ViewItem> _item;
461 };
462 
463 class LayoutCommand : public ViewItemCommand
464 {
465   public:
LayoutCommand(ViewItem * item)466     explicit LayoutCommand(ViewItem *item)
467         : ViewItemCommand(item, QObject::tr("Create layout"), false) {}
468 
~LayoutCommand()469     virtual ~LayoutCommand() {}
470 
471     virtual void undo();
472     virtual void redo();
473     void createLayout(bool preserve = true, int columns = 0);
474   private:
475     QPointer<ViewGridLayout> _layout;
476 };
477 
478 class AppendLayoutCommand : public ViewItemCommand
479 {
480   public:
AppendLayoutCommand(ViewItem * item)481     explicit AppendLayoutCommand(ViewItem *item)
482         : ViewItemCommand(item, QObject::tr("Append Item to Layout"), false) {}
483 
~AppendLayoutCommand()484     virtual ~AppendLayoutCommand() {}
485 
486     virtual void undo();
487     virtual void redo();
488     void appendLayout(CurvePlacement::Layout layout, ViewItem* item, int columns = 0);
489 
490   private:
491     QPointer<ViewGridLayout> _layout;
492 };
493 
494 class MoveCommand : public ViewItemCommand
495 {
496   public:
MoveCommand(ViewItem * item,const QPointF & originalPos,const QPointF & newPos)497     MoveCommand(ViewItem *item, const QPointF &originalPos, const QPointF &newPos)
498         : ViewItemCommand(item, QObject::tr("Move")),
499           _originalPos(originalPos),
500           _newPos(newPos) {}
501 
~MoveCommand()502     virtual ~MoveCommand() {}
503 
504     virtual void undo();
505     virtual void redo();
506 
507   private:
508     QPointF _originalPos;
509     QPointF _newPos;
510 };
511 
512 class ResizeCommand : public ViewItemCommand
513 {
514   public:
ResizeCommand(ViewItem * item,const QRectF & originalRect,const QRectF & newRect)515     ResizeCommand(ViewItem *item, const QRectF &originalRect, const QRectF &newRect)
516         : ViewItemCommand(item, QObject::tr("Resize")),
517           _originalRect(originalRect),
518           _newRect(newRect) {}
519 
~ResizeCommand()520     virtual ~ResizeCommand() {}
521 
522     virtual void undo();
523     virtual void redo();
524 
525   private:
526     QRectF _originalRect;
527     QRectF _newRect;
528 };
529 
530 class RemoveCommand : public ViewItemCommand
531 {
532   public:
RemoveCommand(ViewItem * item)533     explicit RemoveCommand(ViewItem *item)
534         : ViewItemCommand(item, QObject::tr("Remove")) {}
535 
~RemoveCommand()536     virtual ~RemoveCommand() {}
537 
538     virtual void undo();
539     virtual void redo();
540 };
541 
542 class RaiseCommand : public ViewItemCommand
543 {
544   public:
RaiseCommand(ViewItem * item)545     explicit RaiseCommand(ViewItem *item)
546         : ViewItemCommand(item, QObject::tr("Raise")) {}
547 
~RaiseCommand()548     virtual ~RaiseCommand() {}
549 
550     virtual void undo();
551     virtual void redo();
552 };
553 
554 class LowerCommand : public ViewItemCommand
555 {
556   public:
LowerCommand(ViewItem * item)557     explicit LowerCommand(ViewItem *item)
558         : ViewItemCommand(item, QObject::tr("Lower")) {}
559 
~LowerCommand()560     virtual ~LowerCommand() {}
561 
562     virtual void undo();
563     virtual void redo();
564 };
565 
566 class TransformCommand : public ViewItemCommand
567 {
568   public:
TransformCommand(ViewItem * item,const QTransform & originalTransform,const QTransform & newTransform,const QString & text)569     TransformCommand(ViewItem *item, const QTransform &originalTransform,
570                   const QTransform &newTransform, const QString &text)
571         : ViewItemCommand(item, text),
572           _originalTransform(originalTransform), _newTransform(newTransform) {}
573 
~TransformCommand()574     virtual ~TransformCommand() {}
575 
576     virtual void undo();
577     virtual void redo();
578 
579   private:
580     QTransform _originalTransform;
581     QTransform _newTransform;
582 };
583 
584 class ScaleCommand : public TransformCommand
585 {
586   public:
ScaleCommand(ViewItem * item,const QTransform & originalTransform,const QTransform & newTransform)587     ScaleCommand(ViewItem *item, const QTransform &originalTransform, const QTransform &newTransform)
588         : TransformCommand(item, originalTransform, newTransform, QObject::tr("Scale")) {}
589 
~ScaleCommand()590     virtual ~ScaleCommand() {}
591 };
592 
593 class RotateCommand : public TransformCommand
594 {
595   public:
RotateCommand(ViewItem * item,const QTransform & originalTransform,const QTransform & newTransform)596     RotateCommand(ViewItem *item, const QTransform &originalTransform, const QTransform &newTransform)
597         : TransformCommand(item, originalTransform, newTransform, QObject::tr("Rotate")) {}
598 
~RotateCommand()599     virtual ~RotateCommand() {}
600 };
601 
602 
603 template<class T>
getItems(bool include_hidden)604 QList<T *> ViewItem::getItems(bool include_hidden) {
605   QList<T *> tItems;
606   ViewItem *viewItem;
607   T* tItem;
608 
609   QList<View*> views = kstApp->mainWindow()->tabWidget()->views();
610 
611   for (int i_view = 0; i_view<views.count(); i_view++) {
612     QList<QGraphicsItem*> items = views.at(i_view)->scene()->items();
613     for (int i_item = 0; i_item<items.count(); i_item++) {
614       viewItem = dynamic_cast<ViewItem *>(items[i_item]);
615       tItem = dynamic_cast<T*>(viewItem);
616       if ((tItem) && (include_hidden || viewItem->isVisible())) {
617         tItems.append(tItem);
618       }
619     }
620   }
621   return tItems;
622 }
623 
624 template<class T>
retrieveItem(const QString & name)625 T* ViewItem::retrieveItem(const QString &name) {
626   QList<T *> tItems = getItems<T>();
627 
628   int match = -1;
629 
630   if (name.isEmpty()) {
631     return NULL;
632   }
633 
634   QString shortName;
635   QRegExp rx("(\\(|^)([A-Z]\\d+)(\\)$|$)");
636   rx.indexIn(name);
637   shortName = rx.cap(2);
638 
639   // 1) search for short names
640   int size = tItems.size();
641   for (int i = 0; i < size; ++i) {
642     if (tItems.at(i)->shortName()==shortName)
643       return tItems.at(i);
644   }
645   // 3) search for descriptive names: must be unique
646   for (int i = 0; i < size; ++i) {
647     if (tItems.at(i)->descriptiveName() == name) {
648       if (match != -1)
649         return NULL; // not unique, so... no match
650       match = i;
651     }
652   }
653 
654   if (match >-1)
655     return tItems.at(match);
656 
657   return NULL;
658 }
659 
660 
661 class MimeDataViewItem : public QMimeData
662 {
663   Q_OBJECT
664 public:
665   MimeDataViewItem();
666 
667   ViewItem* item;
668   QPointF hotSpot;
669 
670   static const MimeDataViewItem* downcast(const QMimeData*);
671 };
672 
673 }
674 
675 #endif
676 
677 // vim: ts=2 sw=2 et
678