Wt examples  3.3.5
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 ()
 
- 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 ()
 
- 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 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 void setObjectName (const std::string &name)
 
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)())
 
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),
66  fill_(MinimumValueFill)
67 {
69  WBrush(WColor(0xFF, 0xFA, 0xE5)));
70 
71  PanelList *list = new PanelList(this);
72 
73  WIntValidator *sizeValidator = new WIntValidator(200, 2000, this);
74  sizeValidator->setMandatory(true);
75 
76  WDoubleValidator *anyNumberValidator = new WDoubleValidator(this);
77  anyNumberValidator->setMandatory(true);
78 
79  WDoubleValidator *angleValidator = new WDoubleValidator(-90, 90, this);
80  angleValidator->setMandatory(true);
81 
82  // ---- Chart properties ----
83 
84  WStandardItemModel *orientation = new WStandardItemModel(0, 1, this);
85  addEntry(orientation, "Vertical");
86  addEntry(orientation, "Horizontal");
87 
88  WStandardItemModel *legendLocation = new WStandardItemModel(0, 1, this);
89  addEntry(legendLocation, "Outside");
90  addEntry(legendLocation, "Inside");
91 
92  WStandardItemModel *legendSide = new WStandardItemModel(0, 1, this);
93  addEntry(legendSide, "Top");
94  addEntry(legendSide, "Right");
95  addEntry(legendSide, "Bottom");
96  addEntry(legendSide, "Left");
97 
98  WStandardItemModel *legendAlignment = new WStandardItemModel(0, 1, this);
99  addEntry(legendAlignment, "AlignLeft");
100  addEntry(legendAlignment, "AlignCenter");
101  addEntry(legendAlignment, "AlignRight");
102  addEntry(legendAlignment, "AlignTop");
103  addEntry(legendAlignment, "AlignMiddle");
104  addEntry(legendAlignment, "AlignBottom");
105 
106  WTable *chartConfig = new WTable();
107  chartConfig->setMargin(WLength::Auto, Left | Right);
108 
109  int row = 0;
110  chartConfig->elementAt(row, 0)->addWidget(new WText("Title:"));
111  titleEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
113  ++row;
114 
115  chartConfig->elementAt(row, 0)->addWidget(new WText("Width:"));
116  chartWidthEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
118  ->setText(WLocale::currentLocale().toString(chart_->width().value()));
119  chartWidthEdit_->setValidator(sizeValidator);
122  ++row;
123 
124  chartConfig->elementAt(row, 0)->addWidget(new WText("Height:"));
125  chartHeightEdit_ = new WLineEdit(chartConfig->elementAt(row, 1));
127  ->setText(WLocale::currentLocale().toString(chart_->height().value()));
128  chartHeightEdit_->setValidator(sizeValidator);
131  ++row;
132 
133  chartConfig->elementAt(row, 0)->addWidget(new WText("Orientation:"));
134  chartOrientationEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
135  chartOrientationEdit_->setModel(orientation);
138  ++row;
139 
140  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend location:"));
141  legendLocationEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
142  legendLocationEdit_->setModel(legendLocation);
145  ++row;
146 
147  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend side:"));
148  legendSideEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
149  legendSideEdit_->setModel(legendSide);
153  ++row;
154 
155  chartConfig->elementAt(row, 0)->addWidget(new WText("Legend alignment:"));
156  legendAlignmentEdit_ = new WComboBox(chartConfig->elementAt(row, 1));
157  legendAlignmentEdit_->setModel(legendAlignment);
161  ++row;
162 
163  chartConfig->elementAt(row, 0)->addWidget(new WText("Border:"));
164  borderEdit_ = new WCheckBox(chartConfig->elementAt(row, 1));
165  borderEdit_->setChecked(false);
167  ++row;
168 
169  for (int i = 0; i < chartConfig->rowCount(); ++i) {
170  chartConfig->elementAt(i, 0)->setStyleClass("tdhead");
171  chartConfig->elementAt(i, 1)->setStyleClass("tddata");
172  }
173 
174  WPanel *p = list->addWidget("Chart properties", chartConfig);
175  p->setMargin(WLength::Auto, Left | Right);
176  p->resize(1080, WLength::Auto);
177  p->setMargin(20, Top | Bottom);
178 
179  // ---- Series properties ----
180 
181  WStandardItemModel *types = new WStandardItemModel(0, 1, this);
182  addEntry(types, "Points");
183  addEntry(types, "Line");
184  addEntry(types, "Curve");
185  addEntry(types, "Bar");
186  addEntry(types, "Line Area");
187  addEntry(types, "Curve Area");
188  addEntry(types, "Stacked Bar");
189  addEntry(types, "Stacked Line Area");
190  addEntry(types, "Stacked Curve Area");
191 
192  WStandardItemModel *markers = new WStandardItemModel(0, 1, this);
193  addEntry(markers, "None");
194  addEntry(markers, "Square");
195  addEntry(markers, "Circle");
196  addEntry(markers, "Cross");
197  addEntry(markers, "X cross");
198  addEntry(markers, "Triangle");
199  addEntry(markers, "Diamond");
200 
201  WStandardItemModel *axes = new WStandardItemModel(0, 1, this);
202  addEntry(axes, "1st Y axis");
203  addEntry(axes, "2nd Y axis");
204 
205  WStandardItemModel *labels = new WStandardItemModel(0, 1, this);
206  addEntry(labels, "None");
207  addEntry(labels, "X");
208  addEntry(labels, "Y");
209  addEntry(labels, "X: Y");
210 
211  WTable *seriesConfig = new WTable();
212  seriesConfig->setMargin(WLength::Auto, Left | Right);
213 
214  ::addHeader(seriesConfig, "Name");
215  ::addHeader(seriesConfig, "Enabled");
216  ::addHeader(seriesConfig, "Type");
217  ::addHeader(seriesConfig, "Marker");
218  ::addHeader(seriesConfig, "Y axis");
219  ::addHeader(seriesConfig, "Legend");
220  ::addHeader(seriesConfig, "Shadow");
221  ::addHeader(seriesConfig, "Value labels");
222 
223  seriesConfig->rowAt(0)->setStyleClass("trhead");
224 
225  for (int j = 1; j < chart->model()->columnCount(); ++j) {
226  SeriesControl sc;
227 
228  new WText(asString(chart->model()->headerData(j)),
229  seriesConfig->elementAt(j, 0));
230 
231  sc.enabledEdit = new WCheckBox(seriesConfig->elementAt(j, 1));
232  connectSignals(sc.enabledEdit);
233 
234  sc.typeEdit = new WComboBox(seriesConfig->elementAt(j, 2));
235  sc.typeEdit->setModel(types);
236  sc.typeEdit->setCurrentIndex(0);
237  connectSignals(sc.typeEdit);
238 
239  sc.markerEdit = new WComboBox(seriesConfig->elementAt(j, 3));
240  sc.markerEdit->setModel(markers);
241  sc.markerEdit->setCurrentIndex(0);
242  connectSignals(sc.markerEdit);
243 
244  sc.axisEdit = new WComboBox(seriesConfig->elementAt(j, 4));
245  sc.axisEdit->setModel(axes);
246  sc.axisEdit->setCurrentIndex(0);
247  connectSignals(sc.axisEdit);
248 
249  sc.legendEdit = new WCheckBox(seriesConfig->elementAt(j, 5));
250  connectSignals(sc.legendEdit);
251 
252  sc.shadowEdit = new WCheckBox(seriesConfig->elementAt(j, 6));
253  connectSignals(sc.shadowEdit);
254 
255  sc.labelsEdit = new WComboBox(seriesConfig->elementAt(j, 7));
256  sc.labelsEdit->setModel(labels);
257  sc.labelsEdit->setCurrentIndex(0);
258  connectSignals(sc.labelsEdit);
259 
260  int si = seriesIndexOf(chart, j);
261 
262  if (si != -1) {
263  sc.enabledEdit->setChecked();
264  const WDataSeries& s = chart_->series(j);
265  switch (s.type()) {
266  case PointSeries:
267  sc.typeEdit->setCurrentIndex(0); break;
268  case LineSeries:
269  sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
270  (s.isStacked() ? 7 : 4) : 1); break;
271  case CurveSeries:
272  sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
273  (s.isStacked() ? 8 : 5) : 2); break;
274  case BarSeries:
275  sc.typeEdit->setCurrentIndex(s.isStacked() ? 6 : 3);
276  }
277 
278  sc.markerEdit->setCurrentIndex((int)s.marker());
279  sc.legendEdit->setChecked(s.isLegendEnabled());
280  sc.shadowEdit->setChecked(s.shadow() != WShadow());
281  }
282 
283  seriesControls_.push_back(sc);
284 
285  seriesConfig->rowAt(j)->setStyleClass("trdata");
286  }
287 
288  p = list->addWidget("Series properties", seriesConfig);
289  p->expand();
290  p->setMargin(WLength::Auto, Left | Right);
291  p->resize(1080, WLength::Auto);
292  p->setMargin(20, Top | Bottom);
293 
294  // ---- Axis properties ----
295 
296  WStandardItemModel *yScales = new WStandardItemModel(0, 1, this);
297  addEntry(yScales, "Linear scale");
298  addEntry(yScales, "Log scale");
299 
300  WStandardItemModel *xScales = new WStandardItemModel(0, 1, this);
301  addEntry(xScales, "Categories");
302  addEntry(xScales, "Linear scale");
303  addEntry(xScales, "Log scale");
304  addEntry(xScales, "Date scale");
305 
306  WTable *axisConfig = new WTable();
307  axisConfig->setMargin(WLength::Auto, Left | Right);
308 
309  ::addHeader(axisConfig, "Axis");
310  ::addHeader(axisConfig, "Visible");
311  ::addHeader(axisConfig, "Scale");
312  ::addHeader(axisConfig, "Automatic");
313  ::addHeader(axisConfig, "Minimum");
314  ::addHeader(axisConfig, "Maximum");
315  ::addHeader(axisConfig, "Gridlines");
316  ::addHeader(axisConfig, "Label angle");
317  ::addHeader(axisConfig, "Title");
318  ::addHeader(axisConfig, "Title orientation");
319  ::addHeader(axisConfig, "Tick direction");
320  ::addHeader(axisConfig, "Location");
321 
322  axisConfig->rowAt(0)->setStyleClass("trhead");
323 
324  for (int i = 0; i < 3; ++i) {
325  const char *axisName[] = { "X axis", "1st Y axis", "2nd Y axis" };
326  int j = i + 1;
327 
328  const WAxis& axis = chart_->axis(static_cast<Axis>(i));
329  AxisControl sc;
330 
331  new WText(WString(axisName[i], UTF8), axisConfig->elementAt(j, 0));
332 
333  sc.visibleEdit = new WCheckBox(axisConfig->elementAt(j, 1));
334  sc.visibleEdit->setChecked(axis.isVisible());
335  connectSignals(sc.visibleEdit);
336 
337  sc.scaleEdit = new WComboBox(axisConfig->elementAt(j, 2));
338  if (axis.scale() == CategoryScale)
339  sc.scaleEdit->addItem("Category scale");
340  else {
341  if (axis.id() == XAxis) {
342  sc.scaleEdit->setModel(xScales);
343  sc.scaleEdit->setCurrentIndex(axis.scale());
344  } else {
345  sc.scaleEdit->setModel(yScales);
346  sc.scaleEdit->setCurrentIndex(axis.scale() - 1);
347  }
348  }
349  connectSignals(sc.scaleEdit);
350 
351  bool autoValues = axis.autoLimits() == (MinimumValue | MaximumValue);
352 
353  sc.minimumEdit = new WLineEdit(axisConfig->elementAt(j, 4));
354  sc.minimumEdit->setText(WLocale::currentLocale()
355  .toString(axis.minimum()));
356  sc.minimumEdit->setValidator(anyNumberValidator);
357  sc.minimumEdit->setEnabled(!autoValues);
358  connectSignals(sc.minimumEdit);
359 
360  sc.maximumEdit = new WLineEdit(axisConfig->elementAt(j, 5));
361  sc.maximumEdit->setText(WLocale::currentLocale()
362  .toString(axis.maximum()));
363  sc.maximumEdit->setValidator(anyNumberValidator);
364  sc.maximumEdit->setEnabled(!autoValues);
365  connectSignals(sc.maximumEdit);
366 
367  sc.autoEdit = new WCheckBox(axisConfig->elementAt(j, 3));
368  sc.autoEdit->setChecked(autoValues);
369  connectSignals(sc.autoEdit);
370  sc.autoEdit->checked().connect(sc.maximumEdit, &WLineEdit::disable);
371  sc.autoEdit->unChecked().connect(sc.maximumEdit, &WLineEdit::enable);
372  sc.autoEdit->checked().connect(sc.minimumEdit, &WLineEdit::disable);
373  sc.autoEdit->unChecked().connect(sc.minimumEdit, &WLineEdit::enable);
374 
375  sc.gridLinesEdit = new WCheckBox(axisConfig->elementAt(j, 6));
376  connectSignals(sc.gridLinesEdit);
377 
378  sc.labelAngleEdit = new WLineEdit(axisConfig->elementAt(j, 7));
379  sc.labelAngleEdit->setText("0");
380  sc.labelAngleEdit->setValidator(angleValidator);
381  connectSignals(sc.labelAngleEdit);
382 
383  sc.titleEdit = new WLineEdit(axisConfig->elementAt(j, 8));
384  sc.titleEdit->setText("");
385  connectSignals(sc.titleEdit);
386 
387  sc.titleOrientationEdit = new WComboBox(axisConfig->elementAt(j, 9));
388  sc.titleOrientationEdit->addItem("Horizontal");
389  sc.titleOrientationEdit->addItem("Vertical");
390  sc.titleOrientationEdit->setCurrentIndex(0);
391  connectSignals(sc.titleOrientationEdit);
392 
393  sc.tickDirectionEdit = new WComboBox(axisConfig->elementAt(j, 10));
394  sc.tickDirectionEdit->addItem("Outwards");
395  sc.tickDirectionEdit->addItem("Inwards");
396  sc.tickDirectionEdit->setCurrentIndex(0);
397  connectSignals(sc.tickDirectionEdit);
398 
399  sc.locationEdit = new WComboBox(axisConfig->elementAt(j, 11));
400  sc.locationEdit->addItem("Minimum value");
401  sc.locationEdit->addItem("Maximum value");
402  sc.locationEdit->addItem("Zero value");
403  sc.locationEdit->addItem("Both sides");
404  sc.locationEdit->setCurrentIndex(0);
405  if (axis.location() == ZeroValue) {
406  sc.locationEdit->setCurrentIndex(2);
407  }
408  connectSignals(sc.locationEdit);
409 
410  axisConfig->rowAt(j)->setStyleClass("trdata");
411 
412  axisControls_.push_back(sc);
413  }
414 
415  p = list->addWidget("Axis properties", axisConfig);
416  p->setMargin(WLength::Auto, Left | Right);
417  p->resize(1080, WLength::Auto);
418  p->setMargin(20, Top | Bottom);
419 
420  /*
421  * If we do not have JavaScript, then add a button to reflect changes to
422  * the chart.
423  */
424  if (!WApplication::instance()->environment().javaScript()) {
425  WPushButton *b = new WPushButton(this);
426  b->setText("Update chart");
427  b->setInline(false); // so we can add margin to center horizontally
428  b->setMargin(WLength::Auto, Left | Right);
429  b->clicked().connect(this, &ChartConfig::update);
430  }
431 }
void expand()
Wt::WCheckBox * borderEdit_
Definition: ChartConfig.h:89
int rowCount() const
virtual boost::any headerData(int section, Orientation orientation=Horizontal, int role=DisplayRole) const
MarkerType marker() const
virtual void setMargin(const WLength &margin, WFlags< Side > sides=All)
virtual void setText(const WString &text)
WString asString(const boost::any &v, const WString &formatString=WString())
bool isLegendEnabled() const
Wt::Chart::FillRangeType fill_
Definition: ChartConfig.h:48
EventSignal< WMouseEvent > & clicked()
Wt::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:718
void setValidator(WValidator *validator)
double minimum() const
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
bool setText(const WString &text)
bool isStacked() const
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
WAbstractItemModel * model() const
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)
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
void update()
Definition: ChartConfig.C:438
bool isVisible() const
void setModel(WAbstractItemModel *model)
virtual int columnCount(const WModelIndex &parent=WModelIndex()) const =0
double value() const
void setMandatory(bool how)
double maximum() const
WContainerWidget(WContainerWidget *parent=0)
virtual void addWidget(WWidget *widget)
Wt::WComboBox * legendAlignmentEdit_
Definition: ChartConfig.h:88
void setChecked(bool checked)
WTableRow * rowAt(int row)
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 718 of file ChartConfig.C.

