Wt examples  3.7.1
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::WContainerWidget
 WContainerWidget ()
 
 ~WContainerWidget ()
 
void setLayout (std::unique_ptr< WLayout > layout)
 
Layout * setLayout (std::unique_ptr< Layout > layout)
 
WLayoutlayout () const
 
virtual void addWidget (std::unique_ptr< WWidget > widget)
 
Widget * addWidget (std::unique_ptr< Widget > widget)
 
Widget * addNew (Args &&...args)
 
virtual void insertBefore (std::unique_ptr< WWidget > widget, WWidget *before)
 
Widget * insertBefore (std::unique_ptr< Widget > widget, WWidget *before)
 
virtual void insertWidget (int index, std::unique_ptr< WWidget > widget)
 
Widget * insertWidget (int index, std::unique_ptr< Widget > widget)
 
Widget * insertNew (int index, Args &&...args)
 
virtual std::unique_ptr< WWidgetremoveWidget (WWidget *widget) override
 
virtual void clear ()
 
virtual int indexOf (WWidget *widget) const
 
virtual WWidgetwidget (int index) const
 
virtual int count () const
 
void setContentAlignment (WFlags< AlignmentFlag > contentAlignment)
 
void setPadding (const WLength &padding, WFlags< Side > sides=AllSides)
 
WLength padding (Side side) const
 
WFlags< AlignmentFlagcontentAlignment () const
 
void setOverflow (Overflow overflow, WFlags< Orientation > orientation=(Orientation::Horizontal|Orientation::Vertical))
 
void setList (bool list, bool ordered=false)
 
bool isList () const
 
bool isUnorderedList () const
 
bool isOrderedList () const
 
EventSignal< WScrollEvent > & scrolled ()
 
int scrollTop () const
 
int scrollLeft () const
 
- Public Member Functions inherited from Wt::WInteractWidget
 WInteractWidget ()
 
EventSignal< WKeyEvent > & keyWentDown ()
 
EventSignal< WKeyEvent > & keyPressed ()
 
EventSignal< WKeyEvent > & keyWentUp ()
 
EventSignalenterPressed ()
 
EventSignalescapePressed ()
 
EventSignal< WMouseEvent > & clicked ()
 
EventSignal< WMouseEvent > & doubleClicked ()
 
EventSignal< WMouseEvent > & mouseWentDown ()
 
EventSignal< WMouseEvent > & mouseWentUp ()
 
EventSignal< WMouseEvent > & mouseWentOut ()
 
EventSignal< WMouseEvent > & mouseWentOver ()
 
EventSignal< WMouseEvent > & mouseMoved ()
 
EventSignal< WMouseEvent > & mouseDragged ()
 
EventSignal< WMouseEvent > & mouseWheel ()
 
EventSignal< WTouchEvent > & touchStarted ()
 
EventSignal< WTouchEvent > & touchEnded ()
 
EventSignal< WTouchEvent > & touchMoved ()
 
EventSignal< WGestureEvent > & gestureStarted ()
 
EventSignal< WGestureEvent > & gestureChanged ()
 
EventSignal< WGestureEvent > & gestureEnded ()
 
void setDraggable (const std::string &mimeType, WWidget *dragWidget=nullptr, bool isDragWidgetOnly=false, WObject *sourceWidget=nullptr)
 
void unsetDraggable ()
 
void setMouseOverDelay (int delay)
 
int mouseOverDelay () const
 
virtual void setPopup (bool popup) override
 
virtual void load () override
 
virtual bool isEnabled () const override
 
- Public Member Functions inherited from Wt::WWebWidget
 WWebWidget ()
 
virtual std::vector< WWidget *> children () const override
 
SignalchildrenChanged ()
 
virtual void setPositionScheme (PositionScheme scheme) override
 
virtual PositionScheme positionScheme () const override
 
virtual void setOffsets (const WLength &offset, WFlags< Side > sides=AllSides) override
 
virtual WLength offset (Side s) const override
 
virtual void resize (const WLength &width, const WLength &height) override
 
virtual WLength width () const override
 
virtual WLength height () const override
 
virtual void setMinimumSize (const WLength &width, const WLength &height) override
 
virtual WLength minimumWidth () const override
 
virtual WLength minimumHeight () const override
 
virtual void setMaximumSize (const WLength &width, const WLength &height) override
 
virtual WLength maximumWidth () const override
 
virtual WLength maximumHeight () const override
 
virtual void setLineHeight (const WLength &height) override
 
virtual WLength lineHeight () const override
 
virtual void setFloatSide (Side s) override
 
virtual Side floatSide () const override
 
virtual void setClearSides (WFlags< Side > sides) override
 
virtual WFlags< SideclearSides () const override
 
virtual void setMargin (const WLength &margin, WFlags< Side > sides=AllSides) override
 
virtual WLength margin (Side side) const override
 
virtual void setHiddenKeepsGeometry (bool enabled) override
 
virtual bool hiddenKeepsGeometry () const override
 
virtual void setHidden (bool hidden, const WAnimation &animation=WAnimation()) override
 
virtual bool isHidden () const override
 
virtual bool isVisible () const override
 
virtual void setDisabled (bool disabled) override
 
virtual bool isDisabled () const override
 
virtual bool isPopup () const override
 
virtual void setInline (bool isInline) override
 
virtual bool isInline () const override
 
virtual void setDecorationStyle (const WCssDecorationStyle &style) override
 
virtual WCssDecorationStyledecorationStyle () override
 
virtual void setStyleClass (const WString &styleClass) override
 
virtual WString styleClass () const override
 
virtual void addStyleClass (const WString &styleClass, bool force=false) override
 
virtual void removeStyleClass (const WString &styleClass, bool force=false) override
 
virtual bool hasStyleClass (const WString &styleClass) const override
 
virtual void setVerticalAlignment (AlignmentFlag alignment, const WLength &length=WLength()) override
 
virtual AlignmentFlag verticalAlignment () const override
 
virtual WLength verticalAlignmentLength () const override
 
virtual void setToolTip (const WString &text, TextFormat textFormat=TextFormat::Plain) override
 
virtual void setDeferredToolTip (bool enable, TextFormat textFormat=TextFormat::Plain) override
 
virtual WString toolTip () const override
 
virtual void refresh () override
 
virtual void setAttributeValue (const std::string &name, const WString &value) override
 
virtual WString attributeValue (const std::string &name) const override
 
virtual void setJavaScriptMember (const std::string &name, const std::string &value) override
 
virtual std::string javaScriptMember (const std::string &name) const override
 
virtual void callJavaScriptMember (const std::string &name, const std::string &args) override
 
virtual bool loaded () const override
 
virtual void setId (const std::string &id) override
 
virtual WWidgetfind (const std::string &name) override
 
virtual WWidgetfindById (const std::string &id) override
 
virtual void setSelectable (bool selectable) override
 
virtual void doJavaScript (const std::string &javascript) override
 
