svgui  1.9
ColourDatabase.cpp
Go to the documentation of this file.
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2 
3 /*
4  Sonic Visualiser
5  An audio file viewer and annotation editor.
6  Centre for Digital Music, Queen Mary, University of London.
7  This file copyright 2007 QMUL.
8 
9  This program is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License as
11  published by the Free Software Foundation; either version 2 of the
12  License, or (at your option) any later version. See the file
13  COPYING included with this distribution for more information.
14 */
15 
16 #include "ColourDatabase.h"
17 #include "base/XmlExportable.h"
18 
19 #include <QPainter>
20 
23 
26 {
27  return &m_instance;
28 }
29 
31 {
32 }
33 
34 int
36 {
37  return m_colours.size();
38 }
39 
40 QString
42 {
43  if (c < 0 || size_t(c) >= m_colours.size()) return "";
44  return m_colours[c].name;
45 }
46 
47 QColor
49 {
50  if (c < 0 || size_t(c) >= m_colours.size()) return Qt::black;
51  return m_colours[c].colour;
52 }
53 
54 QColor
55 ColourDatabase::getColour(QString name) const
56 {
57  for (ColourList::const_iterator i = m_colours.begin();
58  i != m_colours.end(); ++i) {
59  if (i->name == name) return i->colour;
60  }
61 
62  return Qt::black;
63 }
64 
65 int
66 ColourDatabase::getColourIndex(QString name) const
67 {
68  int index = 0;
69  for (ColourList::const_iterator i = m_colours.begin();
70  i != m_colours.end(); ++i) {
71  if (i->name == name) return index;
72  ++index;
73  }
74 
75  return -1;
76 }
77 
78 int
80 {
81  int index = 0;
82  for (ColourList::const_iterator i = m_colours.begin();
83  i != m_colours.end(); ++i) {
84  if (i->colour == c) return index;
85  ++index;
86  }
87 
88  return -1;
89 }
90 
91 bool
93 {
94  if (c < 0 || size_t(c) >= m_colours.size()) return false;
95  return m_colours[c].darkbg;
96 }
97 
98 void
100 {
101  if (c < 0 || size_t(c) >= m_colours.size()) return;
102  if (m_colours[c].darkbg != dark) {
103  m_colours[c].darkbg = dark;
104  emit colourDatabaseChanged();
105  }
106 }
107 
108 int
109 ColourDatabase::addColour(QColor c, QString name)
110 {
111  int index = 0;
112  for (ColourList::iterator i = m_colours.begin();
113  i != m_colours.end(); ++i) {
114  if (i->name == name) {
115  i->colour = c;
116  return index;
117  }
118  ++index;
119  }
120 
121  ColourRec rec;
122  rec.colour = c;
123  rec.name = name;
124  rec.darkbg = false;
125  m_colours.push_back(rec);
126  emit colourDatabaseChanged();
127  return index;
128 }
129 
130 void
132 {
133  for (ColourList::iterator i = m_colours.begin();
134  i != m_colours.end(); ++i) {
135  if (i->name == name) {
136  m_colours.erase(i);
137  return;
138  }
139  }
140 }
141 
142 void
144  QString &colourName,
145  QString &colourSpec,
146  QString &darkbg) const
147 {
148  colourName = "";
149  colourSpec = "";
150  if (index < 0 || size_t(index) >= m_colours.size()) return;
151 
152  colourName = getColourName(index);
153  QColor c = getColour(index);
154  colourSpec = XmlExportable::encodeColour(c.red(), c.green(), c.blue());
155  darkbg = useDarkBackground(index) ? "true" : "false";
156 }
157 
158 int
160  QString colourSpec,
161  QString darkbg)
162 {
163  int index = -1;
164  if (colourSpec != "") {
165  QColor colour(colourSpec);
166  index = getColourIndex(colour);
167  if (index < 0) {
168  index = addColour(colour,
169  colourName == "" ? colourSpec : colourName);
170  }
171  } else if (colourName != "") {
172  index = getColourIndex(colourName);
173  }
174  if (index >= 0) {
175  setUseDarkBackground(index, darkbg == "true");
176  }
177  return index;
178 }
179 
180 void
181 ColourDatabase::getColourPropertyRange(int *min, int *max) const
182 {
183  ColourDatabase *db = getInstance();
184  if (min) *min = 0;
185  if (max) {
186  *max = 0;
187  if (db->getColourCount() > 0) *max = db->getColourCount()-1;
188  }
189 }
190 
191 QPixmap
192 ColourDatabase::getExamplePixmap(int index, QSize size) const
193 {
194  QPixmap pmap(size);
195  pmap.fill(useDarkBackground(index) ? Qt::black : Qt::white);
196  QPainter paint(&pmap);
197  QColor colour(getColour(index));
198  paint.setPen(colour);
199  paint.setBrush(colour);
200  int margin = 2;
201  if (size.width() < 4 || size.height() < 4) margin = 0;
202  else if (size.width() < 8 || size.height() < 8) margin = 1;
203  paint.drawRect(margin, margin,
204  size.width() - margin*2 - 1, size.height() - margin*2 - 1);
205  return pmap;
206 }
207 
QString getColourName(int c) const
void colourDatabaseChanged()
void removeColour(QString)
QPixmap getExamplePixmap(int index, QSize size) const
void getStringValues(int index, QString &colourName, QString &colourSpec, QString &darkbg) const
int addColour(QColor, QString)
bool useDarkBackground(int c) const
static ColourDatabase m_instance
int putStringValues(QString colourName, QString colourSpec, QString darkbg)
void setUseDarkBackground(int c, bool dark)
int getColourIndex(QString name) const
int getColourCount() const
void getColourPropertyRange(int *min, int *max) const
ColourList m_colours
static ColourDatabase * getInstance()
QColor getColour(int c) const