Wt examples  3.3.9
Classes | Public Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
ChartConfig Class Reference

A class that allows configuration of a cartesian chart. More...

#include <ChartConfig.h>

Inheritance diagram for ChartConfig:
Inheritance graph
[legend]

Classes

struct  AxisControl
 Struct that holds the controls for one axis. More...
 
struct  SeriesControl
 Struct that holds the controls for one series. More...
 

Public Member Functions

 ChartConfig (Wt::Chart::WCartesianChart *chart, Wt::WContainerWidget *parent)
 Constructor. More...
 
void setValueFill (Wt::Chart::FillRangeType fill)
 
- Public Member Functions inherited from Wt::WWidget
virtual void setPositionScheme (PositionScheme scheme)=0
 
virtual PositionScheme positionScheme () const =0
 
virtual void setOffsets (const WLength &offset, WFlags< Side > sides=All)=0
 
virtual WLength offset (Side side) const =0
 
virtual void resize (const WLength &width, const WLength &height)
 
virtual WLength width () const =0
 
virtual WLength height () const =0
 
virtual void setMinimumSize (const WLength &width, const WLength &height)=0
 
virtual WLength minimumWidth () const =0
 
virtual WLength minimumHeight () const =0
 
virtual void setMaximumSize (const WLength &width, const WLength &height)=0
 
virtual WLength maximumWidth () const =0
 
virtual WLength maximumHeight () const =0
 
virtual void setLineHeight (const WLength &height)=0
 
virtual WLength lineHeight () const =0
 
virtual void setFloatSide (Side s)=0
 
virtual Side floatSide () const =0
 
virtual void setClearSides (WFlags< Side > sides)=0
 
virtual WFlags< SideclearSides () const =0
 
virtual void setMargin (const WLength &margin, WFlags< Side > sides=All)=0
 
virtual WLength margin (Side side) const =0
 
virtual void setHiddenKeepsGeometry (bool enabled)=0
 
virtual bool hiddenKeepsGeometry () const =0
 
virtual void setHidden (bool hidden, const WAnimation &animation=WAnimation())=0
 
virtual bool isHidden () const =0
 
virtual bool isVisible () const =0
 
virtual void setDisabled (bool disabled)=0
 
virtual bool isDisabled () const =0
 
virtual bool isEnabled () const =0
 
virtual void setPopup (bool popup)=0
 
virtual bool isPopup () const =0
 
virtual void setInline (bool inlined)=0
 
virtual bool isInline () const =0
 
virtual void setDecorationStyle (const WCssDecorationStyle &style)=0
 
virtual WCssDecorationStyledecorationStyle ()=0
 
virtual void setStyleClass (const WString &styleClass)=0
 
virtual WString styleClass () const =0
 
virtual void addStyleClass (const WString &styleClass, bool force=false)=0
 
virtual void removeStyleClass (const WString &styleClass, bool force=false)=0
 
virtual bool hasStyleClass (const WString &styleClass) const =0
 
virtual void setVerticalAlignment (AlignmentFlag alignment, const WLength &length=WLength::Auto)=0
 
virtual AlignmentFlag verticalAlignment () const =0
 
virtual WLength verticalAlignmentLength () const =0
 
virtual void setToolTip (const WString &text, TextFormat textFormat=PlainText)=0
 
virtual WString toolTip () const =0
 
virtual void setDeferredToolTip (bool enable, TextFormat textFormat=PlainText)=0
 
virtual void refresh ()
 
virtual void setAttributeValue (const std::string &name, const WString &value)=0
 
virtual WString attributeValue (const std::string &name) const =0
 
virtual void setJavaScriptMember (const std::string &name, const std::string &value)=0
 
virtual std::string javaScriptMember (const std::string &name) const =0
 
virtual void callJavaScriptMember (const std::string &name, const std::string &args)=0
 
virtual void load ()=0
 
virtual bool loaded () const =0
 
virtual void setCanReceiveFocus (bool enabled)=0
 
virtual bool canReceiveFocus () const =0
 
virtual void setFocus (bool focus)=0
 
virtual bool setFirstFocus ()=0
 
virtual bool hasFocus () const =0
 
virtual void setTabIndex (int index)=0
 
virtual int tabIndex () const =0
 
virtual void setId (const std::string &id)=0
 
virtual WWidgetfind (const std::string &name)=0
 
virtual WWidgetfindById (const std::string &id)=0
 