virtual const std::string id () const override
 
void setLoadLaterWhenInvisible (bool)
 
std::string htmlTagName () const
 
void setHtmlTagName (const std::string &tag)
 
virtual void setCanReceiveFocus (bool enabled) override
 
virtual bool canReceiveFocus () const override
 
virtual bool setFirstFocus () override
 
virtual void setFocus (bool focus) override
 
virtual bool hasFocus () const override
 
virtual void setTabIndex (int index) override
 
virtual int tabIndex () const override
 
EventSignalblurred ()
 
EventSignalfocussed ()
 
virtual bool scrollVisibilityEnabled () const final override
 
virtual void setScrollVisibilityEnabled (bool enabled) final override
 
virtual int scrollVisibilityMargin () const final override
 
virtual void setScrollVisibilityMargin (int margin) final override
 
virtual Signal< bool > & scrollVisibilityChanged () final override
 
virtual bool isScrollVisible () const final override
 
virtual void setThemeStyleEnabled (bool enabled) final override
 
virtual bool isThemeStyleEnabled () const final override
 
virtual void setObjectName (const std::string &name) override
 
- Public Member Functions inherited from Wt::WWidget
virtual ~WWidget ()
 
WWidgetparent () const
 
std::unique_ptr< Widget > removeWidget (Widget *widget)
 
std::unique_ptr< WWidgetremoveFromParent ()
 
void setWidth (const WLength &width)
 
void setHeight (const WLength &height)
 
virtual void positionAt (const WWidget *widget, Orientation orientation=Orientation::Vertical)
 
virtual void toggleStyleClass (const WString &styleClass, bool add, bool force=false)
 
std::string jsRef () const
 
void setFocus ()
 
virtual void acceptDrops (const std::string &mimeType, const WString &hoverStyleClass=WString())
 
virtual void stopAcceptDrops (const std::string &mimeType)
 
virtual void htmlText (std::ostream &out)
 
bool isRendered () const
 
void hide ()
 
void animateHide (const WAnimation &animation)
 
void show ()
 
void animateShow (const WAnimation &animation)
 
void enable ()
 
void disable ()
 
bool layoutSizeAware () const
 
- Public Member Functions inherited from Wt::WObject
void addChild (std::unique_ptr< WObject > child)
 
Child * addChild (std::unique_ptr< Child > child)
 
std::unique_ptr< WObjectremoveChild (WObject *child)
 
std::unique_ptr< Child > removeChild (Child *child)
 
virtual std::string objectName () const
 
void resetLearnedSlots ()
 
void resetLearnedSlot (void(T::*method)())
 
WStatelessSlot * implementStateless (void(T::*method)())
 
WStatelessSlot * implementStateless (void(T::*method)(), void(T::*undoMethod)())
 
void isNotStateless ()
 
WStatelessSlot * implementJavaScript (void(T::*method)(), const std::string &jsCode)
 
- Public Member Functions inherited from Wt::Core::observable
 observable () noexcept
 
virtual ~observable ()
 
auto bindSafe (void(C::*method)(Args...)) noexcept
 
auto bindSafe (void(C::*method)(Args...) const) const noexcept
 
auto bindSafe (const Function &function) noexcept
 

Private Member Functions

void connectSignals (Wt::WFormWidget *w)
 
void update ()
 
void addXAxis ()
 
void addYAxis ()
 
void addAxis (Wt::Chart::Axis axis, int axisId)
 
void removeXAxis (const Wt::Chart::WAxis *axis)
 
void removeYAxis (const Wt::Chart::WAxis *axis)
 
void clearXAxes ()
 
void clearYAxes ()
 

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_
 
Wt::WStandardItemModelxAxesModel_
 
Wt::WStandardItemModelyAxesModel_
 
Wt::WStandardItemModelxScales_
 
Wt::WStandardItemModelyScales_
 
Wt::WTableaxisConfig_
 
Wt::WValidatoranyNumberValidator_
 
Wt::WValidatorangleValidator_
 

Additional Inherited Members

- Public Types inherited from Wt::WObject
typedef void(WObject::* Method) ()
 
- Static Public Member Functions inherited from Wt::WWebWidget
static std::string jsStringLiteral (const std::string &v, char delimiter='\'')
 
- Static Public Member Functions inherited from Wt::WWidget
static WString tr (const char *key)
 
- Protected Member Functions inherited from Wt::WInteractWidget
virtual void propagateSetEnabled (bool enabled) override
 
- Protected Member Functions inherited from Wt::WWebWidget
virtual void enableAjax () override
 
virtual WStatelessSlot * getStateless (Method method) override
 
virtual void render (WFlags< RenderFlag > flags) override
 
- Protected Member Functions inherited from Wt::WWidget
void setLayoutSizeAware (bool sizeAware)
 
virtual void layoutSizeChanged (int width, int height)
 
 WWidget ()
 
virtual void dropEvent (WDropEvent dropEvent)
 
virtual int boxPadding (Orientation orientation) const
 
virtual int boxBorder (Orientation orientation) const
 
void scheduleRender (WFlags< RepaintFlag > flags=None)
 

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 40 of file ChartConfig.h.

Constructor & Destructor Documentation

◆ ChartConfig()

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

Constructor.

Definition at line 77 of file ChartConfig.C.

