14 #include <Wt/WApplication> 16 #include <Wt/WEnvironment> 17 #include <Wt/WItemDelegate> 18 #include <Wt/WStandardItemModel> 21 #include <Wt/WBorderLayout> 22 #include <Wt/WFitLayout> 24 #include <Wt/WStandardItem> 25 #include <Wt/WTableView> 27 #include <Wt/Chart/WCartesianChart> 28 #include <Wt/Chart/WPieChart> 38 class NumericItem :
public WStandardItem {
40 virtual NumericItem *clone()
const {
41 return new NumericItem();
44 virtual void setData(
const boost::any &data,
int role = UserRole) {
47 if (role == EditRole) {
48 std::string s = Wt::asString(data).toUTF8();
50 double d = strtod(s.c_str(), &endptr);
57 WStandardItem::setData(data, role);
64 WAbstractItemModel *readCsvFile(
const std::string &fname,
65 WContainerWidget *parent)
67 WStandardItemModel *model =
new WStandardItemModel(0, 0, parent);
68 model->setItemPrototype(
new NumericItem());
69 std::ifstream f(fname.c_str());
74 for (
int row = 0; row < model->rowCount(); ++row)
75 for (
int col = 0; col < model->columnCount(); ++col) {
76 model->item(row, col)->setFlags(ItemIsSelectable | ItemIsEditable);
92 WString error(WString::tr(
"error-missing-data"));
93 error.arg(fname, UTF8);
94 new WText(error, parent);
101 : WContainerWidget(root)
103 new WText(WString::tr(
"introduction"),
this);
112 WContainerWidget(parent)
114 new WText(WString::tr(
"category chart"),
this);
116 WAbstractItemModel *model
117 = readCsvFile(WApplication::appRoot() +
"category.csv",
this);
123 WContainerWidget *w =
new WContainerWidget(
this);
124 WTableView *table =
new WTableView(w);
126 table->setMargin(10, Top | Bottom);
127 table->setMargin(WLength::Auto, Left | Right);
129 table->setModel(model);
130 table->setSortingEnabled(
true);
131 table->setColumnResizeEnabled(
true);
133 table->setAlternatingRowColors(
true);
134 table->setColumnAlignment(0, AlignCenter);
135 table->setHeaderAlignment(0, AlignCenter);
136 table->setRowHeight(22);
140 if (WApplication::instance()->environment().ajax()) {
141 table->resize(600, 20 + 5*22);
142 table->setEditTriggers(WAbstractItemView::SingleClicked);
144 table->resize(600, WLength::Auto);
145 table->setEditTriggers(WAbstractItemView::NoEditTrigger);
150 WItemDelegate *delegate =
new WItemDelegate(
this);
151 delegate->setTextFormat(
"%.f");
152 table->setItemDelegate(delegate);
154 table->setColumnWidth(0, 80);
155 for (
int i = 1; i < model->columnCount(); ++i)
156 table->setColumnWidth(i, 120);
161 WCartesianChart *chart =
new WCartesianChart(
this);
162 chart->setModel(model);
163 chart->setXSeriesColumn(0);
164 chart->setLegendEnabled(
true);
165 chart->setZoomEnabled(
true);
166 chart->setPanEnabled(
true);
169 chart->setAutoLayoutEnabled(
true);
171 chart->setBackground(WColor(200,200,200));
176 for (
int i = 1; i < model->columnCount(); ++i) {
177 WDataSeries *s =
new WDataSeries(i, BarSeries);
178 s->setShadow(WShadow(3, 3, WColor(0, 0, 0, 127), 3));
182 chart->resize(800, 400);
184 chart->setMargin(10, Top | Bottom);
185 chart->setMargin(WLength::Auto, Left | Right);
194 WContainerWidget(parent)
196 new WText(WString::tr(
"scatter plot"),
this);
198 WAbstractItemModel *model = readCsvFile(
199 WApplication::appRoot() +
"timeseries.csv",
this);
207 for (
int i = 0; i < model->rowCount(); ++i) {
208 WString s = asString(model->data(i, 0));
209 WDate d = WDate::fromString(s,
"dd/MM/yy");
210 model->setData(i, 0, d);
214 WContainerWidget *w =
new WContainerWidget(
this);
215 WTableView *table =
new WTableView(w);
217 table->setMargin(10, Top | Bottom);
218 table->setMargin(WLength::Auto, Left | Right);
220 table->setModel(model);
221 table->setSortingEnabled(
false);
222 table->setColumnResizeEnabled(
true);
223 table->setSelectionMode(NoSelection);
224 table->setAlternatingRowColors(
true);
225 table->setColumnAlignment(0, AlignCenter);
226 table->setHeaderAlignment(0, AlignCenter);
227 table->setRowHeight(22);
231 if (WApplication::instance()->environment().ajax()) {
232 table->resize(800, 20 + 5*22);
233 table->setEditTriggers(WAbstractItemView::SingleClicked);
235 table->resize(800, 20 + 5*22 + 25);
236 table->setEditTriggers(WAbstractItemView::NoEditTrigger);
239 WItemDelegate *delegate =
new WItemDelegate(
this);
240 delegate->setTextFormat(
"%.1f");
241 table->setItemDelegate(delegate);
242 table->setItemDelegateForColumn(0,
new WItemDelegate(
this));
244 table->setColumnWidth(0, 80);
245 for (
int i = 1; i < model->columnCount(); ++i)
246 table->setColumnWidth(i, 90);
251 WCartesianChart *chart =
new WCartesianChart(
this);
254 chart->setModel(model);
255 chart->setXSeriesColumn(0);
256 chart->setLegendEnabled(
true);
257 chart->setZoomEnabled(
true);
258 chart->setPanEnabled(
true);
260 chart->setType(ScatterPlot);
261 chart->axis(XAxis).setScale(DateScale);
264 chart->setAutoLayoutEnabled();
266 chart->setBackground(WColor(200,200,200));
270 for (
int i = 1; i < 3; ++i) {
271 WDataSeries *s =
new WDataSeries(i, LineSeries);
272 s->setShadow(WShadow(3, 3, WColor(0, 0, 0, 127), 3));
276 chart->resize(800, 400);
278 chart->setMargin(10, Top | Bottom);
279 chart->setMargin(WLength::Auto, Left | Right);
285 WContainerWidget(parent)
287 new WText(WString::tr(
"scatter plot 2"),
this);
289 WStandardItemModel *model =
new WStandardItemModel(40, 2,
this);
290 model->setItemPrototype(
new NumericItem());
291 model->setHeaderData(0, WString(
"X"));
292 model->setHeaderData(1, WString(
"Y = sin(X)"));
294 for (
unsigned i = 0; i < 40; ++i) {
295 double x = (
static_cast<double>(i) - 20) / 4;
297 model->setData(i, 0, x);
298 model->setData(i, 1, sin(x));
304 WCartesianChart *chart =
new WCartesianChart(
this);
305 chart->setModel(model);
306 chart->setXSeriesColumn(0);
307 chart->setLegendEnabled(
true);
308 chart->setZoomEnabled(
true);
309 chart->setPanEnabled(
true);
310 chart->setCrosshairEnabled(
true);
312 chart->setBackground(WColor(200,200,200));
314 chart->setType(ScatterPlot);
318 chart->axis(XAxis).setLocation(ZeroValue);
319 chart->axis(YAxis).setLocation(ZeroValue);
322 chart->setAutoLayoutEnabled();
325 WDataSeries *s =
new WDataSeries(1, CurveSeries);
326 s->setShadow(WShadow(3, 3, WColor(0, 0, 0, 127), 3));
329 chart->resize(800, 300);
331 chart->setMargin(10, Top | Bottom);
332 chart->setMargin(WLength::Auto, Left | Right);
339 WContainerWidget(parent)
341 new WText(WString::tr(
"pie chart"),
this);
343 WStandardItemModel *model =
new WStandardItemModel(
this);
344 model->setItemPrototype(
new NumericItem());
347 model->insertColumns(model->columnCount(), 2);
348 model->setHeaderData(0, WString(
"Item"));
349 model->setHeaderData(1, WString(
"Sales"));
352 model->insertRows(model->rowCount(), 6);
354 model->setData(row, 0, WString(
"Blueberry"));
355 model->setData(row, 1, 120);
358 model->setData(row, 0, WString(
"Cherry"));
359 model->setData(row, 1, 30);
361 model->setData(row, 0, WString(
"Apple"));
362 model->setData(row, 1, 260);
364 model->setData(row, 0, WString(
"Boston Cream"));
365 model->setData(row, 1, 160);
367 model->setData(row, 0, WString(
"Other"));
368 model->setData(row, 1, 40);
370 model->setData(row, 0, WString(
"Vanilla Cream"));
371 model->setData(row, 1, 120);
375 for (
int row = 0; row < model->rowCount(); ++row)
376 for (
int col = 0; col < model->columnCount(); ++col)
377 model->item(row, col)->setFlags(ItemIsSelectable | ItemIsEditable);
379 WContainerWidget *w =
new WContainerWidget(
this);
380 WTableView* table =
new WTableView(w);
382 table->setMargin(10, Top | Bottom);
383 table->setMargin(WLength::Auto, Left | Right);
384 table->setSortingEnabled(
true);
385 table->setModel(model);
386 table->setColumnWidth(1, 100);
387 table->setRowHeight(22);
389 if (WApplication::instance()->environment().ajax()) {
390 table->resize(150 + 100 + 14, 20 + 6 * 22);
391 table->setEditTriggers(WAbstractItemView::SingleClicked);
393 table->resize(150 + 100 + 14, WLength::Auto);
394 table->setEditTriggers(WAbstractItemView::NoEditTrigger);
400 WPieChart *chart =
new WPieChart(
this);
401 chart->setModel(model);
402 chart->setLabelsColumn(0);
403 chart->setDataColumn(1);
406 chart->setDisplayLabels(Outside | TextLabel | TextPercentage);
409 chart->setPerspectiveEnabled(
true, 0.2);
410 chart->setShadowEnabled(
true);
413 chart->setExplode(0, 0.3);
415 chart->resize(800, 300);
417 chart->setMargin(10, Top | Bottom);
418 chart->setMargin(WLength::Auto, Left | Right);
A Widget that demonstrates a scatter plot.
ChartsExample(Wt::WContainerWidget *root)
Constructor.
A Widget that demonstrates a Pie chart.
CategoryExample(Wt::WContainerWidget *parent)
Creates the category chart example.
A Widget that demonstrates a category chart.
A widget that demonstrates a times series chart.
TimeSeriesExample(Wt::WContainerWidget *parent)
Creates the time series scatter plot example.
void setValueFill(Wt::Chart::FillRangeType fill)
PieExample(Wt::WContainerWidget *parent)
Creates the pie chart example.
A class that allows configuration of a cartesian chart.
void readFromCsv(std::istream &f, Wt::WAbstractItemModel *model, int numRows, bool firstLineIsHeaders)
Utility function that reads a model from a CSV file.
ScatterPlotExample(Wt::WContainerWidget *parent)
Creates the scatter plot example.