virtual void setSelectable (bool selectable)=0
 
virtual void doJavaScript (const std::string &js)=0
 
virtual bool scrollVisibilityEnabled () const =0
 
virtual void setScrollVisibilityEnabled (bool enabled)=0
 
virtual int scrollVisibilityMargin () const =0
 
virtual void setScrollVisibilityMargin (int margin)=0
 
virtual Signal< bool > & scrollVisibilityChanged ()=0
 
virtual bool isScrollVisible () const =0
 
virtual void setThemeStyleEnabled (bool enabled)=0
 
virtual bool isThemeStyleEnabled () const =0
 

Private Member Functions

void connectSignals (Wt::WFormWidget *w)
 
void update ()
 

Static Private Member Functions

static bool validate (Wt::WFormWidget *w)
 

Private Attributes

Wt::Chart::WCartesianChartchart_
 
Wt::Chart::FillRangeType fill_
 
std::vector< SeriesControlseriesControls_
 Controls for series. More...
 
std::vector< AxisControlaxisControls_
 Controls for axes. More...
 
Wt::WLineEdittitleEdit_
 
Wt::WLineEditchartWidthEdit_
 
Wt::WLineEditchartHeightEdit_
 
Wt::WComboBoxchartOrientationEdit_
 
Wt::WComboBoxlegendLocationEdit_
 
Wt::WComboBoxlegendSideEdit_
 
Wt::WComboBoxlegendAlignmentEdit_
 
Wt::WCheckBoxborderEdit_
 

Additional Inherited Members

- Protected Member Functions inherited from Wt::WWidget
virtual void enableAjax ()=0
 
virtual void propagateSetEnabled (bool enabled)=0
 
virtual void render (WFlags< RenderFlag > flags)
 

Detailed Description

A class that allows configuration of a cartesian chart.

This widget provides forms for configuring chart, series, and axis properties and manipulates the chart according to user settings.

This widget is part of the Wt charts example.

Definition at line 37 of file ChartConfig.h.

Constructor & Destructor Documentation

ChartConfig::ChartConfig ( Wt::Chart::WCartesianChart chart,
Wt::WContainerWidget parent 
)

Constructor.

Definition at line 63 of file ChartConfig.C.

