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