78  : WContainerWidget(parent),
79  chart_(chart),
80  fill_(MinimumValueFill)
81 {
83  WBrush(WColor(0xFF, 0xFA, 0xE5)));
84 
85  PanelList *list = new PanelList(this);
86 
87  WIntValidator *sizeValidator = new WIntValidator(200, 2000, this);
88  sizeValidator->setMandatory(true);
89 
92 
93  angleValidator_ = new WDoubleValidator(-90, 90, this);
95 
96  // ---- Chart properties ----
97 
98  WStandardItemModel *orientation = new WStandardItemModel(0, 1, this);
99  addEntry(orientation, "Vertical");
100  addEntry(orientation, "Horizontal");
101 
102  WStandardItemModel *legendLocation = new WStandardItemModel(0, 1, this);
103  addEntry(legendLocation, "Outside");
104  addEntry(legendLocation, "Inside");
105 
106  WStandardItemModel *legendSide = new WStandardItemModel(0, 1, this);
107  addEntry(legendSide, "Top");
108  addEntry(legendSide, "Right");
109  addEntry(legendSide, "Bottom");
110  addEntry(legendSide, "Left");
111 
112  WStandardItemModel *legendAlignment = new WStandardItemModel(0, 1, this);
113  addEntry(legendAlignment, "AlignLeft");
114  addEntry(legendAlignment, "AlignCenter");
115  addEntry(legendAlignment, "AlignRight");
116  addEntry(legendAlignment, "AlignTop");
117  addEntry(legendAlignment, "AlignMiddle");
118  addEntry(legendAlignment, "AlignBottom");
119 
120  WTable *chartConfig = new WTable();
121  chartConfig->setMargin(WLength::Auto, Left | Right);
122 
123  int row = 0;
124  chartConfig->elementAt(row, 0)->addWidget(new WText("Title:"));
125  titleEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
127  ++row;
128 
129  chartConfig->elementAt(row, 0)->addWidget(new WText("Width:"));
130  chartWidthEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
132  ->setText(WLocale::currentLocale().toString(chart_->width().value()));
133  chartWidthEdit_->setValidator(sizeValidator);
136  ++row;
137 
138  chartConfig->elementAt(row, 0)->addWidget(new WText("Height:"));
139  chartHeightEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
141  ->setText(WLocale::currentLocale().toString(chart_->height().value()));
142  chartHeightEdit_->setValidator(sizeValidator);
145  ++row;
146 
147  chartConfig->elementAt(row, 0)->addWidget(new WText("Orientation:"));
148  chartOrientationEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
149  chartOrientationEdit_->setModel(orientation);
152  ++row;
153 
154  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend location:"));
155  legendLocationEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
156  legendLocationEdit_->setModel(legendLocation);
159  ++row;
160 
161  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend side:"));
162  legendSideEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
163  legendSideEdit_->setModel(legendSide);
166  ++row;
167 
168  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend alignment:"));
169  legendAlignmentEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
170  legendAlignmentEdit_->setModel(legendAlignment);
173  ++row;
174 
175  chartConfig->elementAt(row, 0)->addWidget(new WText("Border:"));
176  borderEdit_ = new WCheckBox(chartConfig->elementAt(row, 1));
177  borderEdit_->setChecked(false);
179  ++row;
180 
181  for (int i = 0; i < chartConfig->rowCount(); ++i) {
182  chartConfig->elementAt(i, 0)->setStyleClass("tdhead");
183  chartConfig->elementAt(i, 1)->setStyleClass("tddata");
184  }
185 
186  WPanel *p = list->addWidget("Chart properties", chartConfig);
187  p->setMargin(WLength::Auto, Left | Right);
188  p->resize(1160, WLength::Auto);
189  p->setMargin(20, Top | Bottom);
190 
191  // ---- Series properties ----
192 
193  WStandardItemModel *types = new WStandardItemModel(0, 1, this);
194  addEntry(types, "Points");
195  addEntry(types, "Line");
196  addEntry(types, "Curve");
197  addEntry(types, "Bar");
198  addEntry(types, "Line Area");
199  addEntry(types, "Curve Area");
200  addEntry(types, "Stacked Bar");
201  addEntry(types, "Stacked Line Area");
202  addEntry(types, "Stacked Curve Area");
203 
204  WStandardItemModel *markers = new WStandardItemModel(0, 1, this);
205  addEntry(markers, "None");
206  addEntry(markers, "Square");
207  addEntry(markers, "Circle");
208  addEntry(markers, "Cross");
209  addEntry(markers, "X cross");
210  addEntry(markers, "Triangle");
211  addEntry(markers, "Pipe");
212  addEntry(markers, "Star");
213  addEntry(markers, "Inverted triangle");
214  addEntry(markers, "Asterisk");
215  addEntry(markers, "Diamond");
216 
217  xAxesModel_ = new WStandardItemModel(0, 1, this);
218  addEntry(xAxesModel_, axisName(XAxis, 0));
219 
220  yAxesModel_ = new WStandardItemModel(0, 1, this);
221  addEntry(yAxesModel_, axisName(YAxis, 0));
222  addEntry(yAxesModel_, axisName(YAxis, 1));
223 
224  WStandardItemModel *labels = new WStandardItemModel(0, 1, this);
225  addEntry(labels, "None");
226  addEntry(labels, "X");
227  addEntry(labels, "Y");
228  addEntry(labels, "X: Y");
229 
230  WTable *seriesConfig = new WTable();
231  seriesConfig->setMargin(WLength::Auto, Left | Right);
232 
233  ::addHeader(seriesConfig, "Name");
234  ::addHeader(seriesConfig, "Enabled");
235  ::addHeader(seriesConfig, "Type");
236  ::addHeader(seriesConfig, "Marker");
237  ::addHeader(seriesConfig, "X axis");
238  ::addHeader(seriesConfig, "Y axis");
239  ::addHeader(seriesConfig, "Legend");
240  ::addHeader(seriesConfig, "Shadow");
241  ::addHeader(seriesConfig, "Value labels");
242 
243  seriesConfig->rowAt(0)->setStyleClass("trhead");
244 
245  for (int j = 1; j < chart->model()->columnCount(); ++j) {
246  SeriesControl sc;
247 
248  new WText(chart->model()->headerData(j),
249  seriesConfig->elementAt(j, 0));
250 
251  sc.enabledEdit = new WCheckBox(seriesConfig->elementAt(j, 1));
252  connectSignals(sc.enabledEdit);
253 
254  sc.typeEdit = new WComboBox(seriesConfig->elementAt(j, 2));
255  sc.typeEdit->setModel(types);
256  sc.typeEdit->setCurrentIndex(0);
257  connectSignals(sc.typeEdit);
258 
259  sc.markerEdit = new WComboBox(seriesConfig->elementAt(j, 3));
260  sc.markerEdit->setModel(markers);
261  sc.markerEdit->setCurrentIndex(0);
262  connectSignals(sc.markerEdit);
263 
264  sc.xAxisEdit = new WComboBox(seriesConfig->elementAt(j, 4));
265  sc.xAxisEdit->setModel(xAxesModel_);
266  sc.xAxisEdit->setCurrentIndex(0);
267  connectSignals(sc.xAxisEdit);
268 
269  sc.yAxisEdit = new WComboBox(seriesConfig->elementAt(j, 5));
270  sc.yAxisEdit->setModel(yAxesModel_);
271  sc.yAxisEdit->setCurrentIndex(0);
272  connectSignals(sc.yAxisEdit);
273 
274  sc.legendEdit = new WCheckBox(seriesConfig->elementAt(j, 6));
275  connectSignals(sc.legendEdit);
276 
277  sc.shadowEdit = new WCheckBox(seriesConfig->elementAt(j, 7));
278  connectSignals(sc.shadowEdit);
279 
280  sc.labelsEdit = new WComboBox(seriesConfig->elementAt(j, 8));
281  sc.labelsEdit->setModel(labels);
282  sc.labelsEdit->setCurrentIndex(0);
283  connectSignals(sc.labelsEdit);
284 
285  int si = seriesIndexOf(chart, j);
286 
287  if (si != -1) {
288  sc.enabledEdit->setChecked();
289  const WDataSeries& s = chart_->series(j);
290  switch (s.type()) {
291  case PointSeries:
292  sc.typeEdit->setCurrentIndex(0); break;
293  case LineSeries:
294  sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
295  (s.isStacked() ? 7 : 4) : 1); break;
296  case CurveSeries:
297  sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
298  (s.isStacked() ? 8 : 5) : 2); break;
299  case BarSeries:
300  sc.typeEdit->setCurrentIndex(s.isStacked() ? 6 : 3);
301  }
302 
303  sc.markerEdit->setCurrentIndex((int)s.marker());
304  sc.legendEdit->setChecked(s.isLegendEnabled());
305  sc.shadowEdit->setChecked(s.shadow() != WShadow());
306  }
307 
308  seriesControls_.push_back(sc);
309 
310  seriesConfig->rowAt(j)->setStyleClass("trdata");
311  }
312 
313  p = list->addWidget("Series properties", seriesConfig);
314  p->expand();
315  p->setMargin(WLength::Auto, Left | Right);
316  p->resize(1160, WLength::Auto);
317  p->setMargin(20, Top | Bottom);
318 
319  // ---- Axis properties ----
320 
321  yScales_ = new WStandardItemModel(0, 1, this);
322  addEntry(yScales_, "Linear scale");
323  addEntry(yScales_, "Log scale");
324 
325  xScales_ = new WStandardItemModel(0, 1, this);
326  addEntry(xScales_, "Categories");
327  addEntry(xScales_, "Linear scale");
328  addEntry(xScales_, "Log scale");
329  addEntry(xScales_, "Date scale");
330 
331  WContainerWidget *axisConfig = new WContainerWidget();
332  axisConfig_ = new WTable(axisConfig);
333  axisConfig_->setMargin(WLength::Auto, Left | Right);
334 
335  ::addHeader(axisConfig_, "Axis");
336  ::addHeader(axisConfig_, "Visible");
337  ::addHeader(axisConfig_, "Scale");
338  ::addHeader(axisConfig_, "Automatic");
339  ::addHeader(axisConfig_, "Minimum");
340  ::addHeader(axisConfig_, "Maximum");
341  ::addHeader(axisConfig_, "Gridlines");
342  ::addHeader(axisConfig_, "Label angle");
343  ::addHeader(axisConfig_, "Title");
344  ::addHeader(axisConfig_, "Title orientation");
345  ::addHeader(axisConfig_, "Tick direction");
346  ::addHeader(axisConfig_, "Location");
347 
348  axisConfig_->rowAt(0)->setStyleClass("trhead");
349 
350  addAxis(XAxis, 0);
351  addAxis(YAxis, 0);
352  addAxis(YAxis, 1);
353 
354  WPushButton *addXAxisBtn =
355  new WPushButton(Wt::utf8("Add X axis"), axisConfig);
356  addXAxisBtn->clicked().connect(this, &ChartConfig::addXAxis);
357  WPushButton *clearXAxesBtn =
358  new WPushButton(Wt::utf8("Clear X axes"), axisConfig);
359  clearXAxesBtn->clicked().connect(this, &ChartConfig::clearXAxes);
360  WPushButton *addYAxisBtn =
361  new WPushButton(Wt::utf8("Add Y axis"), axisConfig);
362  addYAxisBtn->clicked().connect(this, &ChartConfig::addYAxis);
363  WPushButton *clearYAxesBtn =
364  new WPushButton(Wt::utf8("Clear Y axes"), axisConfig);
365  clearYAxesBtn->clicked().connect(this, &ChartConfig::clearYAxes);
366 
367  p = list->addWidget("Axis properties", axisConfig);
368  p->setMargin(WLength::Auto, Left | Right);
369  p->resize(1160, WLength::Auto);
370  p->setMargin(20, Top | Bottom);
371 
372  /*
373  * If we do not have JavaScript, then add a button to reflect changes to
374  * the chart.
375  */
376  if (!WApplication::instance()->environment().javaScript()) {
377  WPushButton *b = new WPushButton(this);
378  b->setText("Update chart");
379  b->setInline(false); // so we can add margin to center horizontally
380  b->setMargin(WLength::Auto, Left | Right);
381  b->clicked().connect(this, &ChartConfig::update);
382  }
383 }
void expand()
Wt::WCheckBox * borderEdit_
Definition: ChartConfig.h:93
virtual void setStyleClass(const WString &styleClass) override
MarkerType marker() const
virtual void setText(const WString &text)
Wt::WValidator * angleValidator_
Definition: ChartConfig.h:97
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:51
Wt::WValidator * anyNumberValidator_
Definition: ChartConfig.h:97
EventSignal< WMouseEvent > & clicked()
Wt::WLineEdit * titleEdit_
Definition: ChartConfig.h:86
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:50
FillRangeType fillRange() const
Wt::WTable * axisConfig_
Definition: ChartConfig.h:96
void connectSignals(Wt::WFormWidget *w)
Definition: ChartConfig.C:658
void setLegendStyle(const WFont &font, const WPen &border, const WBrush &background)
Wt::WStandardItemModel * xAxesModel_
Definition: ChartConfig.h:95
Wt::WStandardItemModel * xScales_
Definition: ChartConfig.h:95
void setModel(const std::shared_ptr< WAbstractItemModel > model)
bool isLegendEnabled() const
bool setText(const WString &text)
virtual WLength height() const override
virtual void setMargin(const WLength &margin, WFlags< Side > sides=AllSides) override
Wt::WLineEdit * chartWidthEdit_
Definition: ChartConfig.h:87
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:89
void setValidator(const std::shared_ptr< WValidator > &validator)
virtual WLength width() const override
Wt::WComboBox * legendLocationEdit_
Definition: ChartConfig.h:90
std::vector< SeriesControl > seriesControls_
Controls for series.
Definition: ChartConfig.h:66
void setCurrentIndex(int index)
void addXAxis()
Definition: ChartConfig.C:665
void clearXAxes()
Definition: ChartConfig.C:813
void setStyleClass(const WString &style)
WDataSeries & series(int modelColumn)
void setMaxLength(int length)
Wt::WComboBox * legendSideEdit_
Definition: ChartConfig.h:91
void update()
Definition: ChartConfig.C:390
Wt::WStandardItemModel * yAxesModel_
Definition: ChartConfig.h:95
int rowCount() const
std::shared_ptr< WAbstractChartModel > model() const
SeriesType type() const
Wt::WStandardItemModel * yScales_
Definition: ChartConfig.h:95
void setMandatory(bool how)
bool isStacked() const
virtual void resize(const WLength &width, const WLength &height) override
double value() const
void addYAxis()
Definition: ChartConfig.C:674
virtual void setMargin(const WLength &margin, WFlags< Side > sides=AllSides) override
Wt::WComboBox * legendAlignmentEdit_
Definition: ChartConfig.h:92
void setChecked(bool checked)
void clearYAxes()
Definition: ChartConfig.C:830
WTableRow * rowAt(int row)
virtual void addWidget(std::unique_ptr< WWidget > widget)
virtual void setInline(bool isInline) override
const WShadow & shadow() const
Wt::WLineEdit * chartHeightEdit_
Definition: ChartConfig.h:88
void addAxis(Wt::Chart::Axis axis, int axisId)
Definition: ChartConfig.C:683

