1 //=============================================================================
2 // MuseScore
3 // Music Composition & Notation
4 //
5 // Copyright (C) 2011-2017 Werner Schweer
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 "albummanager.h"
14 #include "globals.h"
15 #include "musescore.h"
16 #include "scoreview.h"
17 #include "preferences.h"
18 #include "icons.h"
19 #include "libmscore/mscore.h"
20 #include "libmscore/xml.h"
21 #include "libmscore/undo.h"
22
23 namespace Ms {
24
25 //---------------------------------------------------------
26 // AlbumManager
27 //---------------------------------------------------------
28
AlbumManager(QWidget * parent)29 AlbumManager::AlbumManager(QWidget* parent)
30 : AbstractDialog(parent)
31 {
32 setObjectName("AlbumManager");
33 setupUi(this);
34 setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
35 up->setIcon(*icons[int(Icons::arrowUp_ICON)]);
36 down->setIcon(*icons[int(Icons::arrowDown_ICON)]);
37
38 album = 0;
39 connect(add, SIGNAL(clicked()), SLOT(addClicked()));
40 connect(addNew, SIGNAL(clicked()), SLOT(addNewClicked()));
41 connect(up, SIGNAL(clicked()), SLOT(upClicked()));
42 connect(down, SIGNAL(clicked()), SLOT(downClicked()));
43 connect(remove, SIGNAL(clicked()), SLOT(removeClicked()));
44 connect(scoreList, SIGNAL(currentRowChanged(int)), SLOT(currentScoreChanged(int)));
45 connect(scoreList, SIGNAL(itemChanged(QListWidgetItem*)), SLOT(itemChanged(QListWidgetItem*)));
46 connect(buttonBox, SIGNAL(clicked(QAbstractButton*)), SLOT(buttonBoxClicked(QAbstractButton*)));
47 currentScoreChanged(-1);
48 add->setEnabled(false);
49
50 MuseScore::restoreGeometry(this);
51 //createNewClicked();
52 }
53
54 //---------------------------------------------------------
55 // buttonBoxClicked
56 //---------------------------------------------------------
57
buttonBoxClicked(QAbstractButton *)58 void AlbumManager::buttonBoxClicked(QAbstractButton*)
59 {
60 //printf("buttonBox clicked\n");
61 }
62
63 //---------------------------------------------------------
64 // getScoreTitle
65 //---------------------------------------------------------
66
getScoreTitle(Score * score)67 static QString getScoreTitle(Score* score)
68 {
69 QString name = score->metaTag("movementTitle");
70 if (name.isEmpty()) {
71 Text* t = score->getText(Tid::TITLE);
72 if (t)
73 name = QTextDocumentFragment::fromHtml(t->xmlText()).toPlainText().replace("&","&").replace(">",">").replace("<","<").replace(""", "\"");
74 name = name.simplified();
75 }
76 if (name.isEmpty())
77 name = score->title();
78 return name;
79 }
80
81 //---------------------------------------------------------
82 // addClicked
83 //---------------------------------------------------------
84
addClicked()85 void AlbumManager::addClicked()
86 {
87 QStringList files = mscore->getOpenScoreNames(
88 tr("MuseScore Files") + " (*.mscz *.mscx);;", tr("Load Score")
89 );
90 QList<MasterScore*> scores;
91 for (const QString& fn : files) {
92 MasterScore* score = mscore->readScore(fn);
93 Movements* m = score->movements();
94 for (MasterScore* ms : *m) {
95 scores.push_back(ms);
96 ms->setMovements(0);
97 }
98 delete m;
99 }
100 if (scores.empty())
101 return;
102 MasterScore* topScore = album->front();
103 scoreList->blockSignals(true);
104 for (MasterScore* score : scores) {
105 topScore->addMovement(score);
106 QString name = getScoreTitle(score);
107 QListWidgetItem* li = new QListWidgetItem(name, scoreList);
108 li->setFlags(Qt::ItemFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled));
109 }
110 scoreList->blockSignals(false);
111 topScore->setLayoutAll();
112 topScore->update();
113 }
114
115 //---------------------------------------------------------
116 // addNewClicked
117 //---------------------------------------------------------
118
addNewClicked()119 void AlbumManager::addNewClicked()
120 {
121 MasterScore* score = mscore->getNewFile();
122 if (!score)
123 return;
124
125 delete score->movements();
126 MasterScore* topScore = album->front();
127
128 scoreList->blockSignals(true);
129 topScore->addMovement(score);
130 QString name = getScoreTitle(score);
131 QListWidgetItem* li = new QListWidgetItem(name, scoreList);
132 li->setFlags(Qt::ItemFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled));
133 scoreList->blockSignals(false);
134
135 topScore->setLayoutAll();
136 topScore->update();
137 }
138
139 //---------------------------------------------------------
140 // upClicked
141 //---------------------------------------------------------
142
upClicked()143 void AlbumManager::upClicked()
144 {
145 #if 0
146 int idx = scoreList->currentRow();
147 if (idx == -1 || idx == 0)
148 return;
149 QListWidgetItem* item = scoreList->takeItem(idx);
150 scoreList->insertItem(idx-1, item);
151 album->swap(idx, idx - 1);
152 scoreList->setCurrentRow(idx-1);
153 #endif
154 }
155
156 //---------------------------------------------------------
157 // downClicked
158 //---------------------------------------------------------
159
downClicked()160 void AlbumManager::downClicked()
161 {
162 #if 0
163 int idx = scoreList->currentRow();
164 int n = scoreList->count();
165 if (idx == -1 || idx >= (n-1))
166 return;
167 QListWidgetItem* item = scoreList->takeItem(idx+1);
168 scoreList->insertItem(idx, item);
169 album->swap(idx, idx+1);
170 scoreList->setCurrentRow(idx+1);
171 #endif
172 }
173
174 //---------------------------------------------------------
175 // removeClicked
176 //---------------------------------------------------------
177
removeClicked()178 void AlbumManager::removeClicked()
179 {
180 #if 0
181 int n = scoreList->currentRow();
182 if (n == -1)
183 return;
184 delete scoreList->takeItem(n);
185 album->remove(n);
186 #endif
187 }
188
189 //---------------------------------------------------------
190 // setAlbum
191 //---------------------------------------------------------
192
setAlbum(Movements * a)193 void AlbumManager::setAlbum(Movements* a)
194 {
195 scoreList->clear();
196 if (!a)
197 return;
198
199 album = a;
200
201 scoreList->blockSignals(true);
202 for (MasterScore* score : *album) {
203 QString name = getScoreTitle(score);
204 QListWidgetItem* li = new QListWidgetItem(name, scoreList);
205 li->setFlags(Qt::ItemFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled));
206 }
207 scoreList->blockSignals(false);
208 add->setEnabled(true);
209 }
210
211 //---------------------------------------------------------
212 // currentScoreChanged
213 //---------------------------------------------------------
214
currentScoreChanged(int idx)215 void AlbumManager::currentScoreChanged(int idx)
216 {
217 int n = scoreList->count();
218 if (idx == -1) {
219 up->setEnabled(false);
220 down->setEnabled(false);
221 remove->setEnabled(false);
222 return;
223 }
224 down->setEnabled(idx < (n-1));
225 up->setEnabled(idx > 0);
226 remove->setEnabled(true);
227 }
228
229 //---------------------------------------------------------
230 // itemChanged
231 //---------------------------------------------------------
232
itemChanged(QListWidgetItem * item)233 void AlbumManager::itemChanged(QListWidgetItem* item)
234 {
235 int row = scoreList->row(item);
236 MasterScore* ms = *(album->begin() + row);
237 ms->undo(new ChangeMetaText(ms, "movementTitle", item->text()));
238 }
239
240 //---------------------------------------------------------
241 // showAlbumManager
242 //---------------------------------------------------------
243
showAlbumManager()244 void MuseScore::showAlbumManager()
245 {
246 if (albumManager == 0)
247 albumManager = new AlbumManager(this);
248
249 albumManager->setAlbum(currentScoreView() ? currentScoreView()->score()->masterScore()->movements() : 0);
250 albumManager->show();
251
252 // focus on album name on opening the Album Manager
253 //albumManager->albumName->setFocus();
254 }
255
256 //---------------------------------------------------------
257 // hideEvent
258 //---------------------------------------------------------
259
hideEvent(QHideEvent * event)260 void AlbumManager::hideEvent(QHideEvent* event)
261 {
262 MuseScore::saveGeometry(this);
263 QDialog::hideEvent(event);
264 }
265 }
266
267