1 /*
2 * Copyright (C) 2008 Emweb bv, Herent, Belgium.
3 *
4 * See the LICENSE file for terms of use.
5 */
6 #include "Wt/WAbstractItemModel.h"
7 #include "Wt/WLogger.h"
8 #include "Wt/Chart/WAbstractChart.h"
9 #include "Wt/Chart/WAbstractChartModel.h"
10 #include "Wt/Chart/WChartPalette.h"
11 #include "Wt/Chart/WStandardChartProxyModel.h"
12
13 namespace Wt {
14
15 LOGGER("Chart.WAbstractChart");
16
17 namespace Chart {
18
WAbstractChart()19 WAbstractChart::WAbstractChart()
20 : background_(StandardColor::White),
21 autoPadding_(false)
22 {
23 titleFont_.setFamily(FontFamily::SansSerif);
24 titleFont_.setSize(WLength(15, LengthUnit::Point));
25
26 setPlotAreaPadding(5, WFlags<Side>(Side::Left) | Side::Right);
27 setPlotAreaPadding(5, WFlags<Side>(Side::Top) | Side::Bottom);
28 }
29
~WAbstractChart()30 WAbstractChart::~WAbstractChart()
31 { }
32
setPalette(const std::shared_ptr<WChartPalette> & palette)33 void WAbstractChart::setPalette(const std::shared_ptr<WChartPalette>& palette)
34 {
35 palette_ = palette;
36
37 update();
38 }
39
setPlotAreaPadding(int padding,WFlags<Side> sides)40 void WAbstractChart::setPlotAreaPadding(int padding, WFlags<Side> sides)
41 {
42 if (sides.test(Side::Top))
43 padding_[0] = padding;
44 if (sides.test(Side::Right))
45 padding_[1] = padding;
46 if (sides.test(Side::Bottom))
47 padding_[2] = padding;
48 if (sides.test(Side::Left))
49 padding_[3] = padding;
50 }
51
plotAreaPadding(Side side)52 int WAbstractChart::plotAreaPadding(Side side) const
53 {
54 switch (side) {
55 case Side::Top:
56 return padding_[0];
57 case Side::Right:
58 return padding_[1];
59 case Side::Bottom:
60 return padding_[2];
61 case Side::Left:
62 return padding_[3];
63 default:
64 LOG_ERROR("plotAreaPadding(): improper side.");
65 return 0;
66 }
67 }
68
setAutoLayoutEnabled(bool enabled)69 void WAbstractChart::setAutoLayoutEnabled(bool enabled)
70 {
71 autoPadding_ = enabled;
72 }
73
setBackground(const WBrush & background)74 void WAbstractChart::setBackground(const WBrush& background)
75 {
76 set(background_, background);
77 }
78
setTitle(const WString & title)79 void WAbstractChart::setTitle(const WString& title)
80 {
81 set(title_, title);
82 }
83
setTitleFont(const WFont & titleFont)84 void WAbstractChart::setTitleFont(const WFont& titleFont)
85 {
86 set(titleFont_, titleFont);
87 }
88
setAxisTitleFont(const WFont & titleFont)89 void WAbstractChart::setAxisTitleFont(const WFont& titleFont)
90 {
91 set(axisTitleFont_, titleFont);
92 }
93
setModel(const std::shared_ptr<WAbstractChartModel> & model)94 void WAbstractChart::setModel(const std::shared_ptr<WAbstractChartModel>& model)
95 {
96 if (model_) {
97 /* disconnect slots from previous model */
98 for (unsigned i = 0; i < modelConnections_.size(); ++i)
99 modelConnections_[i].disconnect();
100 modelConnections_.clear();
101 }
102
103 model_ = model;
104
105 modelConnections_.push_back(model_->changed().connect
106 (this, &WAbstractChart::modelReset));
107
108 modelChanged();
109 }
110
setModel(const std::shared_ptr<WAbstractItemModel> & model)111 void WAbstractChart::setModel(const std::shared_ptr<WAbstractItemModel>& model)
112 {
113 setModel(std::shared_ptr<WAbstractChartModel>(std::make_shared<WStandardChartProxyModel>(model)));
114 }
115
itemModel()116 std::shared_ptr<WAbstractItemModel> WAbstractChart::itemModel() const
117 {
118 WStandardChartProxyModel *proxy
119 = dynamic_cast<WStandardChartProxyModel *>(model_.get());
120 if (proxy)
121 return proxy->sourceModel();
122 else
123 return nullptr;
124 }
125
modelChanged()126 void WAbstractChart::modelChanged()
127 { }
128
modelReset()129 void WAbstractChart::modelReset()
130 { }
131
132 }
133 }
134