Member Function Documentation

◆ addAxis()

void ChartConfig::addAxis ( Wt::Chart::Axis  axis,
int  axisId 
)
private

Definition at line 683 of file ChartConfig.C.

684 {
685  int j = ax == XAxis ? 1 + axisId : 1 + chart_->xAxisCount() + axisId;
686 
687  const WAxis& axis = ax == XAxis ? chart_->xAxis(axisId) : chart_->yAxis(axisId);
688  AxisControl sc;
689 
691  new WText(axisName(axis.id(), ax == XAxis ? axis.xAxisId() : axis.yAxisId()), axisConfig_->elementAt(j, 0));
692 
693  sc.visibleEdit = new WCheckBox(axisConfig_->elementAt(j, 1));
694  sc.visibleEdit->setChecked(axis.isVisible());
695  connectSignals(sc.visibleEdit);
696 
697  sc.scaleEdit = new WComboBox(axisConfig_->elementAt(j, 2));
698  if (axis.scale() == CategoryScale)
699  sc.scaleEdit->addItem("Category scale");
700  else {
701  if (axis.id() == XAxis) {
702  sc.scaleEdit->setModel(xScales_);
703  sc.scaleEdit->setCurrentIndex(axis.scale());
704  } else {
705  sc.scaleEdit->setModel(yScales_);
706  sc.scaleEdit->setCurrentIndex(axis.scale() - 1);
707  }
708  }
709  connectSignals(sc.scaleEdit);
710 
711  bool autoValues = axis.autoLimits() == (MinimumValue | MaximumValue);
712 
713  sc.minimumEdit = new WLineEdit(axisConfig_->elementAt(j, 4));
714  sc.minimumEdit->setText(WLocale::currentLocale()
715  .toString(axis.minimum()));
716  sc.minimumEdit->setValidator(anyNumberValidator_);
717  sc.minimumEdit->setEnabled(!autoValues);
718  connectSignals(sc.minimumEdit);
719 
720  sc.maximumEdit = new WLineEdit(axisConfig_->elementAt(j, 5));
721  sc.maximumEdit->setText(WLocale::currentLocale()
722  .toString(axis.maximum()));
723  sc.maximumEdit->setValidator(anyNumberValidator_);
724  sc.maximumEdit->setEnabled(!autoValues);
725  connectSignals(sc.maximumEdit);
726 
727  sc.autoEdit = new WCheckBox(axisConfig_->elementAt(j, 3));
728  sc.autoEdit->setChecked(autoValues);
729  connectSignals(sc.autoEdit);
730  sc.autoEdit->checked().connect(sc.maximumEdit, &WLineEdit::disable);
731  sc.autoEdit->unChecked().connect(sc.maximumEdit, &WLineEdit::enable);
732  sc.autoEdit->checked().connect(sc.minimumEdit, &WLineEdit::disable);
733  sc.autoEdit->unChecked().connect(sc.minimumEdit, &WLineEdit::enable);
734 
735  sc.gridLinesEdit = new WCheckBox(axisConfig_->elementAt(j, 6));
736  connectSignals(sc.gridLinesEdit);
737 
738  sc.labelAngleEdit = new WLineEdit(axisConfig_->elementAt(j, 7));
739  sc.labelAngleEdit->setText("0");
740  sc.labelAngleEdit->setValidator(angleValidator_);
741  connectSignals(sc.labelAngleEdit);
742 
743  sc.titleEdit = new WLineEdit(axisConfig_->elementAt(j, 8));
744  sc.titleEdit->setText("");
745  connectSignals(sc.titleEdit);
746 
747  sc.titleOrientationEdit = new WComboBox(axisConfig_->elementAt(j, 9));
748  sc.titleOrientationEdit->addItem("Horizontal");
749  sc.titleOrientationEdit->addItem("Vertical");
750  sc.titleOrientationEdit->setCurrentIndex(0);
751  connectSignals(sc.titleOrientationEdit);
752 
753  sc.tickDirectionEdit = new WComboBox(axisConfig_->elementAt(j, 10));
754  sc.tickDirectionEdit->addItem("Outwards");
755  sc.tickDirectionEdit->addItem("Inwards");
756  sc.tickDirectionEdit->setCurrentIndex(0);
757  connectSignals(sc.tickDirectionEdit);
758 
759  sc.locationEdit = new WComboBox(axisConfig_->elementAt(j, 11));
760  sc.locationEdit->addItem("Minimum value");
761  sc.locationEdit->addItem("Maximum value");
762  sc.locationEdit->addItem("Zero value");
763  sc.locationEdit->addItem("Both sides");
764  sc.locationEdit->setCurrentIndex(0);
765  if (axis.location() == MaximumValue) {
766  sc.locationEdit->setCurrentIndex(1);
767  } else if (axis.location() == ZeroValue) {
768  sc.locationEdit->setCurrentIndex(2);
769  }
770  connectSignals(sc.locationEdit);
771 
772  WPushButton *removeAxisButton =
773  new WPushButton(Wt::utf8("x"), axisConfig_->elementAt(j, 12));
774  if (ax == XAxis) {
775  removeAxisButton->clicked().connect(boost::bind(&ChartConfig::removeXAxis, this, &axis));
776  } else {
777  removeAxisButton->clicked().connect(boost::bind(&ChartConfig::removeYAxis, this, &axis));
778  }
779 
780  axisConfig_->rowAt(j)->setStyleClass("trdata");
781 
782  axisControls_.insert(axisControls_.begin() + j - 1, sc);
783 }
int yAxisId() const
virtual void setText(const WString &text)
Wt::WValidator * angleValidator_
Definition: ChartConfig.h:97
Wt::WValidator * anyNumberValidator_
Definition: ChartConfig.h:97
EventSignal< WMouseEvent > & clicked()
void removeXAxis(const Wt::Chart::WAxis *axis)
Definition: ChartConfig.C:785
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:50
void addItem(const WString &text)
Axis id() const
double minimum() const
Wt::WTable * axisConfig_
Definition: ChartConfig.h:96
void connectSignals(Wt::WFormWidget *w)
Definition: ChartConfig.C:658
bool isVisible() const
Wt::WStandardItemModel * xScales_
Definition: ChartConfig.h:95
int xAxisId() const
void removeYAxis(const Wt::Chart::WAxis *axis)
Definition: ChartConfig.C:799
WTableCell * elementAt(int row, int column)
WFlags< AxisValue > autoLimits() const
void setStyleClass(const WString &style)
std::vector< AxisControl > axisControls_
Controls for axes.
Definition: ChartConfig.h:84
Wt::WStandardItemModel * yScales_
Definition: ChartConfig.h:95
virtual WTableRow * insertRow(int row, std::unique_ptr< WTableRow > tableRow=nullptr)
AxisScale scale() const
AxisValue location() const
void setChecked(bool checked)
double maximum() const
WTableRow * rowAt(int row)

