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:"));
139 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Legend location:"));
145 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Legend side:"));
152 chartConfig->elementAt(row, 0)->addWidget(
new WText(
"Legend alignment:"));
159 for (
int i = 0; i < chartConfig->rowCount(); ++i) {
160 chartConfig->elementAt(i, 0)->setStyleClass(
"tdhead");
161 chartConfig->elementAt(i, 1)->setStyleClass(
"tddata");
164 WPanel *p = list->
addWidget(
"Chart properties", chartConfig);
165 p->setMargin(WLength::Auto, Left | Right);
166 p->resize(880, WLength::Auto);
167 p->setMargin(20, Top | Bottom);
171 WStandardItemModel *types =
new WStandardItemModel(0, 1,
this);
172 addEntry(types,
"Points");
173 addEntry(types,
"Line");
174 addEntry(types,
"Curve");
175 addEntry(types,
"Bar");
176 addEntry(types,
"Line Area");
177 addEntry(types,
"Curve Area");
178 addEntry(types,
"Stacked Bar");
179 addEntry(types,
"Stacked Line Area");
180 addEntry(types,
"Stacked Curve Area");
182 WStandardItemModel *markers =
new WStandardItemModel(0, 1,
this);
183 addEntry(markers,
"None");
184 addEntry(markers,
"Square");
185 addEntry(markers,
"Circle");
186 addEntry(markers,
"Cross");
187 addEntry(markers,
"X cross");
188 addEntry(markers,
"Triangle");
189 addEntry(markers,
"Diamond");
191 WStandardItemModel *axes =
new WStandardItemModel(0, 1,
this);
192 addEntry(axes,
"1st Y axis");
193 addEntry(axes,
"2nd Y axis");
195 WStandardItemModel *labels =
new WStandardItemModel(0, 1,
this);
196 addEntry(labels,
"None");
197 addEntry(labels,
"X");
198 addEntry(labels,
"Y");
199 addEntry(labels,
"X: Y");
201 WTable *seriesConfig =
new WTable();
202 seriesConfig->setMargin(WLength::Auto, Left | Right);
204 ::addHeader(seriesConfig,
"Name");
205 ::addHeader(seriesConfig,
"Enabled");
206 ::addHeader(seriesConfig,
"Type");
207 ::addHeader(seriesConfig,
"Marker");
208 ::addHeader(seriesConfig,
"Y axis");
209 ::addHeader(seriesConfig,
"Legend");
210 ::addHeader(seriesConfig,
"Shadow");
211 ::addHeader(seriesConfig,
"Value labels");
213 seriesConfig->rowAt(0)->setStyleClass(
"trhead");
215 for (
int j = 1; j < chart->model()->columnCount(); ++j) {
218 new WText(asString(chart->model()->headerData(j)),
219 seriesConfig->elementAt(j, 0));
221 sc.enabledEdit =
new WCheckBox(seriesConfig->elementAt(j, 1));
224 sc.typeEdit =
new WComboBox(seriesConfig->elementAt(j, 2));
225 sc.typeEdit->setModel(types);
228 sc.markerEdit =
new WComboBox(seriesConfig->elementAt(j, 3));
229 sc.markerEdit->setModel(markers);
232 sc.axisEdit =
new WComboBox(seriesConfig->elementAt(j, 4));
233 sc.axisEdit->setModel(axes);
236 sc.legendEdit =
new WCheckBox(seriesConfig->elementAt(j, 5));
239 sc.shadowEdit =
new WCheckBox(seriesConfig->elementAt(j, 6));
242 sc.labelsEdit =
new WComboBox(seriesConfig->elementAt(j, 7));
243 sc.labelsEdit->setModel(labels);
246 int si = seriesIndexOf(chart, j);
249 sc.enabledEdit->setChecked();
250 const WDataSeries& s =
chart_->series(j);
253 sc.typeEdit->setCurrentIndex(0);
break;
255 sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
256 (s.isStacked() ? 7 : 4) : 1);
break;
258 sc.typeEdit->setCurrentIndex(s.fillRange() != NoFill ?
259 (s.isStacked() ? 8 : 5) : 2);
break;
261 sc.typeEdit->setCurrentIndex(s.isStacked() ? 6 : 3);
264 sc.markerEdit->setCurrentIndex((
int)s.marker());
265 sc.legendEdit->setChecked(s.isLegendEnabled());
266 sc.shadowEdit->setChecked(s.shadow() != WShadow());
271 seriesConfig->rowAt(j)->setStyleClass(
"trdata");
274 p = list->
addWidget(
"Series properties", seriesConfig);
276 p->setMargin(WLength::Auto, Left | Right);
277 p->resize(880, WLength::Auto);
278 p->setMargin(20, Top | Bottom);
282 WStandardItemModel *yScales =
new WStandardItemModel(0, 1,
this);
283 addEntry(yScales,
"Linear scale");
284 addEntry(yScales,
"Log scale");
286 WStandardItemModel *xScales =
new WStandardItemModel(0, 1,
this);
287 addEntry(xScales,
"Categories");
288 addEntry(xScales,
"Linear scale");
289 addEntry(xScales,
"Log scale");
290 addEntry(xScales,
"Date scale");
292 WTable *axisConfig =
new WTable();
293 axisConfig->setMargin(WLength::Auto, Left | Right);
295 ::addHeader(axisConfig,
"Axis");
296 ::addHeader(axisConfig,
"Visible");
297 ::addHeader(axisConfig,
"Scale");
298 ::addHeader(axisConfig,
"Automatic");
299 ::addHeader(axisConfig,
"Minimum");
300 ::addHeader(axisConfig,
"Maximum");
301 ::addHeader(axisConfig,
"Gridlines");
302 ::addHeader(axisConfig,
"Label angle");
304 axisConfig->rowAt(0)->setStyleClass(
"trhead");
306 for (
int i = 0; i < 3; ++i) {
307 const char *axisName[] = {
"X axis",
"1st Y axis",
"2nd Y axis" };
310 const WAxis& axis =
chart_->axis(static_cast<Axis>(i));
313 new WText(WString(axisName[i], UTF8), axisConfig->elementAt(j, 0));
315 sc.visibleEdit =
new WCheckBox(axisConfig->elementAt(j, 1));
316 sc.visibleEdit->setChecked(axis.isVisible());
319 sc.scaleEdit =
new WComboBox(axisConfig->elementAt(j, 2));
320 if (axis.scale() == CategoryScale)
321 sc.scaleEdit->addItem(
"Category scale");
323 if (axis.id() == XAxis) {
324 sc.scaleEdit->setModel(xScales);
325 sc.scaleEdit->setCurrentIndex(axis.scale());
327 sc.scaleEdit->setModel(yScales);
328 sc.scaleEdit->setCurrentIndex(axis.scale() - 1);
333 bool autoValues = axis.autoLimits() == (MinimumValue | MaximumValue);
335 sc.minimumEdit =
new WLineEdit(axisConfig->elementAt(j, 4));
336 sc.minimumEdit->setText(WLocale::currentLocale()
337 .toString(axis.minimum()));
338 sc.minimumEdit->setValidator(anyNumberValidator);
339 sc.minimumEdit->setEnabled(!autoValues);
342 sc.maximumEdit =
new WLineEdit(axisConfig->elementAt(j, 5));
343 sc.maximumEdit->setText(WLocale::currentLocale()
344 .toString(axis.maximum()));
345 sc.maximumEdit->setValidator(anyNumberValidator);
346 sc.maximumEdit->setEnabled(!autoValues);
349 sc.autoEdit =
new WCheckBox(axisConfig->elementAt(j, 3));
350 sc.autoEdit->setChecked(autoValues);
352 sc.autoEdit->checked().connect(sc.maximumEdit, &WLineEdit::disable);
353 sc.autoEdit->unChecked().connect(sc.maximumEdit, &WLineEdit::enable);
354 sc.autoEdit->checked().connect(sc.minimumEdit, &WLineEdit::disable);
355 sc.autoEdit->unChecked().connect(sc.minimumEdit, &WLineEdit::enable);
357 sc.gridLinesEdit =
new WCheckBox(axisConfig->elementAt(j, 6));
360 sc.labelAngleEdit =
new WLineEdit(axisConfig->elementAt(j, 7));
361 sc.labelAngleEdit->setText(
"0");
362 sc.labelAngleEdit->setValidator(angleValidator);
365 axisConfig->rowAt(j)->setStyleClass(
"trdata");
370 p = list->
addWidget(
"Axis properties", axisConfig);
371 p->setMargin(WLength::Auto, Left | Right);
372 p->resize(880, WLength::Auto);
373 p->setMargin(20, Top | Bottom);
379 if (!WApplication::instance()->environment().javaScript()) {
380 WPushButton *b =
new WPushButton(
this);
381 b->setText(
"Update chart");
383 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_