Constructor.
64 : WContainerWidget(parent),
66 fill_(MinimumValueFill)
68 chart_->setLegendStyle(
chart_->legendFont(), WPen(black),
69 WBrush(WColor(0xFF, 0xFA, 0xE5)));
73 WIntValidator *sizeValidator =
new WIntValidator(200, 2000,
this);
74 sizeValidator->setMandatory(
true);
76 WDoubleValidator *anyNumberValidator =
new WDoubleValidator(
this);
77 anyNumberValidator->setMandatory(
true);
79 WDoubleValidator *angleValidator =
new WDoubleValidator(-90, 90,
this);
80 angleValidator->setMandatory(
true);
84 WStandardItemModel *orientation =
new WStandardItemModel(0, 1,
this);
85 addEntry(orientation,
"Vertical");
86 addEntry(orientation,
"Horizontal");
88 WStandardItemModel *legendLocation =
new WStandardItemModel(0, 1,
this);
89 addEntry(legendLocation,
"Outside");
90 addEntry(legendLocation,
"Inside");
92 WStandardItemModel *legendSide =
new WStandardItemModel(0, 1,
this);
93 addEntry(legendSide,
"Top");
94 addEntry(legendSide,
"Right");
95 addEntry(legendSide,
"Bottom");
96 addEntry(legendSide,
"Left");
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");
106 WTable *chartConfig =
new WTable();
107 chartConfig->setMargin(WLength::Auto, Left | Right);
110 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Title:"));
111 titleEdit_ =
new WLineEdit(chartConfig->elementAt(row, 1));
115 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Width:"));
118 ->setText(WLocale::currentLocale().toString(
chart_->width().value()));
124 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Height:"));
127 ->setText(WLocale::currentLocale().toString(
chart_->height().value()));
133 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Orientation:"));
140 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Legend location:"));
147 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Legend side:"));
154 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Legend alignment:"));
161 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Border:"));
162 borderEdit_ =
new WCheckBox(chartConfig->elementAt(row, 1));
167 for (
int i = 0; i < chartConfig->rowCount(); ++i) {
168 chartConfig->elementAt(i, 0)->setStyleClass(
"tdhead");
169 chartConfig->elementAt(i, 1)->setStyleClass(
"tddata");
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);
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");
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");
203 WStandardItemModel *axes =
new WStandardItemModel(0, 1,
this);
204 addEntry(axes,
"1st Y axis");
205 addEntry(axes,
"2nd Y axis");
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");
213 WTable *seriesConfig =
new WTable();
214 seriesConfig->setMargin(WLength::Auto, Left | Right);
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");
225 seriesConfig->rowAt(0)->setStyleClass(
"trhead");
227 for (
int j = 1; j < chart->model()->columnCount(); ++j) {
230 new WText(chart->model()->headerData(j),
231 seriesConfig->elementAt(j, 0));
233 sc.enabledEdit =
new WCheckBox(seriesConfig->elementAt(j, 1));
236 sc.typeEdit =
new WComboBox(seriesConfig->elementAt(j, 2));
237 sc.typeEdit->setModel(types);
238 sc.typeEdit->setCurrentIndex(0);
241 sc.markerEdit =
new WComboBox(seriesConfig->elementAt(j, 3));
242 sc.markerEdit->setModel(markers);
243 sc.markerEdit->setCurrentIndex(0);
246 sc.axisEdit =
new WComboBox(seriesConfig->elementAt(j, 4));
247 sc.axisEdit->setModel(axes);
248 sc.axisEdit->setCurrentIndex(0);
251 sc.legendEdit =
new WCheckBox(seriesConfig->elementAt(j, 5));
254 sc.shadowEdit =
new WCheckBox(seriesConfig->elementAt(j, 6));
257 sc.labelsEdit =
new WComboBox(seriesConfig->elementAt(j, 7));
258 sc.labelsEdit->setModel(labels);
259 sc.labelsEdit->setCurrentIndex(0);
262 int si = seriesIndexOf(chart, j);
265 sc.enabledEdit->setChecked();
266 const WDataSeries& s =
chart_->series(j);
269 sc.typeEdit->setCurrentIndex(0);
break;
271 sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
272 (s.isStacked() ? 7 : 4) : 1);
break;
274 sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
275 (s.isStacked() ? 8 : 5) : 2);
break;
277 sc.typeEdit->setCurrentIndex(s.isStacked() ? 6 : 3);
280 sc.markerEdit->setCurrentIndex((
int)s.marker());
281 sc.legendEdit->setChecked(s.isLegendEnabled());
282 sc.shadowEdit->setChecked(s.shadow() != WShadow());
287 seriesConfig->rowAt(j)->setStyleClass(
"trdata");
290 p = list->
addWidget(
"Series properties", seriesConfig);
292 p->setMargin(WLength::Auto, Left | Right);
293 p->resize(1080, WLength::Auto);
294 p->setMargin(20, Top | Bottom);
298 WStandardItemModel *yScales =
new WStandardItemModel(0, 1,
this);
299 addEntry(yScales,
"Linear scale");
300 addEntry(yScales,
"Log scale");
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");
308 WTable *axisConfig =
new WTable();
309 axisConfig->setMargin(WLength::Auto, Left | Right);
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");
324 axisConfig->rowAt(0)->setStyleClass(
"trhead");
326 for (
int i = 0; i < 3; ++i) {
327 const char *axisName[] = {
"X axis",
"1st Y axis",
"2nd Y axis" };
330 const WAxis& axis =
chart_->axis(static_cast<Axis>(i));
333 new WText(WString(axisName[i], UTF8), axisConfig->elementAt(j, 0));
335 sc.visibleEdit =
new WCheckBox(axisConfig->elementAt(j, 1));
336 sc.visibleEdit->setChecked(axis.isVisible());
339 sc.scaleEdit =
new WComboBox(axisConfig->elementAt(j, 2));
340 if (axis.scale() == CategoryScale)
341 sc.scaleEdit->addItem(
"Category scale");
343 if (axis.id() == XAxis) {
344 sc.scaleEdit->setModel(xScales);
345 sc.scaleEdit->setCurrentIndex(axis.scale());
347 sc.scaleEdit->setModel(yScales);
348 sc.scaleEdit->setCurrentIndex(axis.scale() - 1);
353 bool autoValues = axis.autoLimits() == (MinimumValue | MaximumValue);
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);
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);
369 sc.autoEdit =
new WCheckBox(axisConfig->elementAt(j, 3));
370 sc.autoEdit->setChecked(autoValues);
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);
377 sc.gridLinesEdit =
new WCheckBox(axisConfig->elementAt(j, 6));
380 sc.labelAngleEdit =
new WLineEdit(axisConfig->elementAt(j, 7));
381 sc.labelAngleEdit->setText(
"0");
382 sc.labelAngleEdit->setValidator(angleValidator);
385 sc.titleEdit =
new WLineEdit(axisConfig->elementAt(j, 8));
386 sc.titleEdit->setText(
"");
389 sc.titleOrientationEdit =
new WComboBox(axisConfig->elementAt(j, 9));
390 sc.titleOrientationEdit->addItem(
"Horizontal");
391 sc.titleOrientationEdit->addItem(
"Vertical");
392 sc.titleOrientationEdit->setCurrentIndex(0);
395 sc.tickDirectionEdit =
new WComboBox(axisConfig->elementAt(j, 10));
396 sc.tickDirectionEdit->addItem(
"Outwards");
397 sc.tickDirectionEdit->addItem(
"Inwards");
398 sc.tickDirectionEdit->setCurrentIndex(0);
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);
412 axisConfig->rowAt(j)->setStyleClass(
"trdata");
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);
426 if (!WApplication::instance()->environment().javaScript()) {
427 WPushButton *b =
new WPushButton(
this);
428 b->setText(
"Update chart");
430 b->setMargin(WLength::Auto, Left | Right);
Wt::WCheckBox * borderEdit_
Wt::Chart::FillRangeType fill_
Wt::WLineEdit * titleEdit_
Wt::Chart::WCartesianChart * chart_
void connectSignals(Wt::WFormWidget *w)
Wt::WLineEdit * chartWidthEdit_
Wt::WPanel * addWidget(const Wt::WString &text, Wt::WWidget *w)
Wt::WComboBox * chartOrientationEdit_
Wt::WComboBox * legendLocationEdit_
std::vector< SeriesControl > seriesControls_
Controls for series.
Wt::WComboBox * legendSideEdit_
std::vector< AxisControl > axisControls_
Controls for axes.
Wt::WComboBox * legendAlignmentEdit_
Wt::WLineEdit * chartHeightEdit_