◆ addXAxis()

void ChartConfig::addXAxis ( )
private

Definition at line 665 of file ChartConfig.C.

666 {
667  int xAxis = chart_->addXAxis(new WAxis());
668  addAxis(XAxis, xAxis);
669  addEntry(xAxesModel_, axisName(XAxis, xAxis));
670  if (xAxis == 0)
671  update();
672 }
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:50
Wt::WStandardItemModel * xAxesModel_
Definition: ChartConfig.h:95
void update()
Definition: ChartConfig.C:390
int addXAxis(std::unique_ptr< WAxis > waxis)
void addAxis(Wt::Chart::Axis axis, int axisId)
Definition: ChartConfig.C:683

◆ addYAxis()

void ChartConfig::addYAxis ( )
private

Definition at line 674 of file ChartConfig.C.

675 {
676  int yAxis = chart_->addYAxis(new WAxis());
677  addAxis(YAxis, yAxis);
678  addEntry(yAxesModel_, axisName(YAxis, yAxis));
679  if (yAxis == 0)
680  update();
681 }
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:50
void update()
Definition: ChartConfig.C:390
Wt::WStandardItemModel * yAxesModel_
Definition: ChartConfig.h:95
int addYAxis(std::unique_ptr< WAxis > waxis)
void addAxis(Wt::Chart::Axis axis, int axisId)
Definition: ChartConfig.C:683

