| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include <QMessageBox> |
| | #include <QPushButton> |
| | #include <QRegularExpression> |
| | #include <QRegularExpressionMatch> |
| |
|
| | #include "Dialogs/DlgCreateNewPreferencePackImp.h" |
| | #include "ui_DlgCreateNewPreferencePack.h" |
| |
|
| | #include "FileDialog.h" |
| |
|
| | using namespace Gui::Dialog; |
| |
|
| | const auto TemplateRole = Qt::UserRole; |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | DlgCreateNewPreferencePackImp::DlgCreateNewPreferencePackImp(QWidget* parent) |
| | : QDialog(parent) |
| | , ui(new Ui_DlgCreateNewPreferencePack) |
| | { |
| | ui->setupUi(this); |
| |
|
| | QRegularExpression validNames(QStringLiteral(R"([^/\\?%*:|"<>]+)")); |
| | _nameValidator.setRegularExpression(validNames); |
| | ui->lineEdit->setValidator(&_nameValidator); |
| | ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); |
| | connect(ui->treeWidget, &QTreeWidget::itemChanged, this, &DlgCreateNewPreferencePackImp::onItemChanged); |
| | connect( |
| | ui->lineEdit, |
| | &QLineEdit::textEdited, |
| | this, |
| | &DlgCreateNewPreferencePackImp::onLineEditTextEdited |
| | ); |
| | connect( |
| | ui->pushButton, |
| | &QPushButton::clicked, |
| | this, |
| | &DlgCreateNewPreferencePackImp::onBrowseButtonClicked |
| | ); |
| | } |
| |
|
| |
|
| | DlgCreateNewPreferencePackImp::~DlgCreateNewPreferencePackImp() = default; |
| |
|
| | void DlgCreateNewPreferencePackImp::setPreferencePackTemplates( |
| | const std::vector<Gui::PreferencePackManager::TemplateFile>& availableTemplates |
| | ) |
| | { |
| | ui->treeWidget->clear(); |
| | _groups.clear(); |
| |
|
| | ui->treeWidget->header()->setDefaultSectionSize(250); |
| |
|
| | _templates = availableTemplates; |
| | for (const auto& t : _templates) { |
| |
|
| | QTreeWidgetItem* group; |
| | if (auto foundGroup = _groups.find(t.group); foundGroup != _groups.end()) { |
| | group = foundGroup->second; |
| | } |
| | else { |
| | group = new QTreeWidgetItem(ui->treeWidget, QStringList(QString::fromStdString(t.group))); |
| | group->setCheckState(0, Qt::Checked); |
| | group->setExpanded(true); |
| | _groups.insert(std::make_pair(t.group, group)); |
| | } |
| |
|
| | QStringList itemColumns; |
| | itemColumns.push_back(QString::fromStdString(t.name)); |
| | auto newItem = new QTreeWidgetItem(group, itemColumns); |
| | newItem->setCheckState(0, Qt::Checked); |
| | if (group->checkState(0) != newItem->checkState(0)) { |
| | group->setCheckState(0, Qt::PartiallyChecked); |
| | } |
| | newItem->setData(0, TemplateRole, QVariant::fromValue(t)); |
| | group->addChild(newItem); |
| | } |
| | } |
| |
|
| | void Gui::Dialog::DlgCreateNewPreferencePackImp::setPreferencePackNames( |
| | const std::vector<std::string>& usedNames |
| | ) |
| | { |
| | _existingPackNames = usedNames; |
| | } |
| |
|
| | std::vector<Gui::PreferencePackManager::TemplateFile> DlgCreateNewPreferencePackImp::selectedTemplates() const |
| | { |
| | std::vector<Gui::PreferencePackManager::TemplateFile> results; |
| |
|
| | for (const auto& group : _groups) { |
| | for (int childIndex = 0; childIndex < group.second->childCount(); ++childIndex) { |
| | if (auto child = group.second->child(childIndex); child->checkState(0) == Qt::Checked) { |
| | if (child->data(0, TemplateRole).canConvert<Gui::PreferencePackManager::TemplateFile>()) { |
| | results.push_back( |
| | child->data(0, TemplateRole).value<Gui::PreferencePackManager::TemplateFile>() |
| | ); |
| | } |
| | } |
| | } |
| | } |
| |
|
| | return results; |
| | } |
| |
|
| | std::string DlgCreateNewPreferencePackImp::preferencePackName() const |
| | { |
| | return ui->lineEdit->text().toStdString(); |
| | } |
| |
|
| | std::string Gui::Dialog::DlgCreateNewPreferencePackImp::preferencePackDirectory() const |
| | { |
| | return _cfgFileDirectory.toStdString(); |
| | } |
| |
|
| | void DlgCreateNewPreferencePackImp::onItemChanged(QTreeWidgetItem* item, int column) |
| | { |
| | Q_UNUSED(column); |
| | const QSignalBlocker blocker(ui->treeWidget); |
| | if (auto group = item->parent(); group) { |
| | |
| | bool firstItemChecked = false; |
| | for (int childIndex = 0; childIndex < group->childCount(); ++childIndex) { |
| | auto child = group->child(childIndex); |
| | if (childIndex == 0) { |
| | firstItemChecked = child->checkState(0) == Qt::Checked; |
| | } |
| | else { |
| | bool thisItemChecked = child->checkState(0) == Qt::Checked; |
| | if (firstItemChecked != thisItemChecked) { |
| | group->setCheckState(0, Qt::PartiallyChecked); |
| | return; |
| | } |
| | } |
| | } |
| | group->setCheckState(0, firstItemChecked ? Qt::Checked : Qt::Unchecked); |
| | } |
| | else { |
| | |
| | auto groupCheckState = item->checkState(0); |
| | for (int childIndex = 0; childIndex < item->childCount(); ++childIndex) { |
| | auto child = item->child(childIndex); |
| | child->setCheckState(0, groupCheckState); |
| | } |
| | } |
| | } |
| |
|
| | void DlgCreateNewPreferencePackImp::onLineEditTextEdited(const QString& text) |
| | { |
| | ui->buttonBox->button(QDialogButtonBox::Ok)->setDisabled(text.isEmpty()); |
| | } |
| |
|
| | void DlgCreateNewPreferencePackImp::onBrowseButtonClicked() |
| | { |
| | _cfgFileDirectory |
| | = FileDialog::getExistingDirectory(this, tr("Export configuration"), _cfgFileDirectory); |
| | } |
| |
|
| | void Gui::Dialog::DlgCreateNewPreferencePackImp::accept() |
| | { |
| | |
| | |
| | if (const auto chosenName = ui->lineEdit->text().toStdString(); |
| | std::ranges::find(_existingPackNames, chosenName) != _existingPackNames.end()) { |
| | const auto result = QMessageBox::warning( |
| | this, |
| | tr("Pack already exists"), |
| | tr("A preference pack with that name already exists. Overwrite it?"), |
| | QMessageBox::Yes | QMessageBox::Cancel |
| | ); |
| | if (result == QMessageBox::Cancel) { |
| | return; |
| | } |
| | } |
| | QDialog::accept(); |
| | } |
| |
|
| |
|
| | #include "moc_DlgCreateNewPreferencePackImp.cpp" |
| |
|