Wt examples 3.3.12
ChartConfig.C
Go to the documentation of this file.
1/*
2 * Copyright (C) 2008 Emweb bvba, Kessel-Lo, Belgium.
3 *
4 * See the LICENSE file for terms of use.
5 */
6
7#include "ChartConfig.h"
8#include "PanelList.h"
9
10#include <iostream>
11#include <boost/date_time/gregorian/greg_year.hpp>
12
13#include <Wt/WAbstractItemModel>
14#include <Wt/WApplication>
15#include <Wt/WCheckBox>
16#include <Wt/WComboBox>
17#include <Wt/WDoubleValidator>
18#include <Wt/WDate>
19#include <Wt/WEnvironment>
20#include <Wt/WIntValidator>
21#include <Wt/WLineEdit>
22#include <Wt/WLocale>
23#include <Wt/WPanel>
24#include <Wt/WPushButton>
25#include <Wt/WStandardItemModel>
26#include <Wt/WTable>
27#include <Wt/WText>
28#include <Wt/WPainterPath>
29
30#include <Wt/Chart/WCartesianChart>
31
32using namespace Wt;
33using namespace Wt::Chart;
34
35namespace {
36 void addHeader(WTable *t, const char *value) {
37 t->elementAt(0, t->columnCount())->addWidget(new WText(value));
38 }
39
40 void addEntry(WAbstractItemModel *model, const char *value) {
41 model->insertRows(model->rowCount(), 1);
42 model->setData(model->rowCount()-1, 0, boost::any(std::string(value)));
43 }
44
45 void addEntry(WAbstractItemModel *model, const WString &value) {
46 model->insertRows(model->rowCount(), 1);
47 model->setData(model->rowCount()-1, 0, boost::any(value));
48 }
49
50 bool getDouble(WLineEdit *edit, double& value) {
51 try {
52 value = WLocale::currentLocale().toDouble(edit->text());
53 return true;
54 } catch (...) {
55 return false;
56 }
57 }
58
59 int seriesIndexOf(WCartesianChart* chart, int modelColumn) {
60 for (unsigned i = 0; i < chart->series().size(); ++i)
61 if (chart->series()[i]->modelColumn() == modelColumn)
62 return i;
63
64 return -1;
65 }
66
67 WString axisName(Axis axis, int yAxis)
68 {
69 if (axis == XAxis)
70 return Wt::utf8("X Axis");
71 else {
72 return Wt::utf8("Y axis {1}").arg(yAxis + 1);
73 }
74 }
75}
76
78 : WContainerWidget(parent),
79 chart_(chart),
80 fill_(MinimumValueFill)
81{
83 WBrush(WColor(0xFF, 0xFA, 0xE5)));
84
85 PanelList *list = new PanelList(this);
86
87 WIntValidator *sizeValidator = new WIntValidator(200, 2000, this);
88 sizeValidator->setMandatory(true);
89
92
93 angleValidator_ = new WDoubleValidator(-90, 90, this);
95
96 // ---- Chart properties ----
97
98 WStandardItemModel *orientation = new WStandardItemModel(0, 1, this);
99 addEntry(orientation, "Vertical");
100 addEntry(orientation, "Horizontal");
101
102 WStandardItemModel *legendLocation = new WStandardItemModel(0, 1, this);
103 addEntry(legendLocation, "Outside");
104 addEntry(legendLocation, "Inside");
105
106 WStandardItemModel *legendSide = new WStandardItemModel(0, 1, this);
107 addEntry(legendSide, "Top");
108 addEntry(legendSide, "Right");
109 addEntry(legendSide, "Bottom");
110 addEntry(legendSide, "Left");
111
112 WStandardItemModel *legendAlignment = new WStandardItemModel(0, 1, this);
113 addEntry(legendAlignment, "AlignLeft");
114 addEntry(legendAlignment, "AlignCenter");
115 addEntry(legendAlignment, "AlignRight");
116 addEntry(legendAlignment, "AlignTop");
117 addEntry(legendAlignment, "AlignMiddle");
118 addEntry(legendAlignment, "AlignBottom");
119
120 WTable *chartConfig = new WTable();
121 chartConfig->setMargin(WLength::Auto, Left | Right);
122
123 int row = 0;
124 chartConfig->elementAt(row, 0)->addWidget(new WText("Title:"));
125 titleEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
127 ++row;
128
129 chartConfig->elementAt(row, 0)->addWidget(new WText("Width:"));
130 chartWidthEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
132 ->setText(WLocale::currentLocale().toString(chart_->width().value()));
133 chartWidthEdit_->setValidator(sizeValidator);
136 ++row;
137
138 chartConfig->elementAt(row, 0)->addWidget(new WText("Height:"));
139 chartHeightEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
142 chartHeightEdit_->setValidator(sizeValidator);
145 ++row;
146
147 chartConfig->elementAt(row, 0)->addWidget(new WText("Orientation:"));
148 chartOrientationEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
149 chartOrientationEdit_->setModel(orientation);
152 ++row;
153
154 chartConfig->elementAt(row, 0)->addWidget(new WText("Legend location:"));
155 legendLocationEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
156 legendLocationEdit_->setModel(legendLocation);
159 ++row;
160
161 chartConfig->elementAt(row, 0)->addWidget(new WText("Legend side:"));
162 legendSideEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
163 legendSideEdit_->setModel(legendSide);
166 ++row;
167
168 chartConfig->elementAt(row, 0)->addWidget(new WText("Legend alignment:"));
169 legendAlignmentEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
170 legendAlignmentEdit_->setModel(legendAlignment);
173 ++row;
174
175 chartConfig->elementAt(row, 0)->addWidget(new WText("Border:"));
176 borderEdit_ = new WCheckBox(chartConfig->elementAt(row, 1));
177 borderEdit_->setChecked(false);
179 ++row;
180
181 for (int i = 0; i < chartConfig->rowCount(); ++i) {
182 chartConfig->elementAt(i, 0)->setStyleClass("tdhead");
183 chartConfig->elementAt(i, 1)->setStyleClass("tddata");
184 }
185
186 WPanel *p = list->addWidget("Chart properties", chartConfig);
188 p->resize(1160, WLength::Auto);
189 p->setMargin(20, Top | Bottom);
190
191 // ---- Series properties ----
192
193 WStandardItemModel *types = new WStandardItemModel(0, 1, this);
194 addEntry(types, "Points");
195 addEntry(types, "Line");
196 addEntry(types, "Curve");
197 addEntry(types, "Bar");
198 addEntry(types, "Line Area");
199 addEntry(types, "Curve Area");
200 addEntry(types, "Stacked Bar");
201 addEntry(types, "Stacked Line Area");
202 addEntry(types, "Stacked Curve Area");
203
204 WStandardItemModel *markers = new WStandardItemModel(0, 1, this);
205 addEntry(markers, "None");
206 addEntry(markers, "Square");
207 addEntry(markers, "Circle");
208 addEntry(markers, "Cross");
209 addEntry(markers, "X cross");
210 addEntry(markers, "Triangle");
211 addEntry(markers, "Pipe");
212 addEntry(markers, "Star");
213 addEntry(markers, "Inverted triangle");
214 addEntry(markers, "Asterisk");
215 addEntry(markers, "Diamond");
216
217 yAxesModel_ = new WStandardItemModel(0, 1, this);
218 addEntry(yAxesModel_, axisName(YAxis, 0));
219 addEntry(yAxesModel_, axisName(YAxis, 1));
220
221 WStandardItemModel *labels = new WStandardItemModel(0, 1, this);
222 addEntry(labels, "None");
223 addEntry(labels, "X");
224 addEntry(labels, "Y");
225 addEntry(labels, "X: Y");
226
227 WTable *seriesConfig = new WTable();
228 seriesConfig->setMargin(WLength::Auto, Left | Right);
229
230 ::addHeader(seriesConfig, "Name");
231 ::addHeader(seriesConfig, "Enabled");
232 ::addHeader(seriesConfig, "Type");
233 ::addHeader(seriesConfig, "Marker");
234 ::addHeader(seriesConfig, "Y axis");
235 ::addHeader(seriesConfig, "Legend");
236 ::addHeader(seriesConfig, "Shadow");
237 ::addHeader(seriesConfig, "Value labels");
238
239 seriesConfig->rowAt(0)->setStyleClass("trhead");
240
241 for (int j = 1; j < chart->model()->columnCount(); ++j) {
242 SeriesControl sc;
243
244 new WText(chart->model()->headerData(j),
245 seriesConfig->elementAt(j, 0));
246
247 sc.enabledEdit = new WCheckBox(seriesConfig->elementAt(j, 1));
249
250 sc.typeEdit = new WComboBox(seriesConfig->elementAt(j, 2));
251 sc.typeEdit->setModel(types);
254
255 sc.markerEdit = new WComboBox(seriesConfig->elementAt(j, 3));
256 sc.markerEdit->setModel(markers);
259
260 sc.axisEdit = new WComboBox(seriesConfig->elementAt(j, 4));
264
265 sc.legendEdit = new WCheckBox(seriesConfig->elementAt(j, 5));
267
268 sc.shadowEdit = new WCheckBox(seriesConfig->elementAt(j, 6));
270
271 sc.labelsEdit = new WComboBox(seriesConfig->elementAt(j, 7));
272 sc.labelsEdit->setModel(labels);
275
276 int si = seriesIndexOf(chart, j);
277
278 if (si != -1) {
280 const WDataSeries& s = chart_->series(j);
281 switch (s.type()) {
282 case PointSeries:
283 sc.typeEdit->setCurrentIndex(0); break;
284 case LineSeries:
286 (s.isStacked() ? 7 : 4) : 1); break;
287 case CurveSeries:
289 (s.isStacked() ? 8 : 5) : 2); break;
290 case BarSeries:
291 sc.typeEdit->setCurrentIndex(s.isStacked() ? 6 : 3);
292 }
293
294 sc.markerEdit->setCurrentIndex((int)s.marker());
296 sc.shadowEdit->setChecked(s.shadow() != WShadow());
297 }
298
299 seriesControls_.push_back(sc);
300
301 seriesConfig->rowAt(j)->setStyleClass("trdata");
302 }
303
304 p = list->addWidget("Series properties", seriesConfig);
305 p->expand();
307 p->resize(1160, WLength::Auto);
308 p->setMargin(20, Top | Bottom);
309
310 // ---- Axis properties ----
311
312 yScales_ = new WStandardItemModel(0, 1, this);
313 addEntry(yScales_, "Linear scale");
314 addEntry(yScales_, "Log scale");
315
316 xScales_ = new WStandardItemModel(0, 1, this);
317 addEntry(xScales_, "Categories");
318 addEntry(xScales_, "Linear scale");
319 addEntry(xScales_, "Log scale");
320 addEntry(xScales_, "Date scale");
321
322 WContainerWidget *axisConfig = new WContainerWidget();
323 axisConfig_ = new WTable(axisConfig);
325
326 ::addHeader(axisConfig_, "Axis");
327 ::addHeader(axisConfig_, "Visible");
328 ::addHeader(axisConfig_, "Scale");
329 ::addHeader(axisConfig_, "Automatic");
330 ::addHeader(axisConfig_, "Minimum");
331 ::addHeader(axisConfig_, "Maximum");
332 ::addHeader(axisConfig_, "Gridlines");
333 ::addHeader(axisConfig_, "Label angle");
334 ::addHeader(axisConfig_, "Title");
335 ::addHeader(axisConfig_, "Title orientation");
336 ::addHeader(axisConfig_, "Tick direction");
337 ::addHeader(axisConfig_, "Location");
338
339 axisConfig_->rowAt(0)->setStyleClass("trhead");
340
341 addAxis(XAxis, 0);
342 addAxis(YAxis, 0);
343 addAxis(YAxis, 1);
344
345 WPushButton *addAxisBtn =
346 new WPushButton(Wt::utf8("Add Y axis"), axisConfig);
347 addAxisBtn->clicked().connect(this, &ChartConfig::addYAxis);
348 WPushButton *clearAxesBtn =
349 new WPushButton(Wt::utf8("Clear Y axes"), axisConfig);
350 clearAxesBtn->clicked().connect(this, &ChartConfig::clearYAxes);
351
352 p = list->addWidget("Axis properties", axisConfig);
354 p->resize(1160, WLength::Auto);
355 p->setMargin(20, Top | Bottom);
356
357 /*
358 * If we do not have JavaScript, then add a button to reflect changes to
359 * the chart.
360 */
361 if (!WApplication::instance()->environment().javaScript()) {
362 WPushButton *b = new WPushButton(this);
363 b->setText("Update chart");
364 b->setInline(false); // so we can add margin to center horizontally
366 b->clicked().connect(this, &ChartConfig::update);
367 }
368}
369
371{
372 fill_ = fill;
373}
374
376{
377 bool haveLegend = false;
378 std::vector<WDataSeries *> series;
379
380 for (int i = 1; i < chart_->model()->columnCount(); ++i) {
382
383 if (sc.enabledEdit->isChecked()) {
384 WDataSeries *s = new WDataSeries(i);
385
386 switch (sc.typeEdit->currentIndex()) {
387 case 0:
389 if (sc.markerEdit->currentIndex() == 0)
391 break;
392 case 1:
394 break;
395 case 2:
397 break;
398 case 3:
399 s->setType(BarSeries);
400 break;
401 case 4:
404 break;
405 case 5:
408 break;
409 case 6:
410 s->setType(BarSeries);
411 s->setStacked(true);
412 break;
413 case 7:
416 s->setStacked(true);
417 break;
418 case 8:
421 s->setStacked(true);
422 }
423
424 //set WPainterPath to draw a pipe
427 pp.moveTo(0, -6);
428 pp.lineTo(0, 6);
429 s->setCustomMarker(pp);
430 }
431
432 s->setMarker(static_cast<MarkerType>(sc.markerEdit->currentIndex()));
433
435
436 if (sc.legendEdit->isChecked()) {
437 s->setLegendEnabled(true);
438 haveLegend = true;
439 } else
440 s->setLegendEnabled(false);
441
442 if (sc.shadowEdit->isChecked()) {
443 s->setShadow(WShadow(3, 3, WColor(0, 0, 0, 127), 3));
444 } else
445 s->setShadow(WShadow());
446
447 switch (sc.labelsEdit->currentIndex()) {
448 case 1:
450 break;
451 case 2:
453 break;
454 case 3:
457 break;
458 }
459
460 series.push_back(s);
461 }
462 }
463
464 chart_->setSeries(series);
465
466 for (std::size_t i = 0; i < axisControls_.size(); ++i) {
467 AxisControl& sc = axisControls_[i];
468 WAxis& axis = i == 0 ? chart_->axis(XAxis) : chart_->yAxis(i - 1);
469
470 axis.setVisible(sc.visibleEdit->isChecked());
471
472 if (sc.scaleEdit->count() != 1) {
473 int k = sc.scaleEdit->currentIndex();
474 if (axis.id() != XAxis)
475 k += 1;
476 else {
477 if (k == 0)
479 else
481 }
482
483 switch (k) {
484 case 1:
485 axis.setScale(LinearScale); break;
486 case 2:
487 axis.setScale(LogScale); break;
488 case 3:
489 axis.setScale(DateScale); break;
490 }
491 }
492
493 if (sc.autoEdit->isChecked())
495 else {
496 if (axis.autoLimits() & (MinimumValue | MaximumValue)) {
498 .toString(axis.minimum()));
500 .toString(axis.maximum()));
501 }
502 if (validate(sc.minimumEdit) && validate(sc.maximumEdit)) {
503 double min, max;
504 getDouble(sc.minimumEdit, min);
505 getDouble(sc.maximumEdit, max);
506
507 if (axis.scale() == LogScale)
508 if (min <= 0)
509 min = 0.0001;
510
511 if (axis.scale() == DateScale){
512 //the number of julian days until year 1986
513 WDate dMin = WDate(1900,1,1);
514 double gregDaysMin = (double)dMin.toJulianDay();
515 //the number of julian days until year 1988
516 WDate dMax = WDate(3000,1,1);
517 double gregDaysMax = (double)dMax.toJulianDay();
518
519 bool greg_year_validation =
520 (min > gregDaysMin &&
521 min < gregDaysMax &&
522 max > gregDaysMin &&
523 max < gregDaysMax);
524
525 if(!greg_year_validation){
526 min = gregDaysMin;
527 max = gregDaysMax;
528 }
529 }
530
531 axis.setRange(min, max);
532 }
533
534 }
535
536 if (validate(sc.labelAngleEdit)) {
537 double angle;
538 getDouble(sc.labelAngleEdit, angle);
539 axis.setLabelAngle(angle);
540 }
541
543
544 axis.setTitle(sc.titleEdit->text());
545
547
549
550 switch (sc.locationEdit->currentIndex()) {
551 case 0:
553 break;
554 case 1:
556 break;
557 case 2:
559 break;
560 case 3:
562 break;
563 }
564 }
565
567
569 double width, height;
570 getDouble(chartWidthEdit_, width);
571 getDouble(chartHeightEdit_, height);
573 }
574
576 case 0:
578 case 1:
580 }
581
582 chart_->setLegendEnabled(haveLegend);
583
584 if (haveLegend) {
585 LegendLocation location = LegendOutside;
586 Side side = Right;
587 AlignmentFlag alignment = AlignMiddle;
589 case 0: location = LegendOutside; break;
590 case 1: location = LegendInside; break;
591 }
592
593 switch (legendSideEdit_->currentIndex()) {
594 case 0: side = Top; break;
595 case 1: side = Right; break;
596 case 2: side = Bottom; break;
597 case 3: side = Left; break;
598 }
599
600 if (side == Left || side == Right) {
603 } else {
606 }
607
609 case 0: alignment = AlignLeft; break;
610 case 1: alignment = AlignCenter; break;
611 case 2: alignment = AlignRight; break;
612 case 3: alignment = AlignTop; break;
613 case 4: alignment = AlignMiddle; break;
614 case 5: alignment = AlignBottom; break;
615 }
616
617 chart_->setLegendLocation(location, side, alignment);
618
619 chart_->setLegendColumns((side == Top || side == Bottom ) ? 2 : 1,
620 WLength(100));
621 }
622
623 if (borderEdit_->isChecked()) {
625 } else {
626 chart_->setBorderPen(NoPen);
627 }
628}
629
631{
632 bool valid = w->validate() == WValidator::Valid;
633
634 if (!WApplication::instance()->environment().javaScript()) {
635 w->setStyleClass(valid ? "" : "Wt-invalid");
636 w->setToolTip(valid ? "" : "Invalid value");
637 }
638
639 return valid;
640}
641
643{
645 if (dynamic_cast<WLineEdit *>(w))
647}
648
650{
651 int yAxis = chart_->addYAxis(new WAxis());
652 addAxis(YAxis, yAxis);
653 addEntry(yAxesModel_, axisName(YAxis, yAxis));
654 if (yAxis == 0)
655 update();
656}
657
658void ChartConfig::addAxis(Axis ax, int yAxis)
659{
660 int j = ax == XAxis ? 1 : yAxis + 2;
661
662 const WAxis& axis = ax == XAxis ? chart_->axis(XAxis) : chart_->yAxis(yAxis);
663 AxisControl sc;
664
665 new WText(axisName(axis.id(), axis.yAxisId()), axisConfig_->elementAt(j, 0));
666
668 sc.visibleEdit->setChecked(axis.isVisible());
670
671 sc.scaleEdit = new WComboBox(axisConfig_->elementAt(j, 2));
672 if (axis.scale() == CategoryScale)
673 sc.scaleEdit->addItem("Category scale");
674 else {
675 if (axis.id() == XAxis) {
677 sc.scaleEdit->setCurrentIndex(axis.scale());
678 } else {
680 sc.scaleEdit->setCurrentIndex(axis.scale() - 1);
681 }
682 }
684
685 bool autoValues = axis.autoLimits() == (MinimumValue | MaximumValue);
686
689 .toString(axis.minimum()));
691 sc.minimumEdit->setEnabled(!autoValues);
693
696 .toString(axis.maximum()));
698 sc.maximumEdit->setEnabled(!autoValues);
700
701 sc.autoEdit = new WCheckBox(axisConfig_->elementAt(j, 3));
702 sc.autoEdit->setChecked(autoValues);
704 sc.autoEdit->checked().connect(sc.maximumEdit, &WLineEdit::disable);
705 sc.autoEdit->unChecked().connect(sc.maximumEdit, &WLineEdit::enable);
706 sc.autoEdit->checked().connect(sc.minimumEdit, &WLineEdit::disable);
707 sc.autoEdit->unChecked().connect(sc.minimumEdit, &WLineEdit::enable);
708
711
713 sc.labelAngleEdit->setText("0");
716
717 sc.titleEdit = new WLineEdit(axisConfig_->elementAt(j, 8));
718 sc.titleEdit->setText("");
720
722 sc.titleOrientationEdit->addItem("Horizontal");
723 sc.titleOrientationEdit->addItem("Vertical");
726
728 sc.tickDirectionEdit->addItem("Outwards");
729 sc.tickDirectionEdit->addItem("Inwards");
732
734 sc.locationEdit->addItem("Minimum value");
735 sc.locationEdit->addItem("Maximum value");
736 sc.locationEdit->addItem("Zero value");
737 sc.locationEdit->addItem("Both sides");
739 if (axis.location() == MaximumValue) {
741 } else if (axis.location() == ZeroValue) {
743 }
745
746 if (ax != XAxis) {
747 WPushButton *removeAxisButton =
748 new WPushButton(Wt::utf8("x"), axisConfig_->elementAt(j, 12));
749 removeAxisButton->clicked().connect(boost::bind(&ChartConfig::removeYAxis, this, &axis));
750 }
751
752 axisConfig_->rowAt(j)->setStyleClass("trdata");
753
754 axisControls_.push_back(sc);
755}
756
758{
759 int yAxis = axis->yAxisId();
760 for (std::size_t i = 0; i < chart_->series().size(); ++i) {
761 if (chart_->series()[i]->yAxis() == yAxis)
762 chart_->series()[i]->bindToYAxis(-1);
763 }
764 chart_->removeYAxis(yAxis);
765 axisConfig_->deleteRow(yAxis + 2);
766 yAxesModel_->removeRow(yAxis);
767 axisControls_.erase(axisControls_.begin() + yAxis + 1);
768 update();
769}
770
772{
773 if (chart_->yAxisCount() == 0)
774 return;
775
776 for (std::size_t i = 0; i < chart_->series().size(); ++i) {
777 chart_->series()[i]->bindToYAxis(-1);
778 }
780 while (axisConfig_->rowCount() > 2)
783 axisControls_.resize(1);
784}
std::vector< SeriesControl > seriesControls_
Controls for series.
Definition ChartConfig.h:65
Wt::WComboBox * legendAlignmentEdit_
Definition ChartConfig.h:91
ChartConfig(Wt::Chart::WCartesianChart *chart, Wt::WContainerWidget *parent)
Constructor.
Definition ChartConfig.C:77
Wt::WComboBox * legendLocationEdit_
Definition ChartConfig.h:89
Wt::WTable * axisConfig_
Definition ChartConfig.h:95
Wt::WComboBox * legendSideEdit_
Definition ChartConfig.h:90
void addAxis(Wt::Chart::Axis axis, int yAxis)
Wt::WStandardItemModel * yScales_
Definition ChartConfig.h:94
void setValueFill(Wt::Chart::FillRangeType fill)
Wt::WLineEdit * chartWidthEdit_
Definition ChartConfig.h:86
Wt::WLineEdit * titleEdit_
Definition ChartConfig.h:85
void removeYAxis(const Wt::Chart::WAxis *axis)
void addYAxis()
static bool validate(Wt::WFormWidget *w)
Wt::WStandardItemModel * xScales_
Definition ChartConfig.h:94
void connectSignals(Wt::WFormWidget *w)
Wt::WValidator * angleValidator_
Definition ChartConfig.h:96
Wt::Chart::WCartesianChart * chart_
Definition ChartConfig.h:50
std::vector< AxisControl > axisControls_
Controls for axes.
Definition ChartConfig.h:83
void clearYAxes()
Wt::Chart::FillRangeType fill_
Definition ChartConfig.h:51
Wt::WValidator * anyNumberValidator_
Definition ChartConfig.h:96
void update()
Wt::WCheckBox * borderEdit_
Definition ChartConfig.h:92
Wt::WLineEdit * chartHeightEdit_
Definition ChartConfig.h:87
Wt::WComboBox * chartOrientationEdit_
Definition ChartConfig.h:88
Wt::WStandardItemModel * yAxesModel_
Definition ChartConfig.h:94
Wt::WPanel * addWidget(const Wt::WString &text, Wt::WWidget *w)
Definition PanelList.C:17
virtual WString headerData(int column) const
WAbstractChartModel * model() const
void setTitle(const WString &title)
double maximum() const
int yAxisId() const
WFlags< AxisValue > autoLimits() const
void setAutoLimits(WFlags< AxisValue > locations)
Axis id() const
void setVisible(bool visible)
void setLocation(AxisValue value)
void setGridLinesEnabled(bool enabled)
bool isVisible() const
AxisScale scale() const
void setRange(double minimum, double maximum)
void setScale(AxisScale scale)
void setTickDirection(TickDirection direction)
double minimum() const
AxisValue location() const
void setTitleOrientation(const Orientation &orientation)
void setTitle(const WString &title)
void setLabelAngle(double angle)
void setType(ChartType type)
void setLegendEnabled(bool enabled)
void removeYAxis(int yAxisId)
void setSeries(const std::vector< WDataSeries > &series)
int addYAxis(WAxis *waxis)
void setLegendStyle(const WFont &font, const WPen &border, const WBrush &background)
WDataSeries & series(int modelColumn)
void setLegendColumns(int columns, const WLength &width)
void setOrientation(Orientation orientation)
void setBorderPen(const WPen &pen)
void setLegendLocation(LegendLocation location, Side side, AlignmentFlag alignment)
WAxis & axis(Axis axis)
void setLabelsEnabled(Axis axis, bool enabled=true)
MarkerType marker() const
void setStacked(bool stacked)
const WShadow & shadow() const
void setShadow(const WShadow &shadow)
void setType(SeriesType t)
void setFillRange(FillRangeType fillRange)
bool isStacked() const
void setCustomMarker(const WPainterPath &path)
FillRangeType fillRange() const
void setMarker(MarkerType marker)
void setLegendEnabled(bool enabled)
SeriesType type() const
void bindToYAxis(int yAxis)
bool isLegendEnabled() const
Wt::Signals::connection connect(const F &function)
virtual bool setData(const WModelIndex &index, const boost::any &value, int role=EditRole)
virtual int rowCount(const WModelIndex &parent=WModelIndex()) const=0
virtual bool insertRows(int row, int count, const WModelIndex &parent=WModelIndex())
bool removeRow(int row, const WModelIndex &parent=WModelIndex())
void setChecked(bool checked)
EventSignal & unChecked()
EventSignal & checked()
void setModel(WAbstractItemModel *model)
int currentIndex() const
void setCurrentIndex(int index)
void addItem(const WString &text)
int count() const
virtual void resize(const WLength &width, const WLength &height)
virtual void setMargin(const WLength &margin, WFlags< Side > sides=All)
virtual void addWidget(WWidget *widget)
int toJulianDay() const
virtual void setToolTip(const WString &text, TextFormat textFormat=PlainText)
EventSignal & changed()
virtual WValidator::State validate()
void setValidator(WValidator *validator)
void setEnabled(bool enabled)
EventSignal & enterPressed()
EventSignal< WMouseEvent > & clicked()
static WLength Auto
double value() const
const WString & text() const
void setMaxLength(int length)
virtual void setText(const WString &text)
double toDouble(const WString &value) const
static const WLocale & currentLocale()
virtual void resize(const WLength &width, const WLength &height)
void moveTo(const WPointF &point)
void lineTo(const WPointF &point)
void expand()
bool setText(const WString &text)
void setStyleClass(const WString &style)
int rowCount() const
virtual void deleteRow(int row)
int columnCount() const
WTableCell * elementAt(int row, int column)
WTableRow * rowAt(int row)
void setMandatory(bool how)
virtual WLength height() const
virtual void setMargin(const WLength &margin, WFlags< Side > sides=All)
virtual void setInline(bool isInline)
virtual void setStyleClass(const WString &styleClass)
virtual WLength width() const
Horizontal
Vertical
AlignmentFlag
AlignCenter
AlignMiddle
AlignBottom
AlignTop
AlignRight
AlignLeft
Struct that holds the controls for one axis.
Definition ChartConfig.h:68
Wt::WLineEdit * maximumEdit
Definition ChartConfig.h:73
Wt::WComboBox * tickDirectionEdit
Definition ChartConfig.h:78
Wt::WLineEdit * titleEdit
Definition ChartConfig.h:76
Wt::WLineEdit * labelAngleEdit
Definition ChartConfig.h:75
Wt::WComboBox * titleOrientationEdit
Definition ChartConfig.h:77
Wt::WCheckBox * gridLinesEdit
Definition ChartConfig.h:74
Wt::WLineEdit * minimumEdit
Definition ChartConfig.h:72
Wt::WComboBox * locationEdit
Definition ChartConfig.h:79
Wt::WComboBox * scaleEdit
Definition ChartConfig.h:70
Wt::WCheckBox * visibleEdit
Definition ChartConfig.h:69
Wt::WCheckBox * autoEdit
Definition ChartConfig.h:71
Struct that holds the controls for one series.
Definition ChartConfig.h:54
Wt::WComboBox * markerEdit
Definition ChartConfig.h:57
Wt::WComboBox * labelsEdit
Definition ChartConfig.h:61
Wt::WComboBox * axisEdit
Definition ChartConfig.h:58
Wt::WCheckBox * enabledEdit
Definition ChartConfig.h:55
Wt::WCheckBox * legendEdit
Definition ChartConfig.h:59
Wt::WCheckBox * shadowEdit
Definition ChartConfig.h:60
Wt::WComboBox * typeEdit
Definition ChartConfig.h:56

Generated on Fri May 17 2024 for the C++ Web Toolkit (Wt) by doxygen 1.9.8