◆ clearXAxes()

void ChartConfig::clearXAxes ( )
private

Definition at line 813 of file ChartConfig.C.

814 {
815  if (chart_->xAxisCount() == 0)
816  return;
817 
818  for (std::size_t i = 0; i < chart_->series().size(); ++i) {
819  chart_->series()[i]->bindToXAxis(-1);
820  }
821  const int xAxisCount = chart_->xAxisCount();
822  chart_->clearXAxes();
823  for (int i = 0; i < xAxisCount; ++i) {
824  axisConfig_->deleteRow(1);
825  }
826  xAxesModel_->clear();
827  axisControls_.erase(axisControls_.begin(), axisControls_.begin() + xAxisCount);
828 }
void bindToXAxis(int xAxis)
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:50
Wt::WTable * axisConfig_
Definition: ChartConfig.h:96
Wt::WStandardItemModel * xAxesModel_
Definition: ChartConfig.h:95
WDataSeries & series(int modelColumn)
std::vector< AxisControl > axisControls_
Controls for axes.
Definition: ChartConfig.h:84

◆ clearYAxes()

void ChartConfig::clearYAxes ( )
private

Definition at line 830 of file ChartConfig.C.

831 {
832  if (chart_->yAxisCount() == 0)
833  return;
834 
835  for (std::size_t i = 0; i < chart_->series().size(); ++i) {
836  chart_->series()[i]->bindToYAxis(-1);
837  }
838  const int yAxisCount = chart_->yAxisCount();
839  chart_->clearYAxes();
840  for (int i = 0; i < yAxisCount; ++i) {
841  axisConfig_->deleteRow(axisConfig_->rowCount() - 1);
842  }
843  yAxesModel_->clear();
844  axisControls_.resize(chart_->xAxisCount());
845 }
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:50
Wt::WTable * axisConfig_
Definition: ChartConfig.h:96
WDataSeries & series(int modelColumn)
std::vector< AxisControl > axisControls_
Controls for axes.
Definition: ChartConfig.h:84
Wt::WStandardItemModel * yAxesModel_
Definition: ChartConfig.h:95
int rowCount() const
void bindToYAxis(int yAxis)

◆ connectSignals()

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

Definition at line 658 of file ChartConfig.C.

659 {
660  w->changed().connect(this, &ChartConfig::update);
661  if (dynamic_cast<WLineEdit *>(w))
663 }
void update()
Definition: ChartConfig.C:390
EventSignal & enterPressed()
EventSignal & changed()
Wt::Signals::connection connect(F function)

◆ removeXAxis()

void ChartConfig::removeXAxis ( const Wt::Chart::WAxis axis)
private

Definition at line 785 of file ChartConfig.C.

786 {
787  int xAxis = axis->xAxisId();
788  for (std::size_t i = 0; i < chart_->series().size(); ++i) {
789  if (chart_->series()[i]->xAxis() == xAxis)
790  chart_->series()[i]->bindToXAxis(-1);
791  }
792  chart_->removeXAxis(xAxis);
793  axisConfig_->deleteRow(1 + xAxis);
794  xAxesModel_->removeRow(xAxis);
795  axisControls_.erase(axisControls_.begin() + xAxis);
796  update();
797 }
void bindToXAxis(int xAxis)
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:50
Wt::WTable * axisConfig_
Definition: ChartConfig.h:96
Wt::WStandardItemModel * xAxesModel_
Definition: ChartConfig.h:95
std::unique_ptr< WAxis > removeXAxis(int xAxisId)
int xAxisId() const
WDataSeries & series(int modelColumn)
std::vector< AxisControl > axisControls_
Controls for axes.
Definition: ChartConfig.h:84
void update()
Definition: ChartConfig.C:390
bool removeRow(int row, const WModelIndex &parent=WModelIndex())

◆ removeYAxis()

void ChartConfig::removeYAxis ( const Wt::Chart::WAxis axis)
private

Definition at line 799 of file ChartConfig.C.

800 {
801  int yAxis = axis->yAxisId();
802  for (std::size_t i = 0; i < chart_->series().size(); ++i) {
803  if (chart_->series()[i]->yAxis() == yAxis)
804  chart_->series()[i]->bindToYAxis(-1);
805  }
806  chart_->removeYAxis(yAxis);
807  axisConfig_->deleteRow(1 + chart_->xAxisCount() + yAxis);
808  yAxesModel_->removeRow(yAxis);
809  axisControls_.erase(axisControls_.begin() + chart_->xAxisCount() + yAxis);
810  update();
811 }
int yAxisId() const
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:50
Wt::WTable * axisConfig_
Definition: ChartConfig.h:96
WDataSeries & series(int modelColumn)
std::vector< AxisControl > axisControls_
Controls for axes.
Definition: ChartConfig.h:84
void update()
Definition: ChartConfig.C:390
Wt::WStandardItemModel * yAxesModel_
Definition: ChartConfig.h:95
bool removeRow(int row, const WModelIndex &parent=WModelIndex())
std::unique_ptr< WAxis > removeYAxis(int yAxisId)
void bindToYAxis(int yAxis)

◆ setValueFill()

void ChartConfig::setValueFill ( Wt::Chart::FillRangeType  fill)

Definition at line 385 of file ChartConfig.C.

386 {
387  fill_ = fill;
388 }
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:51

◆ update()

void ChartConfig::update ( )
private

Definition at line 390 of file ChartConfig.C.

