1 | // SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. |
2 | // |
3 | // SPDX-License-Identifier: GPL-3.0-or-later |
4 | |
5 | #include "binarytoolsconfigview.h" |
6 | #include "binarytoolssetting.h" |
7 | #include "environmentview.h" |
8 | |
9 | #include "common/widget/collapsewidget.h" |
10 | #include "common/util/custompaths.h" |
11 | #include "common/dialog/contextdialog.h" |
12 | |
13 | #include <QComboBox> |
14 | #include <QPushButton> |
15 | #include <QLineEdit> |
16 | #include <QFileDialog> |
17 | #include <QFont> |
18 | #include <QInputDialog> |
19 | #include <qmessagebox.h> |
20 | #include <QGridLayout> |
21 | #include <QLabel> |
22 | #include <QStandardPaths> |
23 | #include <QScrollArea> |
24 | #include <QJsonArray> |
25 | #include <QJsonDocument> |
26 | #include <QJsonObject> |
27 | |
28 | static QString CURRENT_COMMAND = "Current command" ; |
29 | static QString ALL_COMMAND = "All command" ; |
30 | static QString ENVIRONMENT = "Environment" ; |
31 | |
32 | class BinaryToolsConfigViewPrivate |
33 | { |
34 | friend class BinaryToolsConfigView; |
35 | |
36 | QGridLayout *gridLayout = nullptr; |
37 | QWidget *compatConfigWidget = nullptr; |
38 | QComboBox *runComandCombo = nullptr; |
39 | QLineEdit *toolArgsEdit = nullptr; |
40 | QDialog *combinationDialog = nullptr; |
41 | QLabel *commandCombination = nullptr; |
42 | QLabel *nameLabel = nullptr; |
43 | QLabel *commandLabel = nullptr; |
44 | QLineEdit *executableDirEdit = nullptr; |
45 | QLineEdit *workingDirEdit = nullptr; |
46 | EnvironmentView *envView = nullptr; |
47 | QPushButton *addButton = nullptr; |
48 | QPushButton *deleteButton = nullptr; |
49 | QPushButton *renameButton = nullptr; |
50 | QPushButton *combineButton = nullptr; |
51 | QPushButton *useCombinationButton = nullptr; |
52 | BinaryToolsSetting *settings = nullptr; |
53 | QList<QString> programList; |
54 | QList<QStringList> argsList; |
55 | QList<QString> workingDirList; |
56 | QList<QMap<QString, QVariant>> envList; |
57 | }; |
58 | |
59 | BinaryToolsConfigView::BinaryToolsConfigView(QWidget *parent) |
60 | : QWidget(parent) |
61 | , d(new BinaryToolsConfigViewPrivate) |
62 | { |
63 | d->compatConfigWidget = new QWidget(this); |
64 | d->nameLabel = new QLabel(); |
65 | |
66 | d->runComandCombo = new QComboBox(this); |
67 | d->runComandCombo->setMinimumContentsLength(15); |
68 | d->runComandCombo->setSizeAdjustPolicy(QComboBox::AdjustToContents); |
69 | |
70 | d->addButton = new QPushButton(tr("Add" ), this); |
71 | d->deleteButton = new QPushButton(tr("Delete" ), this); |
72 | d->renameButton = new QPushButton(tr("Rename" ), this); |
73 | d->combineButton = new QPushButton(tr("Combine" ), this); |
74 | |
75 | d->gridLayout = new QGridLayout(this); |
76 | d->gridLayout->setSpacing(6); |
77 | d->gridLayout->setContentsMargins(10, 10, 10, 10); |
78 | |
79 | auto configLabel = new QLabel(this); |
80 | configLabel->setText(tr("Binary configuration:" )); |
81 | |
82 | d->gridLayout->addWidget(configLabel, 0, 0, 1, 1); |
83 | d->gridLayout->addWidget(d->runComandCombo, 0, 1, 1, 1); |
84 | d->gridLayout->addWidget(d->addButton, 0, 2, 1, 1); |
85 | d->gridLayout->addWidget(d->deleteButton, 0, 3, 1, 1); |
86 | d->gridLayout->addWidget(d->renameButton, 0, 4, 1, 1); |
87 | d->gridLayout->addWidget(d->combineButton, 0, 5, 1, 1); |
88 | d->gridLayout->addWidget(d->compatConfigWidget, 1, 0, 1, 6); |
89 | |
90 | setConfigWidget(); |
91 | |
92 | d->combinationDialog = new QDialog(this); |
93 | d->commandCombination = new QLabel(tr("command combination:" ), d->combinationDialog); |
94 | d->useCombinationButton = new QPushButton(tr("Use Combination Command" ), d->combinationDialog); |
95 | initializeCombinationDialog(); |
96 | |
97 | if (!d->settings) { |
98 | QString iniPath = CustomPaths::user(CustomPaths::Flags::Configures) + QDir::separator() + QString("binarytools.ini" ); |
99 | bool setDefaultVaule = false; |
100 | if (!QFile::exists(iniPath)) { |
101 | setDefaultVaule = true; |
102 | } |
103 | d->settings = new BinaryToolsSetting(iniPath, this); |
104 | if (setDefaultVaule) { |
105 | initializeCombo(); |
106 | } |
107 | } |
108 | readConfig(); |
109 | |
110 | connect(d->runComandCombo, static_cast<void (QComboBox::*)(const QString &)>(&QComboBox::currentIndexChanged), |
111 | this, &BinaryToolsConfigView::currentConfigChanged); |
112 | |
113 | connect(d->addButton, &QPushButton::clicked, |
114 | this, &BinaryToolsConfigView::addCompatConfig); |
115 | |
116 | connect(d->deleteButton, &QPushButton::clicked, |
117 | this, &BinaryToolsConfigView::deleteCompatConfig); |
118 | |
119 | connect(d->renameButton, &QPushButton::clicked, |
120 | this, &BinaryToolsConfigView::renameCompatConfig); |
121 | |
122 | connect(d->combineButton, &QPushButton::clicked, |
123 | this, &BinaryToolsConfigView::combineCompatConfig); |
124 | } |
125 | |
126 | BinaryToolsConfigView::~BinaryToolsConfigView() |
127 | { |
128 | if (d) |
129 | delete d; |
130 | } |
131 | |
132 | bool BinaryToolsConfigView::saveConfig() |
133 | { |
134 | QString curCommand = d->runComandCombo->currentText(); |
135 | if (curCommand.isEmpty()) |
136 | return false; |
137 | |
138 | if (d->executableDirEdit->text().isEmpty()) { |
139 | QMessageBox msgBox(QMessageBox::Warning, tr("Warning" ), |
140 | tr("Please select working directory." ), |
141 | QMessageBox::Ok, d->compatConfigWidget); |
142 | msgBox.exec(); |
143 | return false; |
144 | } |
145 | |
146 | if (d->toolArgsEdit->text().isEmpty()) |
147 | d->toolArgsEdit->setText("" ); |
148 | QStringList commandList = QStringList() << d->executableDirEdit->text() << d->toolArgsEdit->text() |
149 | << d->nameLabel->text() << d->workingDirEdit->text(); |
150 | |
151 | d->settings->setValue(CURRENT_COMMAND, curCommand); |
152 | d->settings->setValue(curCommand, commandList); |
153 | d->settings->setValue(curCommand + ENVIRONMENT, d->envView->getEnvironment()); |
154 | return true; |
155 | } |
156 | |
157 | void BinaryToolsConfigView::readConfig() |
158 | { |
159 | QStringList allCommand = qvariant_cast<QStringList>(d->settings->getValue(ALL_COMMAND)); |
160 | for (QString command : allCommand) { |
161 | if (d->runComandCombo->findText(command) == -1) |
162 | d->runComandCombo->addItem(command); |
163 | } |
164 | |
165 | QString curCommand = qvariant_cast<QString>(d->settings->getValue(CURRENT_COMMAND, "" )); |
166 | if (curCommand.isEmpty()) |
167 | return; |
168 | int index = d->runComandCombo->findText(curCommand); |
169 | d->runComandCombo->setCurrentIndex(index); |
170 | updateView(curCommand); |
171 | } |
172 | |
173 | QList<QString> BinaryToolsConfigView::getProgramList() |
174 | { |
175 | saveConfig(); |
176 | if (d->programList.isEmpty()) |
177 | d->programList.push_back(d->executableDirEdit->text()); |
178 | return d->programList; |
179 | } |
180 | |
181 | QList<QStringList> BinaryToolsConfigView::getArgumentsList() |
182 | { |
183 | if (d->argsList.isEmpty()) |
184 | d->argsList.push_back(d->toolArgsEdit->text().split(" " )); |
185 | return d->argsList; |
186 | } |
187 | |
188 | QList<QString> BinaryToolsConfigView::getWorkingDirList() |
189 | { |
190 | if (d->workingDirList.isEmpty()) |
191 | d->workingDirList.push_back(d->workingDirEdit->text()); |
192 | return d->workingDirList; |
193 | } |
194 | |
195 | QList<QMap<QString, QVariant>> BinaryToolsConfigView::getEnvironmentList() |
196 | { |
197 | if (d->envList.isEmpty()) |
198 | d->envList.push_back(d->envView->getEnvironment()); |
199 | return d->envList; |
200 | } |
201 | |
202 | void BinaryToolsConfigView::updateView(const QString &command) |
203 | { |
204 | if (command.isEmpty()) { |
205 | d->nameLabel->setText("" ); |
206 | d->commandLabel->setText("" ); |
207 | d->toolArgsEdit->setText("" ); |
208 | d->executableDirEdit->setText("" ); |
209 | d->workingDirEdit->setText("" ); |
210 | d->envView->setValue({}); |
211 | return; |
212 | } |
213 | |
214 | BinaryToolsSetting settings; |
215 | QStringList argList = qvariant_cast<QStringList>(d->settings->getValue(command, "/usr/bin/" + command)); |
216 | if (argList.isEmpty()) |
217 | return; |
218 | d->executableDirEdit->setText(argList.at(0)); |
219 | d->toolArgsEdit->setText(argList.size() > 1 ? argList.at(1) : "" ); |
220 | d->nameLabel->setText(argList.size() > 2 ? argList.at(2) : "" ); |
221 | d->workingDirEdit->setText(argList.size() > 3 ? argList.at(3) : "" ); |
222 | d->commandLabel->setText(d->executableDirEdit->text() + " " + d->toolArgsEdit->text()); |
223 | |
224 | QMap<QString, QVariant> map = qvariant_cast<QMap<QString, QVariant>>(d->settings->getValue(command + ENVIRONMENT)); |
225 | d->envView->setValue(map); |
226 | } |
227 | |
228 | void BinaryToolsConfigView::currentConfigChanged(const QString &text) |
229 | { |
230 | if (d->settings->getValue(CURRENT_COMMAND).toString() == text) |
231 | return; |
232 | |
233 | d->settings->setValue(CURRENT_COMMAND, text); |
234 | updateView(text); |
235 | emit comboChanged(); |
236 | } |
237 | |
238 | void BinaryToolsConfigView::initializeCombo() |
239 | { |
240 | QString fileName = CustomPaths::global(CustomPaths::Flags::Configures) |
241 | + QDir::separator() + QString("binarytool.support" ); |
242 | QFile file(fileName); |
243 | if (file.open(QIODevice::ReadOnly)) { |
244 | QByteArray data = file.readAll(); |
245 | file.close(); |
246 | |
247 | QJsonDocument doc = QJsonDocument::fromJson(data); |
248 | QJsonArray array = doc.array(); |
249 | for (auto node : array) { |
250 | auto obj = node.toObject(); |
251 | QString name = obj.value("name" ).toString(); |
252 | appendCommand(name); |
253 | } |
254 | } |
255 | } |
256 | |
257 | void BinaryToolsConfigView::initializeCombinationDialog() |
258 | { |
259 | QRect parentRect = this->geometry(); |
260 | int parentX = parentRect.x(); |
261 | int parentY = parentRect.y(); |
262 | int parentWidth = parentRect.width(); |
263 | int parentHeight = parentRect.height(); |
264 | QRect dialogRect = d->combinationDialog->geometry(); |
265 | int dialogWidth = dialogRect.width(); |
266 | int dialogHeight = dialogRect.height(); |
267 | int x = parentX + (parentWidth - dialogWidth) / 2; |
268 | int y = parentY + (parentHeight - dialogHeight) / 2; |
269 | setGeometry(x, y, dialogWidth, dialogHeight); |
270 | |
271 | auto gridLayout = new QGridLayout(d->combinationDialog); |
272 | d->combinationDialog->setLayout(gridLayout); |
273 | gridLayout->setSpacing(30); |
274 | gridLayout->setContentsMargins(30, 30, 30, 30); |
275 | gridLayout->addWidget(d->commandCombination, 0, 0, 1, 2); |
276 | gridLayout->addWidget(d->useCombinationButton, 1, 1, 1, 1); |
277 | QObject::connect(d->useCombinationButton, &QPushButton::clicked, [=](){ |
278 | d->combinationDialog->close(); |
279 | emit useCombinationCommand(); |
280 | }); |
281 | } |
282 | |
283 | void BinaryToolsConfigView::addCompatConfig() |
284 | { |
285 | if (!d->runComandCombo->currentText().isEmpty() && !saveConfig()) |
286 | return; |
287 | |
288 | bool ok; |
289 | QString name = QInputDialog::getText(this, tr("Add new command" ), |
290 | tr("New command name:" ), |
291 | QLineEdit::Normal, "" , &ok); |
292 | if (!ok) |
293 | return; |
294 | |
295 | appendCommand(name); |
296 | } |
297 | |
298 | void BinaryToolsConfigView::deleteCompatConfig() |
299 | { |
300 | bool doSave = false, doCancle = false; |
301 | auto ok = [&](bool checked) { |
302 | Q_UNUSED(checked); |
303 | doSave = true; |
304 | }; |
305 | auto no = [&](bool checked) { |
306 | Q_UNUSED(checked); |
307 | doSave = false; |
308 | }; |
309 | auto cancel = [&](bool checked) { |
310 | Q_UNUSED(checked); |
311 | }; |
312 | |
313 | ContextDialog::question(tr("Delete Configuration?" ), |
314 | tr("Do you really want to delete the command <b>%1</b>?" ).arg(d->nameLabel->text()), |
315 | QMessageBox::Question, |
316 | ok, no, cancel); |
317 | if (!doSave || doCancle) |
318 | return; |
319 | |
320 | QStringList allCommand = qvariant_cast<QStringList>(d->settings->getValue(ALL_COMMAND)); |
321 | allCommand.removeOne(d->runComandCombo->currentText()); |
322 | d->settings->setValue(ALL_COMMAND, allCommand); |
323 | d->settings->deleteKey(d->runComandCombo->currentText()); |
324 | d->settings->deleteKey(d->runComandCombo->currentText() + ENVIRONMENT); |
325 | |
326 | int curIndex = d->runComandCombo->currentIndex(); |
327 | d->runComandCombo->removeItem(curIndex); |
328 | d->runComandCombo->setCurrentIndex((curIndex - 1) >= 0 ? curIndex - 1 : 0); |
329 | if (d->runComandCombo->currentText().isEmpty()) |
330 | d->deleteButton->setEnabled(false); |
331 | } |
332 | |
333 | void BinaryToolsConfigView::renameCompatConfig() |
334 | { |
335 | bool ok; |
336 | QString name = QInputDialog::getText(this, tr("Rename..." ), |
337 | tr("New name for command <b>%1</b>:" ). |
338 | arg(d->runComandCombo->currentText()), |
339 | QLineEdit::Normal, |
340 | d->runComandCombo->currentText(), &ok); |
341 | if (!ok) |
342 | return; |
343 | |
344 | if (name == d->runComandCombo->currentText()) |
345 | return; |
346 | |
347 | QString uniName = uniqueName(name); |
348 | if (uniName.isEmpty()) |
349 | return; |
350 | |
351 | QStringList allCommand = qvariant_cast<QStringList>(d->settings->getValue(ALL_COMMAND)); |
352 | int index = allCommand.indexOf(d->runComandCombo->currentText()); |
353 | if (index != -1) { |
354 | allCommand.replace(index, uniName); |
355 | } else { |
356 | allCommand.append(uniName); |
357 | } |
358 | d->settings->setValue(CURRENT_COMMAND, uniName); |
359 | d->settings->setValue(ALL_COMMAND, allCommand); |
360 | d->nameLabel->setText(name); |
361 | QStringList commandList = QStringList() << d->executableDirEdit->text()<< d->toolArgsEdit->text() |
362 | << d->nameLabel->text() << d->workingDirEdit->text(); |
363 | d->settings->setValue(uniName, commandList); |
364 | d->settings->setValue(uniName + ENVIRONMENT, d->envView->getEnvironment()); |
365 | d->settings->deleteKey(d->runComandCombo->currentText()); |
366 | d->settings->deleteKey(d->runComandCombo->currentText() + ENVIRONMENT); |
367 | |
368 | int itemIndex = d->runComandCombo->currentIndex(); |
369 | d->runComandCombo->insertItem(itemIndex + 1, uniName); |
370 | d->runComandCombo->setCurrentText(uniName); |
371 | d->runComandCombo->removeItem(itemIndex); |
372 | } |
373 | |
374 | void BinaryToolsConfigView::combineCompatConfig() |
375 | { |
376 | saveConfig(); |
377 | d->combinationDialog->showNormal(); |
378 | d->programList.push_back(d->executableDirEdit->text()); |
379 | d->argsList.push_back(d->toolArgsEdit->text().split(" " )); |
380 | d->workingDirList.push_back(d->workingDirEdit->text()); |
381 | d->envList.push_back(d->envView->getEnvironment()); |
382 | d->commandCombination->setText(d->commandCombination->text() + " " + d->nameLabel->text()); |
383 | } |
384 | |
385 | void BinaryToolsConfigView::setConfigWidget() |
386 | { |
387 | d->compatConfigWidget->setContentsMargins(0, 0, 0, 0); |
388 | d->compatConfigWidget->setAutoFillBackground(true); |
389 | auto cmdLabel = new QLabel(d->compatConfigWidget); |
390 | QFont ft; |
391 | ft.setBold(true); |
392 | cmdLabel->setFont(ft); |
393 | cmdLabel->setText(tr("Command:" )); |
394 | d->commandLabel = new QLabel(d->compatConfigWidget); |
395 | |
396 | auto argsLabel = new QLabel(d->compatConfigWidget); |
397 | argsLabel->setText(tr("Tool arguments:" )); |
398 | d->toolArgsEdit = new QLineEdit(d->compatConfigWidget); |
399 | d->toolArgsEdit->setPlaceholderText(tr("Input your arguments." )); |
400 | |
401 | auto exeLabel = new QLabel(d->compatConfigWidget); |
402 | exeLabel->setText(tr("Executable:" )); |
403 | d->executableDirEdit = new QLineEdit(d->compatConfigWidget); |
404 | auto browseButton1 = new QPushButton(tr("Browse..." ), d->compatConfigWidget); |
405 | |
406 | auto workLabel = new QLabel(d->compatConfigWidget); |
407 | workLabel->setText(tr("Working directory:" )); |
408 | d->workingDirEdit = new QLineEdit(d->compatConfigWidget); |
409 | auto browseButton2 = new QPushButton(tr("Browse..." ), d->compatConfigWidget); |
410 | |
411 | auto envLabel = new QLabel(d->compatConfigWidget); |
412 | envLabel->setText(tr("Envrioment: Base environment for this command configuration." )); |
413 | auto appendButton = new QPushButton(tr("&Append" ), d->compatConfigWidget); |
414 | auto deleteButton = new QPushButton(tr("&Delete" ), d->compatConfigWidget); |
415 | auto resetButton = new QPushButton(tr("&Reset" ), d->compatConfigWidget); |
416 | deleteButton->setEnabled(false); |
417 | d->envView = new EnvironmentView(); |
418 | d->envView->setFixedHeight(250); |
419 | |
420 | auto gridLayout = new QGridLayout(d->compatConfigWidget); |
421 | gridLayout->setSpacing(5); |
422 | gridLayout->setContentsMargins(5, 5, 5, 5); |
423 | |
424 | gridLayout->addWidget(cmdLabel, 0, 0, 1, 1); |
425 | gridLayout->addWidget(d->commandLabel, 0, 1, 1, 2); |
426 | gridLayout->addWidget(argsLabel, 1, 0, 1, 1); |
427 | gridLayout->addWidget(d->toolArgsEdit, 1, 1, 1, 2); |
428 | gridLayout->addWidget(exeLabel, 2, 0, 1, 1); |
429 | gridLayout->addWidget(d->executableDirEdit, 2, 1, 1, 1); |
430 | gridLayout->addWidget(browseButton1, 2, 2, 1, 1); |
431 | gridLayout->addWidget(workLabel, 3, 0, 1, 1); |
432 | gridLayout->addWidget(d->workingDirEdit, 3, 1, 1, 1); |
433 | gridLayout->addWidget(browseButton2, 3, 2, 1, 1); |
434 | gridLayout->addWidget(envLabel, 4, 0, 1, 3); |
435 | gridLayout->addWidget(appendButton, 5, 0, 1, 1); |
436 | gridLayout->addWidget(deleteButton, 6, 0, 1, 1); |
437 | gridLayout->addWidget(resetButton, 7, 0, 1, 1); |
438 | gridLayout->addWidget(d->envView, 5, 1, 5, 2); |
439 | d->compatConfigWidget->setLayout(gridLayout); |
440 | |
441 | connect(browseButton1, &QPushButton::clicked, [=]() { |
442 | QString dir = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); |
443 | QString filePath = QFileDialog::getOpenFileName(nullptr, tr("Select Executabel Path" ), dir); |
444 | if (filePath.isEmpty() && !QFileInfo(filePath).exists()) |
445 | return; |
446 | d->executableDirEdit->setText(filePath); |
447 | }); |
448 | |
449 | connect(browseButton2, &QPushButton::clicked, [=]() { |
450 | QString dir = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); |
451 | QString filePath = QFileDialog::getExistingDirectory(nullptr, tr("Select Working Directory" ), dir); |
452 | if (filePath.isEmpty() && !QFileInfo(filePath).exists()) |
453 | return; |
454 | d->workingDirEdit->setText(filePath); |
455 | }); |
456 | |
457 | connect(appendButton, &QPushButton::clicked, d->envView, &EnvironmentView::appendRow); |
458 | connect(deleteButton, &QPushButton::clicked, d->envView, &EnvironmentView::deleteRow); |
459 | connect(resetButton, &QPushButton::clicked, d->envView, &EnvironmentView::initModel); |
460 | |
461 | connect(d->toolArgsEdit, &QLineEdit::textChanged, [=](){ |
462 | d->commandLabel->setText(d->executableDirEdit->text() + " " + d->toolArgsEdit->text()); |
463 | }); |
464 | |
465 | connect(d->executableDirEdit, &QLineEdit::textChanged, [=](){ |
466 | d->commandLabel->setText(d->executableDirEdit->text() + " " + d->toolArgsEdit->text()); |
467 | }); |
468 | |
469 | connect(d->envView, &EnvironmentView::deleteSignal, [=](bool enable){ |
470 | deleteButton->setEnabled(enable); |
471 | }); |
472 | |
473 | connect(this, &BinaryToolsConfigView::comboChanged, [=]{ |
474 | deleteButton->setEnabled(false); |
475 | }); |
476 | } |
477 | |
478 | void BinaryToolsConfigView::appendCommand(const QString &name) |
479 | { |
480 | QString uniName = uniqueName(name); |
481 | if (uniName.isEmpty()) |
482 | return; |
483 | |
484 | QStringList allCommand = qvariant_cast<QStringList>(d->settings->getValue(ALL_COMMAND)); |
485 | allCommand.append(uniName); |
486 | d->settings->setValue(CURRENT_COMMAND, uniName); |
487 | d->settings->setValue(ALL_COMMAND, allCommand); |
488 | |
489 | d->nameLabel->setText(name); |
490 | d->toolArgsEdit->setText("" ); |
491 | d->executableDirEdit->setText("/usr/bin/" + name); |
492 | d->workingDirEdit->setText(QStandardPaths::writableLocation(QStandardPaths::HomeLocation)); |
493 | d->envView->initModel(); |
494 | QStringList commandList = QStringList() << d->executableDirEdit->text()<< d->toolArgsEdit->text() |
495 | << d->nameLabel->text() << d->workingDirEdit->text(); |
496 | d->settings->setValue(uniName, commandList); |
497 | d->settings->setValue(uniName + ENVIRONMENT, d->envView->getEnvironment()); |
498 | |
499 | //call currentConfigChanged() |
500 | d->runComandCombo->addItem(uniName); |
501 | d->runComandCombo->setCurrentText(uniName); |
502 | d->deleteButton->setEnabled(true); |
503 | } |
504 | |
505 | QString BinaryToolsConfigView::uniqueName(const QString &name) |
506 | { |
507 | QString result = name.trimmed(); |
508 | if (!result.isEmpty()) { |
509 | if (d->runComandCombo->findText(result) == -1) |
510 | return result; |
511 | int i = 2; |
512 | |
513 | QString tryName = result + QString::number(i); |
514 | while (d->runComandCombo->findText(tryName) != -1) { |
515 | tryName = result + QString::number(++i); |
516 | } |
517 | return tryName; |
518 | } |
519 | return result; |
520 | } |
521 | |