Wt examples  3.3.1
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  chart->initLayout();
71 
72  PanelList *list = new PanelList(this);
73 
74  WIntValidator *sizeValidator = new WIntValidator(200, 2000, this);
75  sizeValidator->setMandatory(true);
76 
77  WDoubleValidator *anyNumberValidator = new WDoubleValidator(this);
78  anyNumberValidator->setMandatory(true);
79 
80  WDoubleValidator *angleValidator = new WDoubleValidator(-90, 90, this);
81  angleValidator->setMandatory(true);
82 
83  // ---- Chart properties ----
84 
85  WStandardItemModel *orientation = new WStandardItemModel(0, 1, this);
86  addEntry(orientation, "Vertical");
87  addEntry(orientation, "Horizontal");
88 
89  WStandardItemModel *legendLocation = new WStandardItemModel(0, 1, this);
90  addEntry(legendLocation, "Outside");
91  addEntry(legendLocation, "Inside");
92 
93  WStandardItemModel *legendSide = new WStandardItemModel(0, 1, this);
94  addEntry(legendSide, "Top");
95  addEntry(legendSide, "Right");
96  addEntry(legendSide, "Bottom");
97  addEntry(legendSide, "Left");
98 
99  WStandardItemModel *legendAlignment = new WStandardItemModel(0, 1, this);
100  addEntry(legendAlignment, "AlignLeft");
101  addEntry(legendAlignment, "AlignCenter");
102  addEntry(legendAlignment, "AlignRight");
103  addEntry(legendAlignment, "AlignTop");
104  addEntry(legendAlignment, "AlignMiddle");
105  addEntry(legendAlignment, "AlignBottom");
106 
107  WTable *chartConfig = new WTable();
108  chartConfig->setMargin(WLength::Auto, Left | Right);
109 
110  int row = 0;
111  chartConfig->elementAt(row, 0)->addWidget(new WText("Title:"));
112  titleEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
114  ++row;
115 
116  chartConfig->elementAt(row, 0)->addWidget(new WText("Width:"));
117  chartWidthEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
119  ->setText(WLocale::currentLocale().toString(chart_->width().value()));
120  chartWidthEdit_->setValidator(sizeValidator);
121  chartWidthEdit_->setMaxLength(4);
123  ++row;
124 
125  chartConfig->elementAt(row, 0)->addWidget(new WText("Height:"));
126  chartHeightEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
128  ->setText(WLocale::currentLocale().toString(chart_->height().value()));
129  chartHeightEdit_->setValidator(sizeValidator);
130  chartHeightEdit_->setMaxLength(4);
132  ++row;
133 
134  chartConfig->elementAt(row, 0)->addWidget(new WText("Orientation:"));
135  chartOrientationEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
136  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);
144  ++row;
145 
146  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend side:"));
147  legendSideEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
148  legendSideEdit_->setModel(legendSide);
151  ++row;
152 
153  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend alignment:"));
154  legendAlignmentEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
155  legendAlignmentEdit_->setModel(legendAlignment);
158  ++row;
159 
160  for (int i = 0; i < chartConfig->rowCount(); ++i) {
161  chartConfig->elementAt(i, 0)->setStyleClass("tdhead");
162  chartConfig->elementAt(i, 1)->setStyleClass("tddata");
163  }
164 
165  WPanel *p = list->addWidget("Chart properties", chartConfig);
166  p->setMargin(WLength::Auto, Left | Right);
167  p->resize(880, WLength::Auto);
168  p->setMargin(20, Top | Bottom);
169 
170  if (chart_->isLegendEnabled())
172 
173  // ---- Series properties ----
174 
175  WStandardItemModel *types = new WStandardItemModel(0, 1, this);
176  addEntry(types, "Points");
177  addEntry(types, "Line");
178  addEntry(types, "Curve");
179  addEntry(types, "Bar");
180  addEntry(types, "Line Area");
181  addEntry(types, "Curve Area");
182  addEntry(types, "Stacked Bar");
183  addEntry(types, "Stacked Line Area");
184  addEntry(types, "Stacked Curve Area");
185 
186  WStandardItemModel *markers = new WStandardItemModel(0, 1, this);
187  addEntry(markers, "None");
188  addEntry(markers, "Square");
189  addEntry(markers, "Circle");
190  addEntry(markers, "Cross");
191  addEntry(markers, "X cross");
192  addEntry(markers, "Triangle");
193  addEntry(markers, "Diamond");
194 
195  WStandardItemModel *axes = new WStandardItemModel(0, 1, this);
196  addEntry(axes, "1st Y axis");
197  addEntry(axes, "2nd Y axis");
198 
199  WStandardItemModel *labels = new WStandardItemModel(0, 1, this);
200  addEntry(labels, "None");
201  addEntry(labels, "X");
202  addEntry(labels, "Y");
203  addEntry(labels, "X: Y");
204 
205  WTable *seriesConfig = new WTable();
206  seriesConfig->setMargin(WLength::Auto, Left | Right);
207 
208  ::addHeader(seriesConfig, "Name");
209  ::addHeader(seriesConfig, "Enabled");
210  ::addHeader(seriesConfig, "Type");
211  ::addHeader(seriesConfig, "Marker");
212  ::addHeader(seriesConfig, "Y axis");
213  ::addHeader(seriesConfig, "Legend");
214  ::addHeader(seriesConfig, "Shadow");
215  ::addHeader(seriesConfig, "Value labels");
216 
217  seriesConfig->rowAt(0)->setStyleClass("trhead");
218 
219  for (int j = 1; j < chart->model()->columnCount(); ++j) {
220  SeriesControl sc;
221 
222  new WText(asString(chart->model()->headerData(j)),
223  seriesConfig->elementAt(j, 0));
224 
225  sc.enabledEdit = new WCheckBox(seriesConfig->elementAt(j, 1));
227 
228  sc.typeEdit = new WComboBox(seriesConfig->elementAt(j, 2));
229  sc.typeEdit->setModel(types);
231 
232  sc.markerEdit = new WComboBox(seriesConfig->elementAt(j, 3));
233  sc.markerEdit->setModel(markers);
235 
236  sc.axisEdit = new WComboBox(seriesConfig->elementAt(j, 4));
237  sc.axisEdit->setModel(axes);
239 
240  sc.legendEdit = new WCheckBox(seriesConfig->elementAt(j, 5));
242 
243  sc.shadowEdit = new WCheckBox(seriesConfig->elementAt(j, 6));
245 
246  sc.labelsEdit = new WComboBox(seriesConfig->elementAt(j, 7));
247  sc.labelsEdit->setModel(labels);
249 
250  int si = seriesIndexOf(chart, j);
251 
252  if (si != -1) {
253  sc.enabledEdit->setChecked();
254  const WDataSeries& s = chart_->series(j);
255  switch (s.type()) {
256  case PointSeries:
257  sc.typeEdit->setCurrentIndex(0); break;
258  case LineSeries:
260  (s.isStacked() ? 7 : 4) : 1); break;
261  case CurveSeries:
263  (s.isStacked() ? 8 : 5) : 2); break;
264  case BarSeries:
265  sc.typeEdit->setCurrentIndex(s.isStacked() ? 6 : 3);
266  }
267 
268  sc.markerEdit->setCurrentIndex((int)s.marker());
270  sc.shadowEdit->setChecked(s.shadow() != WShadow());
271  }
272 
273  seriesControls_.push_back(sc);
274 
275  seriesConfig->rowAt(j)->setStyleClass("trdata");
276  }
277 
278  p = list->addWidget("Series properties", seriesConfig);
279  p->expand();
280  p->setMargin(WLength::Auto, Left | Right);
281  p->resize(880, WLength::Auto);
282  p->setMargin(20, Top | Bottom);
283 
284  // ---- Axis properties ----
285 
286  WStandardItemModel *yScales = new WStandardItemModel(0, 1, this);
287  addEntry(yScales, "Linear scale");
288  addEntry(yScales, "Log scale");
289 
290  WStandardItemModel *xScales = new WStandardItemModel(0, 1, this);
291  addEntry(xScales, "Categories");
292  addEntry(xScales, "Linear scale");
293  addEntry(xScales, "Log scale");
294  addEntry(xScales, "Date scale");
295 
296  WTable *axisConfig = new WTable();
297  axisConfig->setMargin(WLength::Auto, Left | Right);
298 
299  ::addHeader(axisConfig, "Axis");
300  ::addHeader(axisConfig, "Visible");
301  ::addHeader(axisConfig, "Scale");
302  ::addHeader(axisConfig, "Automatic");
303  ::addHeader(axisConfig, "Minimum");
304  ::addHeader(axisConfig, "Maximum");
305  ::addHeader(axisConfig, "Gridlines");
306  ::addHeader(axisConfig, "Label angle");
307 
308  axisConfig->rowAt(0)->setStyleClass("trhead");
309 
310  for (int i = 0; i < 3; ++i) {
311  const char *axisName[] = { "X axis", "1st Y axis", "2nd Y axis" };
312  int j = i + 1;
313 
314  const WAxis& axis = chart_->axis(static_cast<Axis>(i));
315  AxisControl sc;
316 
317  new WText(WString(axisName[i], UTF8), axisConfig->elementAt(j, 0));
318 
319  sc.visibleEdit = new WCheckBox(axisConfig->elementAt(j, 1));
320  sc.visibleEdit->setChecked(axis.isVisible());
322 
323  sc.scaleEdit = new WComboBox(axisConfig->elementAt(j, 2));
324  if (axis.scale() == CategoryScale)
325  sc.scaleEdit->addItem("Category scale");
326  else {
327  if (axis.id() == XAxis) {
328  sc.scaleEdit->setModel(xScales);
329  sc.scaleEdit->setCurrentIndex(axis.scale());
330  } else {
331  sc.scaleEdit->setModel(yScales);
332  sc.scaleEdit->setCurrentIndex(axis.scale() - 1);
333  }
334  }
336 
337  bool autoValues = axis.autoLimits() == (MinimumValue | MaximumValue);
338 
339  sc.minimumEdit = new WLineEdit(axisConfig->elementAt(j, 4));
340  sc.minimumEdit->setText(WLocale::currentLocale()
341  .toString(axis.minimum()));
342  sc.minimumEdit->setValidator(anyNumberValidator);
343  sc.minimumEdit->setEnabled(!autoValues);
345 
346  sc.maximumEdit = new WLineEdit(axisConfig->elementAt(j, 5));
347  sc.maximumEdit->setText(WLocale::currentLocale()
348  .toString(axis.maximum()));
349  sc.maximumEdit->setValidator(anyNumberValidator);
350  sc.maximumEdit->setEnabled(!autoValues);
352 
353  sc.autoEdit = new WCheckBox(axisConfig->elementAt(j, 3));
354  sc.autoEdit->setChecked(autoValues);
356  sc.autoEdit->checked().connect(sc.maximumEdit, &WLineEdit::disable);
357  sc.autoEdit->unChecked().connect(sc.maximumEdit, &WLineEdit::enable);
358  sc.autoEdit->checked().connect(sc.minimumEdit, &WLineEdit::disable);
359  sc.autoEdit->unChecked().connect(sc.minimumEdit, &WLineEdit::enable);
360 
361  sc.gridLinesEdit = new WCheckBox(axisConfig->elementAt(j, 6));
363 
364  sc.labelAngleEdit = new WLineEdit(axisConfig->elementAt(j, 7));
365  sc.labelAngleEdit->setText("0");
366  sc.labelAngleEdit->setValidator(angleValidator);
368 
369  axisConfig->rowAt(j)->setStyleClass("trdata");
370 
371  axisControls_.push_back(sc);
372  }
373 
374  p = list->addWidget("Axis properties", axisConfig);
375  p->setMargin(WLength::Auto, Left | Right);
376  p->resize(880, WLength::Auto);
377  p->setMargin(20, Top | Bottom);
378 
379  /*
380  * If we do not have JavaScript, then add a button to reflect changes to
381  * the chart.
382  */
383  if (!WApplication::instance()->environment().javaScript()) {
384  WPushButton *b = new WPushButton(this);
385  b->setText("Update chart");
386  b->setInline(false); // so we can add margin to center horizontally
387  b->setMargin(WLength::Auto, Left | Right);
388  b->clicked().connect(this, &ChartConfig::update);
389  }
390 }
391 
393 {
394  fill_ = fill;
395 }
396 
398 {
399  bool haveLegend = false;
400  std::vector<WDataSeries> series;
401 
402  for (int i = 1; i < chart_->model()->columnCount(); ++i) {
403  SeriesControl& sc = seriesControls_[i-1];
404 
405  if (sc.enabledEdit->isChecked()) {
406  WDataSeries s(i);
407 
408  switch (sc.typeEdit->currentIndex()) {
409  case 0:
410  s.setType(PointSeries);
411  if (sc.markerEdit->currentIndex() == 0)
413  break;
414  case 1:
415  s.setType(LineSeries);
417  break;
418  case 2:
419  s.setType(CurveSeries);
421  break;
422  case 3:
423  s.setType(BarSeries);
425  break;
426  case 4:
427  s.setType(LineSeries);
428  s.setFillRange(fill_);
430  break;
431  case 5:
432  s.setType(CurveSeries);
433  s.setFillRange(fill_);
435  break;
436  case 6:
437  s.setType(BarSeries);
438  s.setStacked(true);
440  break;
441  case 7:
442  s.setType(LineSeries);
443  s.setFillRange(fill_);
444  s.setStacked(true);
446  break;
447  case 8:
448  s.setType(CurveSeries);
449  s.setFillRange(fill_);
450  s.setStacked(true);
452  }
453 
454  //set WPainterPath to draw a diamond
455  if(sc.markerEdit->currentIndex() == CustomMarker){
456  WPainterPath pp = WPainterPath();
457  pp.moveTo(-6, 0);
458  pp.lineTo(0, 6);
459  pp.lineTo(6, 0);
460  pp.lineTo(0, -6);
461  pp.lineTo(-6, 0);
462  s.setCustomMarker(pp);
463  }
464 
465  s.setMarker(static_cast<MarkerType>(sc.markerEdit->currentIndex()));
466 
467  if (sc.axisEdit->currentIndex() == 1) {
468  s.bindToAxis(Y2Axis);
469  }
470 
471  if (sc.legendEdit->isChecked()) {
472  s.setLegendEnabled(true);
473  haveLegend = true;
474  } else
475  s.setLegendEnabled(false);
476 
477  if (sc.shadowEdit->isChecked()) {
478  s.setShadow(WShadow(3, 3, WColor(0, 0, 0, 127), 3));
479  } else
480  s.setShadow(WShadow());
481 
482  switch (sc.labelsEdit->currentIndex()) {
483  case 1:
485  break;
486  case 2:
488  break;
489  case 3:
492  break;
493  }
494 
495  series.push_back(s);
496  }
497  }
498 
499  chart_->setSeries(series);
500 
501  for (int i = 0; i < 3; ++i) {
502  AxisControl& sc = axisControls_[i];
503  WAxis& axis = chart_->axis(static_cast<Axis>(i));
504 
505  axis.setVisible(sc.visibleEdit->isChecked());
506 
507  if (sc.scaleEdit->count() != 1) {
508  int k = sc.scaleEdit->currentIndex();
509  if (axis.id() != XAxis)
510  k += 1;
511  else {
512  if (k == 0)
514  else
516  }
517 
518  switch (k) {
519  case 1:
520  axis.setScale(LinearScale); break;
521  case 2:
522  axis.setScale(LogScale); break;
523  case 3:
524  axis.setScale(DateScale); break;
525  }
526  }
527 
528  if (sc.autoEdit->isChecked())
530  else {
531  if (validate(sc.minimumEdit) && validate(sc.maximumEdit)) {
532  double min, max;
533  getDouble(sc.minimumEdit, min);
534  getDouble(sc.maximumEdit, max);
535 
536  if (axis.scale() == LogScale)
537  if (min <= 0)
538  min = 0.0001;
539 
540  if (axis.scale() == DateScale){
541  //the number of julian days until year 1986
542  WDate dMin = WDate(1900,1,1);
543  double gregDaysMin = (double)dMin.toJulianDay();
544  //the number of julian days until year 1988
545  WDate dMax = WDate(3000,1,1);
546  double gregDaysMax = (double)dMax.toJulianDay();
547 
548  bool greg_year_validation =
549  (min > gregDaysMin &&
550  min < gregDaysMax &&
551  max > gregDaysMin &&
552  max < gregDaysMax);
553 
554  if(!greg_year_validation){
555  min = gregDaysMin;
556  max = gregDaysMax;
557  }
558  }
559 
560  axis.setRange(min, max);
561  }
562 
563  }
564 
565  if (validate(sc.labelAngleEdit)) {
566  double angle;
567  getDouble(sc.labelAngleEdit, angle);
568  axis.setLabelAngle(angle);
569  }
570 
572  }
573 
574  chart_->setTitle(titleEdit_->text());
575 
577  double width, height;
578  getDouble(chartWidthEdit_, width);
579  getDouble(chartHeightEdit_, height);
580  chart_->resize(width, height);
581  }
582 
583  switch (chartOrientationEdit_->currentIndex()) {
584  case 0:
585  chart_->setOrientation(Vertical); break;
586  case 1:
588  }
589 
590  chart_->setLegendEnabled(haveLegend);
591 
592  if (haveLegend) {
593  LegendLocation location = LegendOutside;
594  Side side = Right;
595  AlignmentFlag alignment = AlignMiddle;
596 
597  switch (legendLocationEdit_->currentIndex()) {
598  case 0: location = LegendOutside; break;
599  case 1: location = LegendInside; break;
600  }
601 
602  switch (legendSideEdit_->currentIndex()) {
603  case 0: side = Top; break;
604  case 1: side = Right; break;
605  case 2: side = Bottom; break;
606  case 3: side = Left; break;
607  }
608 
609  if (side == Left || side == Right) {
612  } else {
615  }
616 
617  switch (legendAlignmentEdit_->currentIndex()) {
618  case 0: alignment = AlignLeft; break;
619  case 1: alignment = AlignCenter; break;
620  case 2: alignment = AlignRight; break;
621  case 3: alignment = AlignTop; break;
622  case 4: alignment = AlignMiddle; break;
623  case 5: alignment = AlignBottom; break;
624  }
625 
626  chart_->setLegendLocation(location, side, alignment);
627 
628  chart_->setLegendColumns((side == Top || side == Bottom ) ? 2 : 1,
629  WLength(100));
630  }
631 
632  for (unsigned i = 0; i < 4; ++i) {
633  Side sides[] = { Top, Right, Bottom, Left };
634 
635  bool legendRoom =
636  haveLegend
638  && chart_->legendSide() == sides[i];
639 
640  int padding;
641 
642  if (i % 2 == 0)
643  padding = legendRoom ? 80 : 40;
644  else
645  padding = legendRoom ? 200 : 80;
646 
647  chart_->setPlotAreaPadding(padding, sides[i]);
648  }
649 }
650 
652 {
653  bool valid = w->validate() == WValidator::Valid;
654 
655  if (!WApplication::instance()->environment().javaScript()) {
656  w->setStyleClass(valid ? "" : "Wt-invalid");
657  w->setToolTip(valid ? "" : "Invalid value");
658  }
659 
660  return valid;
661 }
662 
664 {
665  w->changed().connect(this, &ChartConfig::update);
666  if (dynamic_cast<WLineEdit *>(w))
667  w->enterPressed().connect(this, &ChartConfig::update);
668 }
void setVisible(bool visible)
void expand()
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 setToolTip(const WString &text, TextFormat textFormat=PlainText)=0
ChartConfig(Wt::Chart::WCartesianChart *chart, Wt::WContainerWidget *parent)
Constructor.
Definition: ChartConfig.C:63
Wt::WComboBox * axisEdit
Definition: ChartConfig.h:55
WString asString(const boost::any &v, const WString &formatString=WString())
bool isLegendEnabled() const
bool isLegendEnabled() const
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:48
Wt::WComboBox * scaleEdit
Definition: ChartConfig.h:67
Wt::WLineEdit * titleEdit_
Definition: ChartConfig.h:78
void setGridLinesEnabled(bool enabled)
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:47
void addItem(const WString &text)
void connectSignals(Wt::WFormWidget *w)
Definition: ChartConfig.C:663
double minimum() 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)
void setLegendStyle(const WFont &font, const WPen &border, const WBrush &background)
int currentIndex() const
Wt::WCheckBox * enabledEdit
Definition: ChartConfig.h:52
void setType(ChartType type)
Struct that holds the controls for one series.
Definition: ChartConfig.h:51
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
int modelColumn() const
int toJulianDay() const
virtual int rowCount(const WModelIndex &parent=WModelIndex()) const =0
virtual void resize(const WLength &width, const WLength &height)
bool setText(const WString &text)
void initLayout(const WRectF &rectangle=WRectF())
virtual WLength height() const =0
Wt::Signals::connection connect(const F &function)
void setSeries(const std::vector< WDataSeries > &series)
Wt::WCheckBox * visibleEdit
Definition: ChartConfig.h:66
bool isStacked() const
LegendLocation legendLocation() const
virtual WLength width() const =0
void setLegendEnabled(bool enabled)
Wt::WComboBox * markerEdit
Definition: ChartConfig.h:54
Wt::WLineEdit * chartWidthEdit_
Definition: ChartConfig.h:79
Struct that holds the controls for one axis.
Definition: ChartConfig.h:65
WTableCell * elementAt(int row, int column)
Wt::WPanel * addWidget(const Wt::WString &text, Wt::WWidget *w)
Definition: PanelList.C:17
Wt::WComboBox * chartOrientationEdit_
Definition: ChartConfig.h:81
Wt::WComboBox * legendLocationEdit_
Definition: ChartConfig.h:82
std::vector< SeriesControl > seriesControls_
Controls for series.
Definition: ChartConfig.h:62
WAbstractItemModel * model() const
void setCurrentIndex(int index)
Axis id() const
void setScale(AxisScale scale)
void setStyleClass(const WString &style)
WDataSeries & series(int modelColumn)
WFlags< AxisValue > autoLimits() const
virtual void setMargin(const WLength &margin, WFlags< Side > sides=All)=0
Wt::WLineEdit * minimumEdit
Definition: ChartConfig.h:69
FillRangeType fillRange() const
void setCustomMarker(const WPainterPath &path)
void setAutoLimits(WFlags< AxisValue > locations)
Wt::WComboBox * legendSideEdit_
Definition: ChartConfig.h:83
std::vector< AxisControl > axisControls_
Controls for axes.
Definition: ChartConfig.h:76
void update()
Definition: ChartConfig.C:397
Wt::WCheckBox * shadowEdit
Definition: ChartConfig.h:57
Wt::WComboBox * labelsEdit
Definition: ChartConfig.h:58
virtual void setInline(bool inlined)=0
void setLabelsEnabled(Axis axis, bool enabled=true)
bool isVisible() const
void setValueFill(Wt::Chart::FillRangeType fill)
Definition: ChartConfig.C:392
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 setPlotAreaPadding(int padding, WFlags< Side > sides=All)
void setOrientation(Orientation orientation)
double maximum() const
Wt::WCheckBox * legendEdit
Definition: ChartConfig.h:56
void setRange(double minimum, double maximum)
Wt::WCheckBox * gridLinesEdit
Definition: ChartConfig.h:71
void setLegendEnabled(bool enabled)
static const WLocale & currentLocale()
void bindToAxis(Axis axis)
Wt::WComboBox * legendAlignmentEdit_
Definition: ChartConfig.h:84
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)
virtual void setStyleClass(const WString &styleClass)=0
void setLegendColumns(int columns, const WLength &width)
static bool validate(Wt::WFormWidget *w)
Definition: ChartConfig.C:651
Wt::WLineEdit * chartHeightEdit_
Definition: ChartConfig.h:80
double toDouble(const WString &value) const
EventSignal & checked()
const WShadow & shadow() const
SeriesType type() const

Generated on Wed Jun 11 2014 for the C++ Web Toolkit (Wt) by doxygen 1.8.7