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