1 //=============================================================================
2 //  MuseScore
3 //  Linux Music Score Editor
4 //
5 //  Copyright (C) 2002-2011 Werner Schweer and others
6 //
7 //  This program is free software; you can redistribute it and/or modify
8 //  it under the terms of the GNU General Public License version 2.
9 //
10 //  This program is distributed in the hope that it will be useful,
11 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 //  GNU General Public License for more details.
14 //
15 //  You should have received a copy of the GNU General Public License
16 //  along with this program; if not, write to the Free Software
17 //  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 //=============================================================================
19 
20 #include "tupletdialog.h"
21 #include "libmscore/tuplet.h"
22 #include "libmscore/score.h"
23 #include "libmscore/chord.h"
24 #include "libmscore/note.h"
25 #include "libmscore/xml.h"
26 #include "preferences.h"
27 #include "libmscore/style.h"
28 #include "libmscore/text.h"
29 #include "libmscore/element.h"
30 #include "libmscore/utils.h"
31 #include "libmscore/measure.h"
32 #include "libmscore/undo.h"
33 #include "libmscore/stem.h"
34 #include "musescore.h"
35 #include "scoreview.h"
36 
37 namespace Ms {
38 
39 //---------------------------------------------------------
40 //   TupletDialog
41 //---------------------------------------------------------
42 
TupletDialog(QWidget * parent)43 TupletDialog::TupletDialog(QWidget* parent)
44    : QDialog(parent)
45       {
46       setObjectName("TupletDialog");
47       setupUi(this);
48       setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
49       MuseScore::restoreGeometry(this);
50       }
51 
52 //---------------------------------------------------------
53 //   defaultToStyleSettings
54 //---------------------------------------------------------
55 
defaultToStyleSettings(Score * score)56 void TupletDialog::defaultToStyleSettings(Score* score)
57       {
58       TupletNumberType nt = TupletNumberType(score->styleI(Sid::tupletNumberType));
59       number->setChecked(nt == TupletNumberType::SHOW_NUMBER);
60       relation->setChecked(nt == TupletNumberType::SHOW_RELATION);
61       noNumber->setChecked(nt == TupletNumberType::NO_TEXT);
62 
63       TupletBracketType bt = TupletBracketType(score->styleI(Sid::tupletBracketType));
64       autoBracket->setChecked(bt == TupletBracketType::AUTO_BRACKET);
65       bracket->setChecked(bt == TupletBracketType::SHOW_BRACKET);
66       noBracket->setChecked(bt == TupletBracketType::SHOW_NO_BRACKET);
67       }
68 
69 //---------------------------------------------------------
70 //   setupTuplet
71 //---------------------------------------------------------
72 
setupTuplet(Tuplet * tuplet)73 void TupletDialog::setupTuplet(Tuplet* tuplet)
74       {
75       tuplet->setRatio(Fraction(actualNotes->value(), normalNotes->value()));
76       if (number->isChecked())
77             tuplet->setNumberType(TupletNumberType::SHOW_NUMBER);
78       else if (relation->isChecked())
79             tuplet->setNumberType(TupletNumberType::SHOW_RELATION);
80       else if (noNumber->isChecked())
81             tuplet->setNumberType(TupletNumberType::NO_TEXT);
82       if (autoBracket->isChecked())
83             tuplet->setBracketType(TupletBracketType::AUTO_BRACKET);
84       else if (bracket->isChecked())
85             tuplet->setBracketType(TupletBracketType::SHOW_BRACKET);
86       else if (noBracket->isChecked())
87             tuplet->setBracketType(TupletBracketType::SHOW_NO_BRACKET);
88 
89       if (tuplet->numberType() == TupletNumberType(tuplet->score()->styleI(Sid::tupletNumberType)))
90             tuplet->setPropertyFlags(Pid::NUMBER_TYPE, PropertyFlags::STYLED);
91       else
92             tuplet->setPropertyFlags(Pid::NUMBER_TYPE, PropertyFlags::UNSTYLED);
93 
94       if (tuplet->bracketType() == TupletBracketType(tuplet->score()->styleI(Sid::tupletBracketType)))
95             tuplet->setPropertyFlags(Pid::BRACKET_TYPE, PropertyFlags::STYLED);
96       else
97             tuplet->setPropertyFlags(Pid::BRACKET_TYPE, PropertyFlags::UNSTYLED);
98       }
99 
100 //---------------------------------------------------------
101 //   tupletDialog
102 //    create tuplet dialog
103 //---------------------------------------------------------
104 
tupletDialog()105 Tuplet* MuseScore::tupletDialog()
106       {
107       if (!cs)
108             return 0;
109       ChordRest* cr = 0;
110       if (cv->noteEntryMode()) {
111             cs->expandVoice();
112             cs->changeCRlen(cs->inputState().cr(), cs->inputState().duration());
113             cr = cs->inputState().cr();
114             }
115       else
116             cr = cs->getSelectedChordRest();
117       if (cr == 0)
118             return 0;
119       if (cr->durationType() < TDuration(TDuration::DurationType::V_512TH) && cr->durationType() != TDuration(TDuration::DurationType::V_MEASURE)) {
120             noteTooShortForTupletDialog();
121             return 0;
122             }
123       Measure* measure = cr->measure();
124       if (measure && measure->isMMRest())
125             return 0;
126 
127       TupletDialog td;
128       td.defaultToStyleSettings(cs);
129       if (!td.exec())
130             return 0;
131 
132       Tuplet* tuplet = new Tuplet(cs);
133       tuplet->setTrack(cr->track());
134       tuplet->setTick(cr->tick());
135       td.setupTuplet(tuplet);
136       Fraction f1(cr->ticks());
137       tuplet->setTicks(f1);
138       Fraction f = f1 * Fraction(1, tuplet->ratio().denominator());
139       f.reduce();
140 
141       qDebug("len %s  ratio %s  base %s",
142          qPrintable(f1.print()),
143          qPrintable(tuplet->ratio().print()),
144          qPrintable(f.print()));
145 
146       if (TDuration::isValid(f))
147             tuplet->setBaseLen(f);
148       else
149             tuplet->setBaseLen(TDuration::DurationType::V_INVALID);
150 
151       if (tuplet->baseLen() == TDuration::DurationType::V_INVALID) {
152             QMessageBox::warning(0,
153                tr("Tuplet Error"),
154                tr("Cannot create tuplet with ratio %1 for duration %2").arg(tuplet->ratio().print()).arg(f1.print()));
155             delete tuplet;
156             return 0;
157             }
158 
159       tuplet->setParent(measure);
160 
161       return tuplet;
162       }
163 
164 //---------------------------------------------------------
165 //   hideEvent
166 //---------------------------------------------------------
167 
hideEvent(QHideEvent * event)168 void TupletDialog::hideEvent(QHideEvent* event)
169       {
170       MuseScore::saveGeometry(this);
171       QWidget::hideEvent(event);
172       }
173 }
174 
175