From 058196a0892cdc96dc78e39f638a4f2062474b26 Mon Sep 17 00:00:00 2001 From: Kewlan Date: Fri, 4 Jun 2021 12:24:18 +0200 Subject: limitable_input_dialog: Implement character limiter When using GetText() you can now choose what set of characters the user can't enter. --- src/yuzu/configuration/configure_input_player.cpp | 3 +- src/yuzu/util/limitable_input_dialog.cpp | 38 +++++++++++++++++++++-- src/yuzu/util/limitable_input_dialog.h | 12 ++++++- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index ab3512810..d5d624b96 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -1395,7 +1395,8 @@ void ConfigureInputPlayer::keyPressEvent(QKeyEvent* event) { void ConfigureInputPlayer::CreateProfile() { const auto profile_name = - LimitableInputDialog::GetText(this, tr("New Profile"), tr("Enter a profile name:"), 1, 20); + LimitableInputDialog::GetText(this, tr("New Profile"), tr("Enter a profile name:"), 1, 20, + LimitableInputDialog::InputLimiter::Filesystem); if (profile_name.isEmpty()) { return; diff --git a/src/yuzu/util/limitable_input_dialog.cpp b/src/yuzu/util/limitable_input_dialog.cpp index edd78e579..6fea41f95 100644 --- a/src/yuzu/util/limitable_input_dialog.cpp +++ b/src/yuzu/util/limitable_input_dialog.cpp @@ -21,11 +21,13 @@ void LimitableInputDialog::CreateUI() { text_label = new QLabel(this); text_entry = new QLineEdit(this); + text_label_invalid = new QLabel(this); buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); auto* const layout = new QVBoxLayout; layout->addWidget(text_label); layout->addWidget(text_entry); + layout->addWidget(text_label_invalid); layout->addWidget(buttons); setLayout(layout); @@ -37,18 +39,36 @@ void LimitableInputDialog::ConnectEvents() { } QString LimitableInputDialog::GetText(QWidget* parent, const QString& title, const QString& text, - int min_character_limit, int max_character_limit) { + int min_character_limit, int max_character_limit, + InputLimiter limit_type) { Q_ASSERT(min_character_limit <= max_character_limit); LimitableInputDialog dialog{parent}; dialog.setWindowTitle(title); dialog.text_label->setText(text); dialog.text_entry->setMaxLength(max_character_limit); + dialog.text_label_invalid->show(); + + switch (limit_type) { + case InputLimiter::Filesystem: + dialog.invalid_characters = QStringLiteral("<>:;\"/\\|,.!?*"); + break; + default: + dialog.invalid_characters.clear(); + dialog.text_label_invalid->hide(); + break; + } + dialog.text_label_invalid->setText( + tr("The text can't contain any of the following characters:\n%1") + .arg(dialog.invalid_characters)); auto* const ok_button = dialog.buttons->button(QDialogButtonBox::Ok); ok_button->setEnabled(false); - connect(dialog.text_entry, &QLineEdit::textEdited, [&](const QString& new_text) { - ok_button->setEnabled(new_text.length() >= min_character_limit); + connect(dialog.text_entry, &QLineEdit::textEdited, [&] { + if (!dialog.invalid_characters.isEmpty()) { + dialog.RemoveInvalidCharacters(); + } + ok_button->setEnabled(dialog.text_entry->text().length() >= min_character_limit); }); if (dialog.exec() != QDialog::Accepted) { @@ -57,3 +77,15 @@ QString LimitableInputDialog::GetText(QWidget* parent, const QString& title, con return dialog.text_entry->text(); } + +void LimitableInputDialog::RemoveInvalidCharacters() { + auto cpos = text_entry->cursorPosition(); + for (int i = 0; i < text_entry->text().length(); i++) { + if (invalid_characters.contains(text_entry->text().at(i))) { + text_entry->setText(text_entry->text().remove(i, 1)); + i--; + cpos--; + } + } + text_entry->setCursorPosition(cpos); +} diff --git a/src/yuzu/util/limitable_input_dialog.h b/src/yuzu/util/limitable_input_dialog.h index 164ad7301..a8e31098b 100644 --- a/src/yuzu/util/limitable_input_dialog.h +++ b/src/yuzu/util/limitable_input_dialog.h @@ -18,14 +18,24 @@ public: explicit LimitableInputDialog(QWidget* parent = nullptr); ~LimitableInputDialog() override; + enum class InputLimiter { + None, + Filesystem, + }; + static QString GetText(QWidget* parent, const QString& title, const QString& text, - int min_character_limit, int max_character_limit); + int min_character_limit, int max_character_limit, + InputLimiter limit_type = InputLimiter::None); private: void CreateUI(); void ConnectEvents(); + void RemoveInvalidCharacters(); + QString invalid_characters; + QLabel* text_label; QLineEdit* text_entry; + QLabel* text_label_invalid; QDialogButtonBox* buttons; }; -- cgit v1.2.3