software_keyboard: Make GetText asynchronous

a
This commit is contained in:
Zach Hilman
2018-11-12 11:08:09 -05:00
parent 7cfb29de23
commit 8b433beff3
9 changed files with 64 additions and 29 deletions

View File

@@ -105,20 +105,27 @@ bool QtSoftwareKeyboardDialog::GetStatus() const {
return ok;
}
QtSoftwareKeyboard::QtSoftwareKeyboard(GMainWindow& parent) : main_window(parent) {}
QtSoftwareKeyboard::QtSoftwareKeyboard(GMainWindow& main_window) {
connect(this, &QtSoftwareKeyboard::MainWindowGetText, &main_window,
&GMainWindow::SoftwareKeyboardGetText, Qt::QueuedConnection);
connect(this, &QtSoftwareKeyboard::MainWindowTextCheckDialog, &main_window,
&GMainWindow::SoftwareKeyboardInvokeCheckDialog, Qt::BlockingQueuedConnection);
connect(&main_window, &GMainWindow::SoftwareKeyboardFinishedText, this,
&QtSoftwareKeyboard::MainWindowFinishedText, Qt::QueuedConnection);
}
QtSoftwareKeyboard::~QtSoftwareKeyboard() = default;
std::optional<std::u16string> QtSoftwareKeyboard::GetText(
Core::Frontend::SoftwareKeyboardParameters parameters) const {
std::optional<std::u16string> success;
QMetaObject::invokeMethod(&main_window, "SoftwareKeyboardGetText", Qt::BlockingQueuedConnection,
Q_RETURN_ARG(std::optional<std::u16string>, success),
Q_ARG(Core::Frontend::SoftwareKeyboardParameters, parameters));
return success;
void QtSoftwareKeyboard::RequestText(std::function<void(std::optional<std::u16string>)> out,
Core::Frontend::SoftwareKeyboardParameters parameters) const {
text_output = out;
emit MainWindowGetText(parameters);
}
void QtSoftwareKeyboard::SendTextCheckDialog(std::u16string error_message) const {
QMetaObject::invokeMethod(&main_window, "SoftwareKeyboardInvokeCheckDialog",
Qt::BlockingQueuedConnection, Q_ARG(std::u16string, error_message));
emit MainWindowTextCheckDialog(error_message);
}
void QtSoftwareKeyboard::MainWindowFinishedText(std::optional<std::u16string> text) {
text_output(text);
}

View File

@@ -54,14 +54,23 @@ private:
};
class QtSoftwareKeyboard final : public QObject, public Core::Frontend::SoftwareKeyboardApplet {
Q_OBJECT
public:
explicit QtSoftwareKeyboard(GMainWindow& parent);
~QtSoftwareKeyboard() override;
std::optional<std::u16string> GetText(
Core::Frontend::SoftwareKeyboardParameters parameters) const override;
void RequestText(std::function<void(std::optional<std::u16string>)> out,
Core::Frontend::SoftwareKeyboardParameters parameters) const override;
void SendTextCheckDialog(std::u16string error_message) const override;
signals:
void MainWindowGetText(Core::Frontend::SoftwareKeyboardParameters parameters) const;
void MainWindowTextCheckDialog(std::u16string error_message) const;
public slots:
void MainWindowFinishedText(std::optional<std::u16string> text);
private:
GMainWindow& main_window;
mutable std::function<void(std::optional<std::u16string>)> text_output;
};

View File

@@ -207,7 +207,7 @@ GMainWindow::~GMainWindow() {
delete render_window;
}
std::optional<std::u16string> GMainWindow::SoftwareKeyboardGetText(
void GMainWindow::SoftwareKeyboardGetText(
const Core::Frontend::SoftwareKeyboardParameters& parameters) {
QtSoftwareKeyboardDialog dialog(this, parameters);
dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |
@@ -216,9 +216,9 @@ std::optional<std::u16string> GMainWindow::SoftwareKeyboardGetText(
dialog.exec();
if (!dialog.GetStatus())
return std::nullopt;
emit SoftwareKeyboardFinishedText(std::nullopt);
return dialog.GetText();
emit SoftwareKeyboardFinishedText(dialog.GetText());
}
void GMainWindow::SoftwareKeyboardInvokeCheckDialog(std::u16string error_message) {

View File

@@ -99,9 +99,10 @@ signals:
// Signal that tells widgets to update icons to use the current theme
void UpdateThemedIcons();
void SoftwareKeyboardFinishedText(std::optional<std::u16string> text);
public slots:
std::optional<std::u16string> SoftwareKeyboardGetText(
const Core::Frontend::SoftwareKeyboardParameters& parameters);
void SoftwareKeyboardGetText(const Core::Frontend::SoftwareKeyboardParameters& parameters);
void SoftwareKeyboardInvokeCheckDialog(std::u16string error_message);
private: