Browse Source
qt/applets: Provide Qt frontend implementation of software keyboard
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.nce_cpp
3 changed files with 171 additions and 0 deletions
-
2src/yuzu/CMakeLists.txt
-
107src/yuzu/applets/software_keyboard.cpp
-
62src/yuzu/applets/software_keyboard.h
@ -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; |
|||
}; |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue