diff options
Diffstat (limited to 'src/base/ColourMap.cpp')
-rw-r--r-- | src/base/ColourMap.cpp | 266 |
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(); + +} + +} |