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("&amp;","&").replace("&gt;",">").replace("&lt;","<").replace("&quot;", "\"");
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