QtiPlot  0.9.8.2
MultiLayer.h
Go to the documentation of this file.
1 /***************************************************************************
2  File : MultiLayer.h
3  Project : QtiPlot
4  --------------------------------------------------------------------
5  Copyright : (C) 2006 - 2009 by Ion Vasilief, Knut Franke
6  Email (use @ for *) : ion_vasilief*yahoo.fr, knut.franke*gmx.de
7  Description : Multi layer widget
8 
9  ***************************************************************************/
10 
11 /***************************************************************************
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * *
18  * This program is distributed in the hope that it will be useful, *
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
21  * GNU General Public License for more details. *
22  * *
23  * You should have received a copy of the GNU General Public License *
24  * along with this program; if not, write to the Free Software *
25  * Foundation, Inc., 51 Franklin Street, Fifth Floor, *
26  * Boston, MA 02110-1301 USA *
27  * *
28  ***************************************************************************/
29 #ifndef MULTILAYER_H
30 #define MULTILAYER_H
31 
32 #include <MdiSubWindow.h>
33 #include <FrameWidget.h>
34 #include <QPushButton>
35 #include <QLayout>
36 #include <QPointer>
37 
38 class QTextDocument;
39 class QLabel;
40 class LayerButton;
42 class LegendWidget;
43 class Graph;
44 class QwtPlotCurve;
45 class Matrix;
46 
64 class MultiLayer: public MdiSubWindow
65 {
66  Q_OBJECT
67 
68 public:
69  MultiLayer (ApplicationWindow* parent = 0, int layers = 1, int rows = 1, int cols = 1, const QString& label = "", const char* name=0, Qt::WFlags f=0);
70  ~MultiLayer();
71 
72  QList<Graph *> layersList(){return graphsList;};
73  QList<Graph*> stackOrderedLayersList();
74  Graph *layer(int num);
75  int layerIndex(Graph *g){return graphsList.indexOf(g);};
76 
77  int numLayers(){return graphsList.size();};
78  void setNumLayers(int n);
79 
80  void copy(MultiLayer* ml);
81 
86 
89 
91  void printCropmarks(bool on){d_print_cropmarks = on;};
92 
94  void setScaleLayersOnResize(bool ok){d_scale_layers = ok;};
95 
96  QWidget *canvas(){return d_canvas;};
97  QRect canvasRect(){return d_canvas->rect();};
98  QRect canvasChildrenRect();
99  virtual QString sizeToString();
100 
101  void setWaterfallLayout(bool on = true);
102 
103  void setEqualSizedLayers();
104 
105  void plotProfiles(Matrix* m);
106 
107  QHBoxLayout *toolBox(){return toolbuttonsBox;};
108 
110  void setAlignPolicy(const AlignPolicy& policy){d_align_policy = policy;};
111 
113  void setSizePolicy(const SizePolicy& policy){d_size_policy = policy;};
114 
115  void setCommonLayerAxes(bool verticalAxis = true, bool horizontalAxis = true);
116  void linkXLayerAxes(bool link = true);
119  void setCommonAxesLayout(bool on = true){d_common_axes_layout = on;};
120 
121  void deselect();
122  bool hasSelectedLayers();
123  bool isLayerSelected(Graph*);
124 
126 
127 public slots:
128  Graph* addLayer(int x = 0, int y = 0, int width = 0, int height = 0, bool = false);
129 
130  bool isEmpty();
131  bool removeLayer(Graph *g);
132  bool removeActiveLayer();
133  void confirmRemoveLayer();
134 
136  void setActiveLayer(Graph* g);
137  void activateGraph(LayerButton* button);
138  void selectLayerCanvas(Graph* g);
139 
141  Graph* layerAt(const QPoint& pos);
142  void setGraphGeometry(int x, int y, int w, int h);
143 
144  void findBestLayout(int &rows, int &cols);
145 
146  QSize arrangeLayers(bool userSize);
147  bool arrangeLayers(bool fit, bool userSize);
148  bool swapLayers(int src, int dest);
149  void updateLayersLayout(Graph *);
150 
151  int getRows(){return d_rows;};
152  void setRows(int r);
153 
154  int getCols(){return d_cols;};
155  void setCols(int c);
156 
157  int colsSpacing(){return colsSpace;};
158  int rowsSpacing(){return rowsSpace;};
159  void setSpacing (int rgap, int cgap);
160 
161  int leftMargin(){return left_margin;};
162  int rightMargin(){return right_margin;};
163  int topMargin(){return top_margin;};
164  int bottomMargin(){return bottom_margin;};
165  void setMargins (int lm, int rm, int tm, int bm);
166 
168  void setLayerCanvasSize (int w, int h);
169 
172  void setAlignement (int ha, int va);
173 
175 
176  QPixmap canvasPixmap(const QSize& size = QSize(), double scaleFontsFactor = 1.0, bool transparent = false);
177  void exportToFile(const QString& fileName);
178 #if QT_VERSION >= 0x040500
179  void exportImage(QTextDocument *document, int quality = 100, bool transparent = false,
180  int dpi = 0, const QSizeF& customSize = QSizeF (), int unit = FrameWidget::Pixel, double fontsFactor = 1.0);
181 #endif
182  void exportImage(const QString& fileName, int quality = 100, bool transparent = false, int dpi = 0,
183  const QSizeF& customSize = QSizeF (), int unit = FrameWidget::Pixel, double fontsFactor = 1.0, int compression = 0);
184  void exportSVG(const QString& fname, const QSizeF& customSize = QSizeF(), int unit = FrameWidget::Pixel, double fontsFactor = 1.0);
185  void exportPDF(const QString& fname);
186  void exportVector(const QString& fileName, int res = 0, bool color = true,
187  const QSizeF& customSize = QSizeF (), int unit = FrameWidget::Pixel, double fontsFactor = 1.0);
188  void exportVector(QPrinter *printer, int res = 0, bool color = true,
189  const QSizeF& customSize = QSizeF (), int unit = FrameWidget::Pixel, double fontsFactor = 1.0);
190 
191  void draw(QPaintDevice *, const QSizeF& customSize, int unit, int res, double fontsFactor = 1.0);
192 
193  void exportEMF(const QString& fname, const QSizeF& customSize = QSizeF(), int unit = FrameWidget::Pixel, double fontsFactor = 1.0);
194  void exportTeX(const QString& fname, bool color = true, bool escapeStrings = true, bool fontSizes = true,
195  const QSizeF& customSize = QSizeF(), int unit = FrameWidget::Pixel, double fontsFactor = 1.0);
196 
197  void copyAllLayers();
198  void print();
199  void print(QPrinter *);
200  void printAllLayers(QPainter *painter);
201  void printActiveLayer();
203 
204  void setFonts(const QFont& titleFnt, const QFont& scaleFnt,
205  const QFont& numbersFnt, const QFont& legendFnt);
206 
207  void connectLayer(Graph *g);
208 
209  void save(const QString& fn, const QString& geometry, bool = false);
210 
212 
214  void reverseWaterfallOrder();
216  void updateWaterfalls();
219  void setWaterfallFillColor(const QColor& c);
221 
222  void updateLayerAxes(Graph *g, int axis);
223 
224 signals:
225  void showEnrichementDialog();
226  void showCurvesDialog();
227  void drawLineEnded(bool);
228  void showMarkerPopupMenu();
229  void modifiedPlot();
230  void cursorInfo(const QString&);
231  void showLineDialog();
232  void pasteMarker();
233  void setPointerCursor();
234  void currentFontChanged(const QFont&);
235  void currentColorChanged(const QColor&);
236 
237 private:
239 
240  void mouseReleaseEvent(QMouseEvent *);
241  void showEvent(QShowEvent *);
242  void dropEvent(QDropEvent*);
243  void dragEnterEvent(QDragEnterEvent*);
244  void wheelEvent(QWheelEvent *);
245  void keyPressEvent(QKeyEvent *);
246  bool eventFilter(QObject *object, QEvent *);
247  void releaseLayer();
248  void resizeLayers(QResizeEvent *);
252 
254  void createWaterfallBox();
255 
264 
265  QList<LayerButton *> buttonsList;
266  QList<Graph *> graphsList;
268  QWidget *d_canvas;
269 
270  QPointer<SelectionMoveResizer> d_layers_selector;
271 
274 
276 
278 
283 
284  QVector<QRectF> d_layer_coordinates;
285 };
286 
288 class LayerButton: public QPushButton
289 {
290  Q_OBJECT
291 
292 public:
293  LayerButton (const QString& text = QString::null, QWidget* parent = 0);
294  static int btnSize(){return 20;};
295 
296 protected:
297  void mousePressEvent( QMouseEvent * );
298  void mouseDoubleClickEvent ( QMouseEvent * );
299 
300 signals:
301  void showCurvesDialog();
302  void clicked(LayerButton*);
303  void showLayerContextMenu();
304 };
305 
306 #endif
QVector< QRectF > d_layer_coordinates
Definition: MultiLayer.h:284
bool removeLayer(Graph *g)
Definition: MultiLayer.cpp:504
SizePolicy d_size_policy
Definition: MultiLayer.h:280
void exportToFile(const QString &fileName)
Definition: MultiLayer.cpp:1020
Definition: MultiLayer.h:82
void exportVector(const QString &fileName, int res=0, bool color=true, const QSizeF &customSize=QSizeF(), int unit=FrameWidget::Pixel, double fontsFactor=1.0)
Definition: MultiLayer.cpp:1211
int left_margin
Definition: MultiLayer.h:259
QPixmap canvasPixmap(const QSize &size=QSize(), double scaleFontsFactor=1.0, bool transparent=false)
Definition: MultiLayer.cpp:976
int d_cols
Used for resizing of layers.
Definition: MultiLayer.h:258
void showLayerContextMenu()
QRect canvasChildrenRect()
Definition: MultiLayer.cpp:350
void setScaleLayersOnResize(bool ok)
Definition: MultiLayer.h:94
void dropEvent(QDropEvent *)
Definition: MultiLayer.cpp:2062
An MDI window (MdiSubWindow) managing one or more Graph objects.
Definition: MultiLayer.h:64
~MultiLayer()
Definition: MultiLayer.cpp:2235
void deselect()
Definition: MultiLayer.cpp:2229
void setMargins(int lm, int rm, int tm, int bm)
Definition: MultiLayer.cpp:1717
void setSizePolicy(const SizePolicy &policy)
Definition: MultiLayer.h:113
bool eventFilter(QObject *object, QEvent *)
Definition: MultiLayer.cpp:1512
int rowsSpace
Definition: MultiLayer.h:258
QList< Graph * > layersList()
Definition: MultiLayer.h:72
void exportPDF(const QString &fname)
Definition: MultiLayer.cpp:1143
static int btnSize()
Definition: MultiLayer.h:294
SizePolicy
Definition: MultiLayer.h:85
void drawLineEnded(bool)
int bottom_margin
Definition: MultiLayer.h:259
void save(const QString &fn, const QString &geometry, bool=false)
Definition: MultiLayer.cpp:1677
bool d_common_axes_layout
Definition: MultiLayer.h:282
void setLayerCanvasSize(int w, int h)
Definition: MultiLayer.cpp:1737
void showWaterfallOffsetDialog()
Definition: MultiLayer.cpp:1945
void releaseLayer()
void exportImage(const QString &fileName, int quality=100, bool transparent=false, int dpi=0, const QSizeF &customSize=QSizeF(), int unit=FrameWidget::Pixel, double fontsFactor=1.0, int compression=0)
Definition: MultiLayer.cpp:1055
A 2D-plotting widget.
Definition: Graph.h:123
void setAlignement(int ha, int va)
Definition: MultiLayer.cpp:1745
bool isWaterfallPlot()
Definition: MultiLayer.h:217
void currentFontChanged(const QFont &)
bool hasSelectedLayers()
Definition: MultiLayer.cpp:1888
Graph * layer(int num)
Definition: MultiLayer.cpp:202
void mouseDoubleClickEvent(QMouseEvent *)
Definition: MultiLayer.cpp:104
int layerIndex(Graph *g)
Definition: MultiLayer.h:75
virtual QString sizeToString()
Size of the widget as a string.
Definition: MultiLayer.cpp:1861
void showEnrichementDialog()
void setFonts(const QFont &titleFnt, const QFont &scaleFnt, const QFont &numbersFnt, const QFont &legendFnt)
Definition: MultiLayer.cpp:1460
bool hasCommonAxes()
Definition: MultiLayer.h:118
void setAlignPolicy(const AlignPolicy &policy)
Definition: MultiLayer.h:110
void currentColorChanged(const QColor &)
AlignPolicy d_align_policy
Definition: MultiLayer.h:279
int d_rows
Definition: MultiLayer.h:258
int getRows()
Definition: MultiLayer.h:151
QSize arrangeLayers(bool userSize)
Definition: MultiLayer.cpp:590
void showCurvesDialog()
QPointer< SelectionMoveResizer > d_layers_selector
Definition: MultiLayer.h:270
void setNumLayers(int n)
Definition: MultiLayer.cpp:1754
void plotProfiles(Matrix *m)
Definition: MultiLayer.cpp:2080
void copyAllLayers()
Definition: MultiLayer.cpp:1316
int graph_width
Definition: MultiLayer.h:258
Graph * activeLayer()
Definition: MultiLayer.h:135
bool removeActiveLayer()
Definition: MultiLayer.cpp:499
Graph * layerAt(const QPoint &pos)
Returns the layer at the given position; returns 0 if there is no such layer.
Definition: MultiLayer.cpp:1879
void resizeLayers(QResizeEvent *)
Definition: MultiLayer.cpp:374
QWidget * d_canvas
Definition: MultiLayer.h:268
void copy(MultiLayer *ml)
Definition: MultiLayer.cpp:1801
int vert_align
Definition: MultiLayer.h:260
void updateLayersLayout(Graph *)
Definition: MultiLayer.cpp:2216
AlignPolicy alignPolicy()
Definition: MultiLayer.h:109
Definition: MultiLayer.h:82
void clicked(LayerButton *)
Definition: MultiLayer.h:85
bool scaleLayersOnResize()
Definition: MultiLayer.h:93
HorAlignement
Definition: MultiLayer.h:82
int rowsSpacing()
Definition: MultiLayer.h:158
QColor d_waterfall_fill_color
Definition: MultiLayer.h:273
void printActiveLayer()
Definition: MultiLayer.cpp:1350
QWidget * canvas()
Definition: MultiLayer.h:96
Handler for modifying one or more QWidget and/or QwtPlotMarker with mouse or keyboard.
Definition: SelectionMoveResizer.h:89
QSize layerCanvasSize()
Definition: MultiLayer.h:167
void updateWaterfalls()
Definition: MultiLayer.cpp:1934
void setCols(int c)
Definition: MultiLayer.cpp:952
Definition: MultiLayer.h:84
void cursorInfo(const QString &)
int graph_height
Definition: MultiLayer.h:258
Definition: MultiLayer.h:85
VertAlignement
Definition: MultiLayer.h:83
LayerButton * addLayerButton()
Definition: MultiLayer.cpp:211
void setPointerCursor()
void setSpacing(int rgap, int cgap)
Definition: MultiLayer.cpp:1729
int bottomMargin()
Definition: MultiLayer.h:164
void mousePressEvent(QMouseEvent *)
Definition: MultiLayer.cpp:95
int getCols()
Definition: MultiLayer.h:154
int hor_align
Definition: MultiLayer.h:260
Definition: MultiLayer.h:84
int colsSpacing()
Definition: MultiLayer.h:157
Definition: MultiLayer.h:83
MultiLayer(ApplicationWindow *parent=0, int layers=1, int rows=1, int cols=1, const QString &label="", const char *name=0, Qt::WFlags f=0)
Definition: MultiLayer.cpp:109
void adjustLayersToCanvasSize()
Definition: MultiLayer.cpp:359
bool scaleLayersOnPrint()
Definition: MultiLayer.h:87
QtiPlot&#39;s main window.
Definition: ApplicationWindow.h:133
void showLineDialog()
void showCurvesDialog()
SizePolicy sizePolicy()
Definition: MultiLayer.h:112
void setCommonLayerAxes(bool verticalAxis=true, bool horizontalAxis=true)
Definition: MultiLayer.cpp:774
void setRows(int r)
Definition: MultiLayer.cpp:958
int l_canvas_width
Definition: MultiLayer.h:260
int right_margin
Definition: MultiLayer.h:259
Definition: LegendWidget.h:42
QPushButton * d_remove_layer_btn
Definition: MultiLayer.h:275
void keyPressEvent(QKeyEvent *)
Definition: MultiLayer.cpp:1579
QList< Graph * > graphsList
Definition: MultiLayer.h:266
QList< Graph * > stackOrderedLayersList()
Definition: MultiLayer.cpp:964
bool isLayerSelected(Graph *)
Definition: MultiLayer.cpp:279
Matrix worksheet class.
Definition: Matrix.h:57
void confirmRemoveLayer()
Definition: MultiLayer.cpp:474
bool d_link_x_axes
Definition: MultiLayer.h:281
bool isEmpty()
Definition: MultiLayer.cpp:1669
int verticalAlignement()
Definition: MultiLayer.h:171
void print()
Definition: MultiLayer.cpp:1356
Definition: MultiLayer.h:82
void draw(QPaintDevice *, const QSizeF &customSize, int unit, int res, double fontsFactor=1.0)
Definition: MultiLayer.cpp:1227
int colsSpace
Definition: MultiLayer.h:258
Definition: FrameWidget.h:44
AlignPolicy
Definition: MultiLayer.h:84
Graph * clickedLayer(Graph *)
Try to guess on which layer the user clicked if the layers are superposed.
Definition: MultiLayer.cpp:288
void dragEnterEvent(QDragEnterEvent *)
Definition: MultiLayer.cpp:2052
void exportSVG(const QString &fname, const QSizeF &customSize=QSizeF(), int unit=FrameWidget::Pixel, double fontsFactor=1.0)
Definition: MultiLayer.cpp:1257
QRect canvasRect()
Definition: MultiLayer.h:97
void selectLayerCanvas(Graph *g)
Definition: MultiLayer.cpp:305
void createWaterfallBox()
Definition: MultiLayer.cpp:1916
void printAllLayers(QPainter *painter)
Definition: MultiLayer.cpp:1398
void exportEMF(const QString &fname, const QSizeF &customSize=QSizeF(), int unit=FrameWidget::Pixel, double fontsFactor=1.0)
Definition: MultiLayer.cpp:1277
void showWaterfallFillDialog()
Definition: MultiLayer.cpp:2001
int topMargin()
Definition: MultiLayer.h:163
QHBoxLayout * waterfallBox
Definition: MultiLayer.h:267
void setWaterfallFillColor(const QColor &c)
Definition: MultiLayer.cpp:2045
bool printCropmarksEnabled()
Definition: MultiLayer.h:90
Definition: MultiLayer.h:83
int leftMargin()
Definition: MultiLayer.h:161
bool swapLayers(int src, int dest)
Definition: MultiLayer.cpp:1841
void linkXLayerAxes(bool link=true)
Definition: MultiLayer.cpp:2147
void setEqualSizedLayers()
Definition: MultiLayer.cpp:563
void wheelEvent(QWheelEvent *)
Definition: MultiLayer.cpp:1620
void showEvent(QShowEvent *)
Definition: MultiLayer.cpp:1573
Base class of all MDI client windows.
Definition: MdiSubWindow.h:51
void mouseReleaseEvent(QMouseEvent *)
Definition: MultiLayer.cpp:1567
bool hasLinkedXLayerAxes()
Definition: MultiLayer.h:117
void setWaterfallLayout(bool on=true)
Definition: MultiLayer.cpp:1895
void connectLayer(Graph *g)
Definition: MultiLayer.cpp:1484
Button with layer number.
Definition: MultiLayer.h:288
void setActiveLayer(Graph *g)
Definition: MultiLayer.cpp:321
bool d_scale_on_print
Definition: MultiLayer.h:261
Definition: MultiLayer.h:83
void showMarkerPopupMenu()
void setScaleLayersOnPrint(bool on)
Definition: MultiLayer.h:88
int rightMargin()
Definition: MultiLayer.h:162
Graph * active_graph
Definition: MultiLayer.h:256
QHBoxLayout * toolbuttonsBox
Definition: MultiLayer.h:267
int l_canvas_height
Definition: MultiLayer.h:260
void exportTeX(const QString &fname, bool color=true, bool escapeStrings=true, bool fontSizes=true, const QSizeF &customSize=QSizeF(), int unit=FrameWidget::Pixel, double fontsFactor=1.0)
Definition: MultiLayer.cpp:1287
void reverseWaterfallOrder()
Definition: MultiLayer.cpp:1991
bool d_scale_layers
Flag telling if layers should be rescaled on the plot window is resized by the user.
Definition: MultiLayer.h:263
void setCommonAxesLayout(bool on=true)
Definition: MultiLayer.h:119
QPushButton * d_add_layer_btn
Definition: MultiLayer.h:275
QSize d_canvas_size
Definition: MultiLayer.h:277
Graph * addLayer(int x=0, int y=0, int width=0, int height=0, bool=false)
Definition: MultiLayer.cpp:228
LayerButton(const QString &text=QString::null, QWidget *parent=0)
Definition: MultiLayer.cpp:83
void printCropmarks(bool on)
Definition: MultiLayer.h:91
QHBoxLayout * toolBox()
Definition: MultiLayer.h:107
void setGraphGeometry(int x, int y, int w, int h)
Definition: MultiLayer.cpp:553
int horizontalAlignement()
Definition: MultiLayer.h:170
void pasteMarker()
QList< LayerButton * > buttonsList
Definition: MultiLayer.h:265
QString name()
Return the window name.
Definition: MdiSubWindow.h:84
bool d_is_waterfall_plot
Definition: MultiLayer.h:272
QColor waterfallFillColor()
Definition: MultiLayer.h:218
bool d_print_cropmarks
Definition: MultiLayer.h:261
QHBoxLayout * layerButtonsBox
Definition: MultiLayer.h:267
void modifiedPlot()
void activateGraph(LayerButton *button)
Definition: MultiLayer.cpp:256
int numLayers()
Definition: MultiLayer.h:77
void updateLayerAxes(Graph *g, int axis)
Definition: MultiLayer.cpp:2160
int top_margin
Definition: MultiLayer.h:259
void findBestLayout(int &rows, int &cols)
Definition: MultiLayer.cpp:879