Line data Source code
1 : /*
2 : * SPDX-License-Identifier: GPL-3.0-only
3 : * MuseScore-Studio-CLA-applies
4 : *
5 : * MuseScore Studio
6 : * Music Composition & Notation
7 : *
8 : * Copyright (C) 2021 MuseScore Limited and others
9 : *
10 : * This program is free software: you can redistribute it and/or modify
11 : * it under the terms of the GNU General Public License version 3 as
12 : * published by the Free Software Foundation.
13 : *
14 : * This program is distributed in the hope that it will be useful,
15 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : * GNU General Public License for more details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 : */
22 :
23 : #include "masterpalette.h"
24 :
25 : #include "translation.h"
26 :
27 : #include "palettewidget.h"
28 : #include "keyedit.h"
29 : #include "timedialog.h"
30 : #include "symboldialog.h"
31 :
32 : #include "internal/palettecreator.h"
33 :
34 : #include "engraving/infrastructure/smufl.h"
35 : #include "ui/view/widgetstatestore.h"
36 :
37 : #include "log.h"
38 :
39 : using namespace mu::palette;
40 : using namespace muse::ui;
41 : using namespace mu::engraving;
42 :
43 0 : void MasterPalette::setSelectedPaletteName(const QString& name)
44 : {
45 0 : for (int idx = 0; idx < treeWidget->topLevelItemCount(); ++idx) {
46 0 : if (treeWidget->topLevelItem(idx)->text(0) == name) {
47 0 : treeWidget->setCurrentItem(treeWidget->topLevelItem(idx));
48 0 : emit selectedPaletteNameChanged(name);
49 0 : break;
50 : }
51 : }
52 0 : }
53 :
54 0 : QString MasterPalette::selectedPaletteName() const
55 : {
56 0 : return treeWidget->currentItem()->text(0);
57 : }
58 :
59 : //---------------------------------------------------------
60 : // addPalette
61 : //---------------------------------------------------------
62 :
63 0 : void MasterPalette::addPalette(PalettePtr palette)
64 : {
65 0 : TRACEFUNC;
66 :
67 0 : PaletteWidget* widget = new PaletteWidget(this, true /*setIocContext*/);
68 0 : widget->setReadOnly(true);
69 0 : widget->setPalette(palette);
70 :
71 0 : PaletteScrollArea* psa = new PaletteScrollArea(widget);
72 0 : psa->setRestrictHeight(false);
73 0 : QTreeWidgetItem* item = new QTreeWidgetItem(QStringList(widget->name()));
74 0 : item->setData(0, Qt::UserRole, stack->count());
75 0 : item->setText(0, muse::qtrc("palette", widget->name().toUtf8().data()).replace("&&", "&"));
76 0 : stack->addWidget(psa);
77 0 : treeWidget->addTopLevelItem(item);
78 0 : }
79 :
80 : //---------------------------------------------------------
81 : // MasterPalette
82 : //---------------------------------------------------------
83 :
84 0 : MasterPalette::MasterPalette(QWidget* parent)
85 0 : : TopLevelDialog(parent)
86 : {
87 0 : TRACEFUNC;
88 :
89 0 : setObjectName("MasterPalette");
90 0 : setupUi(this);
91 0 : }
92 :
93 0 : void MasterPalette::componentComplete()
94 : {
95 0 : TopLevelDialog::componentComplete();
96 :
97 0 : treeWidget->clear();
98 :
99 0 : PaletteCreator creator(iocContext());
100 :
101 0 : addPalette(creator.newClefsPalette());
102 0 : m_keyEditor = new KeyEditor(this);
103 :
104 0 : m_keyItem = new QTreeWidgetItem();
105 0 : m_keyItem->setData(0, Qt::UserRole, stack->count());
106 0 : stack->addWidget(m_keyEditor);
107 0 : treeWidget->addTopLevelItem(m_keyItem);
108 :
109 0 : m_timeItem = new QTreeWidgetItem();
110 0 : m_timeItem->setData(0, Qt::UserRole, stack->count());
111 0 : m_timeEditor = new TimeEditor(this);
112 0 : m_timeEditor->classBegin();
113 0 : stack->addWidget(m_timeEditor);
114 0 : treeWidget->addTopLevelItem(m_timeItem);
115 :
116 0 : addPalette(creator.newBracketsPalette());
117 0 : addPalette(creator.newAccidentalsPalette());
118 0 : addPalette(creator.newArticulationsPalette());
119 0 : addPalette(creator.newOrnamentsPalette());
120 0 : addPalette(creator.newBreathPalette());
121 0 : addPalette(creator.newGraceNotePalette());
122 0 : addPalette(creator.newNoteHeadsPalette());
123 0 : addPalette(creator.newLinesPalette());
124 0 : addPalette(creator.newBarLinePalette());
125 0 : addPalette(creator.newArpeggioPalette());
126 0 : addPalette(creator.newTremoloPalette());
127 0 : addPalette(creator.newTextPalette());
128 0 : addPalette(creator.newTempoPalette());
129 0 : addPalette(creator.newDynamicsPalette());
130 0 : addPalette(creator.newFingeringPalette());
131 0 : addPalette(creator.newRepeatsPalette());
132 0 : addPalette(creator.newFretboardDiagramPalette());
133 0 : addPalette(creator.newAccordionPalette());
134 0 : addPalette(creator.newBagpipeEmbellishmentPalette());
135 0 : addPalette(creator.newLayoutPalette());
136 0 : addPalette(creator.newBeamPalette());
137 :
138 0 : m_symbolItem = new QTreeWidgetItem();
139 0 : m_idxAllSymbols = stack->count();
140 0 : m_symbolItem->setData(0, Qt::UserRole, m_idxAllSymbols);
141 0 : m_symbolItem->setText(0, QT_TRANSLATE_NOOP("palette", "Symbols"));
142 0 : treeWidget->addTopLevelItem(m_symbolItem);
143 0 : stack->addWidget(new SymbolDialog(Smufl::SMUFL_ALL_SYMBOLS, this));
144 :
145 : // Add "All symbols" entry to be first in the list of categories
146 0 : QTreeWidgetItem* child = new QTreeWidgetItem({ Smufl::SMUFL_ALL_SYMBOLS });
147 0 : child->setData(0, Qt::UserRole, m_idxAllSymbols);
148 0 : m_symbolItem->addChild(child);
149 :
150 0 : int idx = 0;
151 0 : for (const auto& [rangeName, _] : Smufl::smuflRanges()) {
152 0 : ++idx;
153 :
154 0 : if (rangeName == Smufl::SMUFL_ALL_SYMBOLS) {
155 0 : continue;
156 : }
157 :
158 0 : QTreeWidgetItem* chld = new QTreeWidgetItem({ rangeName });
159 0 : chld->setData(0, Qt::UserRole, m_idxAllSymbols + idx);
160 :
161 0 : m_symbolItem->addChild(chld);
162 : }
163 :
164 0 : connect(treeWidget, &QTreeWidget::currentItemChanged, this, &MasterPalette::currentChanged);
165 0 : connect(treeWidget, &QTreeWidget::itemClicked, this, &MasterPalette::clicked);
166 0 : retranslate(true);
167 0 : }
168 :
169 : //---------------------------------------------------------
170 : // retranslate
171 : //---------------------------------------------------------
172 :
173 0 : void MasterPalette::retranslate(bool firstTime)
174 : {
175 0 : m_keyItem->setText(0, muse::qtrc("palette", "Key signatures"));
176 0 : m_timeItem->setText(0, muse::qtrc("palette", "Time signatures"));
177 0 : m_symbolItem->setText(0, muse::qtrc("palette", "Symbols"));
178 0 : if (!firstTime) {
179 0 : retranslateUi(this);
180 : }
181 0 : }
182 :
183 : //---------------------------------------------------------
184 : // currentChanged
185 : //---------------------------------------------------------
186 :
187 0 : void MasterPalette::currentChanged(QTreeWidgetItem* item, QTreeWidgetItem*)
188 : {
189 0 : int idx = item->data(0, Qt::UserRole).toInt();
190 :
191 0 : if (idx > m_idxAllSymbols) {
192 0 : if (!m_symbolWidgets.contains(idx)) {
193 0 : String rangeName = std::next(Smufl::smuflRanges().cbegin(), idx - m_idxAllSymbols - 1)->first;
194 0 : SymbolDialog* dialog = new SymbolDialog(rangeName.toQString(), this);
195 0 : m_symbolWidgets[idx] = dialog;
196 0 : stack->addWidget(dialog);
197 0 : }
198 :
199 0 : stack->setCurrentWidget(m_symbolWidgets[idx]);
200 0 : return;
201 : }
202 :
203 0 : if (idx != -1) {
204 0 : stack->setCurrentIndex(idx);
205 : }
206 : }
207 :
208 : //---------------------------------------------------------
209 : // clicked
210 : //---------------------------------------------------------
211 :
212 0 : void MasterPalette::clicked(QTreeWidgetItem* item, int)
213 : {
214 0 : int idx = item->data(0, Qt::UserRole).toInt();
215 0 : if (idx == m_idxAllSymbols) {
216 0 : item->setExpanded(!item->isExpanded());
217 0 : if (idx != -1) {
218 0 : stack->setCurrentIndex(idx);
219 : }
220 : }
221 0 : }
222 :
223 : //---------------------------------------------------------
224 : // closeEvent
225 : //---------------------------------------------------------
226 :
227 0 : void MasterPalette::showEvent(QShowEvent* event)
228 : {
229 0 : WidgetStateStore::restoreGeometry(this);
230 0 : TopLevelDialog::showEvent(event);
231 0 : }
232 :
233 0 : void MasterPalette::closeEvent(QCloseEvent* event)
234 : {
235 0 : WidgetStateStore::saveGeometry(this);
236 0 : if (m_timeEditor->dirty()) {
237 0 : m_timeEditor->save();
238 : }
239 0 : if (m_keyEditor->dirty()) {
240 0 : m_keyEditor->save();
241 : }
242 0 : setResult(QDialog::Accepted);
243 0 : QWidget::closeEvent(event);
244 0 : }
245 :
246 : //---------------------------------------------------------
247 : // changeEvent
248 : //---------------------------------------------------------
249 :
250 0 : void MasterPalette::changeEvent(QEvent* event)
251 : {
252 0 : QWidget::changeEvent(event);
253 0 : if (event->type() == QEvent::LanguageChange) {
254 0 : retranslate();
255 : }
256 0 : }
|