Constructor.
64 : WContainerWidget(parent),
66 fill_(MinimumValueFill)
68 chart_->setLegendStyle(
chart_->legendFont(), WPen(black),
69 WBrush(WColor(0xFF, 0xFA, 0xE5)));
74 WIntValidator *sizeValidator =
new WIntValidator(200, 2000,
this);
75 sizeValidator->setMandatory(
true);
77 WDoubleValidator *anyNumberValidator =
new WDoubleValidator(
this);
78 anyNumberValidator->setMandatory(
true);
80 WDoubleValidator *angleValidator =
new WDoubleValidator(-90, 90,
this);
81 angleValidator->setMandatory(
true);
85 WStandardItemModel *orientation =
new WStandardItemModel(0, 1,
this);
86 addEntry(orientation,
"Vertical");
87 addEntry(orientation,
"Horizontal");
89 WStandardItemModel *legendLocation =
new WStandardItemModel(0, 1,
this);
90 addEntry(legendLocation,
"Outside");
91 addEntry(legendLocation,
"Inside");
93 WStandardItemModel *legendSide =
new WStandardItemModel(0, 1,
this);
94 addEntry(legendSide,
"Top");
95 addEntry(legendSide,
"Right");
96 addEntry(legendSide,
"Bottom");
97 addEntry(legendSide,
"Left");
99 WStandardItemModel *legendAlignment =
new WStandardItemModel(0, 1,
this);
100 addEntry(legendAlignment,
"AlignLeft");
101 addEntry(legendAlignment,
"AlignCenter");
102 addEntry(legendAlignment,
"AlignRight");
103 addEntry(legendAlignment,
"AlignTop");
104 addEntry(legendAlignment,
"AlignMiddle");
105 addEntry(legendAlignment,
"AlignBottom");
107 WTable *chartConfig =
new WTable();
108 chartConfig->setMargin(WLength::Auto, Left | Right);
111 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Title:"));
112 titleEdit_ =
new WLineEdit(chartConfig->elementAt(row, 1));
116 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Width:"));
119 ->setText(WLocale::currentLocale().toString(
chart_->width().value()));
125 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Height:"));
128 ->setText(WLocale::currentLocale().toString(
chart_->height().value()));
134 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Orientation:"));
140 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Legend location:"));
146 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Legend side:"));
153 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Legend alignment:"));
160 for (
int i = 0; i < chartConfig->rowCount(); ++i) {
161 chartConfig->elementAt(i, 0)->setStyleClass(
"tdhead");
162 chartConfig->elementAt(i, 1)->setStyleClass(
"tddata");
165 WPanel *p = list->
addWidget(
"Chart properties", chartConfig);
166 p->setMargin(WLength::Auto, Left | Right);
167 p->resize(880, WLength::Auto);
168 p->setMargin(20, Top | Bottom);
170 if (
chart_->isLegendEnabled())
171 chart_->setPlotAreaPadding(200, Right);
175 WStandardItemModel *types =
new WStandardItemModel(0, 1,
this);
176 addEntry(types,
"Points");
177 addEntry(types,
"Line");
178 addEntry(types,
"Curve");
179 addEntry(types,
"Bar");
180 addEntry(types,
"Line Area");
181 addEntry(types,
"Curve Area");
182 addEntry(types,
"Stacked Bar");
183 addEntry(types,
"Stacked Line Area");
184 addEntry(types,
"Stacked Curve Area");
186 WStandardItemModel *markers =
new WStandardItemModel(0, 1,
this);
187 addEntry(markers,
"None");
188 addEntry(markers,
"Square");
189 addEntry(markers,
"Circle");
190 addEntry(markers,
"Cross");
191 addEntry(markers,
"X cross");
192 addEntry(markers,
"Triangle");
193 addEntry(markers,
"Diamond");
195 WStandardItemModel *axes =
new WStandardItemModel(0, 1,
this);
196 addEntry(axes,
"1st Y axis");
197 addEntry(axes,
"2nd Y axis");
199 WStandardItemModel *labels =
new WStandardItemModel(0, 1,
this);
200 addEntry(labels,
"None");
201 addEntry(labels,
"X");
202 addEntry(labels,
"Y");
203 addEntry(labels,
"X: Y");
205 WTable *seriesConfig =
new WTable();
206 seriesConfig->setMargin(WLength::Auto, Left | Right);
208 ::addHeader(seriesConfig,
"Name");
209 ::addHeader(seriesConfig,
"Enabled");
210 ::addHeader(seriesConfig,
"Type");
211 ::addHeader(seriesConfig,
"Marker");
212 ::addHeader(seriesConfig,
"Y axis");
213 ::addHeader(seriesConfig,
"Legend");
214 ::addHeader(seriesConfig,
"Shadow");
215 ::addHeader(seriesConfig,
"Value labels");
217 seriesConfig->rowAt(0)->setStyleClass(
"trhead");
219 for (
int j = 1; j < chart->model()->columnCount(); ++j) {
222 new WText(asString(chart->model()->headerData(j)),
223 seriesConfig->elementAt(j, 0));
225 sc.enabledEdit =
new WCheckBox(seriesConfig->elementAt(j, 1));
228 sc.typeEdit =
new WComboBox(seriesConfig->elementAt(j, 2));
229 sc.typeEdit->setModel(types);
232 sc.markerEdit =
new WComboBox(seriesConfig->elementAt(j, 3));
233 sc.markerEdit->setModel(markers);
236 sc.axisEdit =
new WComboBox(seriesConfig->elementAt(j, 4));
237 sc.axisEdit->setModel(axes);
240 sc.legendEdit =
new WCheckBox(seriesConfig->elementAt(j, 5));
243 sc.shadowEdit =
new WCheckBox(seriesConfig->elementAt(j, 6));
246 sc.labelsEdit =
new WComboBox(seriesConfig->elementAt(j, 7));
247 sc.labelsEdit->setModel(labels);
250 int si = seriesIndexOf(chart, j);
253 sc.enabledEdit->setChecked();
254 const WDataSeries& s =
chart_->series(j);
257 sc.typeEdit->setCurrentIndex(0);
break;
259 sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
260 (s.isStacked() ? 7 : 4) : 1);
break;
262 sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
263 (s.isStacked() ? 8 : 5) : 2);
break;
265 sc.typeEdit->setCurrentIndex(s.isStacked() ? 6 : 3);
268 sc.markerEdit->setCurrentIndex((
int)s.marker());
269 sc.legendEdit->setChecked(s.isLegendEnabled());
270 sc.shadowEdit->setChecked(s.shadow() != WShadow());
275 seriesConfig->rowAt(j)->setStyleClass(
"trdata");
278 p = list->
addWidget(
"Series properties", seriesConfig);
280 p->setMargin(WLength::Auto, Left | Right);
281 p->resize(880, WLength::Auto);
282 p->setMargin(20, Top | Bottom);
286 WStandardItemModel *yScales =
new WStandardItemModel(0, 1,
this);
287 addEntry(yScales,
"Linear scale");
288 addEntry(yScales,
"Log scale");
290 WStandardItemModel *xScales =
new WStandardItemModel(0, 1,
this);
291 addEntry(xScales,
"Categories");
292 addEntry(xScales,
"Linear scale");
293 addEntry(xScales,
"Log scale");
294 addEntry(xScales,
"Date scale");
296 WTable *axisConfig =
new WTable();
297 axisConfig->setMargin(WLength::Auto, Left | Right);
299 ::addHeader(axisConfig,
"Axis");
300 ::addHeader(axisConfig,
"Visible");
301 ::addHeader(axisConfig,
"Scale");
302 ::addHeader(axisConfig,
"Automatic");
303 ::addHeader(axisConfig,
"Minimum");
304 ::addHeader(axisConfig,
"Maximum");
305 ::addHeader(axisConfig,
"Gridlines");
306 ::addHeader(axisConfig,
"Label angle");
308 axisConfig->rowAt(0)->setStyleClass(
"trhead");
310 for (
int i = 0; i < 3; ++i) {
311 const char *axisName[] = {
"X axis",
"1st Y axis",
"2nd Y axis" };
314 const WAxis& axis =
chart_->axis(static_cast<Axis>(i));
317 new WText(WString(axisName[i], UTF8), axisConfig->elementAt(j, 0));
319 sc.visibleEdit =
new WCheckBox(axisConfig->elementAt(j, 1));
320 sc.visibleEdit->setChecked(axis.isVisible());
323 sc.scaleEdit =
new WComboBox(axisConfig->elementAt(j, 2));
324 if (axis.scale() == CategoryScale)
325 sc.scaleEdit->addItem(
"Category scale");
327 if (axis.id() == XAxis) {
328 sc.scaleEdit->setModel(xScales);
329 sc.scaleEdit->setCurrentIndex(axis.scale());
331 sc.scaleEdit->setModel(yScales);
332 sc.scaleEdit->setCurrentIndex(axis.scale() - 1);
337 bool autoValues = axis.autoLimits() == (MinimumValue | MaximumValue);
339 sc.minimumEdit =
new WLineEdit(axisConfig->elementAt(j, 4));
340 sc.minimumEdit->setText(WLocale::currentLocale()
341 .toString(axis.minimum()));
342 sc.minimumEdit->setValidator(anyNumberValidator);
343 sc.minimumEdit->setEnabled(!autoValues);
346 sc.maximumEdit =
new WLineEdit(axisConfig->elementAt(j, 5));
347 sc.maximumEdit->setText(WLocale::currentLocale()
348 .toString(axis.maximum()));
349 sc.maximumEdit->setValidator(anyNumberValidator);
350 sc.maximumEdit->setEnabled(!autoValues);
353 sc.autoEdit =
new WCheckBox(axisConfig->elementAt(j, 3));
354 sc.autoEdit->setChecked(autoValues);
356 sc.autoEdit->checked().connect(sc.maximumEdit, &WLineEdit::disable);
357 sc.autoEdit->unChecked().connect(sc.maximumEdit, &WLineEdit::enable);
358 sc.autoEdit->checked().connect(sc.minimumEdit, &WLineEdit::disable);
359 sc.autoEdit->unChecked().connect(sc.minimumEdit, &WLineEdit::enable);
361 sc.gridLinesEdit =
new WCheckBox(axisConfig->elementAt(j, 6));
364 sc.labelAngleEdit =
new WLineEdit(axisConfig->elementAt(j, 7));
365 sc.labelAngleEdit->setText(
"0");
366 sc.labelAngleEdit->setValidator(angleValidator);
369 axisConfig->rowAt(j)->setStyleClass(
"trdata");
374 p = list->
addWidget(
"Axis properties", axisConfig);
375 p->setMargin(WLength::Auto, Left | Right);
376 p->resize(880, WLength::Auto);
377 p->setMargin(20, Top | Bottom);
383 if (!WApplication::instance()->environment().javaScript()) {
384 WPushButton *b =
new WPushButton(
this);
385 b->setText(
"Update chart");
387 b->setMargin(WLength::Auto, Left | Right);
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_