qt/applets: Provide Qt frontend implementation of software keyboard
Implements all of the features of the keyboard, including length, default text, character validation, and UTF-16 character support.master
parent
de16c1e453
commit
5454494adb
@ -0,0 +1,107 @@
|
|||||||
|
// Copyright 2018 yuzu Emulator Project
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include <locale>
|
||||||
|
#include <QDialogButtonBox>
|
||||||
|
#include <QFont>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include "common/logging/backend.h"
|
||||||
|
#include "yuzu/applets/software_keyboard.h"
|
||||||
|
|
||||||
|
QtSoftwareKeyboardValidator::QtSoftwareKeyboardValidator(
|
||||||
|
Frontend::SoftwareKeyboardApplet::Parameters parameters)
|
||||||
|
: parameters(std::move(parameters)) {}
|
||||||
|
|
||||||
|
QValidator::State QtSoftwareKeyboardValidator::validate(QString& input, int&) const {
|
||||||
|
if (input.size() > parameters.max_length)
|
||||||
|
return Invalid;
|
||||||
|
if (parameters.disable_space && input.contains(' '))
|
||||||
|
return Invalid;
|
||||||
|
if (parameters.disable_address && input.contains('@'))
|
||||||
|
return Invalid;
|
||||||
|
if (parameters.disable_percent && input.contains('%'))
|
||||||
|
return Invalid;
|
||||||
|
if (parameters.disable_slash && (input.contains('/') || input.contains('\\')))
|
||||||
|
return Invalid;
|
||||||
|
if (parameters.disable_number &&
|
||||||
|
std::any_of(input.begin(), input.end(), [](QChar c) { return c.isDigit(); }))
|
||||||
|
return Invalid;
|
||||||
|
|
||||||
|
if (parameters.disable_download_code &&
|
||||||
|
std::any_of(input.begin(), input.end(), [](QChar c) { return c == 'O' || c == 'I'; }))
|
||||||
|
return Invalid;
|
||||||
|
|
||||||
|
return Acceptable;
|
||||||
|
}
|
||||||
|
|
||||||
|
QtSoftwareKeyboardDialog::QtSoftwareKeyboardDialog(
|
||||||
|
QWidget* parent, Frontend::SoftwareKeyboardApplet::Parameters parameters_)
|
||||||
|
: QDialog(parent), parameters(std::move(parameters_)) {
|
||||||
|
layout = new QVBoxLayout;
|
||||||
|
|
||||||
|
header_label = new QLabel(QString::fromStdU16String(parameters.header_text));
|
||||||
|
header_label->setFont({header_label->font().family(), 12, QFont::Bold});
|
||||||
|
if (header_label->text().isEmpty())
|
||||||
|
header_label->setText(tr("Enter text:"));
|
||||||
|
|
||||||
|
sub_label = new QLabel(QString::fromStdU16String(parameters.sub_text));
|
||||||
|
sub_label->setFont({sub_label->font().family(), sub_label->font().pointSize(),
|
||||||
|
sub_label->font().weight(), true});
|
||||||
|
sub_label->setHidden(parameters.sub_text.empty());
|
||||||
|
|
||||||
|
guide_label = new QLabel(QString::fromStdU16String(parameters.guide_text));
|
||||||
|
guide_label->setHidden(parameters.guide_text.empty());
|
||||||
|
|
||||||
|
line_edit = new QLineEdit;
|
||||||
|
line_edit->setValidator(new QtSoftwareKeyboardValidator(parameters));
|
||||||
|
line_edit->setMaxLength(static_cast<int>(parameters.max_length));
|
||||||
|
line_edit->setText(QString::fromStdU16String(parameters.initial_text));
|
||||||
|
line_edit->setCursorPosition(
|
||||||
|
parameters.cursor_at_beginning ? 0 : static_cast<int>(parameters.initial_text.size()));
|
||||||
|
line_edit->setEchoMode(parameters.password ? QLineEdit::Password : QLineEdit::Normal);
|
||||||
|
|
||||||
|
buttons = new QDialogButtonBox;
|
||||||
|
buttons->addButton(tr("Cancel"), QDialogButtonBox::RejectRole);
|
||||||
|
buttons->addButton(parameters.submit_text.empty()
|
||||||
|
? tr("OK")
|
||||||
|
: QString::fromStdU16String(parameters.submit_text),
|
||||||
|
QDialogButtonBox::AcceptRole);
|
||||||
|
|
||||||
|
connect(buttons, &QDialogButtonBox::accepted, this, &QtSoftwareKeyboardDialog::Submit);
|
||||||
|
connect(buttons, &QDialogButtonBox::rejected, this, &QtSoftwareKeyboardDialog::Reject);
|
||||||
|
layout->addWidget(header_label);
|
||||||
|
layout->addWidget(sub_label);
|
||||||
|
layout->addWidget(guide_label);
|
||||||
|
layout->addWidget(line_edit);
|
||||||
|
layout->addWidget(buttons);
|
||||||
|
setLayout(layout);
|
||||||
|
setWindowTitle("Software Keyboard");
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtSoftwareKeyboardDialog::Submit() {
|
||||||
|
ok = true;
|
||||||
|
text = line_edit->text().toStdU16String();
|
||||||
|
accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QtSoftwareKeyboardDialog::Reject() {
|
||||||
|
ok = false;
|
||||||
|
text = Common::UTF8ToUTF16("");
|
||||||
|
accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
QtSoftwareKeyboard::QtSoftwareKeyboard(QWidget& parent) : parent(parent) {}
|
||||||
|
|
||||||
|
bool QtSoftwareKeyboard::GetText(Parameters parameters, std::u16string& text) {
|
||||||
|
QtSoftwareKeyboardDialog dialog(&parent, parameters);
|
||||||
|
dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |
|
||||||
|
Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint);
|
||||||
|
dialog.setWindowModality(Qt::WindowModal);
|
||||||
|
dialog.exec();
|
||||||
|
|
||||||
|
text = dialog.text;
|
||||||
|
return dialog.ok;
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
// Copyright 2018 yuzu Emulator Project
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QValidator>
|
||||||
|
#include "common/assert.h"
|
||||||
|
#include "core/frontend/applets/software_keyboard.h"
|
||||||
|
|
||||||
|
class QDialogButtonBox;
|
||||||
|
class QLabel;
|
||||||
|
class QLineEdit;
|
||||||
|
class QVBoxLayout;
|
||||||
|
class QtSoftwareKeyboard;
|
||||||
|
|
||||||
|
class QtSoftwareKeyboardValidator final : public QValidator {
|
||||||
|
public:
|
||||||
|
explicit QtSoftwareKeyboardValidator(Frontend::SoftwareKeyboardApplet::Parameters parameters);
|
||||||
|
State validate(QString&, int&) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Frontend::SoftwareKeyboardApplet::Parameters parameters;
|
||||||
|
};
|
||||||
|
|
||||||
|
class QtSoftwareKeyboardDialog final : public QDialog {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
QtSoftwareKeyboardDialog(QWidget* parent,
|
||||||
|
Frontend::SoftwareKeyboardApplet::Parameters parameters);
|
||||||
|
void Submit();
|
||||||
|
void Reject();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool ok = false;
|
||||||
|
std::u16string text;
|
||||||
|
|
||||||
|
QDialogButtonBox* buttons;
|
||||||
|
QLabel* header_label;
|
||||||
|
QLabel* sub_label;
|
||||||
|
QLabel* guide_label;
|
||||||
|
QLineEdit* line_edit;
|
||||||
|
QVBoxLayout* layout;
|
||||||
|
|
||||||
|
Frontend::SoftwareKeyboardApplet::Parameters parameters;
|
||||||
|
|
||||||
|
friend class QtSoftwareKeyboard;
|
||||||
|
};
|
||||||
|
|
||||||
|
class QtSoftwareKeyboard final : public QObject, public Frontend::SoftwareKeyboardApplet {
|
||||||
|
public:
|
||||||
|
explicit QtSoftwareKeyboard(QWidget& parent);
|
||||||
|
bool GetText(Parameters parameters, std::u16string& text) override;
|
||||||
|
|
||||||
|
~QtSoftwareKeyboard() {
|
||||||
|
UNREACHABLE();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
QWidget& parent;
|
||||||
|
};
|
Loading…
Reference in New Issue