1 // Copyright (c) 2016 The SigViewer Development Team
2 // Licensed under the GNU General Public License (GPL)
3 // https://www.gnu.org/licenses/gpl
4
5
6 #include "color_manager.h"
7
8 #include <QSettings>
9 #include <QDebug>
10 #include <QDomDocument>
11 #include <QFile>
12
13 namespace sigviewer
14 {
15
16 const char* ColorManager::DEFAULT_CHANNEL_COLOR_SETTING_ = "Default Channel Color";
17
18 //-----------------------------------------------------------------------------
ColorManager()19 ColorManager::ColorManager ()
20 {
21 qDebug() << "constructing event color manager";
22 loadDefaultEventColors ();
23 loadSettings();
24 }
25
26 //-----------------------------------------------------------------------------
~ColorManager()27 ColorManager::~ColorManager ()
28 {
29 qDebug() << "destructing event color manager";
30 }
31
32 //-----------------------------------------------------------------------------
getChannelColor(ChannelID channel_id) const33 QColor ColorManager::getChannelColor (ChannelID channel_id) const
34 {
35 if (channel_color_map_.contains (channel_id))
36 return channel_color_map_[channel_id];
37 else
38 return default_channel_color_;
39 }
40
41 //-----------------------------------------------------------------------------
getDefaultChannelColor() const42 QColor ColorManager::getDefaultChannelColor () const
43 {
44 return default_channel_color_;
45 }
46
47 //-----------------------------------------------------------------------------
setDefaultChannelColor(QColor const & color)48 void ColorManager::setDefaultChannelColor (QColor const& color)
49 {
50 default_channel_color_ = color;
51 QSettings settings;
52 settings.beginGroup ("ColorManager");
53 settings.setValue (DEFAULT_CHANNEL_COLOR_SETTING_, color);
54 settings.endGroup ();
55
56 default_channel_color_ = color;
57 }
58
59 //-----------------------------------------------------------------------------
setChannelColor(ChannelID channel_id,QColor const & color)60 void ColorManager::setChannelColor (ChannelID channel_id, QColor const& color)
61 {
62 channel_color_map_[channel_id] = color;
63 }
64
65
66 //-----------------------------------------------------------------------------
getEventColor(EventType type) const67 QColor ColorManager::getEventColor (EventType type) const
68 {
69 if (type == 800)
70 qDebug () << "ups";
71 EventColorMap::const_iterator it = event_type2color_.find(type);
72 if (it == event_type2color_.end())
73 {
74 if (default_event_colors_.contains (type))
75 return default_event_colors_[type];
76 else
77 return default_event_color_;
78 }
79 else
80 return *it;
81 }
82
83 //-----------------------------------------------------------------------------
getDefaultEventColor(EventType type) const84 QColor ColorManager::getDefaultEventColor (EventType type) const
85 {
86 if (default_event_colors_.contains (type))
87 return default_event_colors_[type];
88 else
89 return default_event_color_;
90 }
91
92 //-----------------------------------------------------------------------------
setEventColor(EventType type,const QColor & color)93 void ColorManager::setEventColor (EventType type, const QColor& color)
94 {
95 event_type2color_[type] = color;
96 }
97
98 //-----------------------------------------------------------------------------
isDark(QColor const & color)99 bool ColorManager::isDark (QColor const& color)
100 {
101 double alpha_factor = color.alpha() / 255.0;
102 double tmp = 255 * (1 - alpha_factor);
103 float64 y = 0.299 * (tmp + color.red() * alpha_factor)+
104 0.587 * (tmp + color.green() * alpha_factor) +
105 0.114 * (tmp + color.blue() * alpha_factor);
106
107 return y < 127;
108 }
109
110
111 //-----------------------------------------------------------------------------
loadSettings()112 void ColorManager::loadSettings()
113 {
114 // get event types from event table reader
115 QColor alpha_color(0, 0, 0, 50);
116 event_type2color_[-1] = alpha_color;
117 EventTableFileReader::IntIterator it;
118 for (it = event_table_file_reader_.eventTypesBegin();
119 it != event_table_file_reader_.eventTypesEnd();
120 it++)
121 {
122 event_type2color_[*it] = default_event_colors_[*it];
123 }
124
125 QSettings settings;
126 settings.beginGroup("ColorManager");
127
128
129 default_channel_color_ = QColor("#0055ff"); //vivid blue
130 // default_channel_color_ = Qt::darkBlue;
131 if (settings.contains (DEFAULT_CHANNEL_COLOR_SETTING_))
132 default_channel_color_ = settings.value (DEFAULT_CHANNEL_COLOR_SETTING_).value<QColor>();
133 else
134 settings.setValue (DEFAULT_CHANNEL_COLOR_SETTING_, default_channel_color_);
135
136 int size = settings.beginReadArray("event");
137 for (int i = 0; i < size; i++)
138 {
139 settings.setArrayIndex(i);
140 int32 id = settings.value("id").toInt();
141 QColor color = settings.value("color").toString();
142 color.setAlpha(settings.value("alpha").toInt());
143 event_type2color_[id] = color;
144 }
145 settings.endArray();
146
147 size = settings.beginReadArray("channel");
148 for (int i = 0; i < size; i++)
149 {
150 settings.setArrayIndex(i);
151 ChannelID id = settings.value("id").toInt ();
152 QColor color = settings.value("color").toString();
153 channel_color_map_[id] = color;
154 }
155 settings.endArray();
156 settings.endGroup();
157 }
158
159 //-----------------------------------------------------------------------------
saveSettings()160 void ColorManager::saveSettings()
161 {
162 qDebug() << "color manager save settings";
163 QSettings settings;
164 settings.beginGroup("ColorManager");
165 settings.beginWriteArray("event");
166 int32 i = 0;
167 for (EventColorMap::const_iterator it = event_type2color_.begin();
168 it != event_type2color_.end();
169 it++)
170 {
171 if (it.key() == UNDEFINED_EVENT_TYPE)
172 {
173 continue;
174 }
175 settings.setArrayIndex(i++);
176 settings.setValue("id", it.key());
177 settings.setValue("color", it->name());
178 settings.setValue("alpha", it->alpha());
179 }
180 settings.endArray();
181
182 i = 0;
183 settings.beginWriteArray("channel");
184 foreach (ChannelID id, channel_color_map_.keys ())
185 {
186 settings.setArrayIndex (i++);
187 settings.setValue ("id", id);
188 settings.setValue ("color", channel_color_map_[id]);
189 }
190 settings.endArray();
191
192 settings.endGroup();
193 }
194
195 //-----------------------------------------------------------------------------
loadDefaultEventColors()196 void ColorManager::loadDefaultEventColors ()
197 {
198 QFile color_settings_file (":/color_settings.xml");
199 QDomDocument color_doc;
200 QString error_msg;
201 int error_line;
202 color_doc.setContent (&color_settings_file, true, &error_msg, &error_line);
203 QDomElement root = color_doc.documentElement();
204
205 QDomNodeList default_elements = root.elementsByTagName("default");
206 if (default_elements.size() != 1)
207 return;
208 QDomElement default_node = default_elements.at(0).toElement();
209 QColor default_color;
210 default_color.setAlpha (default_node.attribute("alpha").toUInt());
211 default_color.setRed (default_node.attribute("red").toUInt());
212 default_color.setGreen (default_node.attribute("green").toUInt());
213 default_color.setBlue (default_node.attribute("blue").toUInt());
214
215 default_event_color_ = default_color;
216
217 QDomNodeList event_elements = root.elementsByTagName("event");
218 for (int index = 0; index < event_elements.size(); index++)
219 {
220 QDomElement element = event_elements.at(index).toElement();
221 QColor event_color = default_color;
222 if (element.hasAttribute("red"))
223 event_color.setRed(element.attribute("red").toUInt());
224 if (element.hasAttribute("green"))
225 event_color.setGreen(element.attribute("green").toUInt());
226 if (element.hasAttribute("blue"))
227 event_color.setBlue(element.attribute("blue").toUInt());
228 if (element.hasAttribute("alpha"))
229 event_color.setAlpha(element.attribute("alpha").toUInt());
230 default_event_colors_[element.attribute("type").toInt(0, 16)] = event_color;
231 }
232
233 EventTableFileReader::IntIterator it;
234 for (it = event_table_file_reader_.eventTypesBegin();
235 it != event_table_file_reader_.eventTypesEnd();
236 it++)
237 {
238 if (!default_event_colors_.contains(*it))
239 default_event_colors_[*it] = default_color;
240 }
241 }
242
243 }
244