Don't pass Python Future objects to QML

Returning a Future doesn't work on Windows for some reason
(https://github.com/thp/pyotherside/issues/116).

Instead of using these objects from QML to cancel running coroutines,
call a Python QMLBridge function that takes a coroutine UUID and will
take care of the cancelling.
This commit is contained in:
miruka
2020-09-28 23:06:50 -04:00
parent 53d2ab17af
commit ee1091b4dc
20 changed files with 161 additions and 178 deletions

View File

@@ -21,26 +21,26 @@ HBox {
property var saveProperties: ["acceptedUserUrl", "knownHttps"]
property string loadingIconStep: "server-ping-bad"
property Future connectFuture: null
property Future fetchServersFuture: null
property string connectFutureId: ""
property string fetchServersFutureId: ""
signal accepted()
function takeFocus() { serverField.item.field.forceActiveFocus() }
function fetchServers() {
if (fetchServersFuture) fetchServersFuture.cancel()
if (fetchServersFutureId) py.cancelCoro(fetchServersFutureId)
fetchServersFuture = py.callCoro("fetch_homeservers", [], () => {
fetchServersFuture = null
fetchServersFutureId = py.callCoro("fetch_homeservers", [], () => {
fetchServersFutureId = ""
}, (type, args, error, traceback) => {
fetchServersFuture = null
fetchServersFutureId = ""
print( traceback) // TODO: display error graphically
})
}
function connect() {
if (connectFuture) connectFuture.cancel()
if (connectFutureId) py.cancelCoro(connectFutureId)
connectTimeout.restart()
const typedUrl = serverField.item.field.cleanText
@@ -49,10 +49,10 @@ HBox {
if (box.knownHttps)
args[0] = args[0].replace(/^(https?:\/\/)?/, "https://")
connectFuture = py.callCoro("server_info", args, ([url, flows]) => {
connectFutureId = py.callCoro("server_info", args, ([url, flows]) => {
connectTimeout.stop()
serverField.errorLabel.text = ""
connectFuture = null
connectFutureId = ""
if (! (
flows.includes("m.login.password") ||
@@ -75,7 +75,7 @@ HBox {
console.error(traceback)
connectTimeout.stop()
connectFuture = null
connectFutureId = ""
let text = qsTr("Unexpected error: %1 [%2]").arg(type).arg(args)
@@ -194,7 +194,7 @@ HBox {
enabled: field.cleanText && ! field.error
icon.name: "server-connect-to-address"
icon.color: theme.colors.positiveBackground
loading: box.connectFuture !== null
loading: box.connectFutureId !== ""
disableWhileLoading: false
onClicked: box.connect()
@@ -209,7 +209,7 @@ HBox {
onAccepted: window.saveState(this)
Component.onDestruction:
if (fetchServersFuture) fetchServersFuture.cancel()
if (fetchServersFutureId) py.cancelCoro(fetchServersFutureId)
Timer {
id: connectTimeout
@@ -230,7 +230,7 @@ HBox {
Timer {
interval: 1000
running:
fetchServersFuture === null &&
fetchServersFutureId === "" &&
ModelStore.get("homeservers").count === 0
repeat: true
@@ -292,7 +292,7 @@ HBox {
height: width
source: "../../Base/HBusyIndicator.qml"
active: box.fetchServersFuture && ! serverList.count
active: box.fetchServersFutureId && ! serverList.count
opacity: active ? 1 : 0
Behavior on opacity { HNumberAnimation { factor: 2 } }

View File

@@ -14,7 +14,7 @@ HFlickableColumnPage {
property string serverUrl
property string displayUrl: serverUrl
property var loginFuture: null
property string loginFutureId: null
readonly property int security:
serverUrl.startsWith("https://") ?
@@ -35,8 +35,8 @@ HFlickableColumnPage {
signal exitRequested()
function finishSignIn(receivedUserId) {
errorMessage.text = ""
page.loginFuture = null
errorMessage.text = ""
page.loginFutureId = ""
py.callCoro(
rememberAccount.checked ?
@@ -53,13 +53,13 @@ HFlickableColumnPage {
}
function cancel() {
if (! page.loginFuture) {
if (! page.loginFutureId) {
page.exitRequested()
return
}
page.loginFuture.cancel()
page.loginFuture = null
py.cancelCoro(page.loginFutureId)
page.loginFutureId = ""
}
@@ -72,7 +72,7 @@ HFlickableColumnPage {
text: qsTr("Sign in")
icon.name: "sign-in"
loading: page.loginFuture !== null
loading: page.loginFutureId !== ""
disableWhileLoading: false
}
@@ -83,7 +83,7 @@ HFlickableColumnPage {
onKeyboardAccept: if (applyButton.enabled) applyButton.clicked()
onKeyboardCancel: page.cancel()
Component.onDestruction: if (loginFuture) loginFuture.cancel()
Component.onDestruction: if (loginFutureId) py.cancelCoro(loginFutureId)
HButton {
icon.name: "sign-in-" + (

View File

@@ -12,17 +12,17 @@ SignInBase {
function takeFocus() { idField.item.forceActiveFocus() }
function signIn() {
if (page.loginFuture) page.loginFuture.cancel()
if (page.loginFutureId) page.loginFutureId = ""
errorMessage.text = ""
page.loginFuture = py.callCoro(
page.loginFutureId = py.callCoro(
"password_auth",
[idField.item.text.trim(), passField.item.text, page.serverUrl],
page.finishSignIn,
(type, args, error, traceback, uuid) => {
page.loginFuture = null
page.loginFutureId = ""
let txt = qsTr(
"Invalid request, login type or unknown error: %1",

View File

@@ -14,23 +14,23 @@ SignInBase {
function startSignIn() {
errorMessage.text = ""
page.loginFuture = py.callCoro("start_sso_auth", [serverUrl], url => {
page.loginFutureId = py.callCoro("start_sso_auth",[serverUrl], url => {
urlArea.text = url
urlArea.cursorPosition = 0
Qt.openUrlExternally(url)
page.loginFuture = py.callCoro("continue_sso_auth", [], userId => {
page.loginFuture = null
page.loginFutureId = py.callCoro("continue_sso_auth",[],userId => {
page.loginFutureId = ""
page.finishSignIn(userId)
})
})
}
function cancel() {
if (loginFuture) {
page.loginFuture.cancel()
page.loginFuture = null
if (loginFutureId) {
py.cancelCoro(page.loginFutureId)
page.loginFutureId = ""
}
page.exitRequested()