1 //=============================================================================
2 // MuseScore
3 // Music Composition & Notation
4 //
5 // Copyright (C) 2002-2016 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 // as published by the Free Software Foundation and appearing in
10 // the file LICENCE.GPL
11 //=============================================================================
12
13 #include "musescore.h"
14 #include "masterpalette.h"
15 #include "menus.h"
16 #include "symboldialog.h"
17 #include "palette.h"
18 #include "keyedit.h"
19 #include "libmscore/score.h"
20 #include "libmscore/clef.h"
21 #include "libmscore/fingering.h"
22 #include "libmscore/spacer.h"
23 #include "libmscore/layoutbreak.h"
24 #include "libmscore/dynamic.h"
25 #include "libmscore/bracket.h"
26 #include "libmscore/arpeggio.h"
27 #include "libmscore/glissando.h"
28 #include "libmscore/repeat.h"
29 #include "libmscore/breath.h"
30 #include "libmscore/harmony.h"
31 #include "libmscore/text.h"
32 #include "libmscore/tempotext.h"
33 #include "libmscore/instrchange.h"
34 #include "libmscore/rehearsalmark.h"
35 #include "libmscore/stafftext.h"
36 #include "libmscore/note.h"
37 #include "libmscore/tremolo.h"
38 #include "libmscore/chordline.h"
39
40 #include "timedialog.h"
41
42 namespace Ms {
43
44 //---------------------------------------------------------
45 // showMasterPalette
46 //---------------------------------------------------------
47
showMasterPalette(const QString & s)48 void MuseScore::showMasterPalette(const QString& s)
49 {
50 QAction* a = getAction("masterpalette");
51
52 if (masterPalette == 0) {
53 masterPalette = new MasterPalette(this);
54 connect(masterPalette, SIGNAL(closed(bool)), a, SLOT(setChecked(bool)));
55 mscore->stackUnder(masterPalette);
56 }
57 // when invoked via other actions, the main "masterpalette" action is not toggled automatically
58 if (!s.isEmpty()) {
59 // display if not already
60 if (!a->isChecked())
61 a->setChecked(true);
62 else {
63 // master palette is open; close only if command match current item
64 if (s == masterPalette->selectedItem())
65 a->setChecked(false);
66 // otherwise switch tabs
67 }
68 }
69 masterPalette->setVisible(a->isChecked());
70 if (!s.isEmpty())
71 masterPalette->selectItem(s);
72 }
73
74 //---------------------------------------------------------
75 // createPalette
76 //---------------------------------------------------------
77
createPalette(int w,int h,bool grid,double mag)78 Palette* MasterPalette::createPalette(int w, int h, bool grid, double mag)
79 {
80 Palette* sp = new Palette;
81 PaletteScrollArea* psa = new PaletteScrollArea(sp);
82 psa->setRestrictHeight(false);
83 sp->setMag(mag);
84 sp->setGrid(w, h);
85 sp->setDrawGrid(grid);
86 sp->setReadOnly(true);
87 stack->addWidget(psa);
88 return sp;
89 }
90
91 //---------------------------------------------------------
92 // keyPressEvent
93 //---------------------------------------------------------
94
keyPressEvent(QKeyEvent * ev)95 void MasterPalette::keyPressEvent(QKeyEvent* ev)
96 {
97 if (ev->key() == Qt::Key_Escape && ev->modifiers() == Qt::NoModifier) {
98 close();
99 return;
100 }
101 QWidget::keyPressEvent(ev);
102 }
103
104 //---------------------------------------------------------
105 // selectItem
106 //---------------------------------------------------------
107
selectItem(const QString & s)108 void MasterPalette::selectItem(const QString& s)
109 {
110 for (int idx = 0; idx < treeWidget->topLevelItemCount(); ++idx) {
111 if (treeWidget->topLevelItem(idx)->text(0) == s) {
112 treeWidget->setCurrentItem(treeWidget->topLevelItem(idx));
113 break;
114 }
115 }
116 }
117
118 //---------------------------------------------------------
119 // selectedItem
120 //---------------------------------------------------------
121
selectedItem()122 QString MasterPalette::selectedItem()
123 {
124 return treeWidget->currentItem()->text(0);
125 }
126
127 //---------------------------------------------------------
128 // addPalette
129 //---------------------------------------------------------
130
addPalette(Palette * sp)131 void MasterPalette::addPalette(Palette* sp)
132 {
133 sp->setReadOnly(true);
134 PaletteScrollArea* psa = new PaletteScrollArea(sp);
135 psa->setRestrictHeight(false);
136 QTreeWidgetItem* item = new QTreeWidgetItem(QStringList(sp->name()));
137 item->setData(0, Qt::UserRole, stack->count());
138 item->setText(0, qApp->translate("Palette", sp->name().toUtf8().data()).replace("&&","&"));
139 stack->addWidget(psa);
140 treeWidget->addTopLevelItem(item);
141 }
142
143 //---------------------------------------------------------
144 // MasterPalette
145 //---------------------------------------------------------
146
MasterPalette(QWidget * parent)147 MasterPalette::MasterPalette(QWidget* parent)
148 : QWidget(parent, Qt::Dialog)
149 {
150 setObjectName("MasterPalette");
151 setupUi(this);
152 setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
153
154 treeWidget->clear();
155
156 addPalette(MuseScore::newClefsPalette());
157 keyEditor = new KeyEditor;
158
159 keyItem = new QTreeWidgetItem();
160 keyItem->setData(0, Qt::UserRole, stack->count());
161 stack->addWidget(keyEditor);
162 treeWidget->addTopLevelItem(keyItem);
163
164 timeItem = new QTreeWidgetItem();
165 timeItem->setData(0, Qt::UserRole, stack->count());
166 timeDialog = new TimeDialog;
167 stack->addWidget(timeDialog);
168 treeWidget->addTopLevelItem(timeItem);
169
170 addPalette(MuseScore::newBracketsPalette());
171 addPalette(MuseScore::newAccidentalsPalette());
172 addPalette(MuseScore::newArticulationsPalette());
173 addPalette(MuseScore::newOrnamentsPalette());
174 addPalette(MuseScore::newBreathPalette());
175 addPalette(MuseScore::newGraceNotePalette());
176 addPalette(MuseScore::newNoteHeadsPalette());
177 addPalette(MuseScore::newLinesPalette());
178 addPalette(MuseScore::newBarLinePalette());
179 addPalette(MuseScore::newArpeggioPalette());
180 addPalette(MuseScore::newTremoloPalette());
181 addPalette(MuseScore::newTextPalette());
182 addPalette(MuseScore::newTempoPalette());
183 addPalette(MuseScore::newDynamicsPalette());
184 addPalette(MuseScore::newFingeringPalette());
185 addPalette(MuseScore::newRepeatsPalette());
186 addPalette(MuseScore::newFretboardDiagramPalette());
187 addPalette(MuseScore::newAccordionPalette());
188 addPalette(MuseScore::newBagpipeEmbellishmentPalette());
189 addPalette(MuseScore::newBreaksPalette());
190 addPalette(MuseScore::newFramePalette());
191 addPalette(MuseScore::newBeamPalette());
192
193 symbolItem = new QTreeWidgetItem();
194 idxAllSymbols = stack->count();
195 symbolItem->setData(0, Qt::UserRole, idxAllSymbols);
196 symbolItem->setText(0, QT_TRANSLATE_NOOP("MasterPalette", "Symbols"));
197 treeWidget->addTopLevelItem(symbolItem);
198 stack->addWidget(new SymbolDialog(SMUFL_ALL_SYMBOLS));
199
200 // Add "All symbols" entry to be first in the list of categories
201 QTreeWidgetItem* child = new QTreeWidgetItem(QStringList(SMUFL_ALL_SYMBOLS));
202 child->setData(0, Qt::UserRole, idxAllSymbols);
203 symbolItem->addChild(child);
204
205 for (const QString& s : smuflRanges()->keys()) {
206 if (s == SMUFL_ALL_SYMBOLS)
207 continue;
208 QTreeWidgetItem* chld = new QTreeWidgetItem(QStringList(s));
209 chld->setData(0, Qt::UserRole, stack->count());
210 symbolItem->addChild(chld);
211 stack->addWidget(new SymbolDialog(s));
212 }
213
214 connect(treeWidget, &QTreeWidget::currentItemChanged, this, &MasterPalette::currentChanged);
215 connect(treeWidget, &QTreeWidget::itemClicked, this, &MasterPalette::clicked);
216 retranslate(true);
217
218 MuseScore::restoreGeometry(this);
219 }
220
221 //---------------------------------------------------------
222 // retranslate
223 //---------------------------------------------------------
224
retranslate(bool firstTime)225 void MasterPalette::retranslate(bool firstTime)
226 {
227 keyItem->setText(0, qApp->translate("Palette", "Key Signatures"));
228 timeItem->setText(0, qApp->translate("Palette", "Time Signatures"));
229 symbolItem->setText(0, qApp->translate("MasterPalette", "Symbols"));
230 if (!firstTime)
231 retranslateUi(this);
232 }
233
234 //---------------------------------------------------------
235 // currentChanged
236 //---------------------------------------------------------
237
currentChanged(QTreeWidgetItem * item,QTreeWidgetItem *)238 void MasterPalette::currentChanged(QTreeWidgetItem* item, QTreeWidgetItem*)
239 {
240 int idx = item->data(0, Qt::UserRole).toInt();
241 if (idx != -1)
242 stack->setCurrentIndex(idx);
243 }
244
245 //---------------------------------------------------------
246 // clicked
247 //---------------------------------------------------------
248
clicked(QTreeWidgetItem * item,int)249 void MasterPalette::clicked(QTreeWidgetItem* item, int)
250 {
251 int idx = item->data(0, Qt::UserRole).toInt();
252 if (idx == idxAllSymbols) {
253 item->setExpanded(!item->isExpanded());
254 if (idx != -1)
255 stack->setCurrentIndex(idx);
256 }
257 }
258
259 //---------------------------------------------------------
260 // closeEvent
261 //---------------------------------------------------------
262
closeEvent(QCloseEvent * ev)263 void MasterPalette::closeEvent(QCloseEvent* ev)
264 {
265 MuseScore::saveGeometry(this);
266 if (timeDialog->dirty())
267 timeDialog->save();
268 if (keyEditor->dirty())
269 keyEditor->save();
270 emit closed(false);
271 QWidget::closeEvent(ev);
272 }
273
274 //---------------------------------------------------------
275 // changeEvent
276 //---------------------------------------------------------
277
changeEvent(QEvent * event)278 void MasterPalette::changeEvent(QEvent *event)
279 {
280 QWidget::changeEvent(event);
281 if (event->type() == QEvent::LanguageChange)
282 retranslate();
283 }
284
285 }
286
287