Wt examples  3.3.8
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 
32 using namespace Wt;
33 using namespace Wt::Chart;
34 
35 namespace {
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  bool getDouble(WLineEdit *edit, double& value) {
46  try {
47  value = WLocale::currentLocale().toDouble(edit->text());
48  return true;
49  } catch (...) {
50  return false;
51  }
52  }
53 
54  int seriesIndexOf(WCartesianChart* chart, int modelColumn) {
55  for (unsigned i = 0; i < chart->series().size(); ++i)
56  if (chart->series()[i]->modelColumn() == modelColumn)
57  return i;
58 
59  return -1;
60  }
61 }
62 
64  : WContainerWidget(parent),
65  chart_(chart),
66  fill_(MinimumValueFill)
67 {
69  WBrush(WColor(0xFF, 0xFA, 0xE5)));
70 
71  PanelList *list = new PanelList(this);
72 
73  WIntValidator *sizeValidator = new WIntValidator(200, 2000, this);
74  sizeValidator->setMandatory(true);
75 
76  WDoubleValidator *anyNumberValidator = new WDoubleValidator(this);
77  anyNumberValidator->setMandatory(true);
78 
79  WDoubleValidator *angleValidator = new WDoubleValidator(-90, 90, this);
80  angleValidator->setMandatory(true);
81 
82  // ---- Chart properties ----
83 
84  WStandardItemModel *orientation = new WStandardItemModel(0, 1, this);
85  addEntry(orientation, "Vertical");
86  addEntry(orientation, "Horizontal");
87 
88  WStandardItemModel *legendLocation = new WStandardItemModel(0, 1, this);
89  addEntry(legendLocation, "Outside");
90  addEntry(legendLocation, "Inside");
91 
92  WStandardItemModel *legendSide = new WStandardItemModel(0, 1, this);
93  addEntry(legendSide, "Top");
94  addEntry(legendSide, "Right");
95  addEntry(legendSide, "Bottom");
96  addEntry(legendSide, "Left");
97 
98  WStandardItemModel *legendAlignment = new WStandardItemModel(0, 1, this);
99  addEntry(legendAlignment, "AlignLeft");
100  addEntry(legendAlignment, "AlignCenter");
101  addEntry(legendAlignment, "AlignRight");
102  addEntry(legendAlignment, "AlignTop");
103  addEntry(legendAlignment, "AlignMiddle");
104  addEntry(legendAlignment, "AlignBottom");
105 
106  WTable *chartConfig = new WTable();
107  chartConfig->setMargin(WLength::Auto, Left | Right);
108 
109  int row = 0;
110  chartConfig->elementAt(row, 0)->addWidget(new WText("Title:"));
111  titleEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
113  ++row;
114 
115  chartConfig->elementAt(row, 0)->addWidget(new WText("Width:"));
116  chartWidthEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
118  ->setText(WLocale::currentLocale().toString(chart_->width().value()));
119  chartWidthEdit_->setValidator(sizeValidator);
122  ++row;
123 
124  chartConfig->elementAt(row, 0)->addWidget(new WText("Height:"));
125  chartHeightEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
127  ->setText(WLocale::currentLocale().toString(chart_->height().value()));
128  chartHeightEdit_->setValidator(sizeValidator);
131  ++row;
132 
133  chartConfig->elementAt(row, 0)->addWidget(new WText("Orientation:"));
134  chartOrientationEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
135  chartOrientationEdit_->setModel(orientation);
138  ++row;
139 
140  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend location:"));
141  legendLocationEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
142  legendLocationEdit_->setModel(legendLocation);
145  ++row;
146 
147  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend side:"));
148  legendSideEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
149  legendSideEdit_->setModel(legendSide);
152  ++row;
153 
154  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend alignment:"));
155  legendAlignmentEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
156  legendAlignmentEdit_->setModel(legendAlignment);
159  ++row;
160 
161  chartConfig->elementAt(row, 0)->addWidget(new WText("Border:"));
162  borderEdit_ = new WCheckBox(chartConfig->elementAt(row, 1));
163  borderEdit_->setChecked(false);
165  ++row;
166 
167  for (int i = 0; i < chartConfig->rowCount(); ++i) {
168  chartConfig->elementAt(i, 0)->setStyleClass("tdhead");
169  chartConfig->elementAt(i, 1)->setStyleClass("tddata");
170  }
171 
172  WPanel *p = list->addWidget("Chart properties", chartConfig);
173  p->setMargin(WLength::Auto, Left | Right);
174  p->resize(1080, WLength::Auto);
175  p->setMargin(20, Top | Bottom);
176 
177  // ---- Series properties ----
178 
179  WStandardItemModel *types = new WStandardItemModel(0, 1, this);
180  addEntry(types, "Points");
181  addEntry(types, "Line");
182  addEntry(types, "Curve");
183  addEntry(types, "Bar");
184  addEntry(types, "Line Area");
185  addEntry(types, "Curve Area");
186  addEntry(types, "Stacked Bar");
187  addEntry(types, "Stacked Line Area");
188  addEntry(types, "Stacked Curve Area");
189 
190  WStandardItemModel *markers = new WStandardItemModel(0, 1, this);
191  addEntry(markers, "None");
192  addEntry(markers, "Square");
193  addEntry(markers, "Circle");
194  addEntry(markers, "Cross");
195  addEntry(markers, "X cross");
196  addEntry(markers, "Triangle");
197  addEntry(markers, "Pipe");
198  addEntry(markers, "Star");
199  addEntry(markers, "Inverted triangle");
200  addEntry(markers, "Asterisk");
201  addEntry(markers, "Diamond");
202 
203  WStandardItemModel *axes = new WStandardItemModel(0, 1, this);
204  addEntry(axes, "1st Y axis");
205  addEntry(axes, "2nd Y axis");
206 
207  WStandardItemModel *labels = new WStandardItemModel(0, 1, this);
208  addEntry(labels, "None");
209  addEntry(labels, "X");
210  addEntry(labels, "Y");
211  addEntry(labels, "X: Y");
212 
213  WTable *seriesConfig = new WTable();
214  seriesConfig->setMargin(WLength::Auto, Left | Right);
215 
216  ::addHeader(seriesConfig, "Name");
217  ::addHeader(seriesConfig, "Enabled");
218  ::addHeader(seriesConfig, "Type");
219  ::addHeader(seriesConfig, "Marker");
220  ::addHeader(seriesConfig, "Y axis");
221  ::addHeader(seriesConfig, "Legend");
222  ::addHeader(seriesConfig, "Shadow");
223  ::addHeader(seriesConfig, "Value labels");
224 
225  seriesConfig->rowAt(0)->setStyleClass("trhead");
226 
227  for (int j = 1; j < chart->model()->columnCount(); ++j) {
228  SeriesControl sc;
229 
230  new WText(chart->model()->headerData(j),
231  seriesConfig->elementAt(j, 0));
232 
233  sc.enabledEdit = new WCheckBox(seriesConfig->elementAt(j, 1));
235 
236  sc.typeEdit = new WComboBox(seriesConfig->elementAt(j, 2));
237  sc.typeEdit->setModel(types);
238  sc.typeEdit->setCurrentIndex(0);
240 
241  sc.markerEdit = new WComboBox(seriesConfig->elementAt(j, 3));
242  sc.markerEdit->setModel(markers);
245 
246  sc.axisEdit = new WComboBox(seriesConfig->elementAt(j, 4));
247  sc.axisEdit->setModel(axes);
248  sc.axisEdit->setCurrentIndex(0);
250 
251  sc.legendEdit = new WCheckBox(seriesConfig->elementAt(j, 5));
253 
254  sc.shadowEdit = new WCheckBox(seriesConfig->elementAt(j, 6));
256 
257  sc.labelsEdit = new WComboBox(seriesConfig->elementAt(j, 7));
258  sc.labelsEdit->setModel(labels);
261 
262  int si = seriesIndexOf(chart, j);
263 
264  if (si != -1) {
265  sc.enabledEdit->setChecked();
266  const WDataSeries& s = chart_->series(j);
267  switch (s.type()) {
268  case PointSeries:
269  sc.typeEdit->setCurrentIndex(0); break;
270  case LineSeries:
272  (s.isStacked() ? 7 : 4) : 1); break;
273  case CurveSeries:
275  (s.isStacked() ? 8 : 5) : 2); break;
276  case BarSeries:
277  sc.typeEdit->setCurrentIndex(s.isStacked() ? 6 : 3);
278  }
279 
280  sc.markerEdit->setCurrentIndex((int)s.marker());
282  sc.shadowEdit->setChecked(s.shadow() != WShadow());
283  }
284 
285  seriesControls_.push_back(sc);
286 
287  seriesConfig->rowAt(j)->setStyleClass("trdata");
288  }
289 
290  p = list->addWidget("Series properties", seriesConfig);
291  p->expand();
292  p->setMargin(WLength::Auto, Left | Right);
293  p->resize(1080, WLength::Auto);
294  p->setMargin(20, Top | Bottom);
295 
296  // ---- Axis properties ----
297 
298  WStandardItemModel *yScales = new WStandardItemModel(0, 1, this);
299  addEntry(yScales, "Linear scale");
300  addEntry(yScales, "Log scale");
301 
302  WStandardItemModel *xScales = new WStandardItemModel(0, 1, this);
303  addEntry(xScales, "Categories");
304  addEntry(xScales, "Linear scale");
305  addEntry(xScales, "Log scale");
306  addEntry(xScales, "Date scale");
307 
308  WTable *axisConfig = new WTable();
309  axisConfig->setMargin(WLength::Auto, Left | Right);
310 
311  ::addHeader(axisConfig, "Axis");
312  ::addHeader(axisConfig, "Visible");
313  ::addHeader(axisConfig, "Scale");
314  ::addHeader(axisConfig, "Automatic");
315  ::addHeader(axisConfig, "Minimum");
316  ::addHeader(axisConfig, "Maximum");
317  ::addHeader(axisConfig, "Gridlines");
318  ::addHeader(axisConfig, "Label angle");
319  ::addHeader(axisConfig, "Title");
320  ::addHeader(axisConfig, "Title orientation");
321  ::addHeader(axisConfig, "Tick direction");
322  ::addHeader(axisConfig, "Location");
323 
324  axisConfig->rowAt(0)->setStyleClass("trhead");
325 
326  for (int i = 0; i < 3; ++i) {
327  const char *axisName[] = { "X axis", "1st Y axis", "2nd Y axis" };
328  int j = i + 1;
329 
330  const WAxis& axis = chart_->axis(static_cast<Axis>(i));
331  AxisControl sc;
332 
333  new WText(WString(axisName[i], UTF8), axisConfig->elementAt(j, 0));
334 
335  sc.visibleEdit = new WCheckBox(axisConfig->elementAt(j, 1));
336  sc.visibleEdit->setChecked(axis.isVisible());
338 
339  sc.scaleEdit = new WComboBox(axisConfig->elementAt(j, 2));
340  if (axis.scale() == CategoryScale)
341  sc.scaleEdit->addItem("Category scale");
342  else {
343  if (axis.id() == XAxis) {
344  sc.scaleEdit->setModel(xScales);
345  sc.scaleEdit->setCurrentIndex(axis.scale());
346  } else {
347  sc.scaleEdit->setModel(yScales);
348  sc.scaleEdit->setCurrentIndex(axis.scale() - 1);
349  }
350  }
352 
353  bool autoValues = axis.autoLimits() == (MinimumValue | MaximumValue);
354 
355  sc.minimumEdit = new WLineEdit(axisConfig->elementAt(j, 4));
356  sc.minimumEdit->setText(WLocale::currentLocale()
357  .toString(axis.minimum()));
358  sc.minimumEdit->setValidator(anyNumberValidator);
359  sc.minimumEdit->setEnabled(!autoValues);
361 
362  sc.maximumEdit = new WLineEdit(axisConfig->elementAt(j, 5));
363  sc.maximumEdit->setText(WLocale::currentLocale()
364  .toString(axis.maximum()));
365  sc.maximumEdit->setValidator(anyNumberValidator);
366  sc.maximumEdit->setEnabled(!autoValues);
368 
369  sc.autoEdit = new WCheckBox(axisConfig->elementAt(j, 3));
370  sc.autoEdit->setChecked(autoValues);
372  sc.autoEdit->checked().connect(sc.maximumEdit, &WLineEdit::disable);
373  sc.autoEdit->unChecked().connect(sc.maximumEdit, &WLineEdit::enable);
374  sc.autoEdit->checked().connect(sc.minimumEdit, &WLineEdit::disable);
375  sc.autoEdit->unChecked().connect(sc.minimumEdit, &WLineEdit::enable);
376 
377  sc.gridLinesEdit = new WCheckBox(axisConfig->elementAt(j, 6));
379 
380  sc.labelAngleEdit = new WLineEdit(axisConfig->elementAt(j, 7));
381  sc.labelAngleEdit->setText("0");
382  sc.labelAngleEdit->setValidator(angleValidator);
384 
385  sc.titleEdit = new WLineEdit(axisConfig->elementAt(j, 8));
386  sc.titleEdit->setText("");
388 
389  sc.titleOrientationEdit = new WComboBox(axisConfig->elementAt(j, 9));
390  sc.titleOrientationEdit->addItem("Horizontal");
391  sc.titleOrientationEdit->addItem("Vertical");
394 
395  sc.tickDirectionEdit = new WComboBox(axisConfig->elementAt(j, 10));
396  sc.tickDirectionEdit->addItem("Outwards");
397  sc.tickDirectionEdit->addItem("Inwards");
400 
401  sc.locationEdit = new WComboBox(axisConfig->elementAt(j, 11));
402  sc.locationEdit->addItem("Minimum value");
403  sc.locationEdit->addItem("Maximum value");
404  sc.locationEdit->addItem("Zero value");
405  sc.locationEdit->addItem("Both sides");
407  if (axis.location() == ZeroValue) {
409  }
411 
412  axisConfig->rowAt(j)->setStyleClass("trdata");
413 
414  axisControls_.push_back(sc);
415  }
416 
417  p = list->addWidget("Axis properties", axisConfig);
418  p->setMargin(WLength::Auto, Left | Right);
419  p->resize(1080, WLength::Auto);
420  p->setMargin(20, Top | Bottom);
421 
422  /*
423  * If we do not have JavaScript, then add a button to reflect changes to
424  * the chart.
425  */
426  if (!WApplication::instance()->environment().javaScript()) {
427  WPushButton *b = new WPushButton(this);
428  b->setText("Update chart");
429  b->setInline(false); // so we can add margin to center horizontally
430  b->setMargin(WLength::Auto, Left | Right);
431  b->clicked().connect(this, &ChartConfig::update);
432  }
433 }
434 
436 {
437  fill_ = fill;
438 }
439 
441 {
442  bool haveLegend = false;
443  std::vector<WDataSeries *> series;
444 
445  for (int i = 1; i < chart_->model()->columnCount(); ++i) {
446  SeriesControl& sc = seriesControls_[i-1];
447 
448  if (sc.enabledEdit->isChecked()) {
449  WDataSeries *s = new WDataSeries(i);
450 
451  switch (sc.typeEdit->currentIndex()) {
452  case 0:
453  s->setType(PointSeries);
454  if (sc.markerEdit->currentIndex() == 0)
456  break;
457  case 1:
458  s->setType(LineSeries);
459  break;
460  case 2:
461  s->setType(CurveSeries);
462  break;
463  case 3:
464  s->setType(BarSeries);
465  break;
466  case 4:
467  s->setType(LineSeries);
468  s->setFillRange(fill_);
469  break;
470  case 5:
471  s->setType(CurveSeries);
472  s->setFillRange(fill_);
473  break;
474  case 6:
475  s->setType(BarSeries);
476  s->setStacked(true);
477  break;
478  case 7:
479  s->setType(LineSeries);
480  s->setFillRange(fill_);
481  s->setStacked(true);
482  break;
483  case 8:
484  s->setType(CurveSeries);
485  s->setFillRange(fill_);
486  s->setStacked(true);
487  }
488 
489  //set WPainterPath to draw a pipe
490  if(sc.markerEdit->currentIndex() == CustomMarker){
491  WPainterPath pp = WPainterPath();
492  pp.moveTo(0, -6);
493  pp.lineTo(0, 6);
494  s->setCustomMarker(pp);
495  }
496 
497  s->setMarker(static_cast<MarkerType>(sc.markerEdit->currentIndex()));
498 
499  if (sc.axisEdit->currentIndex() == 1) {
500  s->bindToAxis(Y2Axis);
501  }
502 
503  if (sc.legendEdit->isChecked()) {
504  s->setLegendEnabled(true);
505  haveLegend = true;
506  } else
507  s->setLegendEnabled(false);
508 
509  if (sc.shadowEdit->isChecked()) {
510  s->setShadow(WShadow(3, 3, WColor(0, 0, 0, 127), 3));
511  } else
512  s->setShadow(WShadow());
513 
514  switch (sc.labelsEdit->currentIndex()) {
515  case 1:
517  break;
518  case 2:
520  break;
521  case 3:
524  break;
525  }
526 
527  series.push_back(s);
528  }
529  }
530 
531  chart_->setSeries(series);
532 
533  for (int i = 0; i < 3; ++i) {
534  AxisControl& sc = axisControls_[i];
535  WAxis& axis = chart_->axis(static_cast<Axis>(i));
536 
537  axis.setVisible(sc.visibleEdit->isChecked());
538 
539  if (sc.scaleEdit->count() != 1) {
540  int k = sc.scaleEdit->currentIndex();
541  if (axis.id() != XAxis)
542  k += 1;
543  else {
544  if (k == 0)
546  else
548  }
549 
550  switch (k) {
551  case 1:
552  axis.setScale(LinearScale); break;
553  case 2:
554  axis.setScale(LogScale); break;
555  case 3:
556  axis.setScale(DateScale); break;
557  }
558  }
559 
560  if (sc.autoEdit->isChecked())
562  else {
563  if (axis.autoLimits() & (MinimumValue | MaximumValue)) {
564  sc.minimumEdit->setText(WLocale::currentLocale()
565  .toString(axis.minimum()));
566  sc.maximumEdit->setText(WLocale::currentLocale()
567  .toString(axis.maximum()));
568  }
569  if (validate(sc.minimumEdit) && validate(sc.maximumEdit)) {
570  double min, max;
571  getDouble(sc.minimumEdit, min);
572  getDouble(sc.maximumEdit, max);
573 
574  if (axis.scale() == LogScale)
575  if (min <= 0)
576  min = 0.0001;
577 
578  if (axis.scale() == DateScale){
579  //the number of julian days until year 1986
580  WDate dMin = WDate(1900,1,1);
581  double gregDaysMin = (double)dMin.toJulianDay();
582  //the number of julian days until year 1988
583  WDate dMax = WDate(3000,1,1);
584  double gregDaysMax = (double)dMax.toJulianDay();
585 
586  bool greg_year_validation =
587  (min > gregDaysMin &&
588  min < gregDaysMax &&
589  max > gregDaysMin &&
590  max < gregDaysMax);
591 
592  if(!greg_year_validation){
593  min = gregDaysMin;
594  max = gregDaysMax;
595  }
596  }
597 
598  axis.setRange(min, max);
599  }
600 
601  }
602 
603  if (validate(sc.labelAngleEdit)) {
604  double angle;
605  getDouble(sc.labelAngleEdit, angle);
606  axis.setLabelAngle(angle);
607  }
608 
610 
611  axis.setTitle(sc.titleEdit->text());
612 
614 
616 
617  switch (sc.locationEdit->currentIndex()) {
618  case 0:
620  break;
621  case 1:
623  break;
624  case 2:
625  axis.setLocation(ZeroValue);
626  break;
627  case 3:
628  axis.setLocation(BothSides);
629  break;
630  }
631  }
632 
634 
636  double width, height;
637  getDouble(chartWidthEdit_, width);
638  getDouble(chartHeightEdit_, height);
639  chart_->resize(width, height);
640  }
641 
642  switch (chartOrientationEdit_->currentIndex()) {
643  case 0:
644  chart_->setOrientation(Vertical); break;
645  case 1:
647  }
648 
649  chart_->setLegendEnabled(haveLegend);
650 
651  if (haveLegend) {
652  LegendLocation location = LegendOutside;
653  Side side = Right;
654  AlignmentFlag alignment = AlignMiddle;
655  switch (legendLocationEdit_->currentIndex()) {
656  case 0: location = LegendOutside; break;
657  case 1: location = LegendInside; break;
658  }
659 
660  switch (legendSideEdit_->currentIndex()) {
661  case 0: side = Top; break;
662  case 1: side = Right; break;
663  case 2: side = Bottom; break;
664  case 3: side = Left; break;
665  }
666 
667  if (side == Left || side == Right) {
670  } else {
673  }
674 
675  switch (legendAlignmentEdit_->currentIndex()) {
676  case 0: alignment = AlignLeft; break;
677  case 1: alignment = AlignCenter; break;
678  case 2: alignment = AlignRight; break;
679  case 3: alignment = AlignTop; break;
680  case 4: alignment = AlignMiddle; break;
681  case 5: alignment = AlignBottom; break;
682  }
683 
684  chart_->setLegendLocation(location, side, alignment);
685 
686  chart_->setLegendColumns((side == Top || side == Bottom ) ? 2 : 1,
687  WLength(100));
688  }
689 
690  if (borderEdit_->isChecked()) {
692  } else {
693  chart_->setBorderPen(NoPen);
694  }
695 }
696 
698 {
699  bool valid = w->validate() == WValidator::Valid;
700 
701  if (!WApplication::instance()->environment().javaScript()) {
702  w->setStyleClass(valid ? "" : "Wt-invalid");
703  w->setToolTip(valid ? "" : "Invalid value");
704  }
705 
706  return valid;
707 }
708 
710 {
711  w->changed().connect(this, &ChartConfig::update);
712  if (dynamic_cast<WLineEdit *>(w))
714 }
virtual WString headerData(int column) const
void setVisible(bool visible)
void expand()
CategoryScale
Wt::WCheckBox * borderEdit_
Definition: ChartConfig.h:89
int rowCount() const
void setType(SeriesType t)
MaximumValue
void lineTo(const WPointF &point)
MarkerType marker() const
Vertical
virtual void setMargin(const WLength &margin, WFlags< Side > sides=All)
ChartConfig(Wt::Chart::WCartesianChart *chart, Wt::WContainerWidget *parent)
Constructor.
Definition: ChartConfig.C:63
virtual void setText(const WString &text)
Wt::WComboBox * axisEdit
Definition: ChartConfig.h:55
LinearScale
AlignMiddle
bool isLegendEnabled() const
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:48
LegendInside
EventSignal< WMouseEvent > & clicked()
black
Wt::WComboBox * scaleEdit
Definition: ChartConfig.h:67
Wt::WLineEdit * titleEdit_
Definition: ChartConfig.h:82
void setGridLinesEnabled(bool enabled)
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:47
void addItem(const WString &text)
XAxis
void setTickDirection(TickDirection direction)
BothSides
void connectSignals(Wt::WFormWidget *w)
Definition: ChartConfig.C:709
void setValidator(WValidator *validator)
double minimum() const
void setLocation(AxisValue value)
Y2Axis
const WString & text() const
MinimumValue
AxisScale scale() const
int count() const
WAxis & axis(Axis axis)
virtual bool insertRows(int row, int count, const WModelIndex &parent=WModelIndex())
void setShadow(const WShadow &shadow)
LegendOutside
virtual WLength width() const
void setLegendStyle(const WFont &font, const WPen &border, const WBrush &background)
int currentIndex() const
Wt::WCheckBox * enabledEdit
Definition: ChartConfig.h:52
Wt::WComboBox * locationEdit
Definition: ChartConfig.h:76
virtual void setInline(bool isInline)
void setType(ChartType type)
Struct that holds the controls for one series.
Definition: ChartConfig.h:51
Wt::WLineEdit * titleEdit
Definition: ChartConfig.h:73
AxisValue location() const
virtual void resize(const WLength &width, const WLength &height)
void setMarker(MarkerType marker)
AlignmentFlag
void setLegendLocation(LegendLocation location, Side side, AlignmentFlag alignment)
ZeroValue
AlignLeft
Wt::WComboBox * typeEdit
Definition: ChartConfig.h:53
int modelColumn() const
int toJulianDay() const
LogScale
virtual int rowCount(const WModelIndex &parent=WModelIndex()) const =0
AlignCenter
bool setText(const WString &text)
NoFill
Wt::Signals::connection connect(const F &function)
void setSeries(const std::vector< WDataSeries > &series)
Wt::WCheckBox * visibleEdit
Definition: ChartConfig.h:66
bool isStacked() const
void setLegendEnabled(bool enabled)
Wt::WComboBox * markerEdit
Definition: ChartConfig.h:54
LineSeries
DateScale
virtual void setToolTip(const WString &text, TextFormat textFormat=PlainText)
Wt::WLineEdit * chartWidthEdit_
Definition: ChartConfig.h:83
virtual void resize(const WLength &width, const WLength &height)
Struct that holds the controls for one axis.
Definition: ChartConfig.h:65
WTableCell * elementAt(int row, int column)
virtual void setStyleClass(const WString &styleClass)
Wt::WPanel * addWidget(const Wt::WString &text, Wt::WWidget *w)
Definition: PanelList.C:17
Wt::WComboBox * chartOrientationEdit_
Definition: ChartConfig.h:85
Wt::WComboBox * legendLocationEdit_
Definition: ChartConfig.h:86
std::vector< SeriesControl > seriesControls_
Controls for series.
Definition: ChartConfig.h:62
void setCurrentIndex(int index)
virtual void setMargin(const WLength &margin, WFlags< Side > sides=All)
Axis id() const
void setScale(AxisScale scale)
void setStyleClass(const WString &style)
virtual WLength height() const
WDataSeries & series(int modelColumn)
PointSeries
WFlags< AxisValue > autoLimits() const
CustomMarker
Wt::WLineEdit * minimumEdit
Definition: ChartConfig.h:69
void setMaxLength(int length)
void setTitleOrientation(const Orientation &orientation)
AlignTop
FillRangeType fillRange() const
void setCustomMarker(const WPainterPath &path)
void setEnabled(bool enabled)
void setAutoLimits(WFlags< AxisValue > locations)
AlignRight
Wt::WComboBox * legendSideEdit_
Definition: ChartConfig.h:87
std::vector< AxisControl > axisControls_
Controls for axes.
Definition: ChartConfig.h:80
virtual int columnCount() const =0
void update()
Definition: ChartConfig.C:440
CategoryChart
Wt::WCheckBox * shadowEdit
Definition: ChartConfig.h:57
Wt::WComboBox * labelsEdit
Definition: ChartConfig.h:58
void setLabelsEnabled(Axis axis, bool enabled=true)
bool isVisible() const
void setValueFill(Wt::Chart::FillRangeType fill)
Definition: ChartConfig.C:435
Wt::WComboBox * tickDirectionEdit
Definition: ChartConfig.h:75
Wt::WLineEdit * labelAngleEdit
Definition: ChartConfig.h:72
void setModel(WAbstractItemModel *model)
double value() const
void moveTo(const WPointF &point)
EventSignal & unChecked()
YAxis
void setStacked(bool stacked)
void setOrientation(Orientation orientation)
void setMandatory(bool how)
double maximum() const
void setBorderPen(const WPen &pen)
Wt::WCheckBox * legendEdit
Definition: ChartConfig.h:56
CurveSeries
void setRange(double minimum, double maximum)
EventSignal & enterPressed()
ScatterPlot
EventSignal & changed()
virtual void addWidget(WWidget *widget)
Wt::WCheckBox * gridLinesEdit
Definition: ChartConfig.h:71
void setLegendEnabled(bool enabled)
static const WLocale & currentLocale()
Wt::WComboBox * titleOrientationEdit
Definition: ChartConfig.h:74
void bindToAxis(Axis axis)
Wt::WComboBox * legendAlignmentEdit_
Definition: ChartConfig.h:88
int columnCount() const
Wt::WCheckBox * autoEdit
Definition: ChartConfig.h:68
void setChecked(bool checked)
Wt::WLineEdit * maximumEdit
Definition: ChartConfig.h:70
AlignBottom
virtual bool setData(const WModelIndex &index, const boost::any &value, int role=EditRole)
BarSeries
void setTitle(const WString &title)
WTableRow * rowAt(int row)
void setLabelAngle(double angle)
void setFillRange(FillRangeType fillRange)
Horizontal
void setLegendColumns(int columns, const WLength &width)
WAbstractChartModel * model() const
static bool validate(Wt::WFormWidget *w)
Definition: ChartConfig.C:697
Wt::WLineEdit * chartHeightEdit_
Definition: ChartConfig.h:84
double toDouble(const WString &value) const
EventSignal & checked()
void setTitle(const WString &title)
const WShadow & shadow() const
virtual WValidator::State validate()
SeriesType type() const

Generated on Mon Sep 4 2017 for the C++ Web Toolkit (Wt) by doxygen 1.8.11