1 #include <Wt/Chart/WAbstractChartModel.h>
2 #include <Wt/Chart/WAxisSliderWidget.h>
3 #include <Wt/Chart/WCartesianChart.h>
4 #include <Wt/Chart/WDataSeries.h>
5 #include <Wt/WApplication.h>
6 #include <Wt/WContainerWidget.h>
7 #include <Wt/WObject.h>
8 #include <Wt/WShadow.h>
9 
10 #include <cmath>
11 
12 #ifndef M_PI
13 #define M_PI 3.14159265358979323846
14 #endif
15 
16 #ifdef WT_TARGET_JAVA
17 using namespace Wt;
18 #endif // WT_TARGET_JAVA
19 
20 class SinModel : public Chart::WAbstractChartModel {
21 public:
SinModel(double minimum,double maximum,int rows)22   SinModel(double minimum, double maximum, int rows)
23     : Chart::WAbstractChartModel(),
24       minimum_(minimum),
25       maximum_(maximum),
26       rows_(rows)
27   { }
28 
data(int row,int column) const29   virtual double data(int row, int column) const
30   {
31     double x = minimum_ + row * (maximum_ - minimum_) / (rowCount() - 1);
32     if (column == 0) {
33       return x;
34     } else {
35       return std::sin(x) + std::sin(x * 100.0) / 40.0;
36     }
37   }
38 
columnCount() const39   virtual int columnCount() const
40   {
41     return 2;
42   }
43 
rowCount() const44   virtual int rowCount() const
45   {
46     return rows_;
47   }
48 
minimum() const49   double minimum() const { return minimum_; }
maximum() const50   double maximum() const { return maximum_; }
51 
52 private:
53   double minimum_;
54   double maximum_;
55   int rows_;
56 };
57 
58 SAMPLE_BEGIN(AxisSliderWidgetDifferentDataSeries)
59 
60 auto container = std::make_unique<WContainerWidget>();
61 
62 auto chart =
63     container->addNew<Chart::WCartesianChart>();
64 chart->setBackground(WColor(220, 220, 220));
65 chart->setType(Chart::ChartType::Scatter);
66 
67 /*
68  * Create a rough model to use for the WAxisSliderWidget
69  */
70 auto roughModel = std::make_shared<SinModel>(-M_PI, M_PI, 100);
71 auto roughSeries =
72     std::make_unique<Chart::WDataSeries>(1, Chart::SeriesType::Line);
73 auto roughSeries_ = roughSeries.get();
74 roughSeries_->setModel(roughModel);
75 roughSeries_->setXSeriesColumn(0);
76 // Add the rough series to the chart, but hide it!
77 roughSeries->setHidden(true);
78 chart->addSeries(std::move(roughSeries));
79 
80 /*
81  * Create a detailed model
82  */
83 auto detailedModel = std::make_shared<SinModel>(-M_PI, M_PI, 10000);
84 auto seriesPtr =
85     std::make_unique<Chart::WDataSeries>(1, Chart::SeriesType::Line);
86 auto series = seriesPtr.get();
87 series->setModel(detailedModel);
88 series->setXSeriesColumn(0);
89 series->setShadow(WShadow(3, 3, WColor(0, 0, 0, 127), 3));
90 chart->addSeries(std::move(seriesPtr));
91 
92 
93 chart->axis(Chart::Axis::X).setMaximumZoomRange(M_PI);
94 chart->axis(Chart::Axis::X).setMinimumZoomRange(M_PI / 16.0);
95 chart->axis(Chart::Axis::X).setMinimum(-3.5);
96 chart->axis(Chart::Axis::X).setMaximum(3.5);
97 
98 chart->axis(Chart::Axis::Y).setMinimumZoomRange(0.1);
99 chart->axis(Chart::Axis::Y).setMinimum(-1.5);
100 chart->axis(Chart::Axis::Y).setMaximum(1.5);
101 
102 chart->resize(800, 400);
103 
104 // Enable pan and zoom
105 chart->setPanEnabled(true);
106 chart->setZoomEnabled(true);
107 
108 // Enable on-demand loading
109 chart->setOnDemandLoadingEnabled(true);
110 
111 chart->setMargin(WLength::Auto, Side::Left | Side::Right); // Center horizontally
112 
113 // Add a WAxisSliderWidget for the chart using the data series for column 2
114 auto sliderWidget =
115     container->addNew<Chart::WAxisSliderWidget>(roughSeries_);
116 sliderWidget->resize(800, 80);
117 sliderWidget->setSelectionAreaPadding(40, Side::Left | Side::Right);
118 sliderWidget->setMargin(WLength::Auto, Side::Left | Side::Right); // Center horizontally
119 
120 SAMPLE_END(return std::move(container))
121