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