11 #include <boost/date_time/gregorian/greg_year.hpp> 13 #include <Wt/WAbstractItemModel> 14 #include <Wt/WApplication> 15 #include <Wt/WCheckBox> 16 #include <Wt/WComboBox> 17 #include <Wt/WDoubleValidator> 19 #include <Wt/WEnvironment> 20 #include <Wt/WIntValidator> 21 #include <Wt/WLineEdit> 24 #include <Wt/WPushButton> 25 #include <Wt/WStandardItemModel> 28 #include <Wt/WPainterPath> 30 #include <Wt/Chart/WCartesianChart> 36 void addHeader(
WTable *t,
const char *value) {
50 bool getDouble(
WLineEdit *edit,
double& value) {
60 for (
unsigned i = 0; i < chart->
series().size(); ++i)
70 return Wt::utf8(
"X Axis {1}").
arg(axisId + 1);
72 return Wt::utf8(
"Y axis {1}").
arg(axisId + 1);
80 fill_(MinimumValueFill)
99 addEntry(orientation,
"Vertical");
100 addEntry(orientation,
"Horizontal");
103 addEntry(legendLocation,
"Outside");
104 addEntry(legendLocation,
"Inside");
107 addEntry(legendSide,
"Top");
108 addEntry(legendSide,
"Right");
109 addEntry(legendSide,
"Bottom");
110 addEntry(legendSide,
"Left");
113 addEntry(legendAlignment,
"AlignLeft");
114 addEntry(legendAlignment,
"AlignCenter");
115 addEntry(legendAlignment,
"AlignRight");
116 addEntry(legendAlignment,
"AlignTop");
117 addEntry(legendAlignment,
"AlignMiddle");
118 addEntry(legendAlignment,
"AlignBottom");
181 for (
int i = 0; i < chartConfig->
rowCount(); ++i) {
188 p->
resize(1160, WLength::Auto);
194 addEntry(types,
"Points");
195 addEntry(types,
"Line");
196 addEntry(types,
"Curve");
197 addEntry(types,
"Bar");
198 addEntry(types,
"Line Area");
199 addEntry(types,
"Curve Area");
200 addEntry(types,
"Stacked Bar");
201 addEntry(types,
"Stacked Line Area");
202 addEntry(types,
"Stacked Curve Area");
205 addEntry(markers,
"None");
206 addEntry(markers,
"Square");
207 addEntry(markers,
"Circle");
208 addEntry(markers,
"Cross");
209 addEntry(markers,
"X cross");
210 addEntry(markers,
"Triangle");
211 addEntry(markers,
"Pipe");
212 addEntry(markers,
"Star");
213 addEntry(markers,
"Inverted triangle");
214 addEntry(markers,
"Asterisk");
215 addEntry(markers,
"Diamond");
225 addEntry(labels,
"None");
226 addEntry(labels,
"X");
227 addEntry(labels,
"Y");
228 addEntry(labels,
"X: Y");
233 ::addHeader(seriesConfig,
"Name");
234 ::addHeader(seriesConfig,
"Enabled");
235 ::addHeader(seriesConfig,
"Type");
236 ::addHeader(seriesConfig,
"Marker");
237 ::addHeader(seriesConfig,
"X axis");
238 ::addHeader(seriesConfig,
"Y axis");
239 ::addHeader(seriesConfig,
"Legend");
240 ::addHeader(seriesConfig,
"Shadow");
241 ::addHeader(seriesConfig,
"Value labels");
245 for (
int j = 1; j < chart->
model()->columnCount(); ++j) {
285 int si = seriesIndexOf(chart, j);
313 p = list->
addWidget(
"Series properties", seriesConfig);
316 p->
resize(1160, WLength::Auto);
355 new WPushButton(Wt::utf8(
"Add X axis"), axisConfig);
358 new WPushButton(Wt::utf8(
"Clear X axes"), axisConfig);
361 new WPushButton(Wt::utf8(
"Add Y axis"), axisConfig);
364 new WPushButton(Wt::utf8(
"Clear Y axes"), axisConfig);
367 p = list->
addWidget(
"Axis properties", axisConfig);
369 p->
resize(1160, WLength::Auto);
376 if (!WApplication::instance()->environment().javaScript()) {
392 bool haveLegend =
false;
393 std::vector<WDataSeries *> series;
395 for (
int i = 1; i <
chart_->
model()->columnCount(); ++i) {
490 if (axis.
id() != XAxis)
523 if (axis.
scale() == LogScale)
527 if (axis.
scale() == DateScale){
535 bool greg_year_validation =
536 (min > gregDaysMin &&
541 if(!greg_year_validation){
605 case 0: location = LegendOutside;
break;
606 case 1: location = LegendInside;
break;
610 case 0: side =
Top;
break;
611 case 1: side =
Right;
break;
612 case 2: side =
Bottom;
break;
613 case 3: side =
Left;
break;
625 case 0: alignment = AlignLeft;
break;
626 case 1: alignment = AlignCenter;
break;
627 case 2: alignment = AlignRight;
break;
628 case 3: alignment = AlignTop;
break;
629 case 4: alignment = AlignMiddle;
break;
630 case 5: alignment = AlignBottom;
break;
648 bool valid = w->
validate() == WValidator::Valid;
650 if (!WApplication::instance()->environment().javaScript()) {
661 if (dynamic_cast<WLineEdit *>(w))
698 if (axis.
scale() == CategoryScale)
701 if (axis.
id() == XAxis) {
788 for (std::size_t i = 0; i <
chart_->
series().size(); ++i) {
802 for (std::size_t i = 0; i <
chart_->
series().size(); ++i) {
818 for (std::size_t i = 0; i <
chart_->
series().size(); ++i) {
823 for (
int i = 0; i < xAxisCount; ++i) {
835 for (std::size_t i = 0; i <
chart_->
series().size(); ++i) {
840 for (
int i = 0; i < yAxisCount; ++i) {
void setVisible(bool visible)
Wt::WCheckBox * borderEdit_
void setType(SeriesType t)
MarkerType marker() const
Wt::WComboBox * xAxisEdit
void lineTo(const WPointF &point)
ChartConfig(Wt::Chart::WCartesianChart *chart, Wt::WContainerWidget *parent)
Constructor.
virtual void setText(const WString &text)
Wt::WValidator * angleValidator_
const WString & text() const
WString & arg(const std::wstring &value)
Wt::Chart::FillRangeType fill_
void bindToXAxis(int xAxis)
Wt::WValidator * anyNumberValidator_
Wt::WComboBox * scaleEdit
Wt::WLineEdit * titleEdit_
void removeXAxis(const Wt::Chart::WAxis *axis)
void setGridLinesEnabled(bool enabled)
Wt::Chart::WCartesianChart * chart_
void addItem(const WString &text)
FillRangeType fillRange() const
void setTickDirection(TickDirection direction)
void connectSignals(Wt::WFormWidget *w)
void setLocation(AxisValue value)
virtual bool insertRows(int row, int count, const WModelIndex &parent=WModelIndex())
void setShadow(const WShadow &shadow)
void setLegendStyle(const WFont &font, const WPen &border, const WBrush &background)
Wt::WCheckBox * enabledEdit
Wt::WStandardItemModel * xAxesModel_
Wt::WComboBox * locationEdit
Wt::WStandardItemModel * xScales_
void setType(ChartType type)
Struct that holds the controls for one series.
std::unique_ptr< WAxis > removeXAxis(int xAxisId)
Wt::WLineEdit * titleEdit
void setMarker(MarkerType marker)
void setLegendLocation(LegendLocation location, Side side, AlignmentFlag alignment)
virtual bool setData(const WModelIndex &index, const cpp17::any &value, ItemDataRole role=ItemDataRole::Edit)
void setModel(const std::shared_ptr< WAbstractItemModel > model)
virtual int rowCount(const WModelIndex &parent=WModelIndex()) const=0
bool isLegendEnabled() const
Wt::WCheckBox * visibleEdit
void removeYAxis(const Wt::Chart::WAxis *axis)
void setLegendEnabled(bool enabled)
Wt::WComboBox * markerEdit
Wt::WLineEdit * chartWidthEdit_
Struct that holds the controls for one axis.
WTableCell * elementAt(int row, int column)
WFlags< AxisValue > autoLimits() const
Wt::WPanel * addWidget(const Wt::WString &text, Wt::WWidget *w)
Wt::WComboBox * chartOrientationEdit_
Wt::WComboBox * legendLocationEdit_
std::vector< SeriesControl > seriesControls_
Controls for series.
void setCurrentIndex(int index)
void setSeries(std::vector< std::unique_ptr< WDataSeries > > series)
void setScale(AxisScale scale)
void setStyleClass(const WString &style)
WDataSeries & series(int modelColumn)
Wt::WLineEdit * minimumEdit
void setMaxLength(int length)
void setTitleOrientation(const Orientation &orientation)
void setCustomMarker(const WPainterPath &path)
void setAutoLimits(WFlags< AxisValue > locations)
Wt::WComboBox * legendSideEdit_
std::vector< AxisControl > axisControls_
Controls for axes.
Wt::WCheckBox * shadowEdit
Wt::WComboBox * labelsEdit
Wt::WStandardItemModel * yAxesModel_
Wt::WComboBox * yAxisEdit
void setLabelsEnabled(Axis axis, bool enabled=true)
void setValueFill(Wt::Chart::FillRangeType fill)
Wt::WComboBox * tickDirectionEdit
Wt::WLineEdit * labelAngleEdit
void moveTo(const WPointF &point)
std::shared_ptr< WAbstractChartModel > model() const
bool removeRow(int row, const WModelIndex &parent=WModelIndex())
Wt::WStandardItemModel * yScales_
void setStacked(bool stacked)
int addXAxis(std::unique_ptr< WAxis > waxis)
void setOrientation(Orientation orientation)
void setMandatory(bool how)
void setBorderPen(const WPen &pen)
double toDouble(const WString &value) const
Wt::WCheckBox * legendEdit
void setRange(double minimum, double maximum)
virtual WTableRow * insertRow(int row, std::unique_ptr< WTableRow > tableRow=nullptr)
Wt::WCheckBox * gridLinesEdit
void setLegendEnabled(bool enabled)
static const WLocale & currentLocale()
Wt::WComboBox * titleOrientationEdit
Wt::WComboBox * legendAlignmentEdit_
AxisValue location() const
Wt::Signals::connection connect(F function)
Wt::WLineEdit * maximumEdit
int addYAxis(std::unique_ptr< WAxis > waxis)
void setTitle(const WString &title)
WTableRow * rowAt(int row)
void setLabelAngle(double angle)
void setFillRange(FillRangeType fillRange)
void setLegendColumns(int columns, const WLength &width)
const WShadow & shadow() const
static bool validate(Wt::WFormWidget *w)
std::unique_ptr< WAxis > removeYAxis(int yAxisId)
Wt::WLineEdit * chartHeightEdit_
void setTitle(const WString &title)
void bindToYAxis(int yAxis)
void addAxis(Wt::Chart::Axis axis, int axisId)