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