64  : WContainerWidget(parent),
65  chart_(chart),
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);
120  chartWidthEdit_->setMaxLength(4);
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);
129  chartHeightEdit_->setMaxLength(4);
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));
234  connectSignals(sc.enabledEdit);
235 
236  sc.typeEdit = new WComboBox(seriesConfig->elementAt(j, 2));
237  sc.typeEdit->setModel(types);
238  sc.typeEdit->setCurrentIndex(0);
239  connectSignals(sc.typeEdit);
240 
241  sc.markerEdit = new WComboBox(seriesConfig->elementAt(j, 3));
242  sc.markerEdit->setModel(markers);
243  sc.markerEdit->setCurrentIndex(0);
244  connectSignals(sc.markerEdit);
245 
246  sc.axisEdit = new WComboBox(seriesConfig->elementAt(j, 4));
247  sc.axisEdit->setModel(axes);
248  sc.axisEdit->setCurrentIndex(0);
249  connectSignals(sc.axisEdit);
250 
251  sc.legendEdit = new WCheckBox(seriesConfig->elementAt(j, 5));
252  connectSignals(sc.legendEdit);
253 
254  sc.shadowEdit = new WCheckBox(seriesConfig->elementAt(j, 6));
255  connectSignals(sc.shadowEdit);
256 
257  sc.labelsEdit = new WComboBox(seriesConfig->elementAt(j, 7));
258  sc.labelsEdit->setModel(labels);
259  sc.labelsEdit->setCurrentIndex(0);
260  connectSignals(sc.labelsEdit);
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:
271  sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
272  (s.isStacked() ? 7 : 4) : 1); break;
273  case CurveSeries:
274  sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
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());
281  sc.legendEdit->setChecked(s.isLegendEnabled());
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());
337  connectSignals(sc.visibleEdit);
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  }
351  connectSignals(sc.scaleEdit);
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);
360  connectSignals(sc.minimumEdit);
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);
367  connectSignals(sc.maximumEdit);
368 
369  sc.autoEdit = new WCheckBox(axisConfig->elementAt(j, 3));
370  sc.autoEdit->setChecked(autoValues);
371  connectSignals(sc.autoEdit);
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));
378  connectSignals(sc.gridLinesEdit);
379 
380  sc.labelAngleEdit = new WLineEdit(axisConfig->elementAt(j, 7));
381  sc.labelAngleEdit->setText("0");
382  sc.labelAngleEdit->setValidator(angleValidator);
383  connectSignals(sc.labelAngleEdit);
384 
385  sc.titleEdit = new WLineEdit(axisConfig->elementAt(j, 8));
386  sc.titleEdit->setText("");
387  connectSignals(sc.titleEdit);
388 
389  sc.titleOrientationEdit = new WComboBox(axisConfig->elementAt(j, 9));
390  sc.titleOrientationEdit->addItem("Horizontal");
391  sc.titleOrientationEdit->addItem("Vertical");
392  sc.titleOrientationEdit->setCurrentIndex(0);
393  connectSignals(sc.titleOrientationEdit);
394 
395  sc.tickDirectionEdit = new WComboBox(axisConfig->elementAt(j, 10));
396  sc.tickDirectionEdit->addItem("Outwards");
397  sc.tickDirectionEdit->addItem("Inwards");
398  sc.tickDirectionEdit->setCurrentIndex(0);
399  connectSignals(sc.tickDirectionEdit);
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");
406  sc.locationEdit->setCurrentIndex(0);
407  if (axis.location() == ZeroValue) {
408  sc.locationEdit->setCurrentIndex(2);
409  }
410  connectSignals(sc.locationEdit);
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 }
virtual WString headerData(int column) const
void expand()
Wt::WCheckBox * borderEdit_
Definition: ChartConfig.h:89
int rowCount() const
MarkerType marker() const
bool isLegendEnabled() const
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:48
Wt::WLineEdit * titleEdit_
Definition: ChartConfig.h:82
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:47
void addItem(const WString &text)
void connectSignals(Wt::WFormWidget *w)
Definition: ChartConfig.C:709
double minimum() const
AxisScale scale() const
WAxis & axis(Axis axis)
void setLegendStyle(const WFont &font, const WPen &border, const WBrush &background)
AxisValue location() const
virtual void resize(const WLength &width, const WLength &height)
bool setText(const WString &text)
virtual WLength height() const =0
bool isStacked() const
virtual WLength width() const =0
Wt::WLineEdit * chartWidthEdit_
Definition: ChartConfig.h:83
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:85
Wt::WComboBox * legendLocationEdit_
Definition: ChartConfig.h:86
std::vector< SeriesControl > seriesControls_
Controls for series.
Definition: ChartConfig.h:62
void setCurrentIndex(int index)
Axis id() const
void setStyleClass(const WString &style)
WDataSeries & series(int modelColumn)
WFlags< AxisValue > autoLimits() const
virtual void setMargin(const WLength &margin, WFlags< Side > sides=All)=0
FillRangeType fillRange() const
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
virtual void setInline(bool inlined)=0
bool isVisible() const
void setModel(WAbstractItemModel *model)
double value() const
double maximum() const
Wt::WComboBox * legendAlignmentEdit_
Definition: ChartConfig.h:88
void setChecked(bool checked)
WTableRow * rowAt(int row)
virtual void setStyleClass(const WString &styleClass)=0
WAbstractChartModel * model() const
Wt::WLineEdit * chartHeightEdit_
Definition: ChartConfig.h:84
const WShadow & shadow() const
SeriesType type() const

Member Function Documentation

void ChartConfig::connectSignals ( Wt::WFormWidget w)
private

Definition at line 709 of file ChartConfig.C.

710 {
711  w->changed().connect(this, &ChartConfig::update);
712  if (dynamic_cast<WLineEdit *>(w))
713  w->enterPressed().connect(this, &ChartConfig::update);
714 }
void update()
Definition: ChartConfig.C:440
void ChartConfig::setValueFill ( Wt::Chart::FillRangeType  fill)

Definition at line 435 of file ChartConfig.C.

436 {
437  fill_ = fill;
438 }
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:48
void ChartConfig::update ( )
private

