Scribus
Open source desktop publishing at your fingertips
canvas.h
1 /*
2  For general Scribus (>=1.3.2) copyright and licensing information please refer
3  to the COPYING file provided with the program. Following this notice may exist
4  a copyright and/or license notice that predates the release of Scribus 1.3.2
5  for which a new license (GPL+exception) is in place.
6  */
7 /***************************************************************************
8 scribusview.h - description
9 -------------------
10  begin : Fre Apr 6 21:47:55 CEST 2001
11  copyright : (C) 2001 by Franz Schmid
12  email : Franz.Schmid@altmuehlnet.de
13  ***************************************************************************/
14 
15 /***************************************************************************
16 * *
17 * This program is free software; you can redistribute it and/or modify *
18 * it under the terms of the GNU General Public License as published by *
19 * the Free Software Foundation; either version 2 of the License, or *
20 * (at your option) any later version. *
21 * *
22 ***************************************************************************/
23 
24 #ifndef CANVAS_H
25 #define CANVAS_H
26 
27 #include <QApplication>
28 //#include <QDebug>
29 #include <QPolygon>
30 #include <QRect>
31 #include <QRectF>
32 #include <QWidget>
33 
34 #include "scribusapi.h"
35 
36 #include "commonstrings.h"
37 #include "fpoint.h"
38 #include "fpointarray.h"
39 #include "pageitempointer.h"
40 
41 
42 class ScPage;
43 class PageItem;
44 class ScLayer;
45 class ScPainter;
46 class ScribusDoc;
47 class ScribusView;
48 
50 {
51  void init();
52 
53  double scale;
54 
55  bool previewMode;
56  bool viewAsPreview;
57  int previewVisual;
58 
59  bool m_MouseButtonPressed;
60  bool operItemMoving;
61  bool operItemResizing;
62  bool operItemSelecting;
63  bool operTextSelecting;
64  QPolygon redrawPolygon;
65  QList<PageItemPointer> linkedFramesToShow;
66 
71 
72  // used for buffering:
73  bool forceRedraw;
74 };
75 
76 QDataStream &operator<<(QDataStream & ds, const CanvasViewMode & vm);
77 QDataStream &operator>>(QDataStream & ds, CanvasViewMode & vm);
78 
79 
80 class SCRIBUS_API Canvas : public QWidget
81 {
82  Q_OBJECT
83 
84 public:
85  static const uint moveWithFullOutlinesThreshold = 21;
86  static const uint moveWithBoxesOnlyThreshold = 41;
87 
88  Canvas(ScribusDoc* doc, ScribusView* parent);
89 
90  friend class ScribusView; // for now...
91  friend class CanvasMode;
92  friend class CanvasMode_CopyProperties;
93  friend class CanvasMode_Edit;
94  friend class CanvasMode_EditArc;
95  friend class CanvasMode_EditGradient;
96  friend class CanvasMode_EditMeshGradient;
97  friend class CanvasMode_EditMeshPatch;
98  friend class CanvasMode_EditWeldPoint;
99  friend class CanvasMode_EditPolygon;
100  friend class CanvasMode_EditSpiral;
101  friend class CanvasMode_EditTable;
102  friend class CanvasMode_EyeDropper;
103  friend class CanvasMode_FrameLinks;
104  friend class CanvasMode_ImageImport;
105  friend class CanvasMode_Magnifier;
106  friend class CanvasMode_NodeEdit;
107  friend class CanvasMode_ObjImport;
108  friend class CanvasMode_Panning;
109  friend class CanvasMode_Normal;
110  friend class CanvasMode_Rotate;
111  friend class FreehandMode;
112  friend class CalligraphicMode;
113 
114  /* Dont rely on these codes!
115  * 2 8 3
116  * 7 6
117  * 4 5 1
118  * But always OUTSIDE < 0, INSIDE >= 0 and any specific handle > 0.
119  */
120  enum FrameHandle {
121  OUTSIDE = -1,
122  INSIDE = 0,
123  NORTHWEST = 2,
124  NORTH = 8,
125  NORTHEAST = 3,
126  EAST = 6,
127  SOUTHEAST = 1,
128  SOUTH = 5,
129  SOUTHWEST = 4,
130  WEST = 7
131  };
132 
133  enum RenderMode {
134  RENDER_NORMAL, // update buffer, paint buffer: expensive for large regions
135  RENDER_BUFFERED, // just paint buffer: fast, but only controls may change (eg. resize mode)
136  // in the following two modes, only the selected objects are updated. Might not be exact.
137  RENDER_SELECTION_SEPARATE, // paint buffer w/o selection, then paint selection (eg. img edit, nodeedit, rotate, beziercurve)
138  RENDER_SELECTION_BUFFERED, // paint buffer w/o selection, update selection buffer, then paint selection buffer (eg. move, text edit)
139  RENDER_LEGACY
140  };
141 
142  void setRenderMode(RenderMode m);
143 
144  void clearBuffers(); // very expensive
145 
146  // deprecated:
147  void resetRenderMode() { m_renderMode = RENDER_NORMAL; clearBuffers(); }
148  void setRenderModeFillBuffer() { m_renderMode = RENDER_BUFFERED; }
149  void setRenderModeUseBuffer(bool use) { m_renderMode = (use ? RENDER_BUFFERED : RENDER_NORMAL) ; }
150 
151  double scale() const { return m_viewMode.scale; }
152  void setScale(double scale);
153  QPoint canvasToLocal(FPoint p) const;
154  QPoint canvasToGlobal(FPoint p) const;
155  QPoint canvasToLocal(QPointF p) const;
156  QPoint canvasToGlobal(QPointF p) const;
157  QRect canvasToLocal(QRectF p) const;
158  QRect canvasToGlobal(QRectF p) const;
159  FPoint localToCanvas(QPoint p) const;
160 // FPoint localToCanvas(QPointF p) const;
161  FPoint globalToCanvas(QPoint p) const;
162 // FPoint globalToCanvas(QPointF p) const;
163  QRectF globalToCanvas(QRect p) const;
164 // QRectF globalToCanvas(QRectF p) const;
165  bool hitsCanvasPoint(QPoint globalPoint, FPoint canvasPoint) const;
166  bool hitsCanvasPoint(QPoint globalPoint, QPointF canvasPoint) const;
167  bool hitsCanvasPoint(FPoint globalPoint, QPointF canvasPoint) const;
168  QRect exposedRect() const;
169  bool cursorOverTextFrameControl(QPoint globalPos, PageItem* frame);
170  bool cursorOverFrameControl(QPoint globalPos, QRectF targetRect, PageItem* frame);
172  FrameHandle frameHitTest(QPointF canvasPoint, PageItem* frame) const;
173  FrameHandle frameHitTest(QPointF point, QRectF frame) const;
182  PageItem* itemUnderCursor(QPoint globalPos, PageItem* itemAbove=NULL, bool allowInGroup=false, bool allowMasterItems=false) const;
183  PageItem* itemInGroup(PageItem* group, QRectF mouseArea) const;
184  PageItem* itemUnderItem(PageItem* item, int& index) const;
185 
186  const QPolygon& redrawPolygon() const { return m_viewMode.redrawPolygon; }
187  QPolygon& newRedrawPolygon()
188  {
189  m_viewMode.redrawPolygon.clear();
190  return m_viewMode.redrawPolygon;
191  }
192  void setForcedRedraw(bool on) { m_viewMode.forceRedraw = on; }
193  void setPreviewMode(bool on) { m_viewMode.previewMode = on; }
194  bool isPreviewMode() const { return m_viewMode.previewMode || m_viewMode.viewAsPreview; }
195  bool usePreviewVisual() const { return m_viewMode.viewAsPreview && m_viewMode.previewVisual != 0; }
196  int previewVisual() const { return m_viewMode.previewVisual; }
197  void setPreviewVisual(int mode);
198 
199  void DrawMasterItems(ScPainter *painter, ScPage *page, ScLayer& layer, QRect clip);
200  //notesFramesPass determine if notes frames are drawed or not
201  void DrawPageItems(ScPainter *painter, ScLayer& layer, QRect clip, bool notesFramesPass);
202  virtual void paintEvent ( QPaintEvent * p );
203  void displayXYHUD(QPoint m);
204  void displayCorrectedXYHUD(QPoint m, double x, double y);
205  void displayCorrectedSingleHUD(QPoint m, double val, bool isX);
206  void displayXYHUD(QPoint m, double x, double y);
207  void displaySizeHUD(QPoint m, double x, double y, bool isLine = false);
208  void displayRotHUD(QPoint m, double rot);
209  void displayRealRotHUD(QPoint m, double rot);
215  void displayDoubleHUD(QPoint point, const QString& label, double value);
216 
217  void setupEditHRuler(PageItem * item, bool forceAndReset = false);
218 
219 private:
220  void DrawPageBorderSub(ScPainter *p, ScPage *page);
221  void DrawPageBorder(ScPainter *p, QRectF clip, bool master = false);
222  void DrawPageMarginsGridSub(ScPainter *p, ScPage *page);
223  void DrawPageMargins(ScPainter *p, QRectF clip, bool master = false);
224  void DrawPageBaselineGridSub(ScPainter *p, ScPage *page);
225  void DrawPageBaselineGrid(ScPainter *p, QRectF clip, bool master = false);
226  void DrawPageGridSub(ScPainter *p, ScPage *page, QRectF clip);
227  void DrawPageGrid(ScPainter *p, QRectF clip, bool master = false);
228  void DrawPageGuidesSub(ScPainter *p, ScPage *page);
229  void DrawPageGuides(ScPainter *p, QRectF clip, bool master = false);
230  void DrawPageIndicatorSub(ScPainter *p, ScPage *page);
231  void DrawPageIndicator(ScPainter *p, QRectF clip, bool master = false);
232  void drawLinkFrameLine(ScPainter* painter, FPoint &start, FPoint &end);
233  void PaintSizeRect(QRect neu);
234  void PaintSizeRect(QPolygon neu);
235  void Transform(PageItem *currItem, QPainter *p);
236  void Transform(PageItem *currItem, QTransform& m);
237  void TransformM(PageItem *currItem, QPainter *p);
238  void getGroupRectScreen(double *x, double *y, double *w, double *h);
239 
243  bool adjustBuffer();
248  void fillBuffer(QPaintDevice* buffer, QPoint bufferOrigin, QRect clipRect);
249  void drawContents(QPainter *p, int clipx, int clipy, int clipw, int cliph);
250  void drawBackgroundMasterpage(ScPainter* painter, int clipx, int clipy, int clipw, int cliph);
251  void drawBackgroundPageOutlines(ScPainter* painter, int clipx, int clipy, int clipw, int cliph);
252  void drawFrameLinks(ScPainter* painter);
253  void drawControls(QPainter* p);
254  void drawControlsMovingItemsRect(QPainter* pp);
255  void drawControlsBezierCurve(QPainter* pp, PageItem* currItem);
256  void drawControlsMeasurementLine(QPainter* pp);
257  void drawControlsDrawLine(QPainter* pp);
258  void drawControlsFreehandLine(QPainter* pp);
259  void getClipPathForPages(FPointArray* PoLine);
260  void calculateFrameLinkPoints(PageItem* pi1, PageItem* pi2, FPoint& start, FPoint& end);
261 
262 private:
263  ScribusDoc* m_doc;
264  ScribusView* m_view;
265  CanvasViewMode m_viewMode;
266 
267  RenderMode m_renderMode;
268  QPixmap m_buffer;
269  QRect m_bufferRect;
270  QPixmap m_selectionBuffer;
271  QRect m_selectionRect;
272  QPoint m_oldMinCanvasCoordinate;
273 };
274 
275 
276 #endif
277 
278 
279 
Definition: canvasmode_copyproperties.h:29
Definition: canvasmode_editmeshpatch.h:42
Definition: canvasmode_edit.h:35
Definition: canvasmode_objimport.h:35
Definition: canvasmode_drawfreehand.h:32
Definition: canvas.h:80
Definition: canvasmode_panning.h:34
Definition: canvas.h:49
Definition: scpage.h:46
Definition: canvasmode_editmeshgradient.h:41
Definition: canvasmode_editgradient.h:35
std::ostream & operator<<(std::ostream &out_file, const Geom::Matrix &m)
Definition: matrix.h:109
A point with floating point precision.
Definition: fpoint.h:43
bool drawFramelinksWithContents
Definition: canvas.h:70
the Document Class
Definition: scribusdoc.h:90
virtual void drawControls(QPainter *p)
Definition: canvasmode_drawcalligraphic.cpp:56
Definition: scpainter.h:33
Definition: canvasmode_drawcalligraphic.h:32
Definition: canvasmode.h:72
Definition: canvasmode_editarc.h:40
Definition: canvasmode_editspiral.h:41
Definition: sclayer.h:17
Definition: canvasmode_magnifier.h:37
Definition: canvasmode_eyedropper.h:27
Definition: canvasmode_imageimport.h:32
Definition: canvasmode_normal.h:37
Binary buffer.
Definition: pdbim.h:93
bool drawSelectedItemsWithControls
Definition: canvas.h:68
Definition: canvasmode_edittable.h:34
Definition: canvasmode_editweldpoint.h:41
Definition: pageitem.h:92
Definition: fpointarray.h:42
Definition: canvasmode_rotate.h:35
Definition: scribusview.h:87
Definition: canvasmode_nodeedit.h:32
Definition: canvasmode_editpolygon.h:41