diff options
Diffstat (limited to 'src/gui/dialogs/ClefDialog.cpp')
-rw-r--r-- | src/gui/dialogs/ClefDialog.cpp | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/src/gui/dialogs/ClefDialog.cpp b/src/gui/dialogs/ClefDialog.cpp new file mode 100644 index 0000000..8f802b0 --- /dev/null +++ b/src/gui/dialogs/ClefDialog.cpp @@ -0,0 +1,273 @@ +/* -*- 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]> + + 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 "ClefDialog.h" + +#include "base/NotationTypes.h" +#include "gui/editors/notation/NotePixmapFactory.h" +#include "gui/widgets/BigArrowButton.h" +#include <klocale.h> +#include <kdialogbase.h> +#include <qbuttongroup.h> +#include <qgroupbox.h> +#include <qhbox.h> +#include <qlabel.h> +#include <qobject.h> +#include <qpixmap.h> +#include <qradiobutton.h> +#include <qstring.h> +#include <qtooltip.h> +#include <qvbox.h> +#include <qwidget.h> + + +namespace Rosegarden +{ + +ClefDialog::ClefDialog(QWidget *parent, + NotePixmapFactory *npf, + Clef defaultClef, + bool showConversionOptions) : + KDialogBase(parent, 0, true, i18n("Clef"), Ok | Cancel | Help), + m_notePixmapFactory(npf), + m_clef(defaultClef) +{ + setHelp("nv-signatures-clef"); + + QVBox *vbox = makeVBoxMainWidget(); + + QGroupBox *clefFrame = new QGroupBox + (1, Horizontal, i18n("Clef"), vbox); + + QButtonGroup *conversionFrame = new QButtonGroup + (1, Horizontal, i18n("Existing notes following clef change"), vbox); + + QHBox *clefBox = new QHBox(clefFrame); + + BigArrowButton *clefDown = new BigArrowButton(clefBox, Qt::LeftArrow); + QToolTip::add + (clefDown, i18n("Lower clef")); + + QHBox *clefLabelBox = new QVBox(clefBox); + + m_octaveUp = new BigArrowButton(clefLabelBox, Qt::UpArrow); + QToolTip::add + (m_octaveUp, i18n("Up an Octave")); + + m_clefLabel = new QLabel(i18n("Clef"), clefLabelBox); + m_clefLabel->setAlignment(AlignVCenter | AlignHCenter); + + m_octaveDown = new BigArrowButton(clefLabelBox, Qt::DownArrow); + QToolTip::add + (m_octaveDown, i18n("Down an Octave")); + + BigArrowButton *clefUp = new BigArrowButton(clefBox, Qt::RightArrow); + QToolTip::add + (clefUp, i18n("Higher clef")); + + m_clefNameLabel = new QLabel(i18n("Clef"), clefLabelBox); + m_clefNameLabel->setAlignment(AlignVCenter | AlignHCenter); + + if (showConversionOptions) { + m_noConversionButton = + new QRadioButton + (i18n("Maintain current pitches"), conversionFrame); + m_changeOctaveButton = + new QRadioButton + (i18n("Transpose into appropriate octave"), conversionFrame); + m_transposeButton = 0; + + //!!! why aren't we offering this option? does it not work? too difficult to describe? + // m_transposeButton = + // new QRadioButton + // (i18n("Maintain current positions on the staff"), conversionFrame); + m_changeOctaveButton->setChecked(true); + } else { + m_noConversionButton = 0; + m_changeOctaveButton = 0; + m_transposeButton = 0; + conversionFrame->hide(); + } + + QObject::connect(clefUp, SIGNAL(clicked()), this, SLOT(slotClefUp())); + QObject::connect(clefDown, SIGNAL(clicked()), this, SLOT(slotClefDown())); + QObject::connect(m_octaveUp, SIGNAL(clicked()), this, SLOT(slotOctaveUp())); + QObject::connect(m_octaveDown, SIGNAL(clicked()), this, SLOT(slotOctaveDown())); + + redrawClefPixmap(); +} + +Clef +ClefDialog::getClef() const +{ + return m_clef; +} + +ClefDialog::ConversionType + +ClefDialog::getConversionType() const +{ + if (m_noConversionButton && m_noConversionButton->isChecked()) { + return NoConversion; + } else if (m_changeOctaveButton && m_changeOctaveButton->isChecked()) { + return ChangeOctave; + } else if (m_transposeButton && m_transposeButton->isChecked()) { + return Transpose; + } + return NoConversion; +} + +void +ClefDialog::slotClefUp() +{ + int octaveOffset = m_clef.getOctaveOffset(); + Clef::ClefList clefs(Clef::getClefs()); + + for (Clef::ClefList::iterator i = clefs.begin(); + i != clefs.end(); ++i) { + + if (m_clef.getClefType() == i->getClefType()) { + if (++i == clefs.end()) + i = clefs.begin(); + m_clef = Clef(i->getClefType(), octaveOffset); + break; + } + } + + redrawClefPixmap(); +} + +void +ClefDialog::slotClefDown() +{ + int octaveOffset = m_clef.getOctaveOffset(); + Clef::ClefList clefs(Clef::getClefs()); + + for (Clef::ClefList::iterator i = clefs.begin(); + i != clefs.end(); ++i) { + + if (m_clef.getClefType() == i->getClefType()) { + if (i == clefs.begin()) + i = clefs.end(); + --i; + m_clef = Clef(i->getClefType(), octaveOffset); + break; + } + } + + redrawClefPixmap(); +} + +void +ClefDialog::slotOctaveUp() +{ + int octaveOffset = m_clef.getOctaveOffset(); + if (octaveOffset == 2) + return ; + + ++octaveOffset; + + m_octaveDown->setEnabled(true); + if (octaveOffset == 2) { + m_octaveUp->setEnabled(false); + } + + m_clef = Clef(m_clef.getClefType(), octaveOffset); + redrawClefPixmap(); +} + +void +ClefDialog::slotOctaveDown() +{ + int octaveOffset = m_clef.getOctaveOffset(); + if (octaveOffset == -2) + return ; + + --octaveOffset; + + m_octaveUp->setEnabled(true); + if (octaveOffset == 2) { + m_octaveDown->setEnabled(false); + } + + m_clef = Clef(m_clef.getClefType(), octaveOffset); + redrawClefPixmap(); +} + +void +ClefDialog::redrawClefPixmap() +{ + QPixmap pmap = NotePixmapFactory::toQPixmap + (m_notePixmapFactory->makeClefDisplayPixmap(m_clef)); + m_clefLabel->setPixmap(pmap); + + QString name; + int octave = m_clef.getOctaveOffset(); + + switch (octave) { + case - 1: + name = i18n("%1 down an octave"); + break; + case - 2: + name = i18n("%1 down two octaves"); + break; + case 1: + name = i18n("%1 up an octave"); + break; + case 2: + name = i18n("%1 up two octaves"); + break; + default: + name = "%1"; + break; + } + + std::string type = m_clef.getClefType(); + if (type == Clef::Treble) + name = name.arg(i18n("Treble")); + else if (type == Clef::French) + name = name.arg(i18n("French violin")); + else if (type == Clef::Soprano) + name = name.arg(i18n("Soprano")); + else if (type == Clef::Mezzosoprano) + name = name.arg(i18n("Mezzo-soprano")); + else if (type == Clef::Alto) + name = name.arg(i18n("Alto")); + else if (type == Clef::Tenor) + name = name.arg(i18n("Tenor")); + else if (type == Clef::Baritone) + name = name.arg(i18n("C-baritone")); + else if (type == Clef::Varbaritone) + name = name.arg(i18n("F-baritone")); + else if (type == Clef::Bass) + name = name.arg(i18n("Bass")); + else if (type == Clef::Subbass) + name = name.arg(i18n("Sub-bass")); + + m_clefNameLabel->setText(name); +} + +} +#include "ClefDialog.moc" |