719 {
720  w->changed().connect(this, &ChartConfig::update);
721  if (dynamic_cast<WLineEdit *>(w))
723 }
Wt::Signals::connection connect(const F &function)
void update()
Definition: ChartConfig.C:438
EventSignal & enterPressed()
EventSignal & changed()
void ChartConfig::setValueFill ( Wt::Chart::FillRangeType  fill)

Definition at line 433 of file ChartConfig.C.

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

Definition at line 438 of file ChartConfig.C.

439 {
440  bool haveLegend = false;
441  std::vector<WDataSeries> series;
442 
443  for (int i = 1; i < chart_->model()->columnCount(); ++i) {
444  SeriesControl& sc = seriesControls_[i-1];
445 
446  if (sc.enabledEdit->isChecked()) {
447  WDataSeries s(i);
448 
449  switch (sc.typeEdit->currentIndex()) {
450  case 0:
451  s.setType(PointSeries);
452  if (sc.markerEdit->currentIndex() == 0)
453  sc.markerEdit->setCurrentIndex(1);
454  break;
455  case 1:
456  s.setType(LineSeries);
457  sc.markerEdit->setCurrentIndex(0);
458  break;
459  case 2:
460  s.setType(CurveSeries);
461  sc.markerEdit->setCurrentIndex(0);
462  break;
463  case 3:
464  s.setType(BarSeries);
465  sc.markerEdit->setCurrentIndex(0);
466  break;
467  case 4:
468  s.setType(LineSeries);
469  s.setFillRange(fill_);
470  sc.markerEdit->setCurrentIndex(0);
471  break;
472  case 5:
473  s.setType(CurveSeries);
474  s.setFillRange(fill_);
475  sc.markerEdit->setCurrentIndex(0);
476  break;
477  case 6:
478  s.setType(BarSeries);
479  s.setStacked(true);
480  sc.markerEdit->setCurrentIndex(0);
481  break;
482  case 7:
483  s.setType(LineSeries);
484  s.setFillRange(fill_);
485  s.setStacked(true);
486  sc.markerEdit->setCurrentIndex(0);
487  break;
488  case 8:
489  s.setType(CurveSeries);
490  s.setFillRange(fill_);
491  s.setStacked(true);
492  sc.markerEdit->setCurrentIndex(0);
493  }
494 
495  //set WPainterPath to draw a diamond
496  if(sc.markerEdit->currentIndex() == CustomMarker){
497  WPainterPath pp = WPainterPath();
498  pp.moveTo(-6, 0);
499  pp.lineTo(0, 6);
500  pp.lineTo(6, 0);
501  pp.lineTo(0, -6);
502  pp.lineTo(-6, 0);
503  s.setCustomMarker(pp);
504  }
505 
506  s.setMarker(static_cast<MarkerType>(sc.markerEdit->currentIndex()));
507 
508  if (sc.axisEdit->currentIndex() == 1) {
509  s.bindToAxis(Y2Axis);
510  }
511 
512  if (sc.legendEdit->isChecked()) {
513  s.setLegendEnabled(true);
514  haveLegend = true;
515  } else
516  s.setLegendEnabled(false);
517 
518  if (sc.shadowEdit->isChecked()) {
519  s.setShadow(WShadow(3, 3, WColor(0, 0, 0, 127), 3));
520  } else
521  s.setShadow(WShadow());
522 
523  switch (sc.labelsEdit->currentIndex()) {
524  case 1:
525  s.setLabelsEnabled(XAxis);
526  break;
527  case 2:
528  s.setLabelsEnabled(YAxis);
529  break;
530  case 3:
531  s.setLabelsEnabled(XAxis);
532  s.setLabelsEnabled(YAxis);
533  break;
534  }
535 
536  series.push_back(s);
537  }
538  }
539 
540  chart_->setSeries(series);
541 
542  for (int i = 0; i < 3; ++i) {
543  AxisControl& sc = axisControls_[i];
544  WAxis& axis = chart_->axis(static_cast<Axis>(i));
545 
546  axis.setVisible(sc.visibleEdit->isChecked());
547 
548  if (sc.scaleEdit->count() != 1) {
549  int k = sc.scaleEdit->currentIndex();
550  if (axis.id() != XAxis)
551  k += 1;
552  else {
553  if (k == 0)
554  chart_->setType(CategoryChart);
555  else
556  chart_->setType(ScatterPlot);
557  }
558 
559  switch (k) {
560  case 1:
561  axis.setScale(LinearScale); break;
562  case 2:
563  axis.setScale(LogScale); break;
564  case 3:
565  axis.setScale(DateScale); break;
566  }
567  }
568 
569  if (sc.autoEdit->isChecked())
570  axis.setAutoLimits(MinimumValue | MaximumValue);
571  else {
572  if (axis.autoLimits() & (MinimumValue | MaximumValue)) {
573  sc.minimumEdit->setText(WLocale::currentLocale()
574  .toString(axis.minimum()));
575  sc.maximumEdit->setText(WLocale::currentLocale()
576  .toString(axis.maximum()));
577  }
578  if (validate(sc.minimumEdit) && validate(sc.maximumEdit)) {
579  double min, max;
580  getDouble(sc.minimumEdit, min);
581  getDouble(sc.maximumEdit, max);
582 
583  if (axis.scale() == LogScale)
584  if (min <= 0)
585  min = 0.0001;
586 
587  if (axis.scale() == DateScale){
588  //the number of julian days until year 1986
589  WDate dMin = WDate(1900,1,1);
590  double gregDaysMin = (double)dMin.toJulianDay();
591  //the number of julian days until year 1988
592  WDate dMax = WDate(3000,1,1);
593  double gregDaysMax = (double)dMax.toJulianDay();
594 
595  bool greg_year_validation =
596  (min > gregDaysMin &&
597  min < gregDaysMax &&
598  max > gregDaysMin &&
599  max < gregDaysMax);
600 
601  if(!greg_year_validation){
602  min = gregDaysMin;
603  max = gregDaysMax;
604  }
605  }
606 
607  axis.setRange(min, max);
608  }
609 
610  }
611 
612  if (validate(sc.labelAngleEdit)) {
613  double angle;
614  getDouble(sc.labelAngleEdit, angle);
615  axis.setLabelAngle(angle);
616  }
617 
618  axis.setGridLinesEnabled(sc.gridLinesEdit->isChecked());
619 
620  axis.setTitle(sc.titleEdit->text());
621 
622  axis.setTitleOrientation(sc.titleOrientationEdit->currentIndex() == 0 ? Horizontal : Vertical);
623 
624  axis.setTickDirection(sc.tickDirectionEdit->currentIndex() == 0 ? Outwards : Inwards);
625 
626  switch (sc.locationEdit->currentIndex()) {
627  case 0:
628  axis.setLocation(MinimumValue);
629  break;
630  case 1:
631  axis.setLocation(MaximumValue);
632  break;
633  case 2:
634  axis.setLocation(ZeroValue);
635  break;
636  case 3:
637  axis.setLocation(BothSides);
638  break;
639  }
640  }
641 
643 
645  double width, height;
646  getDouble(chartWidthEdit_, width);
647  getDouble(chartHeightEdit_, height);
648  chart_->resize(width, height);
649  }
650 
651  switch (chartOrientationEdit_->currentIndex()) {
652  case 0:
653  chart_->setOrientation(Vertical); break;
654  case 1:
655  chart_->setOrientation(Horizontal); break;
656  }
657 
658  chart_->setLegendEnabled(haveLegend);
659 
660  if (haveLegend) {
661  LegendLocation location = LegendOutside;
662  Side side = Right;
663  AlignmentFlag alignment = AlignMiddle;
664  switch (legendLocationEdit_->currentIndex()) {
665  case 0: location = LegendOutside; break;
666  case 1: location = LegendInside; break;
667  }
668 
669  switch (legendSideEdit_->currentIndex()) {
670  case 0: side = Top; break;
671  case 1: side = Right; break;
672  case 2: side = Bottom; break;
673  case 3: side = Left; break;
674  }
675 
676  if (side == Left || side == Right) {
679  } else {
682  }
683 
684  switch (legendAlignmentEdit_->currentIndex()) {
685  case 0: alignment = AlignLeft; break;
686  case 1: alignment = AlignCenter; break;
687  case 2: alignment = AlignRight; break;
688  case 3: alignment = AlignTop; break;
689  case 4: alignment = AlignMiddle; break;
690  case 5: alignment = AlignBottom; break;
691  }
692 
693  chart_->setLegendLocation(location, side, alignment);
694 
695  chart_->setLegendColumns((side == Top || side == Bottom ) ? 2 : 1,
696  WLength(100));
697  }
698 
699  if (borderEdit_->isChecked()) {
701  } else {
702  chart_->setBorderPen(NoPen);
703  }
704 }
void setVisible(bool visible)
Wt::WCheckBox * borderEdit_
Definition: ChartConfig.h:89
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)
const WString & text() const
AxisScale scale() const
WAxis & axis(Axis axis)
virtual WLength width() const
int currentIndex() const
void setType(ChartType type)
virtual void resize(const WLength &width, const WLength &height)
AlignmentFlag
void setLegendLocation(LegendLocation location, Side side, AlignmentFlag alignment)
Side
int toJulianDay() const
void setSeries(const std::vector< WDataSeries > &series)
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
WAbstractItemModel * model() const
void setCurrentIndex(int index)
Axis id() const
void setScale(AxisScale scale)
virtual WLength height() const
LegendLocation
WFlags< AxisValue > autoLimits() const
void setTitleOrientation(const Orientation &orientation)
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 WModelIndex &parent=WModelIndex()) const =0
void moveTo(const WPointF &point)
void setOrientation(Orientation orientation)
double maximum() const
void setBorderPen(const WPen &pen)
void setRange(double minimum, double maximum)
void setLegendEnabled(bool enabled)
Wt::WComboBox * legendAlignmentEdit_
Definition: ChartConfig.h:88
void setTitle(const WString &title)
void setLabelAngle(double angle)
void setLegendColumns(int columns, const WLength &width)
static bool validate(Wt::WFormWidget *w)
Definition: ChartConfig.C:706
Wt::WLineEdit * chartHeightEdit_
Definition: ChartConfig.h:84
void setTitle(const WString &title)
bool ChartConfig::validate ( Wt::WFormWidget w)
staticprivate

Definition at line 706 of file ChartConfig.C.

707 {
708  bool valid = w->validate() == WValidator::Valid;
709 
710  if (!WApplication::instance()->environment().javaScript()) {
711  w->setStyleClass(valid ? "" : "Wt-invalid");
712  w->setToolTip(valid ? "" : "Invalid value");
713  }
714 
715  return valid;
716 }
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 Thu Nov 19 2015 for the C++ Web Toolkit (Wt) by doxygen 1.8.9.1