1 //=============================================================================
2 //  MuseScore
3 //  Music Composition & Notation
4 //
5 //  Copyright (C) 2011 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 //
10 //  This program is distributed in the hope that it will be useful,
11 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 //  GNU General Public License for more details.
14 //
15 //  You should have received a copy of the GNU General Public License
16 //  along with this program; if not, write to the Free Software
17 //  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 //=============================================================================
19 
20 #include "layer.h"
21 #include "libmscore/score.h"
22 #include "musescore.h"
23 
24 namespace Ms {
25 
26 //---------------------------------------------------------
27 //   LayerManager
28 //---------------------------------------------------------
29 
LayerManager(Score * s,QWidget * parent)30 LayerManager::LayerManager(Score* s, QWidget* parent)
31    : QDialog(parent)
32       {
33       setObjectName("LayerManager");
34       setupUi(this);
35       setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
36 
37       score = s;
38 
39       for (int i = 0; i < 31; ++i) {
40             QTableWidgetItem* item = new QTableWidgetItem(score->layerTags()[i+1]);
41             tags->setItem(i, 0, item);
42             item = new QTableWidgetItem(score->layerTagComments()[i+1]);
43             tags->setItem(i, 1, item);
44             }
45 
46       layers->setRowCount(score->layer().size());
47       int row = 0;
48       foreach(const Layer& l, score->layer()) {
49             QTableWidgetItem* item = new QTableWidgetItem(l.name);
50             layers->setItem(row, 0, item);
51             QString tagString;
52             for (int i = 0; i < 31; ++i) {
53                   uint mask = 1 << (i+1);
54                   if (mask &  l.tags) {
55                         if (!tagString.isEmpty())
56                               tagString += ",";
57                         tagString += tags->item(i, 0)->text();
58                         }
59                   }
60             item = new QTableWidgetItem(tagString);
61             layers->setItem(row, 1, item);
62             ++row;
63             }
64       layers->setCurrentCell(score->currentLayer(), 0);
65 
66       connect(createButton, SIGNAL(clicked()), SLOT(createClicked()));
67       connect(deleteButton, SIGNAL(clicked()), SLOT(deleteClicked()));
68       connect(addTagButton, SIGNAL(clicked()), SLOT(addTagClicked()));
69       connect(deleteTagButton, SIGNAL(clicked()), SLOT(deleteTagClicked()));
70 
71       MuseScore::restoreGeometry(this);
72       }
73 
74 //---------------------------------------------------------
75 //   showLayerManager
76 //---------------------------------------------------------
77 
showLayerManager()78 void MuseScore::showLayerManager()
79       {
80       LayerManager am(cs);
81       am.exec();
82       }
83 
84 //---------------------------------------------------------
85 //   createClicked
86 //---------------------------------------------------------
87 
createClicked()88 void LayerManager::createClicked()
89       {
90       int row      = layers->rowCount();
91       QString name = QString("layer%1").arg(row + 1);
92       QTableWidgetItem* item = new QTableWidgetItem(name);
93       layers->setRowCount(row+1);
94       layers->setItem(row, 0, item);
95       item = new QTableWidgetItem("");
96       layers->setItem(row, 1, item);
97       }
98 
99 //---------------------------------------------------------
100 //   deleteClicked
101 //---------------------------------------------------------
102 
deleteClicked()103 void LayerManager::deleteClicked()
104       {
105       qDebug("TODO");
106       }
107 
108 //---------------------------------------------------------
109 //   addTagClicked
110 //---------------------------------------------------------
111 
addTagClicked()112 void LayerManager::addTagClicked()
113       {
114       int row = layers->currentRow();
115       if (row == -1)
116             return;
117       QStringList items;
118       for (int i = 0; i < 31; ++i) {
119             QString s = score->layerTags()[i+1];
120             if (!s.isEmpty())
121                   items.append(s);
122             }
123       for (int i = 0; i < 31; ++i) {
124             QString tag(tags->item(i, 0)->text());
125             if (!tag.isEmpty())
126                   items.append(tag);
127             }
128 
129       if (items.isEmpty()) {
130             qDebug("no tags defined");
131             return;
132             }
133       bool ok;
134       QString item = QInputDialog::getItem(this, tr("Select layer tag"), tr("layer tag"),
135          items, 0, false, &ok);
136       if (ok && !item.isEmpty()) {
137 //            uint tagBits = 0;
138             for (int i = 0; i < 31; ++i) {
139                   QString s = score->layerTags()[i+1];
140                   if (s == item) {
141 //                        tagBits = 1 << (i+1);
142                         break;
143                         }
144                   }
145             QTableWidgetItem* wi = layers->item(row, 1);
146             QString s = wi->text();
147             if (!s.isEmpty())
148                   s += ",";
149             s += item;
150             wi->setText(s);
151             }
152       }
153 
154 //---------------------------------------------------------
155 //   deleteTagClicked
156 //---------------------------------------------------------
157 
deleteTagClicked()158 void LayerManager::deleteTagClicked()
159       {
160       int row = layers->currentRow();
161       if (row == -1)
162             return;
163       QTableWidgetItem* item = layers->item(row, 1);
164       QString s = item->text();
165       QStringList items = s.split(",");
166       bool ok;
167       QString tag = QInputDialog::getItem(this, tr("Select layer tag"), tr("layer tag"),
168          items, 0, false, &ok);
169       if (ok && !tag.isEmpty()) {
170             items.removeOne(tag);
171             item->setText(items.join(","));
172             }
173       }
174 
175 //---------------------------------------------------------
176 //   accept
177 //---------------------------------------------------------
178 
accept()179 void LayerManager:: accept()
180       {
181       score->startCmd();
182       for (int i = 0; i < 31; ++i) {
183             QString tag(tags->item(i, 0)->text());
184             QString comment(tags->item(i, 1)->text());
185             score->layerTags()[i+1] = tag;
186             score->layerTagComments()[i+1] = comment;
187             }
188       int row = layers->currentRow();
189       if (row != -1)
190             score->setCurrentLayer(row);
191 
192       QList<Layer>& layer = score->layer();
193       layer.clear();
194 
195       int n = layers->rowCount();
196       for (int i = 0; i < n; ++i) {
197             Layer l;
198             l.name           = layers->item(i, 0)->text();
199             l.tags           = 1;
200             QString ts       = layers->item(i, 1)->text();
201             QStringList tgs  = ts.split(",");
202             foreach (QString tag, tgs) {
203                   for (int idx = 0; idx < 32; ++idx) {
204                         if (tag == score->layerTags()[idx]) {
205                               l.tags |= 1 << idx;
206                               break;
207                               }
208                         }
209                   }
210             if (i == 0)             // hardwired default tag
211                   l.tags |= 1;
212             layer.append(l);
213             }
214       score->setLayoutAll();
215       score->endCmd();
216       if (enableExperimental)
217       	mscore->updateLayer();
218       QDialog::accept();
219       }
220 
221 //---------------------------------------------------------
222 //   hideEvent
223 //---------------------------------------------------------
224 
hideEvent(QHideEvent * event)225 void LayerManager::hideEvent(QHideEvent* event)
226       {
227       MuseScore::saveGeometry(this);
228       QWidget::hideEvent(event);
229       }
230 
231 }
232 
233