MuseScore/mscore/lineproperties.cpp
2013-02-07 13:10:46 +01:00

345 lines
12 KiB
C++

//=============================================================================
// MuseScore
// Linux Music Score Editor
//
// Copyright (C) 2002-2011 Werner Schweer and others
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//=============================================================================
#include "lineproperties.h"
#include "textproperties.h"
#include "libmscore/textline.h"
#include "libmscore/style.h"
#include "libmscore/system.h"
#include "libmscore/measure.h"
#include "libmscore/xml.h"
#include "libmscore/utils.h"
#include "libmscore/score.h"
#include "preferences.h"
#include "libmscore/sym.h"
#include "libmscore/text.h"
//---------------------------------------------------------
// populateLineSymbolComboBox
//---------------------------------------------------------
static void populateLineSymbolComboBox(QComboBox* cb)
{
cb->clear();
cb->addItem(QComboBox::tr("Ped (Pedal)"), pedalPedSym);
cb->addItem(QComboBox::tr("* (Pedal)"), pedalasteriskSym);
cb->addItem(QComboBox::tr(". (Pedal)"), pedaldotSym);
cb->addItem(QComboBox::tr("dash (Pedal)"), pedaldashSym);
cb->addItem(QComboBox::tr("tr (Trill)"), trillSym);
}
//---------------------------------------------------------
// setLineSymbolComboBox
//---------------------------------------------------------
static void setLineSymbolComboBox(QComboBox* cb, int sym)
{
if (sym == -1)
return;
for (int i = 0; i < cb->count(); ++i) {
if (cb->itemData(i).toInt() == sym) {
cb->setCurrentIndex(i);
return;
}
}
qDebug("setLineSymbol: not found %d\n", sym);
}
//---------------------------------------------------------
// LineProperties
//---------------------------------------------------------
LineProperties::LineProperties(TextLine* l, QWidget* parent)
: QDialog(parent)
{
setupUi(this);
setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
tl = l;
populateLineSymbolComboBox(beginSymbol);
populateLineSymbolComboBox(continueSymbol);
populateLineSymbolComboBox(endSymbol);
lineWidth->setValue(tl->lineWidth().val());
lineStyle->setCurrentIndex(int(tl->lineStyle() - 1));
linecolor->setColor(tl->lineColor());
if (tl->beginText())
_beginText = new Text(*tl->beginText());
else
_beginText = 0;
if (tl->continueText())
_continueText = new Text(*tl->continueText());
else
_continueText = 0;
beginTextRb->setChecked(tl->beginText());
continueTextRb->setChecked(tl->continueText());
beginSymbolRb->setChecked(tl->beginSymbol() != -1);
continueSymbolRb->setChecked(tl->continueSymbol() != -1);
endSymbolRb->setChecked(tl->endSymbol() != -1);
bool bt = beginTextRb->isChecked();
beginText->setEnabled(bt);
beginTextTb->setEnabled(bt);
beginTextPlace->setEnabled(bt);
bt = beginSymbolRb->isChecked();
beginSymbol->setEnabled(bt);
beginSymbolX->setEnabled(bt);
beginSymbolY->setEnabled(bt);
bt = continueTextRb->isChecked();
continueText->setEnabled(bt);
continueTextTb->setEnabled(bt);
continueTextPlace->setEnabled(bt);
bt = continueSymbolRb->isChecked();
continueSymbol->setEnabled(bt);
continueSymbolX->setEnabled(bt);
continueSymbolY->setEnabled(bt);
beginText->setText(tl->beginText() ? tl->beginText()->getText() : "");
continueText->setText(tl->continueText() ? tl->continueText()->getText() : "");
setLineSymbolComboBox(beginSymbol, tl->beginSymbol());
setLineSymbolComboBox(continueSymbol, tl->continueSymbol());
setLineSymbolComboBox(endSymbol, tl->endSymbol());
beginSymbolX->setValue(tl->beginSymbolOffset().x());
beginSymbolY->setValue(tl->beginSymbolOffset().y());
continueSymbolX->setValue(tl->continueSymbolOffset().x());
continueSymbolY->setValue(tl->continueSymbolOffset().y());
endSymbolX->setValue(tl->endSymbolOffset().x());
endSymbolY->setValue(tl->endSymbolOffset().y());
int idx = 0;
switch(tl->beginTextPlace()) {
case PLACE_ABOVE: idx = 0; break;
case PLACE_BELOW: idx = 1; break;
case PLACE_LEFT: idx = 2; break;
default:
qDebug("illegal text placement\n");
}
beginTextPlace->setCurrentIndex(idx);
idx = 0;
switch(tl->continueTextPlace()) {
case PLACE_ABOVE: idx = 0; break;
case PLACE_BELOW: idx = 1; break;
case PLACE_LEFT: idx = 2; break;
default:
qDebug("illegal text placement\n");
}
continueTextPlace->setCurrentIndex(idx);
beginHook->setChecked(tl->beginHook());
endHook->setChecked(tl->endHook());
beginHookHeight->setValue(tl->beginHookHeight().val());
endHookHeight->setValue(tl->endHookHeight().val());
beginHookType90->setChecked(tl->beginHookType() == HOOK_90);
beginHookType45->setChecked(tl->beginHookType() == HOOK_45);
endHookType90->setChecked(tl->endHookType() == HOOK_90);
endHookType45->setChecked(tl->endHookType() == HOOK_45);
diagonal->setChecked(tl->diagonal());
connect(beginTextRb, SIGNAL(toggled(bool)), SLOT(beginTextToggled(bool)));
connect(beginSymbolRb, SIGNAL(toggled(bool)), SLOT(beginSymbolToggled(bool)));
connect(continueTextRb, SIGNAL(toggled(bool)), SLOT(continueTextToggled(bool)));
connect(continueSymbolRb, SIGNAL(toggled(bool)), SLOT(continueSymbolToggled(bool)));
connect(beginTextTb, SIGNAL(clicked()), SLOT(beginTextProperties()));
connect(continueTextTb, SIGNAL(clicked()), SLOT(continueTextProperties()));
}
//---------------------------------------------------------
// accept
//---------------------------------------------------------
void LineProperties::accept()
{
tl->setLineWidth(Spatium(lineWidth->value()));
tl->setLineStyle(Qt::PenStyle(lineStyle->currentIndex() + 1));
tl->setLineColor(linecolor->color());
tl->setBeginHookHeight(Spatium(beginHookHeight->value()));
tl->setBeginHook(beginHook->isChecked());
tl->setEndHookHeight(Spatium(endHookHeight->value()));
tl->setEndHook(endHook->isChecked());
tl->setBeginHookType(beginHookType90->isChecked() ? HOOK_90 : HOOK_45);
tl->setEndHookType(endHookType90->isChecked() ? HOOK_90 : HOOK_45);
if (beginTextRb->isChecked()) {
if (_beginText) {
_beginText->setText(beginText->text());
tl->setBeginText(_beginText);
}
else
tl->setBeginText(beginText->text(), tl->score()->textStyle(TEXT_STYLE_TEXTLINE));
}
else
tl->setBeginText(0);
if (continueTextRb->isChecked()) {
if (_continueText) {
_continueText->setText(continueText->text());
tl->setContinueText(_continueText);
}
else {
tl->setContinueText(continueText->text(), tl->score()->textStyle(TEXT_STYLE_TEXTLINE));
}
}
else
tl->setContinueText(0);
SymId sym = SymId(beginSymbol->itemData(beginSymbol->currentIndex()).toInt());
tl->setBeginSymbol(beginSymbolRb->isChecked() ? sym : noSym);
sym = SymId(continueSymbol->itemData(continueSymbol->currentIndex()).toInt());
tl->setContinueSymbol(continueSymbolRb->isChecked() ? sym : noSym);
sym = SymId(endSymbol->itemData(endSymbol->currentIndex()).toInt());
tl->setEndSymbol(endSymbolRb->isChecked() ? sym : noSym);
PlaceText p = PLACE_ABOVE;
switch(beginTextPlace->currentIndex()) {
case 0: p = PLACE_ABOVE; break;
case 1: p = PLACE_BELOW; break;
case 2: p = PLACE_LEFT; break;
}
tl->setBeginTextPlace(p);
p = PLACE_ABOVE;
switch(continueTextPlace->currentIndex()) {
case 0: p = PLACE_ABOVE; break;
case 1: p = PLACE_BELOW; break;
case 2: p = PLACE_LEFT; break;
}
tl->setContinueTextPlace(p);
tl->setBeginSymbolOffset(QPointF(beginSymbolX->value(), beginSymbolY->value()));
tl->setContinueSymbolOffset(QPointF(continueSymbolX->value(), continueSymbolY->value()));
tl->setEndSymbolOffset(QPointF(endSymbolX->value(), endSymbolY->value()));
tl->setDiagonal(diagonal->isChecked());
QDialog::accept();
}
//---------------------------------------------------------
// beginTextToggled
//---------------------------------------------------------
void LineProperties::beginTextToggled(bool val)
{
if (val)
beginSymbolRb->setChecked(false);
beginText->setEnabled(val);
beginTextPlace->setEnabled(val);
beginTextTb->setEnabled(val);
}
//---------------------------------------------------------
// beginSymbolToggled
//---------------------------------------------------------
void LineProperties::beginSymbolToggled(bool val)
{
if (val)
beginTextRb->setChecked(false);
beginSymbol->setEnabled(val);
beginSymbolX->setEnabled(val);
beginSymbolY->setEnabled(val);
}
//---------------------------------------------------------
// continueTextToggled
//---------------------------------------------------------
void LineProperties::continueTextToggled(bool val)
{
if (val)
continueSymbolRb->setChecked(false);
continueText->setEnabled(val);
continueTextPlace->setEnabled(val);
continueTextTb->setEnabled(val);
}
//---------------------------------------------------------
// continueSymbolToggled
//---------------------------------------------------------
void LineProperties::continueSymbolToggled(bool val)
{
if (val)
continueTextRb->setChecked(false);
continueSymbol->setEnabled(val);
continueSymbolX->setEnabled(val);
continueSymbolY->setEnabled(val);
}
//---------------------------------------------------------
// beginTextProperties
//---------------------------------------------------------
void LineProperties::beginTextProperties()
{
if (!_beginText) {
_beginText = new Text(tl->score());
_beginText->setTextStyleType(TEXT_STYLE_TEXTLINE);
}
_beginText->setText(beginText->text());
TextProperties t(_beginText, this);
if (t.exec()) {
// TODO: delay to ok
foreach(SpannerSegment* ls, tl->spannerSegments()) {
if (ls->subtype() != SEGMENT_SINGLE && ls->subtype() != SEGMENT_BEGIN)
continue;
TextLineSegment* tls = static_cast<TextLineSegment*>(ls);
if (!tls->text())
continue;
Text* t = tls->text();
t->setColor(tl->beginText()->color());
}
}
}
//---------------------------------------------------------
// continueTextProperties
//---------------------------------------------------------
void LineProperties::continueTextProperties()
{
if (!_continueText) {
_continueText = new Text(tl->score());
_continueText->setTextStyleType(TEXT_STYLE_TEXTLINE);
}
_continueText->setText(continueText->text());
TextProperties t(_continueText, this);
if (t.exec()) {
// TODO: delay to ok
foreach(SpannerSegment* ls, tl->spannerSegments()) {
if (ls->subtype() != SEGMENT_MIDDLE)
continue;
TextLineSegment* tls = static_cast<TextLineSegment*>(ls);
if (!tls->text())
continue;
Text* t = tls->text();
t->setColor(tl->continueText()->color());
}
}
}