391 {
392  bool haveLegend = false;
393  std::vector<WDataSeries *> series;
394 
395  for (int i = 1; i < chart_->model()->columnCount(); ++i) {
396  SeriesControl& sc = seriesControls_[i-1];
397 
398  if (sc.enabledEdit->isChecked()) {
399  WDataSeries *s = new WDataSeries(i);
400 
401  switch (sc.typeEdit->currentIndex()) {
402  case 0:
403  s->setType(PointSeries);
404  if (sc.markerEdit->currentIndex() == 0)
405  sc.markerEdit->setCurrentIndex(1);
406  break;
407  case 1:
408  s->setType(LineSeries);
409  break;
410  case 2:
411  s->setType(CurveSeries);
412  break;
413  case 3:
414  s->setType(BarSeries);
415  break;
416  case 4:
417  s->setType(LineSeries);
418  s->setFillRange(fill_);
419  break;
420  case 5:
421  s->setType(CurveSeries);
422  s->setFillRange(fill_);
423  break;
424  case 6:
425  s->setType(BarSeries);
426  s->setStacked(true);
427  break;
428  case 7:
429  s->setType(LineSeries);
430  s->setFillRange(fill_);
431  s->setStacked(true);
432  break;
433  case 8:
434  s->setType(CurveSeries);
435  s->setFillRange(fill_);
436  s->setStacked(true);
437  }
438 
439  //set WPainterPath to draw a pipe
440  if(sc.markerEdit->currentIndex() == CustomMarker){
441  WPainterPath pp = WPainterPath();
442  pp.moveTo(0, -6);
443  pp.lineTo(0, 6);
444  s->setCustomMarker(pp);
445  }
446 
447  s->setMarker(static_cast<MarkerType>(sc.markerEdit->currentIndex()));
448 
449  s->bindToXAxis(sc.xAxisEdit->currentIndex());
450  s->bindToYAxis(sc.yAxisEdit->currentIndex());
451 
452  if (sc.legendEdit->isChecked()) {
453  s->setLegendEnabled(true);
454  haveLegend = true;
455  } else
456  s->setLegendEnabled(false);
457 
458  if (sc.shadowEdit->isChecked()) {
459  s->setShadow(WShadow(3, 3, WColor(0, 0, 0, 127), 3));
460  } else
461  s->setShadow(WShadow());
462 
463  switch (sc.labelsEdit->currentIndex()) {
464  case 1:
465  s->setLabelsEnabled(XAxis);
466  break;
467  case 2:
468  s->setLabelsEnabled(YAxis);
469  break;
470  case 3:
471  s->setLabelsEnabled(XAxis);
472  s->setLabelsEnabled(YAxis);
473  break;
474  }
475 
476  series.push_back(s);
477  }
478  }
479 
480  chart_->setSeries(series);
481 
482  for (std::size_t i = 0; i < axisControls_.size(); ++i) {
483  AxisControl& sc = axisControls_[i];
484  WAxis& axis = static_cast<int>(i) < chart_->xAxisCount() ? chart_->xAxis(i) : chart_->yAxis(i - chart_->xAxisCount());
485 
486  axis.setVisible(sc.visibleEdit->isChecked());
487 
488  if (sc.scaleEdit->count() != 1) {
489  int k = sc.scaleEdit->currentIndex();
490  if (axis.id() != XAxis)
491  k += 1;
492  else {
493  if (k == 0)
494  chart_->setType(CategoryChart);
495  else
496  chart_->setType(ScatterPlot);
497  }
498 
499  switch (k) {
500  case 1:
501  axis.setScale(LinearScale); break;
502  case 2:
503  axis.setScale(LogScale); break;
504  case 3:
505  axis.setScale(DateScale); break;
506  }
507  }
508 
509  if (sc.autoEdit->isChecked())
511  else {
512  if (axis.autoLimits() & (MinimumValue | MaximumValue)) {
513  sc.minimumEdit->setText(WLocale::currentLocale()
514  .toString(axis.minimum()));
515  sc.maximumEdit->setText(WLocale::currentLocale()
516  .toString(axis.maximum()));
517  }
518  if (validate(sc.minimumEdit) && validate(sc.maximumEdit)) {
519  double min, max;
520  getDouble(sc.minimumEdit, min);
521  getDouble(sc.maximumEdit, max);
522 
523  if (axis.scale() == LogScale)
524  if (min <= 0)
525  min = 0.0001;
526 
527  if (axis.scale() == DateScale){
528  //the number of julian days until year 1986
529  WDate dMin = WDate(1900,1,1);
530  double gregDaysMin = (double)dMin.toJulianDay();
531  //the number of julian days until year 1988
532  WDate dMax = WDate(3000,1,1);
533  double gregDaysMax = (double)dMax.toJulianDay();
534 
535  bool greg_year_validation =
536  (min > gregDaysMin &&
537  min < gregDaysMax &&
538  max > gregDaysMin &&
539  max < gregDaysMax);
540 
541  if(!greg_year_validation){
542  min = gregDaysMin;
543  max = gregDaysMax;
544  }
545  }
546 
547  axis.setRange(min, max);
548  }
549 
550  }
551 
552  if (validate(sc.labelAngleEdit)) {
553  double angle;
554  getDouble(sc.labelAngleEdit, angle);
555  axis.setLabelAngle(angle);
556  }
557 
558  axis.setGridLinesEnabled(sc.gridLinesEdit->isChecked());
559 
560  axis.setTitle(sc.titleEdit->text());
561 
562  axis.setTitleOrientation(sc.titleOrientationEdit->currentIndex() == 0 ? Horizontal : Vertical);
563 
564  axis.setTickDirection(sc.tickDirectionEdit->currentIndex() == 0 ? Outwards : Inwards);
565 
566  switch (sc.locationEdit->currentIndex()) {
567  case 0:
569  break;
570  case 1:
572  break;
573  case 2:
574  axis.setLocation(ZeroValue);
575  break;
576  case 3:
577  axis.setLocation(BothSides);
578  break;
579  }
580  }
581 
583 
585  double width, height;
586  getDouble(chartWidthEdit_, width);
587  getDouble(chartHeightEdit_, height);
588  chart_->resize(width, height);
589  }
590 
591  switch (chartOrientationEdit_->currentIndex()) {
592  case 0:
593  chart_->setOrientation(Vertical); break;
594  case 1:
595  chart_->setOrientation(Horizontal); break;
596  }
597 
598  chart_->setLegendEnabled(haveLegend);
599 
600  if (haveLegend) {
601  LegendLocation location = LegendOutside;
602  Side side = Right;
603  AlignmentFlag alignment = AlignMiddle;
604  switch (legendLocationEdit_->currentIndex()) {
605  case 0: location = LegendOutside; break;
606  case 1: location = LegendInside; break;
607  }
608 
609  switch (legendSideEdit_->currentIndex()) {
610  case 0: side = Top; break;
611  case 1: side = Right; break;
612  case 2: side = Bottom; break;
613  case 3: side = Left; break;
614  }
615 
616  if (side == Left || side == Right) {
619  } else {
622  }
623 
624  switch (legendAlignmentEdit_->currentIndex()) {
625  case 0: alignment = AlignLeft; break;
626  case 1: alignment = AlignCenter; break;
627  case 2: alignment = AlignRight; break;
628  case 3: alignment = AlignTop; break;
629  case 4: alignment = AlignMiddle; break;
630  case 5: alignment = AlignBottom; break;
631  }
632 
633  chart_->setLegendLocation(location, side, alignment);
634 
635  chart_->setLegendColumns((side == Top || side == Bottom ) ? 2 : 1,
636  WLength(100));
637  }
638 
639  if (borderEdit_->isChecked()) {
641  } else {
642  chart_->setBorderPen(NoPen);
643  }
644 }
void setVisible(bool visible)
Wt::WCheckBox * borderEdit_
Definition: ChartConfig.h:93
void setType(SeriesType t)
void lineTo(const WPointF &point)
const WString & text() const
int toJulianDay() const
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:51
void bindToXAxis(int xAxis)
Wt::WLineEdit * titleEdit_
Definition: ChartConfig.h:86
void setGridLinesEnabled(bool enabled)
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:50
void setTickDirection(TickDirection direction)
Axis id() const
double minimum() const
void setLocation(AxisValue value)
void setShadow(const WShadow &shadow)
void setType(ChartType type)
void setMarker(MarkerType marker)
AlignmentFlag
void setLegendLocation(LegendLocation location, Side side, AlignmentFlag alignment)
virtual WLength height() const override
void setLegendEnabled(bool enabled)
Wt::WLineEdit * chartWidthEdit_
Definition: ChartConfig.h:87
WFlags< AxisValue > autoLimits() const
Wt::WComboBox * chartOrientationEdit_
Definition: ChartConfig.h:89
virtual WLength width() const override
Wt::WComboBox * legendLocationEdit_
Definition: ChartConfig.h:90
std::vector< SeriesControl > seriesControls_
Controls for series.
Definition: ChartConfig.h:66
void setCurrentIndex(int index)
void setSeries(std::vector< std::unique_ptr< WDataSeries > > series)
virtual void resize(const WLength &width, const WLength &height) override
void setScale(AxisScale scale)
void setTitleOrientation(const Orientation &orientation)
void setCustomMarker(const WPainterPath &path)
void setAutoLimits(WFlags< AxisValue > locations)
Wt::WComboBox * legendSideEdit_
Definition: ChartConfig.h:91
std::vector< AxisControl > axisControls_
Controls for axes.
Definition: ChartConfig.h:84
void setLabelsEnabled(Axis axis, bool enabled=true)
void moveTo(const WPointF &point)
std::shared_ptr< WAbstractChartModel > model() const
void setStacked(bool stacked)
void setOrientation(Orientation orientation)
void setBorderPen(const WPen &pen)
int currentIndex() const
void setRange(double minimum, double maximum)
void setLegendEnabled(bool enabled)
AxisScale scale() const
Wt::WComboBox * legendAlignmentEdit_
Definition: ChartConfig.h:92
double maximum() const
void setTitle(const WString &title)
void setLabelAngle(double angle)
void setFillRange(FillRangeType fillRange)
void setLegendColumns(int columns, const WLength &width)
static bool validate(Wt::WFormWidget *w)
Definition: ChartConfig.C:646
Wt::WLineEdit * chartHeightEdit_
Definition: ChartConfig.h:88
void setTitle(const WString &title)
void bindToYAxis(int yAxis)

