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