Mercurial > hg > svgui
comparison widgets/PluginPathConfigurator.cpp @ 1324:13d9b422f7fe zoom
Merge from default branch
author | Chris Cannam |
---|---|
date | Mon, 17 Sep 2018 13:51:31 +0100 |
parents | f24f64e441ac |
children |
comparison
equal
deleted
inserted
replaced
1183:57d192e26331 | 1324:13d9b422f7fe |
---|---|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ | |
2 | |
3 /* | |
4 Sonic Visualiser | |
5 An audio file viewer and annotation editor. | |
6 Centre for Digital Music, Queen Mary, University of London. | |
7 | |
8 This program is free software; you can redistribute it and/or | |
9 modify it under the terms of the GNU General Public License as | |
10 published by the Free Software Foundation; either version 2 of the | |
11 License, or (at your option) any later version. See the file | |
12 COPYING included with this distribution for more information. | |
13 */ | |
14 | |
15 #include "PluginPathConfigurator.h" | |
16 #include "PluginReviewDialog.h" | |
17 | |
18 #include <QPushButton> | |
19 #include <QListWidget> | |
20 #include <QGridLayout> | |
21 #include <QComboBox> | |
22 #include <QLabel> | |
23 #include <QCheckBox> | |
24 #include <QFileDialog> | |
25 | |
26 #include "IconLoader.h" | |
27 #include "WidgetScale.h" | |
28 | |
29 #include "plugin/PluginPathSetter.h" | |
30 | |
31 PluginPathConfigurator::PluginPathConfigurator(QWidget *parent) : | |
32 QFrame(parent) | |
33 { | |
34 m_layout = new QGridLayout; | |
35 setLayout(m_layout); | |
36 | |
37 QHBoxLayout *buttons = new QHBoxLayout; | |
38 | |
39 m_down = new QPushButton; | |
40 m_down->setIcon(IconLoader().load("down")); | |
41 m_down->setToolTip(tr("Move the selected location later in the list")); | |
42 connect(m_down, SIGNAL(clicked()), this, SLOT(downClicked())); | |
43 buttons->addWidget(m_down); | |
44 | |
45 m_up = new QPushButton; | |
46 m_up->setIcon(IconLoader().load("up")); | |
47 m_up->setToolTip(tr("Move the selected location earlier in the list")); | |
48 connect(m_up, SIGNAL(clicked()), this, SLOT(upClicked())); | |
49 buttons->addWidget(m_up); | |
50 | |
51 m_add = new QPushButton; | |
52 m_add->setIcon(IconLoader().load("plus")); | |
53 m_add->setToolTip(tr("Add a new location to the list")); | |
54 connect(m_add, SIGNAL(clicked()), this, SLOT(addClicked())); | |
55 buttons->addWidget(m_add); | |
56 | |
57 m_delete = new QPushButton; | |
58 m_delete->setIcon(IconLoader().load("datadelete")); | |
59 m_delete->setToolTip(tr("Remove the selected location from the list")); | |
60 connect(m_delete, SIGNAL(clicked()), this, SLOT(deleteClicked())); | |
61 buttons->addWidget(m_delete); | |
62 | |
63 m_reset = new QPushButton; | |
64 m_reset->setText(tr("Reset to Default")); | |
65 m_reset->setToolTip(tr("Reset the list for this plugin type to its default")); | |
66 connect(m_reset, SIGNAL(clicked()), this, SLOT(resetClicked())); | |
67 buttons->addWidget(m_reset); | |
68 | |
69 buttons->addStretch(50); | |
70 | |
71 m_seePlugins = new QPushButton; | |
72 m_seePlugins->setText(tr("Review plugins...")); | |
73 connect(m_seePlugins, SIGNAL(clicked()), this, SLOT(seePluginsClicked())); | |
74 buttons->addWidget(m_seePlugins); | |
75 | |
76 int row = 0; | |
77 | |
78 m_header = new QLabel; | |
79 m_header->setText(tr("Plugin locations for plugin type:")); | |
80 m_layout->addWidget(m_header, row, 0); | |
81 | |
82 m_pluginTypeSelector = new QComboBox; | |
83 m_layout->addWidget(m_pluginTypeSelector, row, 1, Qt::AlignLeft); | |
84 connect(m_pluginTypeSelector, SIGNAL(currentTextChanged(QString)), | |
85 this, SLOT(currentTypeChanged(QString))); | |
86 | |
87 m_layout->setColumnStretch(1, 10); | |
88 ++row; | |
89 | |
90 m_list = new QListWidget; | |
91 m_layout->addWidget(m_list, row, 0, 1, 3); | |
92 m_layout->setRowStretch(row, 20); | |
93 connect(m_list, SIGNAL(currentRowChanged(int)), | |
94 this, SLOT(currentLocationChanged(int))); | |
95 ++row; | |
96 | |
97 m_layout->addLayout(buttons, row, 0, 1, 3); | |
98 | |
99 ++row; | |
100 | |
101 m_envOverride = new QCheckBox; | |
102 connect(m_envOverride, SIGNAL(stateChanged(int)), | |
103 this, SLOT(envOverrideChanged(int))); | |
104 m_layout->addWidget(m_envOverride, row, 0, 1, 3); | |
105 ++row; | |
106 } | |
107 | |
108 PluginPathConfigurator::~PluginPathConfigurator() | |
109 { | |
110 } | |
111 | |
112 QString | |
113 PluginPathConfigurator::getLabelFor(PluginPathSetter::TypeKey key) | |
114 { | |
115 if (key.second == KnownPlugins::FormatNative) { | |
116 switch (key.first) { | |
117 case KnownPlugins::VampPlugin: | |
118 return tr("Vamp"); | |
119 case KnownPlugins::LADSPAPlugin: | |
120 return tr("LADSPA"); | |
121 case KnownPlugins::DSSIPlugin: | |
122 return tr("DSSI"); | |
123 } | |
124 } else if (key.second == KnownPlugins::FormatNonNative32Bit) { | |
125 switch (key.first) { | |
126 case KnownPlugins::VampPlugin: | |
127 return tr("Vamp (32-bit)"); | |
128 case KnownPlugins::LADSPAPlugin: | |
129 return tr("LADSPA (32-bit)"); | |
130 case KnownPlugins::DSSIPlugin: | |
131 return tr("DSSI (32-bit)"); | |
132 } | |
133 } | |
134 SVCERR << "PluginPathConfigurator::getLabelFor: WARNING: " | |
135 << "Unknown format value " << key.second << endl; | |
136 return "<unknown>"; | |
137 } | |
138 | |
139 PluginPathSetter::TypeKey | |
140 PluginPathConfigurator::getKeyForLabel(QString label) | |
141 { | |
142 for (const auto &p: m_paths) { | |
143 auto key = p.first; | |
144 if (getLabelFor(key) == label) { | |
145 return key; | |
146 } | |
147 } | |
148 SVCERR << "PluginPathConfigurator::getKeyForLabel: WARNING: " | |
149 << "Unrecognised label \"" << label << "\"" << endl; | |
150 return { KnownPlugins::VampPlugin, KnownPlugins::FormatNative }; | |
151 } | |
152 | |
153 void | |
154 PluginPathConfigurator::setPaths(PluginPathSetter::Paths paths) | |
155 { | |
156 m_paths = paths; | |
157 | |
158 m_defaultPaths = PluginPathSetter::getDefaultPaths(); | |
159 | |
160 m_pluginTypeSelector->clear(); | |
161 for (const auto &p: paths) { | |
162 m_pluginTypeSelector->addItem(getLabelFor(p.first)); | |
163 } | |
164 | |
165 populate(); | |
166 } | |
167 | |
168 void | |
169 PluginPathConfigurator::populate() | |
170 { | |
171 m_list->clear(); | |
172 | |
173 if (m_paths.empty()) return; | |
174 | |
175 populateFor(m_paths.begin()->first, -1); | |
176 } | |
177 | |
178 void | |
179 PluginPathConfigurator::populateFor(PluginPathSetter::TypeKey key, | |
180 int makeCurrent) | |
181 { | |
182 QString envVariable = m_paths.at(key).envVariable; | |
183 bool useEnvVariable = m_paths.at(key).useEnvVariable; | |
184 QString envVarValue = | |
185 PluginPathSetter::getOriginalEnvironmentValue(envVariable); | |
186 QString currentValueRubric; | |
187 if (envVarValue == QString()) { | |
188 currentValueRubric = tr("(Variable is currently unset)"); | |
189 } else { | |
190 if (envVarValue.length() > 100) { | |
191 QString envVarStart = envVarValue.left(95); | |
192 currentValueRubric = tr("(Current value begins: \"%1 ...\")") | |
193 .arg(envVarStart); | |
194 } else { | |
195 currentValueRubric = tr("(Currently set to: \"%1\")") | |
196 .arg(envVarValue); | |
197 } | |
198 } | |
199 m_envOverride->setText | |
200 (tr("Allow the %1 environment variable to take priority over this\n%2") | |
201 .arg(envVariable) | |
202 .arg(currentValueRubric)); | |
203 m_envOverride->setCheckState(useEnvVariable ? Qt::Checked : Qt::Unchecked); | |
204 | |
205 m_list->clear(); | |
206 | |
207 for (int i = 0; i < m_pluginTypeSelector->count(); ++i) { | |
208 if (getLabelFor(key) == m_pluginTypeSelector->itemText(i)) { | |
209 m_pluginTypeSelector->blockSignals(true); | |
210 m_pluginTypeSelector->setCurrentIndex(i); | |
211 m_pluginTypeSelector->blockSignals(false); | |
212 } | |
213 } | |
214 | |
215 QStringList path = m_paths.at(key).directories; | |
216 | |
217 for (int i = 0; i < path.size(); ++i) { | |
218 m_list->addItem(path[i]); | |
219 } | |
220 | |
221 if (makeCurrent < path.size()) { | |
222 m_list->setCurrentRow(makeCurrent); | |
223 currentLocationChanged(makeCurrent); | |
224 } | |
225 } | |
226 | |
227 void | |
228 PluginPathConfigurator::currentLocationChanged(int i) | |
229 { | |
230 QString label = m_pluginTypeSelector->currentText(); | |
231 PluginPathSetter::TypeKey key = getKeyForLabel(label); | |
232 QStringList path = m_paths.at(key).directories; | |
233 m_up->setEnabled(i > 0); | |
234 m_down->setEnabled(i >= 0 && i + 1 < path.size()); | |
235 m_delete->setEnabled(i >= 0 && i < path.size()); | |
236 m_reset->setEnabled(path != m_defaultPaths.at(key).directories); | |
237 } | |
238 | |
239 void | |
240 PluginPathConfigurator::currentTypeChanged(QString label) | |
241 { | |
242 populateFor(getKeyForLabel(label), -1); | |
243 } | |
244 | |
245 void | |
246 PluginPathConfigurator::envOverrideChanged(int state) | |
247 { | |
248 bool useEnvVariable = (state == Qt::Checked); | |
249 | |
250 QString label = m_pluginTypeSelector->currentText(); | |
251 PluginPathSetter::TypeKey key = getKeyForLabel(label); | |
252 | |
253 auto newEntry = m_paths.at(key); | |
254 newEntry.useEnvVariable = useEnvVariable; | |
255 m_paths[key] = newEntry; | |
256 | |
257 emit pathsChanged(); | |
258 } | |
259 | |
260 void | |
261 PluginPathConfigurator::upClicked() | |
262 { | |
263 QString label = m_pluginTypeSelector->currentText(); | |
264 PluginPathSetter::TypeKey key = getKeyForLabel(label); | |
265 QStringList path = m_paths.at(key).directories; | |
266 | |
267 int current = m_list->currentRow(); | |
268 if (current <= 0) return; | |
269 | |
270 QStringList newPath; | |
271 for (int i = 0; i < path.size(); ++i) { | |
272 if (i + 1 == current) { | |
273 newPath.push_back(path[i+1]); | |
274 newPath.push_back(path[i]); | |
275 ++i; | |
276 } else { | |
277 newPath.push_back(path[i]); | |
278 } | |
279 } | |
280 | |
281 auto newEntry = m_paths.at(key); | |
282 newEntry.directories = newPath; | |
283 m_paths[key] = newEntry; | |
284 | |
285 populateFor(key, current - 1); | |
286 | |
287 emit pathsChanged(); | |
288 } | |
289 | |
290 void | |
291 PluginPathConfigurator::downClicked() | |
292 { | |
293 QString label = m_pluginTypeSelector->currentText(); | |
294 PluginPathSetter::TypeKey key = getKeyForLabel(label); | |
295 QStringList path = m_paths.at(key).directories; | |
296 | |
297 int current = m_list->currentRow(); | |
298 if (current < 0 || current + 1 >= path.size()) return; | |
299 | |
300 QStringList newPath; | |
301 for (int i = 0; i < path.size(); ++i) { | |
302 if (i == current) { | |
303 newPath.push_back(path[i+1]); | |
304 newPath.push_back(path[i]); | |
305 ++i; | |
306 } else { | |
307 newPath.push_back(path[i]); | |
308 } | |
309 } | |
310 | |
311 auto newEntry = m_paths.at(key); | |
312 newEntry.directories = newPath; | |
313 m_paths[key] = newEntry; | |
314 | |
315 populateFor(key, current + 1); | |
316 | |
317 emit pathsChanged(); | |
318 } | |
319 | |
320 void | |
321 PluginPathConfigurator::addClicked() | |
322 { | |
323 QString label = m_pluginTypeSelector->currentText(); | |
324 PluginPathSetter::TypeKey key = getKeyForLabel(label); | |
325 | |
326 QString newDir = QFileDialog::getExistingDirectory | |
327 (this, tr("Choose directory to add")); | |
328 | |
329 if (newDir == QString()) return; | |
330 | |
331 auto newEntry = m_paths.at(key); | |
332 newEntry.directories.push_back(newDir); | |
333 m_paths[key] = newEntry; | |
334 | |
335 populateFor(key, newEntry.directories.size() - 1); | |
336 | |
337 emit pathsChanged(); | |
338 } | |
339 | |
340 void | |
341 PluginPathConfigurator::deleteClicked() | |
342 { | |
343 QString label = m_pluginTypeSelector->currentText(); | |
344 PluginPathSetter::TypeKey key = getKeyForLabel(label); | |
345 QStringList path = m_paths.at(key).directories; | |
346 | |
347 int current = m_list->currentRow(); | |
348 if (current < 0) return; | |
349 | |
350 QStringList newPath; | |
351 for (int i = 0; i < path.size(); ++i) { | |
352 if (i != current) { | |
353 newPath.push_back(path[i]); | |
354 } | |
355 } | |
356 | |
357 auto newEntry = m_paths.at(key); | |
358 newEntry.directories = newPath; | |
359 m_paths[key] = newEntry; | |
360 | |
361 populateFor(key, current < newPath.size() ? current : current-1); | |
362 | |
363 emit pathsChanged(); | |
364 } | |
365 | |
366 void | |
367 PluginPathConfigurator::resetClicked() | |
368 { | |
369 QString label = m_pluginTypeSelector->currentText(); | |
370 PluginPathSetter::TypeKey key = getKeyForLabel(label); | |
371 m_paths[key] = m_defaultPaths[key]; | |
372 populateFor(key, -1); | |
373 | |
374 emit pathsChanged(); | |
375 } | |
376 | |
377 void | |
378 PluginPathConfigurator::seePluginsClicked() | |
379 { | |
380 PluginReviewDialog dialog(this); | |
381 dialog.populate(); | |
382 dialog.exec(); | |
383 } | |
384 |