| | |
| | |
| |
|
| | #include <QDialogButtonBox> |
| | #include <QLabel> |
| | #include <QLineEdit> |
| | #include <QPushButton> |
| | #include <QVBoxLayout> |
| | #include "yuzu/util/limitable_input_dialog.h" |
| |
|
| | LimitableInputDialog::LimitableInputDialog(QWidget* parent) : QDialog{parent} { |
| | CreateUI(); |
| | ConnectEvents(); |
| | } |
| |
|
| | LimitableInputDialog::~LimitableInputDialog() = default; |
| |
|
| | 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); |
| | } |
| |
|
| | void LimitableInputDialog::ConnectEvents() { |
| | connect(buttons, &QDialogButtonBox::accepted, this, &QDialog::accept); |
| | connect(buttons, &QDialogButtonBox::rejected, this, &QDialog::reject); |
| | } |
| |
|
| | QString LimitableInputDialog::GetText(QWidget* parent, const QString& title, const QString& text, |
| | 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, [&] { |
| | if (!dialog.invalid_characters.isEmpty()) { |
| | dialog.RemoveInvalidCharacters(); |
| | } |
| | ok_button->setEnabled(dialog.text_entry->text().length() >= min_character_limit); |
| | }); |
| |
|
| | if (dialog.exec() != QDialog::Accepted) { |
| | return {}; |
| | } |
| |
|
| | 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); |
| | } |
| |
|