◆ validate()

bool ChartConfig::validate ( Wt::WFormWidget w)
staticprivate

Definition at line 646 of file ChartConfig.C.

647 {
648  bool valid = w->validate() == WValidator::Valid;
649 
650  if (!WApplication::instance()->environment().javaScript()) {
651  w->setStyleClass(valid ? "" : "Wt-invalid");
652  w->setToolTip(valid ? "" : "Invalid value");
653  }
654 
655  return valid;
656 }
virtual void setStyleClass(const WString &styleClass) override
virtual void setToolTip(const WString &text, TextFormat textFormat=TextFormat::Plain) override
virtual ValidationState validate()

Member Data Documentation

◆ angleValidator_

Wt::WValidator * ChartConfig::angleValidator_
private

Definition at line 97 of file ChartConfig.h.

◆ anyNumberValidator_

Wt::WValidator* ChartConfig::anyNumberValidator_
private

Definition at line 97 of file ChartConfig.h.

◆ axisConfig_

Wt::WTable* ChartConfig::axisConfig_
private

Definition at line 96 of file ChartConfig.h.

◆ axisControls_

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

Controls for axes.

Definition at line 84 of file ChartConfig.h.

◆ borderEdit_

Wt::WCheckBox* ChartConfig::borderEdit_
private

Definition at line 93 of file ChartConfig.h.

◆ chart_

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

Definition at line 50 of file ChartConfig.h.

◆ chartHeightEdit_

Wt::WLineEdit* ChartConfig::chartHeightEdit_
private

Definition at line 88 of file ChartConfig.h.

◆ chartOrientationEdit_

Wt::WComboBox* ChartConfig::chartOrientationEdit_
private

Definition at line 89 of file ChartConfig.h.

◆ chartWidthEdit_

Wt::WLineEdit* ChartConfig::chartWidthEdit_
private

Definition at line 87 of file ChartConfig.h.

◆ fill_

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

Definition at line 51 of file ChartConfig.h.

◆ legendAlignmentEdit_

Wt::WComboBox* ChartConfig::legendAlignmentEdit_
private

Definition at line 92 of file ChartConfig.h.

◆ legendLocationEdit_

Wt::WComboBox* ChartConfig::legendLocationEdit_
private

Definition at line 90 of file ChartConfig.h.

◆ legendSideEdit_

Wt::WComboBox* ChartConfig::legendSideEdit_
private

Definition at line 91 of file ChartConfig.h.

◆ seriesControls_

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

Controls for series.

Definition at line 66 of file ChartConfig.h.

◆ titleEdit_

Wt::WLineEdit* ChartConfig::titleEdit_
private

Definition at line 86 of file ChartConfig.h.

◆ xAxesModel_

Wt::WStandardItemModel* ChartConfig::xAxesModel_
private

Definition at line 95 of file ChartConfig.h.

◆ xScales_

Wt::WStandardItemModel * ChartConfig::xScales_
private

Definition at line 95 of file ChartConfig.h.

◆ yAxesModel_

Wt::WStandardItemModel * ChartConfig::yAxesModel_
private

Definition at line 95 of file ChartConfig.h.

◆ yScales_

Wt::WStandardItemModel * ChartConfig::yScales_
private

Definition at line 95 of file ChartConfig.h.


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

Generated on Tue Dec 15 2020 for the C++ Web Toolkit (Wt) by doxygen 1.8.13