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:"));
155 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Legend alignment:"));
163 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Border:"));
164 borderEdit_ =
new WCheckBox(chartConfig->elementAt(row, 1));
169 for (
int i = 0; i < chartConfig->rowCount(); ++i) {
170 chartConfig->elementAt(i, 0)->setStyleClass(
"tdhead");
171 chartConfig->elementAt(i, 1)->setStyleClass(
"tddata");
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);
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");
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");
201 WStandardItemModel *axes =
new WStandardItemModel(0, 1,
this);
202 addEntry(axes,
"1st Y axis");
203 addEntry(axes,
"2nd Y axis");
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");
211 WTable *seriesConfig =
new WTable();
212 seriesConfig->setMargin(WLength::Auto, Left | Right);
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");
223 seriesConfig->rowAt(0)->setStyleClass(
"trhead");
225 for (
int j = 1; j < chart->model()->columnCount(); ++j) {
228 new WText(asString(chart->model()->headerData(j)),
229 seriesConfig->elementAt(j, 0));
231 sc.enabledEdit =
new WCheckBox(seriesConfig->elementAt(j, 1));
234 sc.typeEdit =
new WComboBox(seriesConfig->elementAt(j, 2));
235 sc.typeEdit->setModel(types);
236 sc.typeEdit->setCurrentIndex(0);
239 sc.markerEdit =
new WComboBox(seriesConfig->elementAt(j, 3));
240 sc.markerEdit->setModel(markers);
241 sc.markerEdit->setCurrentIndex(0);
244 sc.axisEdit =
new WComboBox(seriesConfig->elementAt(j, 4));
245 sc.axisEdit->setModel(axes);
246 sc.axisEdit->setCurrentIndex(0);
249 sc.legendEdit =
new WCheckBox(seriesConfig->elementAt(j, 5));
252 sc.shadowEdit =
new WCheckBox(seriesConfig->elementAt(j, 6));
255 sc.labelsEdit =
new WComboBox(seriesConfig->elementAt(j, 7));
256 sc.labelsEdit->setModel(labels);
257 sc.labelsEdit->setCurrentIndex(0);
260 int si = seriesIndexOf(chart, j);
263 sc.enabledEdit->setChecked();
264 const WDataSeries& s =
chart_->series(j);
267 sc.typeEdit->setCurrentIndex(0);
break;
269 sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
270 (s.isStacked() ? 7 : 4) : 1);
break;
272 sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
273 (s.isStacked() ? 8 : 5) : 2);
break;
275 sc.typeEdit->setCurrentIndex(s.isStacked() ? 6 : 3);
278 sc.markerEdit->setCurrentIndex((
int)s.marker());
279 sc.legendEdit->setChecked(s.isLegendEnabled());
280 sc.shadowEdit->setChecked(s.shadow() != WShadow());
285 seriesConfig->rowAt(j)->setStyleClass(
"trdata");
288 p = list->
addWidget(
"Series properties", seriesConfig);
290 p->setMargin(WLength::Auto, Left | Right);
291 p->resize(1080, WLength::Auto);
292 p->setMargin(20, Top | Bottom);
296 WStandardItemModel *yScales =
new WStandardItemModel(0, 1,
this);
297 addEntry(yScales,
"Linear scale");
298 addEntry(yScales,
"Log scale");
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");
306 WTable *axisConfig =
new WTable();
307 axisConfig->setMargin(WLength::Auto, Left | Right);
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");
322 axisConfig->rowAt(0)->setStyleClass(
"trhead");
324 for (
int i = 0; i < 3; ++i) {
325 const char *axisName[] = {
"X axis",
"1st Y axis",
"2nd Y axis" };
328 const WAxis& axis =
chart_->axis(static_cast<Axis>(i));
331 new WText(WString(axisName[i], UTF8), axisConfig->elementAt(j, 0));
333 sc.visibleEdit =
new WCheckBox(axisConfig->elementAt(j, 1));
334 sc.visibleEdit->setChecked(axis.isVisible());
337 sc.scaleEdit =
new WComboBox(axisConfig->elementAt(j, 2));
338 if (axis.scale() == CategoryScale)
339 sc.scaleEdit->addItem(
"Category scale");
341 if (axis.id() == XAxis) {
342 sc.scaleEdit->setModel(xScales);
343 sc.scaleEdit->setCurrentIndex(axis.scale());
345 sc.scaleEdit->setModel(yScales);
346 sc.scaleEdit->setCurrentIndex(axis.scale() - 1);
351 bool autoValues = axis.autoLimits() == (MinimumValue | MaximumValue);
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);
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);
367 sc.autoEdit =
new WCheckBox(axisConfig->elementAt(j, 3));
368 sc.autoEdit->setChecked(autoValues);
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);
375 sc.gridLinesEdit =
new WCheckBox(axisConfig->elementAt(j, 6));
378 sc.labelAngleEdit =
new WLineEdit(axisConfig->elementAt(j, 7));
379 sc.labelAngleEdit->setText(
"0");
380 sc.labelAngleEdit->setValidator(angleValidator);
383 sc.titleEdit =
new WLineEdit(axisConfig->elementAt(j, 8));
384 sc.titleEdit->setText(
"");
387 sc.titleOrientationEdit =
new WComboBox(axisConfig->elementAt(j, 9));
388 sc.titleOrientationEdit->addItem(
"Horizontal");
389 sc.titleOrientationEdit->addItem(
"Vertical");
390 sc.titleOrientationEdit->setCurrentIndex(0);
393 sc.tickDirectionEdit =
new WComboBox(axisConfig->elementAt(j, 10));
394 sc.tickDirectionEdit->addItem(
"Outwards");
395 sc.tickDirectionEdit->addItem(
"Inwards");
396 sc.tickDirectionEdit->setCurrentIndex(0);
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);
410 axisConfig->rowAt(j)->setStyleClass(
"trdata");
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);
424 if (!WApplication::instance()->environment().javaScript()) {
425 WPushButton *b =
new WPushButton(
this);
426 b->setText(
"Update chart");
428 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_