1 #include <qregexp.h>
2 #include <qapplication.h>
3 #include <qtoolbar.h>
4 #include <qtoolbutton.h>
5 #include <qlabel.h>
6 #include <qlayout.h>
7 #include <qstatusbar.h>
8 #include <qprinter.h>
9 #include <qpicture.h>
10 #include <qpainter.h>
11 #include <qfiledialog.h>
12 #if QT_VERSION >= 0x040300
13 #ifdef QT_SVG_LIB
14 #include <qsvggenerator.h>
15 #endif
16 #endif
17 #if QT_VERSION >= 0x040000
18 #include <qprintdialog.h>
19 #include <qfileinfo.h>
20 #else
21 #include <qwt_painter.h>
22 #endif
23 #include <qwt_counter.h>
24 #include <qwt_plot_zoomer.h>
25 #include <qwt_plot_panner.h>
26 #include <qwt_text.h>
27 #include <qwt_math.h>
28 #include "pixmaps.h"
29 #include "bode_plot.h"
30 #include "bode.h"
31
32 class Zoomer: public QwtPlotZoomer
33 {
34 public:
Zoomer(int xAxis,int yAxis,QwtPlotCanvas * canvas)35 Zoomer(int xAxis, int yAxis, QwtPlotCanvas *canvas):
36 QwtPlotZoomer(xAxis, yAxis, canvas)
37 {
38 setSelectionFlags(QwtPicker::DragSelection | QwtPicker::CornerToCorner);
39 setTrackerMode(QwtPicker::AlwaysOff);
40 setRubberBand(QwtPicker::NoRubberBand);
41
42 // RightButton: zoom out by 1
43 // Ctrl+RightButton: zoom out to full size
44
45 #if QT_VERSION < 0x040000
46 setMousePattern(QwtEventPattern::MouseSelect2,
47 Qt::RightButton, Qt::ControlButton);
48 #else
49 setMousePattern(QwtEventPattern::MouseSelect2,
50 Qt::RightButton, Qt::ControlModifier);
51 #endif
52 setMousePattern(QwtEventPattern::MouseSelect3,
53 Qt::RightButton);
54 }
55 };
56
57 //-----------------------------------------------------------------
58 //
59 // bode.cpp -- A demo program featuring QwtPlot and QwtCounter
60 //
61 // This example demonstrates the mapping of different curves
62 // to different axes in a QwtPlot widget. It also shows how to
63 // display the cursor position and how to implement zooming.
64 //
65 //-----------------------------------------------------------------
66
MainWin(QWidget * parent)67 MainWin::MainWin(QWidget *parent):
68 QMainWindow(parent)
69 {
70 d_plot = new BodePlot(this);
71 d_plot->setMargin(5);
72
73 #if QT_VERSION >= 0x040000
74 setContextMenuPolicy(Qt::NoContextMenu);
75 #endif
76
77 d_zoomer[0] = new Zoomer( QwtPlot::xBottom, QwtPlot::yLeft,
78 d_plot->canvas());
79 d_zoomer[0]->setRubberBand(QwtPicker::RectRubberBand);
80 d_zoomer[0]->setRubberBandPen(QColor(Qt::green));
81 d_zoomer[0]->setTrackerMode(QwtPicker::ActiveOnly);
82 d_zoomer[0]->setTrackerPen(QColor(Qt::white));
83
84 d_zoomer[1] = new Zoomer(QwtPlot::xTop, QwtPlot::yRight,
85 d_plot->canvas());
86
87 d_panner = new QwtPlotPanner(d_plot->canvas());
88 d_panner->setMouseButton(Qt::MiddleButton);
89
90 d_picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft,
91 QwtPicker::PointSelection | QwtPicker::DragSelection,
92 QwtPlotPicker::CrossRubberBand, QwtPicker::AlwaysOn,
93 d_plot->canvas());
94 d_picker->setRubberBandPen(QColor(Qt::green));
95 d_picker->setRubberBand(QwtPicker::CrossRubberBand);
96 d_picker->setTrackerPen(QColor(Qt::white));
97
98 setCentralWidget(d_plot);
99
100 QToolBar *toolBar = new QToolBar(this);
101
102 QToolButton *btnZoom = new QToolButton(toolBar);
103 #if QT_VERSION >= 0x040000
104 btnZoom->setText("Zoom");
105 btnZoom->setIcon(QIcon(QPixmap(zoom_xpm)));
106 btnZoom->setCheckable(true);
107 btnZoom->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
108 #else
109 btnZoom->setTextLabel("Zoom");
110 btnZoom->setPixmap(zoom_xpm);
111 btnZoom->setToggleButton(true);
112 btnZoom->setUsesTextLabel(true);
113 #endif
114
115 QToolButton *btnPrint = new QToolButton(toolBar);
116 #if QT_VERSION >= 0x040000
117 btnPrint->setText("Print");
118 btnPrint->setIcon(QIcon(QPixmap(print_xpm)));
119 btnPrint->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
120 #else
121 btnPrint->setTextLabel("Print");
122 btnPrint->setPixmap(print_xpm);
123 btnPrint->setUsesTextLabel(true);
124 #endif
125
126 #if QT_VERSION < 0x040000
127 QToolButton *btnSVG = new QToolButton(toolBar);
128 btnSVG->setTextLabel("SVG");
129 btnSVG->setPixmap(print_xpm);
130 btnSVG->setUsesTextLabel(true);
131 #elif QT_VERSION >= 0x040300
132 #ifdef QT_SVG_LIB
133 QToolButton *btnSVG = new QToolButton(toolBar);
134 btnSVG->setText("SVG");
135 btnSVG->setIcon(QIcon(QPixmap(print_xpm)));
136 btnSVG->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
137 #endif
138 #endif
139
140 #if QT_VERSION >= 0x040000
141 toolBar->addWidget(btnZoom);
142 toolBar->addWidget(btnPrint);
143 #if QT_VERSION >= 0x040300
144 #ifdef QT_SVG_LIB
145 toolBar->addWidget(btnSVG);
146 #endif
147 #endif
148 #endif
149 toolBar->addSeparator();
150
151 QWidget *hBox = new QWidget(toolBar);
152
153 QHBoxLayout *layout = new QHBoxLayout(hBox);
154 layout->setSpacing(0);
155 layout->addWidget(new QWidget(hBox), 10); // spacer
156 layout->addWidget(new QLabel("Damping Factor", hBox), 0);
157 layout->addSpacing(10);
158
159 QwtCounter *cntDamp = new QwtCounter(hBox);
160 cntDamp->setRange(0.0, 5.0, 0.01);
161 cntDamp->setValue(0.0);
162
163 layout->addWidget(cntDamp, 0);
164
165 #if QT_VERSION >= 0x040000
166 (void)toolBar->addWidget(hBox);
167 #else
168 toolBar->setStretchableWidget(hBox);
169 #endif
170
171 addToolBar(toolBar);
172 #ifndef QT_NO_STATUSBAR
173 (void)statusBar();
174 #endif
175
176 enableZoomMode(false);
177 showInfo();
178
179 connect(cntDamp, SIGNAL(valueChanged(double)),
180 d_plot, SLOT(setDamp(double)));
181
182 connect(btnPrint, SIGNAL(clicked()), SLOT(print()));
183 #if QT_VERSION < 0x040000
184 connect(btnSVG, SIGNAL(clicked()), SLOT(exportSVG()));
185 #elif QT_VERSION >= 0x040300
186 #ifdef QT_SVG_LIB
187 connect(btnSVG, SIGNAL(clicked()), SLOT(exportSVG()));
188 #endif
189 #endif
190 connect(btnZoom, SIGNAL(toggled(bool)), SLOT(enableZoomMode(bool)));
191
192 connect(d_picker, SIGNAL(moved(const QPoint &)),
193 SLOT(moved(const QPoint &)));
194 connect(d_picker, SIGNAL(selected(const QwtPolygon &)),
195 SLOT(selected(const QwtPolygon &)));
196 }
197
print()198 void MainWin::print()
199 {
200 #if 1
201 QPrinter printer;
202 #else
203 QPrinter printer(QPrinter::HighResolution);
204 #if QT_VERSION < 0x040000
205 printer.setOutputToFile(true);
206 printer.setOutputFileName("/tmp/bode.ps");
207 printer.setColorMode(QPrinter::Color);
208 #else
209 printer.setOutputFileName("/tmp/bode.pdf");
210 #endif
211 #endif
212
213 QString docName = d_plot->title().text();
214 if ( !docName.isEmpty() )
215 {
216 docName.replace (QRegExp (QString::fromLatin1 ("\n")), tr (" -- "));
217 printer.setDocName (docName);
218 }
219
220 printer.setCreator("Bode example");
221 printer.setPageOrientation(QPageLayout::Landscape);
222
223 #if QT_VERSION >= 0x040000
224 QPrintDialog dialog(&printer);
225 if ( dialog.exec() )
226 {
227 #else
228 if (printer.setup())
229 {
230 #endif
231 QwtPlotPrintFilter filter;
232 if ( printer.colorMode() == QPrinter::GrayScale )
233 {
234 int options = QwtPlotPrintFilter::PrintAll;
235 options &= ~QwtPlotPrintFilter::PrintBackground;
236 options |= QwtPlotPrintFilter::PrintFrameWithScales;
237 filter.setOptions(options);
238 }
239 d_plot->print(printer, filter);
240 }
241 }
242
243 void MainWin::exportSVG()
244 {
245 QString fileName = "bode.svg";
246
247 #if QT_VERSION < 0x040000
248
249 #ifndef QT_NO_FILEDIALOG
250 fileName = QFileDialog::getSaveFileName(
251 "bode.svg", "SVG Documents (*.svg)", this);
252 #endif
253 if ( !fileName.isEmpty() )
254 {
255 // enable workaround for Qt3 misalignments
256 QwtPainter::setSVGMode(true);
257
258 QPicture picture;
259
260 QPainter p(&picture);
261 d_plot->print(&p, QRect(0, 0, 800, 600));
262 p.end();
263
264 picture.save(fileName, "svg");
265 }
266
267 #elif QT_VERSION >= 0x040300
268
269 #ifdef QT_SVG_LIB
270 #ifndef QT_NO_FILEDIALOG
271 fileName = QFileDialog::getSaveFileName(
272 this, "Export File Name", QString(),
273 "SVG Documents (*.svg)");
274 #endif
275 if ( !fileName.isEmpty() )
276 {
277 QSvgGenerator generator;
278 generator.setFileName(fileName);
279 generator.setSize(QSize(800, 600));
280
281 d_plot->print(generator);
282 }
283 #endif
284 #endif
285 }
286
287 void MainWin::enableZoomMode(bool on)
288 {
289 d_panner->setEnabled(on);
290
291 d_zoomer[0]->setEnabled(on);
292 d_zoomer[0]->zoom(0);
293
294 d_zoomer[1]->setEnabled(on);
295 d_zoomer[1]->zoom(0);
296
297 d_picker->setEnabled(!on);
298
299 showInfo();
300 }
301
302 void MainWin::showInfo(QString text)
303 {
304 if ( text == QString() )
305 {
306 if ( d_picker->rubberBand() )
307 text = "Cursor Pos: Press left mouse button in plot region";
308 else
309 text = "Zoom: Press mouse button and drag";
310 }
311
312 #ifndef QT_NO_STATUSBAR
313 #if QT_VERSION >= 0x040000
314 statusBar()->showMessage(text);
315 #else
316 statusBar()->message(text);
317 #endif
318 #endif
319 }
320
321 void MainWin::moved(const QPoint &pos)
322 {
323 QString info;
324 info = "Freq="
325 + QString::number(d_plot->invTransform(QwtPlot::xBottom, pos.x()), 'g')
326 + ", Ampl="
327 + QString::number(d_plot->invTransform(QwtPlot::yLeft, pos.y()), 'g')
328 + ", Phase="
329 + QString::number(d_plot->invTransform(QwtPlot::yRight, pos.y()), 'g');
330 showInfo(info);
331 }
332
333 void MainWin::selected(const QwtPolygon &)
334 {
335 showInfo();
336 }
337
338 int main (int argc, char **argv)
339 {
340 QApplication a(argc, argv);
341
342 MainWin w;
343 #if QT_VERSION < 0x040000
344 a.setMainWidget(&w);
345 #endif
346 w.resize(540,400);
347 w.show();
348
349 int rv = a.exec();
350 return rv;
351 }
352