1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2 
3 /*
4     Rosegarden
5     A MIDI and audio sequencer and musical notation editor.
6     Copyright 2000-2021 the Rosegarden development team.
7 
8     Other copyrights also apply to some parts of this work.  Please
9     see the AUTHORS file and individual file headers for details.
10 
11     This program is free software; you can redistribute it and/or
12     modify it under the terms of the GNU General Public License as
13     published by the Free Software Foundation; either version 2 of the
14     License, or (at your option) any later version.  See the file
15     COPYING included with this distribution for more information.
16 */
17 
18 
19 #include "GUIPalette.h"
20 
21 #include "misc/ConfigGroups.h"
22 
23 #include <QApplication>
24 #include <QSettings>
25 #include <QColor>
26 
27 
28 namespace Rosegarden
29 {
30 
31 
32 const QColor GUIPalette::SelectionColor = QColor(0, 54, 232);
33 const QColor GUIPalette::PreviewColor = Qt::darkGreen;
34 const QColor GUIPalette::OutRangeColor = Qt::red;
35 
36 
getColour(const char * const colourName)37 QColor GUIPalette::getColour(const char* const colourName)
38 {
39     QSettings config; // should probably become a member var for performance reasons
40     config.beginGroup(ColoursConfigGroup);
41 
42     // First determine the default colour (see the GUIPalette constructor)
43     QColor defaultColour = getInstance()->m_defaultsMap[colourName];
44 
45     // Then read the user configuration, and if it doesn't have any setting
46     // then use the above default colour as fallback.
47     QColor color = config.value(colourName, defaultColour).value<QColor>();
48 
49     config.endGroup();
50     return color;
51 }
52 
GUIPalette()53 GUIPalette::GUIPalette()
54 {
55     m_defaultsMap[ActiveRecordTrack] = QColor(Qt::red);
56 
57     m_defaultsMap[SegmentCanvas] = QColor(230, 230, 230);
58     m_defaultsMap[SegmentBorder] = QColor(Qt::black);
59 
60     // 1.0 colors
61     //    m_defaultsMap[RecordingInternalSegmentBlock] = QColor(255, 182, 193);
62     //    m_defaultsMap[RecordingAudioSegmentBlock] = QColor(182, 222, 255);
63 
64     // MIDI recording preview (pale yellow)
65     m_defaultsMap[RecordingInternalSegmentBlock] = QColor(255, 234, 182);
66 
67     // audio recording preview (pale red)
68     m_defaultsMap[RecordingAudioSegmentBlock] = QColor(255, 182, 193);
69 
70     m_defaultsMap[RecordingSegmentBorder] = QColor(Qt::black);
71 
72     m_defaultsMap[RepeatSegmentBorder] = QColor(130, 133, 170);
73 
74     m_defaultsMap[SegmentAudioPreview] = QColor(39, 71, 22);
75     m_defaultsMap[SegmentInternalPreview] = QColor(Qt::white);
76     m_defaultsMap[SegmentLabel] = QColor(Qt::black);
77     m_defaultsMap[SegmentSplitLine] = QColor(Qt::black);
78 
79     m_defaultsMap[MatrixElementBorder] = QColor(Qt::black);
80     m_defaultsMap[MatrixElementLightBorder] = QColor(90, 90, 90);
81     m_defaultsMap[MatrixElementBlock] = QColor(98, 128, 232);
82     m_defaultsMap[MatrixOverlapBlock] = QColor(Qt::black);
83     m_defaultsMap[MatrixHorizontalLine] = QColor(200, 200, 200);
84     m_defaultsMap[MatrixPitchHighlight] = QColor(205, 205, 205);
85     m_defaultsMap[MatrixTonicHighlight] = QColor(160, 160, 160);
86 
87     m_defaultsMap[LoopRulerBackground] = QColor(120, 120, 120);
88     m_defaultsMap[LoopRulerForeground] = QColor(Qt::white);
89     m_defaultsMap[LoopHighlight] = QColor(Qt::white);
90 
91     m_defaultsMap[RulerForeground] = Qt::black;
92     m_defaultsMap[RulerBackground] = QColor(0xEE, 0xEE, 0xEE);
93 
94     m_defaultsMap[TempoBase] = QColor(197, 211, 125);
95 
96     //m_defaultsMap[TextRulerBackground] = QColor(60, 205, 230, QColor::Hsv);
97     //    m_defaultsMap[TextRulerBackground] = QColor(120, 90, 238, QColor::Hsv);
98     //    m_defaultsMap[TextRulerBackground] = QColor(210, 220, 140);
99     m_defaultsMap[TextRulerBackground] = QColor(226, 232, 187);
100     m_defaultsMap[TextRulerForeground] = QColor(Qt::white);
101 
102     m_defaultsMap[ChordNameRulerBackground] = QColor(0xEE, 0xEE, 0xEE);
103     m_defaultsMap[ChordNameRulerForeground] = QColor(Qt::black);
104 
105     m_defaultsMap[RawNoteRulerBackground] = QColor(240, 240, 240);
106     m_defaultsMap[RawNoteRulerForeground] = QColor(Qt::black);
107 
108     m_defaultsMap[LevelMeterGreen] = QColor(0, 200, 0);
109     m_defaultsMap[LevelMeterOrange] = QColor(255, 165, 0);
110     m_defaultsMap[LevelMeterRed] = QColor(200, 0, 0);
111 
112     //    m_defaultsMap[LevelMeterSolidGreen] = QColor(0, 140, 0);
113     m_defaultsMap[LevelMeterSolidGreen] = QColor(84, 177, 248); // blue!
114     //    m_defaultsMap[LevelMeterSolidOrange] = QColor(220, 120, 0);
115     m_defaultsMap[LevelMeterSolidOrange] = QColor(255, 225, 0);
116     //    m_defaultsMap[LevelMeterSolidRed] = QColor(255, 50, 50);
117     m_defaultsMap[LevelMeterSolidRed] = QColor(255, 0, 0);
118 
119     m_defaultsMap[BarLine] = QColor(Qt::black);
120     m_defaultsMap[MatrixBarLine] = QColor(60, 60, 60);
121     m_defaultsMap[BarLineIncorrect] = QColor(211, 0, 31);
122     m_defaultsMap[BeatLine] = QColor(200, 200, 200);
123     m_defaultsMap[SubBeatLine] = QColor(212, 212, 212);
124     m_defaultsMap[StaffConnectingLine] = QColor(192, 192, 192);
125     m_defaultsMap[StaffConnectingTerminatingLine] = QColor(128, 128, 128);
126 
127     m_defaultsMap[Pointer] = QColor(Qt::darkBlue);
128     m_defaultsMap[PointerRuler] = QColor(100, 100, 100);
129 
130     m_defaultsMap[InsertCursor] = QColor(160, 104, 186);
131     m_defaultsMap[InsertCursorRuler] = QColor(160, 136, 170);
132 
133     m_defaultsMap[TrackDivider] = QColor(145, 145, 145);
134     //m_defaultsMap[MovementGuide] = QColor(172, 230, 139);
135     m_defaultsMap[MovementGuide] = QColor(62, 161, 194);
136     //m_defaultsMap[MovementGuide] = QColor(255, 189, 89);
137     m_defaultsMap[SelectionRectangle] = QColor(103, 128, 211);
138     m_defaultsMap[SelectedElement] = SelectionColor;
139     m_defaultsMap[ControlItem] = QColor(210, 202, 138);
140 
141     //@@@  I decided to shut up these compiler warnings about unused variables.
142     // They look like simple cruft to me.
143 
144 //    const int SelectedElementHue = 225;
145 //    const int SelectedElementMinValue = 220;
146 //    const int HighlightedElementHue = 25;
147 //    const int HighlightedElementMinValue = 220;
148 //    const int QuantizedNoteHue = 69;
149 //    const int QuantizedNoteMinValue = 140;
150 //    const int TriggerNoteHue = 4;
151 //    const int TriggerNoteMinValue = 140;
152 //    const int OutRangeNoteHue = 0;
153 //    const int OutRangeNoteMinValue = 200;
154 
155     m_defaultsMap[TextAnnotationBackground] = QColor(255, 255, 180);
156 
157     m_defaultsMap[TextLilyPondDirectiveBackground] = QColor(95, 157, 87);
158 
159     m_defaultsMap[AudioCountdownBackground] = QColor(Qt::darkGray);
160     m_defaultsMap[AudioCountdownForeground] = QColor(Qt::red);
161 
162 //    m_defaultsMap[RotaryFloatBackground] = QColor(Qt::cyan);
163     m_defaultsMap[RotaryFloatBackground] = QColor(182, 222, 255);
164     m_defaultsMap[RotaryFloatForeground] = QColor(Qt::black);
165 
166     m_defaultsMap[RotaryPastelBlue] = QColor(205, 212, 255);
167     m_defaultsMap[RotaryPastelRed] = QColor(255, 168, 169);
168     m_defaultsMap[RotaryPastelGreen] = QColor(231, 255, 223);
169     m_defaultsMap[RotaryPastelOrange] = QColor(255, 233, 208);
170     m_defaultsMap[RotaryPastelYellow] = QColor(249, 255, 208);
171 
172     m_defaultsMap[MatrixKeyboardFocus] = QColor(224, 112, 8);
173 
174     //    m_defaultsMap[RotaryPlugin] = QColor(185, 255, 248);
175     m_defaultsMap[RotaryPlugin] = QColor(185, 200, 248);
176     //    m_defaultsMap[RotaryPlugin] = QColor(185, 185, 185);
177 
178     m_defaultsMap[RotaryMeter] = QColor(255, 100, 0);
179 
180     m_defaultsMap[MarkerBackground] = QColor(185, 255, 248);
181 
182     m_defaultsMap[QuickMarker] = QColor(Qt::red);
183 
184     //    m_defaultsMap[MuteTrackLED] = QColor(218, 190, 230, QColor::Hsv);
185     m_defaultsMap[MuteTrackLED] = QColor::fromHsv(211, 194, 238);
186     m_defaultsMap[SoloTrackLED] = QColor::fromHsv(120, 250, 144);
187     m_defaultsMap[RecordMIDITrackLED] = QColor::fromHsv(45, 250, 225);
188     m_defaultsMap[RecordAudioTrackLED] = QColor::fromHsv(0, 250, 225);
189     m_defaultsMap[RecordSoftSynthTrackLED] = QColor(255, 120, 0);
190 
191     m_defaultsMap[PlaybackFaderOutline] = QColor::fromHsv(211, 194, 238);
192     m_defaultsMap[RecordFaderOutline] = QColor::fromHsv(0, 250, 225);
193 
194     m_defaultsMap[PannerOverlay] = QColor::fromHsv(211, 194, 238);
195 
196     m_defaultsMap[ThornGroupBoxBackground] = QColor(0x40, 0x40, 0x40);
197 }
198 
getInstance()199 GUIPalette* GUIPalette::getInstance()
200 {
201     if (!m_instance) m_instance = new GUIPalette();
202     return m_instance;
203 }
204 
205 
206 
207 
208 const char* const GUIPalette::ActiveRecordTrack = "activerecordtrack";
209 
210 
211 const char* const GUIPalette::SegmentCanvas = "segmentcanvas";
212 const char* const GUIPalette::SegmentBorder = "segmentborder";
213 const char* const GUIPalette::RecordingInternalSegmentBlock = "recordinginternalsegmentblock";
214 const char* const GUIPalette::RecordingAudioSegmentBlock = "recordingaudiosegmentblock";
215 const char* const GUIPalette::RecordingSegmentBorder = "recordingsegmentborder";
216 
217 const char* const GUIPalette::RepeatSegmentBorder = "repeatsegmentborder";
218 
219 const char* const GUIPalette::SegmentAudioPreview = "segmentaudiopreview";
220 const char* const GUIPalette::SegmentInternalPreview = "segmentinternalpreview";
221 const char* const GUIPalette::SegmentLabel = "segmentlabel";
222 const char* const GUIPalette::SegmentSplitLine = "segmentsplitline";
223 
224 const char* const GUIPalette::MatrixElementBorder = "matrixelementborder";
225 const char* const GUIPalette::MatrixElementLightBorder = "matrixelementlightborder";
226 const char* const GUIPalette::MatrixElementBlock = "matrixelementblock";
227 const char* const GUIPalette::MatrixOverlapBlock = "matrixoverlapblock";
228 const char* const GUIPalette::MatrixHorizontalLine = "matrixhorizontalline";
229 const char* const GUIPalette::MatrixPitchHighlight = "matrixpitchhighlight";
230 const char* const GUIPalette::MatrixTonicHighlight = "matrixtonichighlight";
231 
232 const char* const GUIPalette::LoopRulerBackground = "looprulerbackground";
233 const char* const GUIPalette::LoopRulerForeground = "looprulerforeground";
234 const char* const GUIPalette::LoopHighlight = "loophighlight";
235 
236 const char* const GUIPalette::RulerForeground = "rulerforeground";
237 const char* const GUIPalette::RulerBackground = "rulerbackground";
238 
239 const char* const GUIPalette::TempoBase = "tempobase";
240 
241 const char* const GUIPalette::TextRulerBackground = "textrulerbackground";
242 const char* const GUIPalette::TextRulerForeground = "textrulerforeground";
243 
244 const char* const GUIPalette::ChordNameRulerBackground = "chordnamerulerbackground";
245 const char* const GUIPalette::ChordNameRulerForeground = "chordnamerulerforeground";
246 
247 const char* const GUIPalette::RawNoteRulerBackground = "rawnoterulerbackground";
248 const char* const GUIPalette::RawNoteRulerForeground = "rawnoterulerforeground";
249 
250 const char* const GUIPalette::LevelMeterGreen = "levelmetergreen";
251 const char* const GUIPalette::LevelMeterOrange = "levelmeterorange";
252 const char* const GUIPalette::LevelMeterRed = "levelmeterred";
253 
254 const char* const GUIPalette::LevelMeterSolidGreen = "levelmetersolidgreen";
255 const char* const GUIPalette::LevelMeterSolidOrange = "levelmetersolidorange";
256 const char* const GUIPalette::LevelMeterSolidRed = "levelmetersolidred";
257 
258 const char* const GUIPalette::BarLine = "barline";
259 const char* const GUIPalette::MatrixBarLine = "matrixbarline";
260 const char* const GUIPalette::BarLineIncorrect = "barlineincorrect";
261 const char* const GUIPalette::BeatLine = "beatline";
262 const char* const GUIPalette::SubBeatLine = "subbeatline";
263 const char* const GUIPalette::StaffConnectingLine = "staffconnectingline";
264 const char* const GUIPalette::StaffConnectingTerminatingLine = "staffconnectingterminatingline";
265 
266 const char* const GUIPalette::Pointer = "pointer";
267 const char* const GUIPalette::PointerRuler = "pointerruler";
268 
269 const char* const GUIPalette::InsertCursor = "insertcursor";
270 const char* const GUIPalette::InsertCursorRuler = "insertcursorruler";
271 
272 const char* const GUIPalette::TrackDivider = "trackdivider";
273 const char* const GUIPalette::MovementGuide = "movementguide";
274 const char* const GUIPalette::SelectionRectangle = "selectionrectangle";
275 const char* const GUIPalette::SelectedElement = "selectedelement";
276 const char* const GUIPalette::ControlItem = "controlitem";
277 
278 const int GUIPalette::SelectedElementHue = 225;
279 const int GUIPalette::SelectedElementMinValue = 220;
280 const int GUIPalette::HighlightedElementHue = 25;
281 const int GUIPalette::HighlightedElementMinValue = 220;
282 const int GUIPalette::QuantizedNoteHue = 69;
283 const int GUIPalette::QuantizedNoteMinValue = 140;
284 const int GUIPalette::TriggerNoteHue = 4;
285 const int GUIPalette::TriggerNoteMinValue = 140;
286 const int GUIPalette::TriggerSkipHue = 42;
287 const int GUIPalette::TriggerSkipMinValue = 140;
288 const int GUIPalette::OutRangeNoteHue = 0;
289 const int GUIPalette::OutRangeNoteMinValue = 200;
290 
291 const int GUIPalette::CollisionHaloHue = 42;
292 const int GUIPalette::CollisionHaloSaturation = 200;
293 
294 const char* const GUIPalette::TextAnnotationBackground = "textannotationbackground";
295 
296 const char* const GUIPalette::TextLilyPondDirectiveBackground = "textlilyponddirectivebackground";
297 
298 const char* const GUIPalette::AudioCountdownBackground = "audiocountdownbackground";
299 const char* const GUIPalette::AudioCountdownForeground = "audiocountdownforeground";
300 
301 const char* const GUIPalette::RotaryFloatBackground = "rotaryfloatbackground";
302 const char* const GUIPalette::RotaryFloatForeground = "rotaryfloatforeground";
303 
304 const char* const GUIPalette::RotaryPastelBlue = "rotarypastelblue";
305 const char* const GUIPalette::RotaryPastelRed = "rotarypastelred";
306 const char* const GUIPalette::RotaryPastelGreen = "rotarypastelgreen";
307 const char* const GUIPalette::RotaryPastelOrange = "rotarypastelorange";
308 const char* const GUIPalette::RotaryPastelYellow = "rotarypastelyellow";
309 
310 const char* const GUIPalette::MatrixKeyboardFocus = "matrixkeyboardfocus";
311 
312 const char* const GUIPalette::RotaryPlugin = "rotaryplugin";
313 
314 const char* const GUIPalette::RotaryMeter = "rotarymeter";
315 
316 const char* const GUIPalette::MarkerBackground = "markerbackground";
317 
318 const char* const GUIPalette::QuickMarker = "quickmarker";
319 
320 const char* const GUIPalette::MuteTrackLED = "mutetrackled";
321 const char* const GUIPalette::SoloTrackLED = "solotrackled";
322 const char* const GUIPalette::RecordMIDITrackLED = "recordmiditrackled";
323 const char* const GUIPalette::RecordAudioTrackLED = "recordaudiotrackled";
324 const char* const GUIPalette::RecordSoftSynthTrackLED = "recordsoftsynthtrackled";
325 
326 const char* const GUIPalette::PlaybackFaderOutline = "playbackfaderoutline";
327 const char* const GUIPalette::RecordFaderOutline = "recordfaderoutline";
328 
329 const char* const GUIPalette::PannerOverlay = "panneroverlay";
330 
331 GUIPalette* GUIPalette::m_instance = nullptr;
332 
333 // defines which index in the document's colourmap should be used as the color
334 // when creating new audio segments from recordings, or inserting from the
335 // audio file manager (presumes a file derived from the updated autoload.rg
336 // that shipped along with this change)
337 const int GUIPalette::AudioDefaultIndex = 1;
338 
339 const char* const GUIPalette::ThornGroupBoxBackground = "thorngroupboxbackground";
340 
341 }
342