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