Wt examples  3.3.8
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 *parent=0)
 
 ~WContainerWidget ()
 
void setLayout (WLayout *layout)
 
void setLayout (WLayout *layout, WFlags< AlignmentFlag > alignment)
 
WLayoutlayout ()
 
virtual void addWidget (WWidget *widget)
 
virtual void insertBefore (WWidget *widget, WWidget *before)
 
virtual void insertWidget (int index, WWidget *widget)
 
virtual void removeWidget (WWidget *widget)
 
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=All)
 
WLength padding (Side side) const
 
WFlags< AlignmentFlagcontentAlignment () const
 
void setOverflow (Overflow overflow, WFlags< Orientation > orientation=(Horizontal|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 (WContainerWidget *parent=0)
 
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=0, bool isDragWidgetOnly=false, WObject *sourceWidget=0)
 
void unsetDraggable ()
 
void setMouseOverDelay (int delay)
 
int mouseOverDelay () const
 
virtual void setPopup (bool popup)
 
virtual void load ()
 
virtual bool isEnabled () const
 
- Public Member Functions inherited from Wt::WWebWidget
 WWebWidget (WContainerWidget *parent=0)
 
virtual void setPositionScheme (PositionScheme scheme)
 
virtual PositionScheme positionScheme () const
 
virtual void setOffsets (const WLength &offset, WFlags< Side > sides=All)
 
virtual WLength offset (Side s) const
 
virtual void resize (const WLength &width, const WLength &height)
 
virtual WLength width () const
 
virtual WLength height () const
 
virtual void setMinimumSize (const WLength &width, const WLength &height)
 
virtual WLength minimumWidth () const
 
virtual WLength minimumHeight () const
 
virtual void setMaximumSize (const WLength &width, const WLength &height)
 
virtual WLength maximumWidth () const
 
virtual WLength maximumHeight () const
 
virtual void setLineHeight (const WLength &height)
 
virtual WLength lineHeight () const
 
virtual void setFloatSide (Side s)
 
virtual Side floatSide () const
 
virtual void setClearSides (WFlags< Side > sides)
 
virtual WFlags< SideclearSides () const
 
virtual void setMargin (const WLength &margin, WFlags< Side > sides=All)
 
virtual WLength margin (Side side) const
 
virtual void setHiddenKeepsGeometry (bool enabled)
 
virtual bool hiddenKeepsGeometry () const
 
virtual void setHidden (bool hidden, const WAnimation &animation=WAnimation())
 
virtual bool isHidden () const
 
virtual bool isVisible () const
 
virtual void setDisabled (bool disabled)
 
virtual bool isDisabled () const
 
virtual bool isPopup () const
 
virtual void setInline (bool isInline)
 
virtual bool isInline () const
 
virtual void setDecorationStyle (const WCssDecorationStyle &style)
 
virtual WCssDecorationStyledecorationStyle ()
 
virtual void setStyleClass (const WString &styleClass)
 
virtual WString styleClass () const
 
virtual void addStyleClass (const WString &styleClass, bool force=false)
 
virtual void removeStyleClass (const WString &styleClass, bool force=false)
 
virtual bool hasStyleClass (const WString &styleClass) const
 
virtual void setVerticalAlignment (AlignmentFlag alignment, const WLength &length=WLength())
 
virtual AlignmentFlag verticalAlignment () const
 
virtual WLength verticalAlignmentLength () const
 
virtual void setToolTip (const WString &text, TextFormat textFormat=PlainText)
 
virtual void setDeferredToolTip (bool enable, TextFormat textFormat=PlainText)
 
virtual WString toolTip () const
 
virtual void refresh ()
 
virtual void setAttributeValue (const std::string &name, const WString &value)
 
virtual WString attributeValue (const std::string &name) const
 
virtual void setJavaScriptMember (const std::string &name, const std::string &value)
 
virtual std::string javaScriptMember (const std::string &name) const
 
virtual void callJavaScriptMember (const std::string &name, const std::string &args)
 
virtual bool loaded () const
 
virtual void setId (const std::string &id)
 
virtual WWidgetfind (const std::string &name)
 
virtual WWidgetfindById (const std::string &id)
 
virtual void setSelectable (bool selectable)
 
virtual void doJavaScript (const std::string &javascript)
 
virtual const std::string id () const
 
void setLoadLaterWhenInvisible (bool)
 
std::string htmlTagName () const
 
void setHtmlTagName (const std::string &tag)
 
const std::vector< WWidget * > & children () const
 
SignalchildrenChanged ()
 
virtual void setCanReceiveFocus (bool enabled)
 
virtual bool canReceiveFocus () const
 
virtual bool setFirstFocus ()
 
virtual void setFocus (bool focus)
 
virtual bool hasFocus () const
 
virtual void setTabIndex (int index)
 
virtual int tabIndex () const
 
EventSignalblurred ()
 
EventSignalfocussed ()
 
virtual bool scrollVisibilityEnabled () const WT_CXX11ONLY(finaloverride)
 
virtual void setScrollVisibilityEnabled (bool enabled) WT_CXX11ONLY(finaloverride)
 
virtual int scrollVisibilityMargin () const WT_CXX11ONLY(finaloverride)
 
virtual void setScrollVisibilityMargin (int margin) WT_CXX11ONLY(finaloverride)
 
virtual Signal< bool > & scrollVisibilityChanged () WT_CXX11ONLY(finaloverride)
 
virtual bool isScrollVisible () const WT_CXX11ONLY(finaloverride)
 
virtual void setThemeStyleEnabled (bool enabled)
 
virtual bool isThemeStyleEnabled () const
 
- Public Member Functions inherited from Wt::WWidget
virtual ~WWidget ()
 
WWidgetparent () const
 
virtual void removeChild (WObject *child)
 
void setWidth (const WLength &width)
 
void setHeight (const WLength &height)
 
virtual void positionAt (const WWidget *widget, 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 setObjectName (const std::string &name)
 
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
 WObject (WObject *parent=0)
 
virtual ~WObject ()
 
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)
 
void addChild (WObject *child)
 
const std::vector< WObject * > & children () const
 
WObjectparent () const
 

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

- Public Types inherited from Wt::WContainerWidget
enum  Overflow
 
- Public Types inherited from Wt::WObject
typedef void(WObject::* Method) ()
 
- Static Public Member Functions inherited from Wt::WWebWidget
static WString escapeText (const WString &text, bool newlinesToo=false)
 
static std::string & escapeText (std::string &text, bool newlinestoo=false)
 
static bool removeScript (WString &text)
 
static std::string jsStringLiteral (const std::string &v, char delimiter= '\'')
 
- Static Public Member Functions inherited from Wt::WWidget
static WString tr (const char *key)
 
- Public Attributes inherited from Wt::WContainerWidget
 OverflowVisible
 
 OverflowAuto
 
 OverflowHidden
 
 OverflowScroll
 
- Protected Member Functions inherited from Wt::WInteractWidget
virtual void propagateSetEnabled (bool enabled)
 
- Protected Member Functions inherited from Wt::WWebWidget
virtual void enableAjax ()
 
virtual WStatelessSlot * getStateless (Method method)
 
virtual void render (WFlags< RenderFlag > flags)
 
- Protected Member Functions inherited from Wt::WWidget
void setLayoutSizeAware (bool sizeAware)
 
virtual void layoutSizeChanged (int width, int height)
 
 WWidget (WContainerWidget *parent=0)
 
virtual void dropEvent (WDropEvent dropEvent)
 
virtual int boxPadding (Orientation orientation) const
 
virtual int boxBorder (Orientation orientation) const
 
void scheduleRender (WFlags< RepaintFlag > flags=0)
 
- Static Protected Member Functions inherited from Wt::WObject
static WObjectsender ()
 

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);
122  ++row;
123 
124  chartConfig->elementAt(row, 0)->addWidget(new WText("Height:"));
125  chartHeightEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
127  ->setText(WLocale::currentLocale().toString(chart_->height().value()));
128  chartHeightEdit_->setValidator(sizeValidator);
131  ++row;
132 
133  chartConfig->elementAt(row, 0)->addWidget(new WText("Orientation:"));
134  chartOrientationEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
135  chartOrientationEdit_->setModel(orientation);
138  ++row;
139 
140  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend location:"));
141  legendLocationEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
142  legendLocationEdit_->setModel(legendLocation);
145  ++row;
146 
147  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend side:"));
148  legendSideEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
149  legendSideEdit_->setModel(legendSide);
152  ++row;
153 
154  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend alignment:"));
155  legendAlignmentEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
156  legendAlignmentEdit_->setModel(legendAlignment);
159  ++row;
160 
161  chartConfig->elementAt(row, 0)->addWidget(new WText("Border:"));
162  borderEdit_ = new WCheckBox(chartConfig->elementAt(row, 1));
163  borderEdit_->setChecked(false);
165  ++row;
166 
167  for (int i = 0; i < chartConfig->rowCount(); ++i) {
168  chartConfig->elementAt(i, 0)->setStyleClass("tdhead");
169  chartConfig->elementAt(i, 1)->setStyleClass("tddata");
170  }
171 
172  WPanel *p = list->addWidget("Chart properties", chartConfig);
173  p->setMargin(WLength::Auto, Left | Right);
174  p->resize(1080, WLength::Auto);
175  p->setMargin(20, Top | Bottom);
176 
177  // ---- Series properties ----
178 
179  WStandardItemModel *types = new WStandardItemModel(0, 1, this);
180  addEntry(types, "Points");
181  addEntry(types, "Line");
182  addEntry(types, "Curve");
183  addEntry(types, "Bar");
184  addEntry(types, "Line Area");
185  addEntry(types, "Curve Area");
186  addEntry(types, "Stacked Bar");
187  addEntry(types, "Stacked Line Area");
188  addEntry(types, "Stacked Curve Area");
189 
190  WStandardItemModel *markers = new WStandardItemModel(0, 1, this);
191  addEntry(markers, "None");
192  addEntry(markers, "Square");
193  addEntry(markers, "Circle");
194  addEntry(markers, "Cross");
195  addEntry(markers, "X cross");
196  addEntry(markers, "Triangle");
197  addEntry(markers, "Pipe");
198  addEntry(markers, "Star");
199  addEntry(markers, "Inverted triangle");
200  addEntry(markers, "Asterisk");
201  addEntry(markers, "Diamond");
202 
203  WStandardItemModel *axes = new WStandardItemModel(0, 1, this);
204  addEntry(axes, "1st Y axis");
205  addEntry(axes, "2nd Y axis");
206 
207  WStandardItemModel *labels = new WStandardItemModel(0, 1, this);
208  addEntry(labels, "None");
209  addEntry(labels, "X");
210  addEntry(labels, "Y");
211  addEntry(labels, "X: Y");
212 
213  WTable *seriesConfig = new WTable();
214  seriesConfig->setMargin(WLength::Auto, Left | Right);
215 
216  ::addHeader(seriesConfig, "Name");
217  ::addHeader(seriesConfig, "Enabled");
218  ::addHeader(seriesConfig, "Type");
219  ::addHeader(seriesConfig, "Marker");
220  ::addHeader(seriesConfig, "Y axis");
221  ::addHeader(seriesConfig, "Legend");
222  ::addHeader(seriesConfig, "Shadow");
223  ::addHeader(seriesConfig, "Value labels");
224 
225  seriesConfig->rowAt(0)->setStyleClass("trhead");
226 
227  for (int j = 1; j < chart->model()->columnCount(); ++j) {
228  SeriesControl sc;
229 
230  new WText(chart->model()->headerData(j),
231  seriesConfig->elementAt(j, 0));
232 
233  sc.enabledEdit = new WCheckBox(seriesConfig->elementAt(j, 1));
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()
CategoryScale
Wt::WCheckBox * borderEdit_
Definition: ChartConfig.h:89
int rowCount() const
MinimumValueFill
MaximumValue
MarkerType marker() const
virtual void setMargin(const WLength &margin, WFlags< Side > sides=All)
virtual void setText(const WString &text)
bool isLegendEnabled() const
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:48
EventSignal< WMouseEvent > & clicked()
black
Wt::WLineEdit * titleEdit_
Definition: ChartConfig.h:82
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:47
void addItem(const WString &text)
XAxis
void connectSignals(Wt::WFormWidget *w)
Definition: ChartConfig.C:709
void setValidator(WValidator *validator)
double minimum() const
MinimumValue
AxisScale scale() const
WAxis & axis(Axis axis)
virtual WLength width() const
void setLegendStyle(const WFont &font, const WPen &border, const WBrush &background)
virtual void setInline(bool isInline)
AxisValue location() const
ZeroValue
bool setText(const WString &text)
NoFill
bool isStacked() const
LineSeries
Wt::WLineEdit * chartWidthEdit_
Definition: ChartConfig.h:83
virtual void resize(const WLength &width, const WLength &height)
WTableCell * elementAt(int row, int column)
virtual void setStyleClass(const WString &styleClass)
Wt::WPanel * addWidget(const Wt::WString &text, Wt::WWidget *w)
Definition: PanelList.C:17
Wt::WComboBox * chartOrientationEdit_
Definition: ChartConfig.h:85
Wt::WComboBox * legendLocationEdit_
Definition: ChartConfig.h:86
std::vector< SeriesControl > seriesControls_
Controls for series.
Definition: ChartConfig.h:62
void setCurrentIndex(int index)
virtual void setMargin(const WLength &margin, WFlags< Side > sides=All)
Axis id() const
void setStyleClass(const WString &style)
virtual WLength height() const
WDataSeries & series(int modelColumn)
PointSeries
WFlags< AxisValue > autoLimits() const
void setMaxLength(int length)
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
bool isVisible() const
void setModel(WAbstractItemModel *model)
double value() const
void setMandatory(bool how)
double maximum() const
WContainerWidget(WContainerWidget *parent=0)
CurveSeries
virtual void addWidget(WWidget *widget)
Wt::WComboBox * legendAlignmentEdit_
Definition: ChartConfig.h:88
void setChecked(bool checked)
BarSeries
WTableRow * rowAt(int row)
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))
714 }
Wt::Signals::connection connect(const F &function)
void update()
Definition: ChartConfig.C:440
EventSignal & enterPressed()
EventSignal & changed()
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 
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 {
693  chart_->setBorderPen(NoPen);
694  }
695 }
void setVisible(bool visible)
Wt::WCheckBox * borderEdit_
Definition: ChartConfig.h:89
void setType(SeriesType t)
MaximumValue
void lineTo(const WPointF &point)
Vertical
LinearScale
AlignMiddle
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:48
LegendInside
Wt::WLineEdit * titleEdit_
Definition: ChartConfig.h:82
void setGridLinesEnabled(bool enabled)
Wt::Chart::WCartesianChart * chart_
Definition: ChartConfig.h:47
XAxis
void setTickDirection(TickDirection direction)
BothSides
double minimum() const
void setLocation(AxisValue value)
Y2Axis
const WString & text() const
AxisScale scale() const
MinimumValue
WAxis & axis(Axis axis)
void setShadow(const WShadow &shadow)
LegendOutside
virtual WLength width() const
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)
ZeroValue
AlignLeft
int toJulianDay() const
LogScale
AlignCenter
void setSeries(const std::vector< WDataSeries > &series)
void setLegendEnabled(bool enabled)
LineSeries
DateScale
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)
virtual WLength height() const
PointSeries
WFlags< AxisValue > autoLimits() const
CustomMarker
void setTitleOrientation(const Orientation &orientation)
AlignTop
void setCustomMarker(const WPainterPath &path)
void setAutoLimits(WFlags< AxisValue > locations)
AlignRight
Wt::WComboBox * legendSideEdit_
Definition: ChartConfig.h:87
std::vector< AxisControl > axisControls_
Controls for axes.
Definition: ChartConfig.h:80
virtual int columnCount() const =0
CategoryChart
void setLabelsEnabled(Axis axis, bool enabled=true)
void moveTo(const WPointF &point)
YAxis
void setStacked(bool stacked)
void setOrientation(Orientation orientation)
double maximum() const
void setBorderPen(const WPen &pen)
CurveSeries
void setRange(double minimum, double maximum)
ScatterPlot
void setLegendEnabled(bool enabled)
void bindToAxis(Axis axis)
Wt::WComboBox * legendAlignmentEdit_
Definition: ChartConfig.h:88
AlignBottom
BarSeries
void setTitle(const WString &title)
void setLabelAngle(double angle)
void setFillRange(FillRangeType fillRange)
Horizontal
void setLegendColumns(int columns, const WLength &width)
WAbstractChartModel * model() const
static bool validate(Wt::WFormWidget *w)
Definition: ChartConfig.C:697
Wt::WLineEdit * chartHeightEdit_
Definition: ChartConfig.h:84
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)
virtual void setStyleClass(const WString &styleClass)
virtual WValidator::State validate()

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 Mon Sep 4 2017 for the C++ Web Toolkit (Wt) by doxygen 1.8.11