Wt examples  3.3.5
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);
153  ++row;
154 
155  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend alignment:"));
156  legendAlignmentEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
157  legendAlignmentEdit_->setModel(legendAlignment);
161  ++row;
162 
163  chartConfig->elementAt(row, 0)->addWidget(new WText("Border:"));
164  borderEdit_ = new WCheckBox(chartConfig->elementAt(row, 1));
165  borderEdit_->setChecked(false);
167  ++row;
168 
169  for (int i = 0; i < chartConfig->rowCount(); ++i) {
170  chartConfig->elementAt(i, 0)->setStyleClass("tdhead");
171  chartConfig->elementAt(i, 1)->setStyleClass("tddata");
172  }
173 
174  WPanel *p = list->addWidget("Chart properties", chartConfig);
175  p->setMargin(WLength::Auto, Left | Right);
176  p->resize(1080, WLength::Auto);
177  p->setMargin(20, Top | Bottom);
178 
179  // ---- Series properties ----
180 
181  WStandardItemModel *types = new WStandardItemModel(0, 1, this);
182  addEntry(types, "Points");
183  addEntry(types, "Line");
184  addEntry(types, "Curve");
185  addEntry(types, "Bar");
186  addEntry(types, "Line Area");
187  addEntry(types, "Curve Area");
188  addEntry(types, "Stacked Bar");
189  addEntry(types, "Stacked Line Area");
190  addEntry(types, "Stacked Curve Area");
191 
192  WStandardItemModel *markers = new WStandardItemModel(0, 1, this);
193  addEntry(markers, "None");
194  addEntry(markers, "Square");
195  addEntry(markers, "Circle");
196  addEntry(markers, "Cross");
197  addEntry(markers, "X cross");
198  addEntry(markers, "Triangle");
199  addEntry(markers, "Diamond");
200 
201  WStandardItemModel *axes = new WStandardItemModel(0, 1, this);
202  addEntry(axes, "1st Y axis");
203  addEntry(axes, "2nd Y axis");
204 
205  WStandardItemModel *labels = new WStandardItemModel(0, 1, this);
206  addEntry(labels, "None");
207  addEntry(labels, "X");
208  addEntry(labels, "Y");
209  addEntry(labels, "X: Y");
210 
211  WTable *seriesConfig = new WTable();
212  seriesConfig->setMargin(WLength::Auto, Left | Right);
213 
214  ::addHeader(seriesConfig, "Name");
215  ::addHeader(seriesConfig, "Enabled");
216  ::addHeader(seriesConfig, "Type");
217  ::addHeader(seriesConfig, "Marker");
218  ::addHeader(seriesConfig, "Y axis");
219  ::addHeader(seriesConfig, "Legend");
220  ::addHeader(seriesConfig, "Shadow");
221  ::addHeader(seriesConfig, "Value labels");
222 
223  seriesConfig->rowAt(0)->setStyleClass("trhead");
224 
225  for (int j = 1; j < chart->model()->columnCount(); ++j) {
226  SeriesControl sc;
227 
228  new WText(asString(chart->model()->headerData(j)),
229  seriesConfig->elementAt(j, 0));
230 
231  sc.enabledEdit = new WCheckBox(seriesConfig->elementAt(j, 1));
233 
234  sc.typeEdit = new WComboBox(seriesConfig->elementAt(j, 2));
235  sc.typeEdit->setModel(types);
236  sc.typeEdit->setCurrentIndex(0);
238 
239  sc.markerEdit = new WComboBox(seriesConfig->elementAt(j, 3));
240  sc.markerEdit->setModel(markers);
243 
244  sc.axisEdit = new WComboBox(seriesConfig->elementAt(j, 4));
245  sc.axisEdit->setModel(axes);
246  sc.axisEdit->setCurrentIndex(0);
248 
249  sc.legendEdit = new WCheckBox(seriesConfig->elementAt(j, 5));
251 
252  sc.shadowEdit = new WCheckBox(seriesConfig->elementAt(j, 6));
254 
255  sc.labelsEdit = new WComboBox(seriesConfig->elementAt(j, 7));
256  sc.labelsEdit->setModel(labels);
259 
260  int si = seriesIndexOf(chart, j);
261 
262  if (si != -1) {
263  sc.enabledEdit->setChecked();
264  const WDataSeries& s = chart_->series(j);
265  switch (s.type()) {
266  case PointSeries:
267  sc.typeEdit->setCurrentIndex(0); break;
268  case LineSeries:
269  sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
270  (s.isStacked() ? 7 : 4) : 1); break;
271  case CurveSeries:
272  sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
273  (s.isStacked() ? 8 : 5) : 2); break;
274  case BarSeries:
275  sc.typeEdit->setCurrentIndex(s.isStacked() ? 6 : 3);
276  }
277 
278  sc.markerEdit->setCurrentIndex((int)s.marker());
280  sc.shadowEdit->setChecked(s.shadow() != WShadow());
281  }
282 
283  seriesControls_.push_back(sc);
284 
285  seriesConfig->rowAt(j)->setStyleClass("trdata");
286  }
287 
288  p = list->addWidget("Series properties", seriesConfig);
289  p->expand();
290  p->setMargin(WLength::Auto, Left | Right);
291  p->resize(1080, WLength::Auto);
292  p->setMargin(20, Top | Bottom);
293 
294  // ---- Axis properties ----
295 
296  WStandardItemModel *yScales = new WStandardItemModel(0, 1, this);
297  addEntry(yScales, "Linear scale");
298  addEntry(yScales, "Log scale");
299 
300  WStandardItemModel *xScales = new WStandardItemModel(0, 1, this);
301  addEntry(xScales, "Categories");
302  addEntry(xScales, "Linear scale");
303  addEntry(xScales, "Log scale");
304  addEntry(xScales, "Date scale");
305 
306  WTable *axisConfig = new WTable();
307  axisConfig->setMargin(WLength::Auto, Left | Right);
308 
309  ::addHeader(axisConfig, "Axis");
310  ::addHeader(axisConfig, "Visible");
311  ::addHeader(axisConfig, "Scale");
312  ::addHeader(axisConfig, "Automatic");
313  ::addHeader(axisConfig, "Minimum");
314  ::addHeader(axisConfig, "Maximum");
315  ::addHeader(axisConfig, "Gridlines");
316  ::addHeader(axisConfig, "Label angle");
317  ::addHeader(axisConfig, "Title");
318  ::addHeader(axisConfig, "Title orientation");
319  ::addHeader(axisConfig, "Tick direction");
320  ::addHeader(axisConfig, "Location");
321 
322  axisConfig->rowAt(0)->setStyleClass("trhead");
323 
324  for (int i = 0; i < 3; ++i) {
325  const char *axisName[] = { "X axis", "1st Y axis", "2nd Y axis" };
326  int j = i + 1;
327 
328  const WAxis& axis = chart_->axis(static_cast<Axis>(i));
329  AxisControl sc;
330 
331  new WText(WString(axisName[i], UTF8), axisConfig->elementAt(j, 0));
332 
333  sc.visibleEdit = new WCheckBox(axisConfig->elementAt(j, 1));
334  sc.visibleEdit->setChecked(axis.isVisible());
336 
337  sc.scaleEdit = new WComboBox(axisConfig->elementAt(j, 2));
338  if (axis.scale() == CategoryScale)
339  sc.scaleEdit->addItem("Category scale");
340  else {
341  if (axis.id() == XAxis) {
342  sc.scaleEdit->setModel(xScales);
343  sc.scaleEdit->setCurrentIndex(axis.scale());
344  } else {
345  sc.scaleEdit->setModel(yScales);
346  sc.scaleEdit->setCurrentIndex(axis.scale() - 1);
347  }
348  }
350 
351  bool autoValues = axis.autoLimits() == (MinimumValue | MaximumValue);
352 
353  sc.minimumEdit = new WLineEdit(axisConfig->elementAt(j, 4));
354  sc.minimumEdit->setText(WLocale::currentLocale()
355  .toString(axis.minimum()));
356  sc.minimumEdit->setValidator(anyNumberValidator);
357  sc.minimumEdit->setEnabled(!autoValues);
359 
360  sc.maximumEdit = new WLineEdit(axisConfig->elementAt(j, 5));
361  sc.maximumEdit->setText(WLocale::currentLocale()
362  .toString(axis.maximum()));
363  sc.maximumEdit->setValidator(anyNumberValidator);
364  sc.maximumEdit->setEnabled(!autoValues);
366 
367  sc.autoEdit = new WCheckBox(axisConfig->elementAt(j, 3));
368  sc.autoEdit->setChecked(autoValues);
370  sc.autoEdit->checked().connect(sc.maximumEdit, &WLineEdit::disable);
371  sc.autoEdit->unChecked().connect(sc.maximumEdit, &WLineEdit::enable);
372  sc.autoEdit->checked().connect(sc.minimumEdit, &WLineEdit::disable);
373  sc.autoEdit->unChecked().connect(sc.minimumEdit, &WLineEdit::enable);
374 
375  sc.gridLinesEdit = new WCheckBox(axisConfig->elementAt(j, 6));
377 
378  sc.labelAngleEdit = new WLineEdit(axisConfig->elementAt(j, 7));
379  sc.labelAngleEdit->setText("0");
380  sc.labelAngleEdit->setValidator(angleValidator);
382 
383  sc.titleEdit = new WLineEdit(axisConfig->elementAt(j, 8));
384  sc.titleEdit->setText("");
386 
387  sc.titleOrientationEdit = new WComboBox(axisConfig->elementAt(j, 9));
388  sc.titleOrientationEdit->addItem("Horizontal");
389  sc.titleOrientationEdit->addItem("Vertical");
392 
393  sc.tickDirectionEdit = new WComboBox(axisConfig->elementAt(j, 10));
394  sc.tickDirectionEdit->addItem("Outwards");
395  sc.tickDirectionEdit->addItem("Inwards");
398 
399  sc.locationEdit = new WComboBox(axisConfig->elementAt(j, 11));
400  sc.locationEdit->addItem("Minimum value");
401  sc.locationEdit->addItem("Maximum value");
402  sc.locationEdit->addItem("Zero value");
403  sc.locationEdit->addItem("Both sides");
405  if (axis.location() == ZeroValue) {
407  }
409 
410  axisConfig->rowAt(j)->setStyleClass("trdata");
411 
412  axisControls_.push_back(sc);
413  }
414 
415  p = list->addWidget("Axis properties", axisConfig);
416  p->setMargin(WLength::Auto, Left | Right);
417  p->resize(1080, WLength::Auto);
418  p->setMargin(20, Top | Bottom);
419 
420  /*
421  * If we do not have JavaScript, then add a button to reflect changes to
422  * the chart.
423  */
424  if (!WApplication::instance()->environment().javaScript()) {
425  WPushButton *b = new WPushButton(this);
426  b->setText("Update chart");
427  b->setInline(false); // so we can add margin to center horizontally
428  b->setMargin(WLength::Auto, Left | Right);
429  b->clicked().connect(this, &ChartConfig::update);
430  }
431 }
432 
434 {
435  fill_ = fill;
436 }
437 
439 {
440  bool haveLegend = false;
441  std::vector<WDataSeries> series;
442 
443  for (int i = 1; i < chart_->model()->columnCount(); ++i) {
444  SeriesControl& sc = seriesControls_[i-1];
445 
446  if (sc.enabledEdit->isChecked()) {
447  WDataSeries s(i);
448 
449  switch (sc.typeEdit->currentIndex()) {
450  case 0:
451  s.setType(PointSeries);
452  if (sc.markerEdit->currentIndex() == 0)
454  break;
455  case 1:
456  s.setType(LineSeries);
458  break;
459  case 2:
460  s.setType(CurveSeries);
462  break;
463  case 3:
464  s.setType(BarSeries);
466  break;
467  case 4:
468  s.setType(LineSeries);
469  s.setFillRange(fill_);
471  break;
472  case 5:
473  s.setType(CurveSeries);
474  s.setFillRange(fill_);
476  break;
477  case 6:
478  s.setType(BarSeries);
479  s.setStacked(true);
481  break;
482  case 7:
483  s.setType(LineSeries);
484  s.setFillRange(fill_);
485  s.setStacked(true);
487  break;
488  case 8:
489  s.setType(CurveSeries);
490  s.setFillRange(fill_);
491  s.setStacked(true);
493  }
494 
495  //set WPainterPath to draw a diamond
496  if(sc.markerEdit->currentIndex() == CustomMarker){
497  WPainterPath pp = WPainterPath();
498  pp.moveTo(-6, 0);
499  pp.lineTo(0, 6);
500  pp.lineTo(6, 0);
501  pp.lineTo(0, -6);
502  pp.lineTo(-6, 0);
503  s.setCustomMarker(pp);
504  }
505 
506  s.setMarker(static_cast<MarkerType>(sc.markerEdit->currentIndex()));
507 
508  if (sc.axisEdit->currentIndex() == 1) {
509  s.bindToAxis(Y2Axis);
510  }
511 
512  if (sc.legendEdit->isChecked()) {
513  s.setLegendEnabled(true);
514  haveLegend = true;
515  } else
516  s.setLegendEnabled(false);
517 
518  if (sc.shadowEdit->isChecked()) {
519  s.setShadow(WShadow(3, 3, WColor(0, 0, 0, 127), 3));
520  } else
521  s.setShadow(WShadow());
522 
523  switch (sc.labelsEdit->currentIndex()) {
524  case 1:
525  s.setLabelsEnabled(XAxis);
526  break;
527  case 2:
528  s.setLabelsEnabled(YAxis);
529  break;
530  case 3:
531  s.setLabelsEnabled(XAxis);
532  s.setLabelsEnabled(YAxis);
533  break;
534  }
535 
536  series.push_back(s);
537  }
538  }
539 
540  chart_->setSeries(series);
541 
542  for (int i = 0; i < 3; ++i) {
543  AxisControl& sc = axisControls_[i];
544  WAxis& axis = chart_->axis(static_cast<Axis>(i));
545 
546  axis.setVisible(sc.visibleEdit->isChecked());
547 
548  if (sc.scaleEdit->count() != 1) {
549  int k = sc.scaleEdit->currentIndex();
550  if (axis.id() != XAxis)
551  k += 1;
552  else {
553  if (k == 0)
554  chart_->setType(CategoryChart);
555  else
556  chart_->setType(ScatterPlot);
557  }
558 
559  switch (k) {
560  case 1:
561  axis.setScale(LinearScale); break;
562  case 2:
563  axis.setScale(LogScale); break;
564  case 3:
565  axis.setScale(DateScale); break;
566  }
567  }
568 
569  if (sc.autoEdit->isChecked())
570  axis.setAutoLimits(MinimumValue | MaximumValue);
571  else {
572  if (axis.autoLimits() & (MinimumValue | MaximumValue)) {
573  sc.minimumEdit->setText(WLocale::currentLocale()
574  .toString(axis.minimum()));
575  sc.maximumEdit->setText(WLocale::currentLocale()
576  .toString(axis.maximum()));
577  }
578  if (validate(sc.minimumEdit) && validate(sc.maximumEdit)) {
579  double min, max;
580  getDouble(sc.minimumEdit, min);
581  getDouble(sc.maximumEdit, max);
582 
583  if (axis.scale() == LogScale)
584  if (min <= 0)
585  min = 0.0001;
586 
587  if (axis.scale() == DateScale){
588  //the number of julian days until year 1986
589  WDate dMin = WDate(1900,1,1);
590  double gregDaysMin = (double)dMin.toJulianDay();
591  //the number of julian days until year 1988
592  WDate dMax = WDate(3000,1,1);
593  double gregDaysMax = (double)dMax.toJulianDay();
594 
595  bool greg_year_validation =
596  (min > gregDaysMin &&
597  min < gregDaysMax &&
598  max > gregDaysMin &&
599  max < gregDaysMax);
600 
601  if(!greg_year_validation){
602  min = gregDaysMin;
603  max = gregDaysMax;
604  }
605  }
606 
607  axis.setRange(min, max);
608  }
609 
610  }
611 
612  if (validate(sc.labelAngleEdit)) {
613  double angle;
614  getDouble(sc.labelAngleEdit, angle);
615  axis.setLabelAngle(angle);
616  }
617 
619 
620  axis.setTitle(sc.titleEdit->text());
621 
622  axis.setTitleOrientation(sc.titleOrientationEdit->currentIndex() == 0 ? Horizontal : Vertical);
623 
624  axis.setTickDirection(sc.tickDirectionEdit->currentIndex() == 0 ? Outwards : Inwards);
625 
626  switch (sc.locationEdit->currentIndex()) {
627  case 0:
628  axis.setLocation(MinimumValue);
629  break;
630  case 1:
631  axis.setLocation(MaximumValue);
632  break;
633  case 2:
634  axis.setLocation(ZeroValue);
635  break;
636  case 3:
637  axis.setLocation(BothSides);
638  break;
639  }
640  }
641 
643 
645  double width, height;
646  getDouble(chartWidthEdit_, width);
647  getDouble(chartHeightEdit_, height);
648  chart_->resize(width, height);
649  }
650 
651  switch (chartOrientationEdit_->currentIndex()) {
652  case 0:
653  chart_->setOrientation(Vertical); break;
654  case 1:
655  chart_->setOrientation(Horizontal); break;
656  }
657 
658  chart_->setLegendEnabled(haveLegend);
659 
660  if (haveLegend) {
661  LegendLocation location = LegendOutside;
662  Side side = Right;
663  AlignmentFlag alignment = AlignMiddle;
664  switch (legendLocationEdit_->currentIndex()) {
665  case 0: location = LegendOutside; break;
666  case 1: location = LegendInside; break;
667  }
668 
669  switch (legendSideEdit_->currentIndex()) {
670  case 0: side = Top; break;
671  case 1: side = Right; break;
672  case 2: side = Bottom; break;
673  case 3: side = Left; break;
674  }
675 
676  if (side == Left || side == Right) {
679  } else {
682  }
683 
684  switch (legendAlignmentEdit_->currentIndex()) {
685  case 0: alignment = AlignLeft; break;
686  case 1: alignment = AlignCenter; break;
687  case 2: alignment = AlignRight; break;
688  case 3: alignment = AlignTop; break;
689  case 4: alignment = AlignMiddle; break;
690  case 5: alignment = AlignBottom; break;
691  }
692 
693  chart_->setLegendLocation(location, side, alignment);
694 
695  chart_->setLegendColumns((side == Top || side == Bottom ) ? 2 : 1,
696  WLength(100));
697  }
698 
699  if (borderEdit_->isChecked()) {
701  } else {
702  chart_->setBorderPen(NoPen);
703  }
704 }
705 
707 {
708  bool valid = w->validate() == WValidator::Valid;
709 
710  if (!WApplication::instance()->environment().javaScript()) {
711  w->setStyleClass(valid ? "" : "Wt-invalid");
712  w->setToolTip(valid ? "" : "Invalid value");
713  }
714 
715  return valid;
716 }
717 
719 {
720  w->changed().connect(this, &ChartConfig::update);
721  if (dynamic_cast<WLineEdit *>(w))
723 }
void setVisible(bool visible)
void expand()
Wt::WCheckBox * borderEdit_
Definition: ChartConfig.h:89
int rowCount() const
virtual boost::any headerData(int section, Orientation orientation=Horizontal, int role=DisplayRole) const
void setType(SeriesType t)
void lineTo(const WPointF &point)
MarkerType marker() const
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
WString asString(const boost::any &v, const WString &formatString=WString())
bool isLegendEnabled() const
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:48
EventSignal< WMouseEvent > & clicked()
Wt::WComboBox * scaleEdit
Definition: ChartConfig.h:67
Wt::WLineEdit * titleEdit_
Definition: ChartConfig.h:82
FillRangeType
void setGridLinesEnabled(bool enabled)
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:47
void addItem(const WString &text)
void setTickDirection(TickDirection direction)
void connectSignals(Wt::WFormWidget *w)
Definition: ChartConfig.C:718
void setValidator(WValidator *validator)
double minimum() const
void setLocation(AxisValue value)
const WString & text() const
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)
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)
Wt::WComboBox * typeEdit
Definition: ChartConfig.h:53
Side
int modelColumn() const
int toJulianDay() const
virtual int rowCount(const WModelIndex &parent=WModelIndex()) const =0
bool setText(const WString &text)
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
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
WAbstractItemModel * model() const
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)
LegendLocation
WFlags< AxisValue > autoLimits() const
Wt::WLineEdit * minimumEdit
Definition: ChartConfig.h:69
void setMaxLength(int length)
void setTitleOrientation(const Orientation &orientation)
FillRangeType fillRange() const
void setCustomMarker(const WPainterPath &path)
void setEnabled(bool enabled)
void setAutoLimits(WFlags< AxisValue > locations)
Wt::WComboBox * legendSideEdit_
Definition: ChartConfig.h:87
std::vector< AxisControl > axisControls_
Controls for axes.
Definition: ChartConfig.h:80
void update()
Definition: ChartConfig.C:438
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:433
Wt::WComboBox * tickDirectionEdit
Definition: ChartConfig.h:75
Wt::WLineEdit * labelAngleEdit
Definition: ChartConfig.h:72
void setModel(WAbstractItemModel *model)
virtual int columnCount(const WModelIndex &parent=WModelIndex()) const =0
double value() const
void moveTo(const WPointF &point)
EventSignal & unChecked()
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
void setRange(double minimum, double maximum)
EventSignal & enterPressed()
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
virtual bool setData(const WModelIndex &index, const boost::any &value, int role=EditRole)
void setTitle(const WString &title)
WTableRow * rowAt(int row)
void setLabelAngle(double angle)
void setFillRange(FillRangeType fillRange)
void setLegendColumns(int columns, const WLength &width)
static bool validate(Wt::WFormWidget *w)
Definition: ChartConfig.C:706
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 Sun Nov 22 2015 for the C++ Web Toolkit (Wt) by doxygen 1.8.9.1