Definition at line 440 of file ChartConfig.C.

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)
455  sc.markerEdit->setCurrentIndex(1);
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 
609  axis.setGridLinesEnabled(sc.gridLinesEdit->isChecked());
610 
611  axis.setTitle(sc.titleEdit->text());
612 
613  axis.setTitleOrientation(sc.titleOrientationEdit->currentIndex() == 0 ? Horizontal : Vertical);
614 
615  axis.setTickDirection(sc.tickDirectionEdit->currentIndex() == 0 ? Outwards : Inwards);
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 
633  chart_->setTitle(titleEdit_->text());
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:
646  chart_->setOrientation(Horizontal); break;
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 {
694  }
695 }
void setVisible(bool visible)
Wt::WCheckBox * borderEdit_
Definition: ChartConfig.h:89
void setType(SeriesType t)
void lineTo(const WPointF &point)
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:48
Wt::WLineEdit * titleEdit_
Definition: ChartConfig.h:82
void setGridLinesEnabled(bool enabled)
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:47
void setTickDirection(TickDirection direction)
double minimum() const
void setLocation(AxisValue value)
AxisScale scale() const
WAxis & axis(Axis axis)
void setShadow(const WShadow &shadow)
int currentIndex() const
void setType(ChartType type)
virtual void resize(const WLength &width, const WLength &height)
void setMarker(MarkerType marker)
AlignmentFlag
void setLegendLocation(LegendLocation location, Side side, AlignmentFlag alignment)
int toJulianDay() const
virtual WLength height() const =0
void setSeries(const std::vector< WDataSeries > &series)
virtual WLength width() const =0
void setLegendEnabled(bool enabled)
Wt::WLineEdit * chartWidthEdit_
Definition: ChartConfig.h:83
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)
Axis id() const
void setScale(AxisScale scale)
WFlags< AxisValue > autoLimits() const
void setTitleOrientation(const Orientation &orientation)
void setCustomMarker(const WPainterPath &path)
void setAutoLimits(WFlags< AxisValue > locations)
Wt::WComboBox * legendSideEdit_
Definition: ChartConfig.h:87
std::vector< AxisControl > axisControls_
Controls for axes.
Definition: ChartConfig.h:80
virtual int columnCount() const =0
void setLabelsEnabled(Axis axis, bool enabled=true)
void moveTo(const WPointF &point)
void setStacked(bool stacked)
void setOrientation(Orientation orientation)
double maximum() const
void setBorderPen(const WPen &pen)
void setRange(double minimum, double maximum)
void setLegendEnabled(bool enabled)
void bindToAxis(Axis axis)
Wt::WComboBox * legendAlignmentEdit_
Definition: ChartConfig.h:88
void setTitle(const WString &title)
void setLabelAngle(double angle)
void setFillRange(FillRangeType fillRange)
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
void setTitle(const WString &title)
bool ChartConfig::validate ( Wt::WFormWidget w)
staticprivate

Definition at line 697 of file ChartConfig.C.

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 }
virtual void setToolTip(const WString &text, TextFormat textFormat=PlainText)=0
virtual void setStyleClass(const WString &styleClass)=0

Member Data Documentation

std::vector<AxisControl> ChartConfig::axisControls_
private

Controls for axes.

Definition at line 80 of file ChartConfig.h.

Wt::WCheckBox* ChartConfig::borderEdit_
private

Definition at line 89 of file ChartConfig.h.

Wt::Chart::WCartesianChart* ChartConfig::chart_
private

Definition at line 47 of file ChartConfig.h.

Wt::WLineEdit* ChartConfig::chartHeightEdit_
private

Definition at line 84 of file ChartConfig.h.

Wt::WComboBox* ChartConfig::chartOrientationEdit_
private

Definition at line 85 of file ChartConfig.h.

Wt::WLineEdit* ChartConfig::chartWidthEdit_
private

Definition at line 83 of file ChartConfig.h.

Wt::Chart::FillRangeType ChartConfig::fill_
private

Definition at line 48 of file ChartConfig.h.

Wt::WComboBox* ChartConfig::legendAlignmentEdit_
private

Definition at line 88 of file ChartConfig.h.

Wt::WComboBox* ChartConfig::legendLocationEdit_
private

Definition at line 86 of file ChartConfig.h.

Wt::WComboBox* ChartConfig::legendSideEdit_
private

Definition at line 87 of file ChartConfig.h.

std::vector<SeriesControl> ChartConfig::seriesControls_
private

Controls for series.

Definition at line 62 of file ChartConfig.h.

Wt::WLineEdit* ChartConfig::titleEdit_
private

Definition at line 82 of file ChartConfig.h.


The documentation for this class was generated from the following files:

Generated on Thu Mar 15 2018 for the C++ Web Toolkit (Wt) by doxygen 1.8.5