summaryrefslogtreecommitdiffstats
path: root/src/gui/general/PresetGroup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/general/PresetGroup.cpp')
-rw-r--r--src/gui/general/PresetGroup.cpp269
1 files changed, 269 insertions, 0 deletions
diff --git a/src/gui/general/PresetGroup.cpp b/src/gui/general/PresetGroup.cpp
new file mode 100644
index 0000000..4a457a9
--- /dev/null
+++ b/src/gui/general/PresetGroup.cpp
@@ -0,0 +1,269 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
+
+/*
+ Rosegarden
+ A MIDI and audio 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 2006
+ D. Michael McIntyre <[email protected]>
+
+ The moral rights of Guillaume Laurent, Chris Cannam, and Richard
+ Bown to claim authorship of this work have been asserted.
+
+ Other copyrights also apply to some parts of this work. Please
+ see the AUTHORS file and individual file headers for details.
+
+ 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 "PresetGroup.h"
+
+#include "misc/Debug.h"
+#include "misc/Strings.h"
+#include "gui/general/ClefIndex.h"
+#include "base/Exception.h"
+#include "CategoryElement.h"
+#include <klocale.h>
+#include <kstddirs.h>
+#include <kglobal.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qregexp.h>
+#include <qstring.h>
+
+
+namespace Rosegarden
+{
+
+PresetGroup::PresetGroup() :
+ m_errorString(i18n("unknown error")),
+ m_elCategoryName(""),
+ m_elInstrumentName(""),
+ m_elClef(0),
+ m_elTranspose(0),
+ m_elLowAm(0),
+ m_elHighAm(0),
+ m_elLowPro(0),
+ m_elHighPro(0),
+ m_lastCategory( -1),
+ m_currentCategory( -1),
+ m_lastInstrument( -1),
+ m_currentInstrument( -1),
+ m_name(false),
+ m_clef(false),
+ m_transpose(false),
+ m_amateur(false),
+ m_pro(false)
+{
+ m_presetDirectory = KGlobal::dirs()->findResource("appdata", "presets/");
+
+ QString language = KGlobal::locale()->language();
+
+ QString presetFileName = QString("%1/presets-%2.xml")
+ .arg(m_presetDirectory).arg(language);
+
+ if (!QFileInfo(presetFileName).isReadable()) {
+
+ RG_DEBUG << "Failed to open " << presetFileName << endl;
+
+ language.replace(QRegExp("_.*$"), "");
+ presetFileName = QString("%1/presets-%2.xml")
+ .arg(m_presetDirectory).arg(language);
+
+ if (!QFileInfo(presetFileName).isReadable()) {
+
+ RG_DEBUG << "Failed to open " << presetFileName << endl;
+
+ presetFileName = QString("%1/presets.xml")
+ .arg(m_presetDirectory);
+
+ if (!QFileInfo(presetFileName).isReadable()) {
+
+ RG_DEBUG << "Failed to open " << presetFileName << endl;
+
+ throw PresetFileReadFailed
+ (qstrtostr(i18n("Can't open preset file %1").
+ arg(presetFileName)));
+ }
+ }
+ }
+
+ QFile presetFile(presetFileName);
+
+ QXmlInputSource source(presetFile);
+ QXmlSimpleReader reader;
+ reader.setContentHandler(this);
+ reader.setErrorHandler(this);
+ bool ok = reader.parse(source);
+ presetFile.close();
+
+ if (!ok) {
+ throw PresetFileReadFailed(qstrtostr(m_errorString));
+ }
+}
+
+PresetGroup::~PresetGroup()
+{
+ //!!! do I have anything to do here?
+}
+
+bool
+PresetGroup::startElement(const QString &, const QString &,
+ const QString &qName,
+ const QXmlAttributes &attributes)
+{
+ QString lcName = qName.lower();
+
+ // RG_DEBUG << "PresetGroup::startElement: processing starting element: " << lcName << endl;
+
+ if (lcName == "category") {
+
+ QString s = attributes.value("name");
+ if (s) {
+ m_elCategoryName = s;
+ // increment the current category number
+ m_lastCategory = m_currentCategory;
+ m_currentCategory++;
+
+ // reset the instrument counter going into the new category
+ m_lastInstrument = -1;
+ m_currentInstrument = -1;
+
+ RG_DEBUG << "PresetGroup::startElement: adding category " << m_elCategoryName << " last: "
+ << m_lastCategory << " curr: " << m_currentCategory << endl;
+
+ // add new CategoryElement to m_categories, in order to contain
+ // subsequent PresetElements
+ CategoryElement ce(m_elCategoryName);
+ m_categories.push_back(ce);
+ }
+
+ } else if (lcName == "instrument") {
+
+ QString s = attributes.value("name");
+ if (s) {
+ m_elInstrumentName = s;
+ m_name = true;
+
+ // increment the current instrument number
+ m_lastInstrument = m_currentInstrument;
+ m_currentInstrument++;
+ }
+
+ } else if (lcName == "clef") {
+ QString s = attributes.value("type");
+ if (s) {
+ m_elClef = clefNameToClefIndex(s);
+ m_clef = true;
+ }
+ } else if (lcName == "transpose") {
+ QString s = attributes.value("value");
+ if (s) {
+ m_elTranspose = s.toInt();
+ m_transpose = true;
+ }
+
+ } else if (lcName == "range") {
+ QString s = attributes.value("class");
+
+ if (s == "amateur") {
+ s = attributes.value("low");
+ if (s) {
+ m_elLowAm = s.toInt();
+ m_amateur = true;
+ }
+
+ s = attributes.value("high");
+ if (s && m_amateur) {
+ m_elHighAm = s.toInt();
+ } else {
+ return false;
+ }
+
+ } else if (s == "professional") {
+ s = attributes.value("low");
+ if (s) {
+ m_pro = true;
+ m_elLowPro = s.toInt();
+ }
+
+ s = attributes.value("high");
+ if (s && m_pro) {
+ m_elHighPro = s.toInt();
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ // RG_DEBUG << "PresetGroup::startElement(): accumulating flags:" << endl
+ // << " name: " << (m_name ? "true" : "false") << endl
+ // << " clef: " << (m_clef ? "true" : "false") << endl
+ // << "transpose: " << (m_transpose ? "true" : "false") << endl
+ // << " am. rng: " << (m_amateur ? "true" : "false") << endl
+ // << " pro rng: " << (m_pro ? "true" : "false") << endl;
+
+ // once we have assembled all the bits, create a new PresetElement
+ if (m_name && m_clef && m_transpose && m_amateur && m_pro) {
+ m_categories[m_currentCategory].addPreset(m_elInstrumentName,
+ m_elClef,
+ m_elTranspose,
+ m_elHighAm,
+ m_elLowAm,
+ m_elHighPro,
+ m_elLowPro);
+ // increment the current instrument
+ //!!! (is this ever going to be needed?)
+ m_lastInstrument = m_currentInstrument;
+ m_currentInstrument++;
+
+ // reset the "do we have a whole preset yet?" flags
+ m_name = false;
+ m_clef = false;
+ m_transpose = false;
+ m_amateur = false;
+ m_pro = false;
+ }
+
+ return true;
+
+} // startElement
+
+bool
+PresetGroup::error(const QXmlParseException& exception)
+{
+ RG_DEBUG << "PresetGroup::error(): jubilation and glee, we have an error, whee!" << endl;
+
+ m_errorString = QString("%1 at line %2, column %3: %4")
+ .arg(exception.message())
+ .arg(exception.lineNumber())
+ .arg(exception.columnNumber())
+ .arg(m_errorString);
+ return QXmlDefaultHandler::error(exception);
+}
+
+bool
+PresetGroup::fatalError(const QXmlParseException& exception)
+{
+ RG_DEBUG << "PresetGroup::fatalError(): double your jubilation, and triple your glee, a fatal error doth it be!" << endl;
+ m_errorString = QString("%1 at line %2, column %3: %4")
+ .arg(exception.message())
+ .arg(exception.lineNumber())
+ .arg(exception.columnNumber())
+ .arg(m_errorString);
+ return QXmlDefaultHandler::fatalError(exception);
+}
+
+}