summaryrefslogtreecommitdiffstats
path: root/src/base/ColourMap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/ColourMap.cpp')
-rw-r--r--src/base/ColourMap.cpp266
1 files changed, 266 insertions, 0 deletions
diff --git a/src/base/ColourMap.cpp b/src/base/ColourMap.cpp
new file mode 100644
index 0000000..322a4a7
--- /dev/null
+++ b/src/base/ColourMap.cpp
@@ -0,0 +1,266 @@
+// -*- c-basic-offset: 4 -*-
+
+
+/*
+ Rosegarden
+ A sequencer and musical notation editor.
+
+ This program is Copyright 2000-2008
+ Guillaume Laurent <[email protected]>,
+ Chris Cannam <[email protected]>,
+ Richard Bown <[email protected]>
+
+ This file is Copyright 2003
+ Mark Hymers <[email protected]>
+
+ The moral right of the authors to claim authorship of this work
+ has been asserted.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version. See the file
+ COPYING included with this distribution for more information.
+*/
+
+#include <string>
+
+#if (__GNUC__ < 3)
+#include <strstream>
+#define stringstream strstream
+#else
+#include <sstream>
+#endif
+
+#include "ColourMap.h"
+#include "XmlExportable.h"
+
+namespace Rosegarden
+{
+
+ColourMap::ColourMap()
+{
+ // Set up the default colour. The #defines can be found in ColourMap.h
+ Colour tempcolour(COLOUR_DEF_R, COLOUR_DEF_G, COLOUR_DEF_B);
+ m_map[0] = make_pair(tempcolour, std::string(""));
+}
+
+ColourMap::ColourMap(const Colour& input)
+{
+ // Set up the default colour based on the input
+ m_map[0] = make_pair(input, std::string(""));
+}
+
+ColourMap::~ColourMap()
+{
+ // Everything should destroy itself automatically
+}
+
+bool
+ColourMap::deleteItemByIndex(const unsigned int item_num)
+{
+ // We explicitly refuse to delete the default colour
+ if (item_num == 0)
+ return false;
+
+ unsigned int n_e = m_map.erase(item_num);
+ if (n_e != 0)
+ {
+ return true;
+ }
+
+ // Otherwise we didn't find the right item
+ return false;
+}
+
+Colour
+ColourMap::getColourByIndex(const unsigned int item_num) const
+{
+ // Iterate over the m_map and if we find a match, return the
+ // Colour. If we don't match, return the default colour. m_map
+ // was initialised with at least one item in the ctor, so this is
+ // safe.
+ Colour ret = (*m_map.begin()).second.first;
+
+ for (RCMap::const_iterator position = m_map.begin();
+ position != m_map.end(); ++position)
+ if (position->first == item_num)
+ ret = position->second.first;
+
+ return ret;
+}
+
+std::string
+ColourMap::getNameByIndex(const unsigned int item_num) const
+{
+ // Iterate over the m_map and if we find a match, return the name.
+ // If we don't match, return the default colour's name. m_map was
+ // initialised with at least one item in the ctor, so this is
+ // safe.
+ std::string ret = (*m_map.begin()).second.second;
+
+ for (RCMap::const_iterator position = m_map.begin();
+ position != m_map.end(); ++position)
+ if (position->first == item_num)
+ ret = position->second.second;
+
+ return ret;
+}
+
+bool
+ColourMap::addItem(const Colour colour, const std::string name)
+{
+ // If we want to limit the number of colours, here's the place to do it
+ unsigned int highest=0;
+
+ for (RCMap::iterator position = m_map.begin(); position != m_map.end(); ++position)
+ {
+ if (position->first != highest)
+ break;
+
+ ++highest;
+ }
+
+ m_map[highest] = make_pair(colour, name);
+
+ return true;
+}
+
+// WARNING: This version of addItem is only for use by rosexmlhandler.cpp
+bool
+ColourMap::addItem(const Colour colour, const std::string name, const unsigned int id)
+{
+ m_map[id] = make_pair(colour, name);
+
+ return true;
+}
+
+bool
+ColourMap::modifyNameByIndex(const unsigned int item_num, const std::string name)
+{
+ // We don't allow a name to be given to the default colour
+ if (item_num == 0)
+ return false;
+
+ for (RCMap::iterator position = m_map.begin(); position != m_map.end(); ++position)
+ if (position->first == item_num)
+ {
+ position->second.second = name;
+ return true;
+ }
+
+ // We didn't find the element
+ return false;
+}
+
+bool
+ColourMap::modifyColourByIndex(const unsigned int item_num, const Colour colour)
+{
+ for (RCMap::iterator position = m_map.begin(); position != m_map.end(); ++position)
+ if (position->first == item_num)
+ {
+ position->second.first = colour;
+ return true;
+ }
+
+ // We didn't find the element
+ return false;
+}
+
+bool
+ColourMap::swapItems(const unsigned int item_1, const unsigned int item_2)
+{
+ // It would make no difference but we return false because
+ // we haven't altered the iterator (see docs in ColourMap.h)
+ if (item_1 == item_2)
+ return false;
+
+ // We refuse to swap the default colour for something else
+ // Basically because what would we do with the strings?
+ if ((item_1 == 0) || (item_2 == 0))
+ return false;
+
+ unsigned int one = 0, two = 0;
+
+ // Check that both elements exist
+ // It's not worth bothering about optimising this
+ for (RCMap::iterator position = m_map.begin(); position != m_map.end(); ++position)
+ {
+ if (position->first == item_1) one = position->first;
+ if (position->first == item_2) two = position->first;
+ }
+
+ // If they both exist, do it
+ // There's probably a nicer way to do this
+ if ((one != 0) && (two != 0))
+ {
+ Colour tempC = m_map[one].first;
+ std::string tempS = m_map[one].second;
+ m_map[one].first = m_map[two].first;
+ m_map[one].second = m_map[two].second;
+ m_map[two].first = tempC;
+ m_map[two].second = tempS;
+
+ return true;
+ }
+
+ // Else they didn't
+ return false;
+}
+
+RCMap::const_iterator
+ColourMap::begin()
+{
+ RCMap::const_iterator ret = m_map.begin();
+ return ret;
+}
+
+RCMap::const_iterator
+ColourMap::end()
+{
+ RCMap::const_iterator ret = m_map.end();
+ return ret;
+}
+
+ColourMap&
+ColourMap::operator=(const ColourMap& input)
+{
+ if (this != &input)
+ m_map = input.m_map;
+
+ return *this;
+}
+
+int
+ColourMap::size() const
+{
+ return m_map.size();
+}
+
+std::string
+ColourMap::toXmlString(std::string name) const
+{
+ std::stringstream output;
+
+ output << " <colourmap name=\"" << XmlExportable::encode(name)
+ << "\">" << std::endl;
+
+ for (RCMap::const_iterator pos = m_map.begin(); pos != m_map.end(); ++pos)
+ {
+ output << " " << " <colourpair id=\"" << pos->first
+ << "\" name=\"" << XmlExportable::encode(pos->second.second)
+ << "\" " << pos->second.first.dataToXmlString() << "/>" << std::endl;
+ }
+
+#if (__GNUC__ < 3)
+ output << " </colourmap>" << std::endl << std::ends;
+#else
+ output << " </colourmap>" << std::endl;
+#endif
+
+
+ return output.str();
+
+}
+
+}