You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rosegarden/src/base/Configuration.cpp

225 lines
5.4 KiB

/*
Rosegarden
A sequencer and musical notation editor.
This program is Copyright 2000-2008
Guillaume Laurent <glaurent@telegraph-road.org>,
Chris Cannam <cannam@all-day-breakfast.com>,
Richard Bown <bownie@bownie.com>
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.
*/
// Class to hold extraneous bits of configuration which
// don't sit inside the Composition itself - sequencer
// and other general stuff that we want to keep separate.
//
//
#include <string>
#include <algorithm>
#include <sstream>
#include "Configuration.h"
namespace Rosegarden
{
Configuration::Configuration(const Configuration &conf) :
PropertyMap(),
XmlExportable()
{
clear();
// Copy everything
//
for (const_iterator i = conf.begin(); i != conf.end(); ++i)
insert(PropertyPair(i->first, i->second->clone()));
}
Configuration::~Configuration()
{
clear();
}
std::vector<std::string>
Configuration::getPropertyNames()
{
std::vector<std::string> v;
for (const_iterator i = begin(); i != end(); ++i) {
v.push_back(i->first.getName());
}
std::sort(v.begin(), v.end());
return v;
}
bool
Configuration::has(const PropertyName &name) const
{
const_iterator i = find(name);
return (i != end());
}
std::string
Configuration::toXmlString()
{
using std::endl;
std::stringstream config;
// This simple implementation just assumes everything's a string.
// Override it if you want something fancier (or reimplement it to
// support the whole gamut -- the reader in rosexmlhandler.cpp
// already can)
for (const_iterator i = begin(); i != end(); ++i) {
config << "<property name=\""
<< encode(i->first.getName()) << "\" value=\""
<< encode(get<String>(i->first)) << "\"/>" << endl;
}
#if (__GNUC__ < 3)
config << endl << std::ends;
#else
config << endl;
#endif
return config.str();
}
Configuration&
Configuration::operator=(const Configuration &conf)
{
clear();
// Copy everything
//
for (const_iterator i = conf.begin(); i != conf.end(); ++i)
insert(PropertyPair(i->first, i->second->clone()));
return (*this);
}
namespace CompositionMetadataKeys
{
const PropertyName Copyright = "copyright";
const PropertyName Composer = "composer";
const PropertyName Title = "title";
const PropertyName Subtitle = "subtitle";
const PropertyName Arranger = "arranger";
// The following are recognized only by LilyPond output
const PropertyName Dedication = "dedication";
const PropertyName Subsubtitle = "subsubtitle";
const PropertyName Poet = "poet";
const PropertyName Meter = "meter";
const PropertyName Opus = "opus";
const PropertyName Instrument = "instrument";
const PropertyName Piece = "piece";
const PropertyName Tagline = "tagline";
// The tab order of the edit fields in HeadersConfigurationPage
// is defined by the creation order of the edit fields.
// The edit fields are created in the order of the keys in getFixedKeys().
std::vector<PropertyName> getFixedKeys() {
std::vector<PropertyName> keys;
keys.push_back(Dedication);
keys.push_back(Title);
keys.push_back(Subtitle);
keys.push_back(Subsubtitle);
keys.push_back(Poet);
keys.push_back(Instrument);
keys.push_back(Composer);
keys.push_back(Meter);
keys.push_back(Arranger);
keys.push_back(Piece);
keys.push_back(Opus);
keys.push_back(Copyright);
keys.push_back(Tagline);
return keys;
}
}
// Keep these in lower case
const PropertyName DocumentConfiguration::SequencerOptions = "sequenceroptions";
const PropertyName DocumentConfiguration::ZoomLevel = "zoomlevel";
const PropertyName DocumentConfiguration::TransportMode = "transportmode";
DocumentConfiguration::DocumentConfiguration()
{
set<Int>(ZoomLevel, 0);
set<String>(TransportMode, ""); // apparently generates an exception if not initialized
}
DocumentConfiguration::DocumentConfiguration(const DocumentConfiguration &conf):
Configuration()
{
for (const_iterator i = conf.begin(); i != conf.end(); ++i)
insert(PropertyPair(i->first, i->second->clone()));
}
DocumentConfiguration::~DocumentConfiguration()
{
clear();
}
DocumentConfiguration&
DocumentConfiguration::operator=(const DocumentConfiguration &conf)
{
clear();
for (const_iterator i = conf.begin(); i != conf.end(); ++i)
insert(PropertyPair(i->first, i->second->clone()));
return *this;
}
// Convert to XML string for export
//
std::string
DocumentConfiguration::toXmlString()
{
using std::endl;
std::stringstream config;
config << endl << "<configuration>" << endl;
config << " <" << ZoomLevel << " type=\"Int\">" << get<Int>(ZoomLevel)
<< "</" << ZoomLevel << ">\n";
config << " <" << TransportMode << " type=\"String\">" << get<String>(TransportMode)
<< "</" << TransportMode << ">\n";
config << "</configuration>" << endl;
#if (__GNUC__ < 3)
config << endl << std::ends;
#else
config << endl;
#endif
return config.str();
}
}