From 98049d1507a6f2ae232782fd79f4f753ad53eead Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Tue, 6 Jul 2021 20:02:31 +0200 Subject: Fix copyright headers --- src/main_qmladaptor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 8a54eb3..731efaf 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -1,8 +1,8 @@ /* * This file is part of Remote Support Desktop * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp - * Copyright 2020-2021 Daniel Teichmann - * Copyright 2020-2021 Mike Gabriel + * Copyright 2020, 2021 Daniel Teichmann + * Copyright 2020, 2021 Mike Gabriel * SPDX-License-Identifier: GPL-2.0-or-later * * This program is free software; you can redistribute it and/or modify -- cgit v1.2.3 From d30e51002393f48c271fc4109f1b6b71ea1d0440 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Tue, 6 Jul 2021 20:07:01 +0200 Subject: MainQMLAdaptor: engine can't be nullptr in constructor --- src/main_qmladaptor.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 731efaf..b34c9d4 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -26,8 +26,9 @@ #include "main_qmladaptor.h" -MainQMLAdaptor::MainQMLAdaptor(QObject *parent, QQmlApplicationEngine* engine) : QObject(parent) -{ +MainQMLAdaptor::MainQMLAdaptor(QObject *parent, QQmlApplicationEngine* engine) : QObject(parent) { + Q_ASSERT(engine != nullptr); + _engine = engine; } -- cgit v1.2.3 From 54249d9c37ce3994b03123ee6367c7f5519d3b40 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Wed, 7 Jul 2021 15:03:13 +0200 Subject: Introduce RWAHostModel. RWAHost's are now loaded on start. Scene_remote_{view, control} are no longer available if no host is selected. --- src/main_qmladaptor.cpp | 94 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index b34c9d4..d75b15c 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -30,6 +30,100 @@ MainQMLAdaptor::MainQMLAdaptor(QObject *parent, QQmlApplicationEngine* engine) : Q_ASSERT(engine != nullptr); _engine = engine; + _rwaHostModel = new QList; +} + +void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) { + Q_ASSERT(host_uuid != ""); + + RWAHost *_host = nullptr; + for (int i = 0; i < getRWAHostModel().size(); i++) { + QObject *obj = getRWAHostModel().value(i); + RWAHost *host = qobject_cast(obj); + Q_ASSERT(host != nullptr); + + if (host->uuid() == host_uuid) { + _host = host; + } + } + Q_ASSERT(_host != nullptr); + + qDebug() << "RWAHost was selected!" << _host->uuid() << "aka" << _host->alias(); +} + +void MainQMLAdaptor::setRWAHostModel(QList rwa_hosts) { + + _rwaHostModel = &rwa_hosts; + emit rwaHostModelChanged(rwa_hosts); +} + +void MainQMLAdaptor::addRWAHost(RWAHost *rwa_host) { + _rwaHostModel->append(rwa_host); + emit rwaHostModelChanged(*_rwaHostModel); +} + +QList MainQMLAdaptor::getRWAHostModel() { + return *_rwaHostModel; +} + +void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { + Q_ASSERT(doc != nullptr); + + // Get the QJsonObject + QJsonObject jObject = doc->object(); + QVariantMap mainMap = jObject.toVariantMap(); + + // Status of request + QString request_status = mainMap["status"].toString(); + if (request_status == "success") { + // Building host_objects + QJsonArray host_objects = jObject.value("hosts").toArray(); + + foreach (const QJsonValue &host_object, host_objects) { + QString host_uuid = host_object["uuid"].toString(); + QString host_alias = host_object["alias"].toString(); + QString host_url = host_object["url"].toString(); + + if (host_url == "" || host_uuid == "") { + // This two values are required and can't be omitted. + QString reason = tr("A host object in the response of D-Bus " + "service lacks a necessary value. (host_url or host_uuid)"); + qCritical().noquote() << tr("An error occured while adding a new host:") + << reason; + //emit step1Failed(reason); + + return; + } + + if (host_alias == "") { + qDebug().noquote() << QString("An alias for the host wasn't delivered " + "so just use '%0' as alias.").arg(host_url); + host_alias = host_url; + } + + // Now built RWAHost object. + RWAHost *rwa_host = new RWAHost(host_uuid, host_alias, host_url); + addRWAHost(rwa_host); + + qInfo().noquote() << QString(tr("Successfully added new RWAHost '%0'")).arg(rwa_host->alias()); + } + } else { + QString reason = tr("An error occured while adding a new host:"); + qCritical().noquote() << reason; + + QString type = mainMap["type"].toString(); + if (type != "") { + reason = QString(tr("The error is not clear. The session service " + "responded with status type '%0'")).arg(type); + qCritical().noquote() << reason; + } else { + reason = QString(tr("The error is not clear. The session service " + "responded with no status type!")); + qCritical().noquote() << reason; + } + + return; + } } bool MainQMLAdaptor::setConnectButtonEnabled(bool enabled) { -- cgit v1.2.3 From 0ed25cd9cd46ba4c3f64eb5e8866becaa07f5344 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Wed, 7 Jul 2021 15:42:42 +0200 Subject: Various small improvements to readability --- src/main_qmladaptor.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index d75b15c..5fcce5f 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -128,7 +128,8 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { bool MainQMLAdaptor::setConnectButtonEnabled(bool enabled) { // Find item via 'objectName' - QQuickItem *item = _engine->rootObjects().at(0)->findChild("start_support_button"); + QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); + QQuickItem *item = scene_remote_control->findChild("start_support_button"); if (item) { item->setProperty("enabled", enabled); if (item->property("checked").toBool()) { @@ -146,7 +147,8 @@ bool MainQMLAdaptor::setConnectButtonEnabled(bool enabled) { bool MainQMLAdaptor::setConnectButtonChecked(bool checked) { // Find item via 'objectName' - QQuickItem *item = _engine->rootObjects().at(0)->findChild("start_support_button"); + QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); + QQuickItem *item = scene_remote_control->findChild("start_support_button"); if (item) { item->setProperty("checked", checked); } else { @@ -159,7 +161,8 @@ bool MainQMLAdaptor::setConnectButtonChecked(bool checked) { bool MainQMLAdaptor::setStatus(QString status) { // Find item via 'objectName' - QQuickItem *item = _engine->rootObjects().at(0)->findChild("dbus_api_status_text"); + QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); + QQuickItem *item = scene_remote_control->findChild("dbus_api_status_text"); if (item) { item->setProperty("text", status); } else { @@ -203,7 +206,8 @@ bool MainQMLAdaptor::getShowMessageDialog() { bool MainQMLAdaptor::setStatusIndicator(bool active, QColor color) { // Find item via 'objectName' - QQuickItem *item = _engine->rootObjects().at(0)->findChild("dbus_api_status_indicator"); + QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); + QQuickItem *item = scene_remote_control->findChild("dbus_api_status_indicator"); if (item) { item->setProperty("active", active); item->setProperty("color", color); @@ -256,10 +260,3 @@ void MainQMLAdaptor::onCloseHandler() { void MainQMLAdaptor::showToast(QString text, uint durationMs) { emit showToastSignal(text, QString::number(durationMs)); } - -//void MainQMLAdaptor::onCloseHandler() { -// qDebug() << "Inside MainQMLAdaptor::onCloseHandler()"; - -// // Sending onClose signal to main and there to Session::onCloseHandler() -// emit MainQMLAdaptor::onCloseSignal(); -//} -- cgit v1.2.3 From dc3b77a1e3c8b8ff9a9299fd17c13b0428f1fa14 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 15:50:22 +0200 Subject: Add: 'Scene_no_server_available.qml' --- src/main_qmladaptor.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 5fcce5f..c1d3f14 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -49,12 +49,19 @@ void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) { Q_ASSERT(_host != nullptr); qDebug() << "RWAHost was selected!" << _host->uuid() << "aka" << _host->alias(); -} -void MainQMLAdaptor::setRWAHostModel(QList rwa_hosts) { + // Find item via 'objectName' + QObject *sidebar_drawer = _engine->rootObjects().takeFirst()->findChild("sidebar_drawer"); + if (sidebar_drawer) { + sidebar_drawer->setProperty("rwaHostIsSelected", true); + } else { + qWarning() << "Unable to find 'sidebar_drawer' Item!"; + } +} - _rwaHostModel = &rwa_hosts; - emit rwaHostModelChanged(rwa_hosts); +void MainQMLAdaptor::setRWAHostModel(QList *rwa_hosts) { + _rwaHostModel = rwa_hosts; + emit rwaHostModelChanged(*rwa_hosts); } void MainQMLAdaptor::addRWAHost(RWAHost *rwa_host) { @@ -69,6 +76,10 @@ QList MainQMLAdaptor::getRWAHostModel() { void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { Q_ASSERT(doc != nullptr); + delete _rwaHostModel; + setRWAHostModel(new QList); + bool atLeastOneHostAvailable = false; + // Get the QJsonObject QJsonObject jObject = doc->object(); QVariantMap mainMap = jObject.toVariantMap(); @@ -90,7 +101,6 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { "service lacks a necessary value. (host_url or host_uuid)"); qCritical().noquote() << tr("An error occured while adding a new host:") << reason; - //emit step1Failed(reason); return; } @@ -104,6 +114,7 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { // Now built RWAHost object. RWAHost *rwa_host = new RWAHost(host_uuid, host_alias, host_url); addRWAHost(rwa_host); + atLeastOneHostAvailable = true; qInfo().noquote() << QString(tr("Successfully added new RWAHost '%0'")).arg(rwa_host->alias()); } @@ -124,6 +135,35 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { return; } + + if (!atLeastOneHostAvailable) { + main_content_replace("scenes/Scene_no_server_available.qml"); + //addRWAHost(new RWAHost("-","Kein Server verfügbar!","-")); + } +} + +void MainQMLAdaptor::main_content_push(QString scene) { + // Find item via 'objectName' + QObject *main_content = _engine->rootObjects().takeFirst()->findChild("main_content"); + Q_ASSERT(main_content != nullptr); + QMetaObject::invokeMethod(main_content, "push", Q_ARG(QString, scene)); +} + +void MainQMLAdaptor::main_content_pop(QString scene) { + // Find item via 'objectName' + QObject *main_content = _engine->rootObjects().takeFirst()->findChild("main_content"); + Q_ASSERT(main_content != nullptr); + QMetaObject::invokeMethod(main_content, "pop", Q_ARG(QString, scene)); +} + +void MainQMLAdaptor::main_content_replace(QString scene) { + // Find item via 'objectName' + QObject *window = _engine->rootObjects().takeFirst(); + Q_ASSERT(window != nullptr); + + QVariant arg = QVariant::fromValue(scene); + if(!QMetaObject::invokeMethod(window, "main_content_replace", Q_ARG(QVariant, arg))) + qDebug() << "Failed to invoke push"; } bool MainQMLAdaptor::setConnectButtonEnabled(bool enabled) { -- cgit v1.2.3 From 36dcf4b27450f04ac60a05cd2837c1b58fd5b24a Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 15:55:53 +0200 Subject: Classes share one specific D-Bus object now. --- src/main_qmladaptor.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index c1d3f14..2dec33c 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -26,10 +26,13 @@ #include "main_qmladaptor.h" -MainQMLAdaptor::MainQMLAdaptor(QObject *parent, QQmlApplicationEngine* engine) : QObject(parent) { +MainQMLAdaptor::MainQMLAdaptor(QObject *parent, QQmlApplicationEngine* engine, + DBusAPI *dbus_api) : QObject(parent) { Q_ASSERT(engine != nullptr); + Q_ASSERT(dbus_api != nullptr); _engine = engine; + _dbus_api = dbus_api; _rwaHostModel = new QList; } -- cgit v1.2.3 From 5be60cd11d0d9dbde8ca67f0ec88e10540c490db Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 15:57:44 +0200 Subject: Refresh hosts every 10 seconds. --- src/main_qmladaptor.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 2dec33c..6684d13 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -34,6 +34,10 @@ MainQMLAdaptor::MainQMLAdaptor(QObject *parent, QQmlApplicationEngine* engine, _engine = engine; _dbus_api = dbus_api; _rwaHostModel = new QList; + + QTimer *timer = new QTimer(this); + connect(timer, &QTimer::timeout, _dbus_api, QOverload<>::of(&DBusAPI::get_web_app_hosts_request)); + timer->start(10000); } void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) { -- cgit v1.2.3 From 6072a403da8e0743dfc42d62d89a09724650ebfa Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 15:58:57 +0200 Subject: Add_server_wizard: Add new type-error messages --- src/main_qmladaptor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 6684d13..c321ec8 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -175,7 +175,7 @@ void MainQMLAdaptor::main_content_replace(QString scene) { bool MainQMLAdaptor::setConnectButtonEnabled(bool enabled) { // Find item via 'objectName' - QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); + QQuickItem *scene_remote_control = _engine->rootObjects().takeFirst()->findChild("Scene_remote_control"); QQuickItem *item = scene_remote_control->findChild("start_support_button"); if (item) { item->setProperty("enabled", enabled); -- cgit v1.2.3 From b975bb69043c8857bbfb5c152e6e277beadf5853 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 16:43:20 +0200 Subject: Don't crash on failure but show an error message. --- src/main_qmladaptor.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index c321ec8..845da0a 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -81,7 +81,13 @@ QList MainQMLAdaptor::getRWAHostModel() { } void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { - Q_ASSERT(doc != nullptr); + // Don't use Q_ASSERT(doc != nullptr); instead use: + if (doc == nullptr) { + showToast(tr("Can't connect to underlying session service!"), 10000); + return; + } + // Q_ASSERT lets the program crash immediatly at startup, + // when the session service is not started. delete _rwaHostModel; setRWAHostModel(new QList); -- cgit v1.2.3 From acf033cbb15641a79a093c301efa3fd478237c2a Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Thu, 8 Jul 2021 16:44:35 +0200 Subject: If there are no hosts available: display it in the sidebar menu. --- src/main_qmladaptor.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 845da0a..419f794 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -151,7 +151,20 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { if (!atLeastOneHostAvailable) { main_content_replace("scenes/Scene_no_server_available.qml"); - //addRWAHost(new RWAHost("-","Kein Server verfügbar!","-")); + // Find item via 'objectName' + QObject *sidebar_drawer = _engine->rootObjects().takeFirst()->findChild("sidebar_drawer"); + if (sidebar_drawer) { + sidebar_drawer->setProperty("rwaHostIsSelected", false); + } else { + qWarning() << "Unable to find 'sidebar_drawer' Item!"; + } + } + QObject *server_chooser = _engine->rootObjects().takeFirst()->findChild("server_chooser"); + if (server_chooser) { + server_chooser->setProperty("displayText", atLeastOneHostAvailable ? server_chooser->property("currentText") : tr("No RWA host available!")); + server_chooser->setProperty("enabled", atLeastOneHostAvailable); + } else { + qWarning() << "Unable to find 'server_chooser' Item!"; } } -- cgit v1.2.3 From c8dc8bda03b27a76d31c358e4b642a5687611178 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Mon, 12 Jul 2021 12:54:17 +0200 Subject: MainQMLAdaptor: removeRWAHost() and setRWAHostSelected() --- src/main_qmladaptor.cpp | 60 +++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 27 deletions(-) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 419f794..a89d085 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -45,7 +45,7 @@ void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) { RWAHost *_host = nullptr; for (int i = 0; i < getRWAHostModel().size(); i++) { - QObject *obj = getRWAHostModel().value(i); + QObject *obj = _rwaHostModel->value(i); RWAHost *host = qobject_cast(obj); Q_ASSERT(host != nullptr); @@ -57,13 +57,7 @@ void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) { qDebug() << "RWAHost was selected!" << _host->uuid() << "aka" << _host->alias(); - // Find item via 'objectName' - QObject *sidebar_drawer = _engine->rootObjects().takeFirst()->findChild("sidebar_drawer"); - if (sidebar_drawer) { - sidebar_drawer->setProperty("rwaHostIsSelected", true); - } else { - qWarning() << "Unable to find 'sidebar_drawer' Item!"; - } + setRWAHostSelected(true); } void MainQMLAdaptor::setRWAHostModel(QList *rwa_hosts) { @@ -76,21 +70,45 @@ void MainQMLAdaptor::addRWAHost(RWAHost *rwa_host) { emit rwaHostModelChanged(*_rwaHostModel); } +void MainQMLAdaptor::removeRWAHost(RWAHost *rwa_host) { + _rwaHostModel->removeOne(rwa_host); + emit rwaHostModelChanged(*_rwaHostModel); +} + QList MainQMLAdaptor::getRWAHostModel() { return *_rwaHostModel; } +void MainQMLAdaptor::setRWAHostSelected(bool value) { + // Find item via 'objectName' + QObject *sidebar_drawer = _engine->rootObjects().takeFirst()->findChild("sidebar_drawer"); + if (sidebar_drawer) { + sidebar_drawer->setProperty("rwaHostIsSelected", value); + } else { + qWarning() << "Unable to find 'sidebar_drawer' Item!"; + } + + QObject *server_chooser = _engine->rootObjects().takeFirst()->findChild("server_chooser"); + if (server_chooser) { + server_chooser->setProperty("displayText", value ? server_chooser->property("currentText") : tr("No RWA host available!")); + server_chooser->setProperty("enabled", value); + } else { + qWarning() << "Unable to find 'server_chooser' Item!"; + } +} + void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { + // Q_ASSERT lets the program crash immediatly at startup, + // when the session service is not started. // Don't use Q_ASSERT(doc != nullptr); instead use: if (doc == nullptr) { - showToast(tr("Can't connect to underlying session service!"), 10000); + setRWAHostSelected(false); + + showToast(tr("Can't connect to underlying session service!"), 9800); return; } - // Q_ASSERT lets the program crash immediatly at startup, - // when the session service is not started. - delete _rwaHostModel; - setRWAHostModel(new QList); + bool atLeastOneHostAvailable = false; // Get the QJsonObject @@ -151,21 +169,9 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { if (!atLeastOneHostAvailable) { main_content_replace("scenes/Scene_no_server_available.qml"); - // Find item via 'objectName' - QObject *sidebar_drawer = _engine->rootObjects().takeFirst()->findChild("sidebar_drawer"); - if (sidebar_drawer) { - sidebar_drawer->setProperty("rwaHostIsSelected", false); - } else { - qWarning() << "Unable to find 'sidebar_drawer' Item!"; - } - } - QObject *server_chooser = _engine->rootObjects().takeFirst()->findChild("server_chooser"); - if (server_chooser) { - server_chooser->setProperty("displayText", atLeastOneHostAvailable ? server_chooser->property("currentText") : tr("No RWA host available!")); - server_chooser->setProperty("enabled", atLeastOneHostAvailable); - } else { - qWarning() << "Unable to find 'server_chooser' Item!"; } + + setRWAHostSelected(atLeastOneHostAvailable); } void MainQMLAdaptor::main_content_push(QString scene) { -- cgit v1.2.3 From 18c2b837d33c040a21f84c444d8c554769f1dc58 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Mon, 12 Jul 2021 13:02:24 +0200 Subject: Don't just reset the _rwaHostModel everytime but add and remove specific items. TODO: Use QSet subtraction feature instead of manual for loops!!! --- src/main_qmladaptor.cpp | 83 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 76 insertions(+), 7 deletions(-) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index a89d085..6d3a60c 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -121,6 +121,7 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { // Building host_objects QJsonArray host_objects = jObject.value("hosts").toArray(); + QList *all_rwa_hosts = new QList; foreach (const QJsonValue &host_object, host_objects) { QString host_uuid = host_object["uuid"].toString(); QString host_alias = host_object["alias"].toString(); @@ -142,12 +143,46 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { host_alias = host_url; } + // Now built RWAHost object. RWAHost *rwa_host = new RWAHost(host_uuid, host_alias, host_url); - addRWAHost(rwa_host); + all_rwa_hosts->append(rwa_host); + + bool found = false; + for (int i = 0; i < this->_rwaHostModel->size(); i++) { + RWAHost* old_host = qobject_cast(_rwaHostModel->value(i)); + Q_ASSERT(old_host != nullptr); + + if (rwa_host->uuid() == old_host->uuid()) { + found = true; + break; + } + } + atLeastOneHostAvailable = true; - qInfo().noquote() << QString(tr("Successfully added new RWAHost '%0'")).arg(rwa_host->alias()); + if (!found) { + qInfo().noquote() << QString(tr("Successfully added new RWAHost '%0'")).arg(rwa_host->alias()); + addRWAHost(rwa_host); + } + } + + for (int i = 0; i < this->_rwaHostModel->size(); i++) { + RWAHost* old_host = qobject_cast(_rwaHostModel->value(i)); + Q_ASSERT(old_host != nullptr); + + bool found = false; + for (RWAHost *host : *all_rwa_hosts) { + if (host->uuid() == old_host->uuid()) { + found = true; + break; + } + } + + if (!found) { + removeRWAHost(old_host); + qInfo().noquote() << QString(tr("Removed RWAHost '%0'")).arg(old_host->alias()); + } } } else { QString reason = tr("An error occured while adding a new host:"); @@ -176,16 +211,40 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { void MainQMLAdaptor::main_content_push(QString scene) { // Find item via 'objectName' + QObject *window = _engine->rootObjects().takeFirst(); + Q_ASSERT(window != nullptr); + QObject *main_content = _engine->rootObjects().takeFirst()->findChild("main_content"); Q_ASSERT(main_content != nullptr); - QMetaObject::invokeMethod(main_content, "push", Q_ARG(QString, scene)); + + QVariant to_cast = main_content->property("currentItem"); + QObject *obj = qvariant_cast(to_cast); + if (obj) { + if (!(scene.contains(obj->objectName()))) { + QVariant arg = QVariant::fromValue(scene); + if(!QMetaObject::invokeMethod(window, "main_content_push", Q_ARG(QVariant, arg))) + qDebug() << "Failed to invoke push"; + } + } } void MainQMLAdaptor::main_content_pop(QString scene) { // Find item via 'objectName' + QObject *window = _engine->rootObjects().takeFirst(); + Q_ASSERT(window != nullptr); + QObject *main_content = _engine->rootObjects().takeFirst()->findChild("main_content"); Q_ASSERT(main_content != nullptr); - QMetaObject::invokeMethod(main_content, "pop", Q_ARG(QString, scene)); + + QVariant to_cast = main_content->property("currentItem"); + QObject *obj = qvariant_cast(to_cast); + if (obj) { + if (!(scene.contains(obj->objectName()))) { + QVariant arg = QVariant::fromValue(scene); + if(!QMetaObject::invokeMethod(window, "main_content_pop", Q_ARG(QVariant, arg))) + qDebug() << "Failed to invoke pop"; + } + } } void MainQMLAdaptor::main_content_replace(QString scene) { @@ -193,9 +252,19 @@ void MainQMLAdaptor::main_content_replace(QString scene) { QObject *window = _engine->rootObjects().takeFirst(); Q_ASSERT(window != nullptr); - QVariant arg = QVariant::fromValue(scene); - if(!QMetaObject::invokeMethod(window, "main_content_replace", Q_ARG(QVariant, arg))) - qDebug() << "Failed to invoke push"; + QObject *main_content = _engine->rootObjects().takeFirst()->findChild("main_content"); + Q_ASSERT(main_content != nullptr); + + QVariant to_cast = main_content->property("currentItem"); + QObject *obj = qvariant_cast(to_cast); + if (obj) { + QString scene_add_server_wizard = "Scene_step_1"; + if (!(scene.contains(obj->objectName()) || scene_add_server_wizard.contains(obj->objectName()))) { + QVariant arg = QVariant::fromValue(scene); + if(!QMetaObject::invokeMethod(window, "main_content_replace", Q_ARG(QVariant, arg))) + qDebug() << "Failed to invoke replace"; + } + } } bool MainQMLAdaptor::setConnectButtonEnabled(bool enabled) { -- cgit v1.2.3 From efa44c931674e498c39fc59091cf1f8654ac97a5 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Sun, 1 Aug 2021 01:58:32 +0200 Subject: Fix typos, too long lines, various styling stuff --- src/main_qmladaptor.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 6d3a60c..7e85157 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -129,8 +129,8 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { if (host_url == "" || host_uuid == "") { // This two values are required and can't be omitted. - QString reason = tr("A host object in the response of D-Bus " - "service lacks a necessary value. (host_url or host_uuid)"); + QString reason = tr("A host object in the response of D-Bus service lacks" + " a necessary value. (host_url or host_uuid)"); qCritical().noquote() << tr("An error occured while adding a new host:") << reason; @@ -162,7 +162,8 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { atLeastOneHostAvailable = true; if (!found) { - qInfo().noquote() << QString(tr("Successfully added new RWAHost '%0'")).arg(rwa_host->alias()); + qInfo().noquote() << QString(tr("Successfully added new RWAHost '%0'")) + .arg(rwa_host->alias()); addRWAHost(rwa_host); } } @@ -233,7 +234,8 @@ void MainQMLAdaptor::main_content_pop(QString scene) { QObject *window = _engine->rootObjects().takeFirst(); Q_ASSERT(window != nullptr); - QObject *main_content = _engine->rootObjects().takeFirst()->findChild("main_content"); + QObject *main_content = _engine->rootObjects().takeFirst()-> + findChild("main_content"); Q_ASSERT(main_content != nullptr); QVariant to_cast = main_content->property("currentItem"); @@ -252,17 +254,21 @@ void MainQMLAdaptor::main_content_replace(QString scene) { QObject *window = _engine->rootObjects().takeFirst(); Q_ASSERT(window != nullptr); - QObject *main_content = _engine->rootObjects().takeFirst()->findChild("main_content"); + QObject *main_content = _engine->rootObjects().takeFirst()-> + findChild("main_content"); Q_ASSERT(main_content != nullptr); QVariant to_cast = main_content->property("currentItem"); QObject *obj = qvariant_cast(to_cast); if (obj) { QString scene_add_server_wizard = "Scene_step_1"; - if (!(scene.contains(obj->objectName()) || scene_add_server_wizard.contains(obj->objectName()))) { + if (!(scene.contains(obj->objectName()) || + scene_add_server_wizard.contains(obj->objectName()))) { QVariant arg = QVariant::fromValue(scene); - if(!QMetaObject::invokeMethod(window, "main_content_replace", Q_ARG(QVariant, arg))) + if (!QMetaObject::invokeMethod(window, "main_content_replace", + Q_ARG(QVariant, arg))) { qDebug() << "Failed to invoke replace"; + } } } } -- cgit v1.2.3 From 766a90125df68f065495354c20412faf9e1df77a Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Sun, 1 Aug 2021 02:19:15 +0200 Subject: move scenes/Scene_remote_control.qml into scenes/remote_control/Scene_remote_control.qml --- src/main_qmladaptor.cpp | 57 ++++++------------------------------------------- 1 file changed, 7 insertions(+), 50 deletions(-) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 7e85157..5da0abb 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -81,16 +81,20 @@ QList MainQMLAdaptor::getRWAHostModel() { void MainQMLAdaptor::setRWAHostSelected(bool value) { // Find item via 'objectName' - QObject *sidebar_drawer = _engine->rootObjects().takeFirst()->findChild("sidebar_drawer"); + QObject *sidebar_drawer = _engine->rootObjects().takeFirst()-> + findChild("sidebar_drawer"); if (sidebar_drawer) { sidebar_drawer->setProperty("rwaHostIsSelected", value); } else { qWarning() << "Unable to find 'sidebar_drawer' Item!"; } - QObject *server_chooser = _engine->rootObjects().takeFirst()->findChild("server_chooser"); + QObject *server_chooser = _engine->rootObjects().takeFirst()-> + findChild("server_chooser"); if (server_chooser) { - server_chooser->setProperty("displayText", value ? server_chooser->property("currentText") : tr("No RWA host available!")); + server_chooser->setProperty("displayText", value ? + server_chooser->property("currentText") : + tr("No RWA host available!")); server_chooser->setProperty("enabled", value); } else { qWarning() << "Unable to find 'server_chooser' Item!"; @@ -273,53 +277,6 @@ void MainQMLAdaptor::main_content_replace(QString scene) { } } -bool MainQMLAdaptor::setConnectButtonEnabled(bool enabled) { - // Find item via 'objectName' - QQuickItem *scene_remote_control = _engine->rootObjects().takeFirst()->findChild("Scene_remote_control"); - QQuickItem *item = scene_remote_control->findChild("start_support_button"); - if (item) { - item->setProperty("enabled", enabled); - if (item->property("checked").toBool()) { - item->setProperty("text", tr("Stop remote support session")); - } else { - item->setProperty("text", tr("Start remote support session")); - } - } else { - qWarning() << "Unable to find 'start_support_button' Item!"; - return false; - } - - return true; -} - -bool MainQMLAdaptor::setConnectButtonChecked(bool checked) { - // Find item via 'objectName' - QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); - QQuickItem *item = scene_remote_control->findChild("start_support_button"); - if (item) { - item->setProperty("checked", checked); - } else { - qWarning() << "Unable to find 'start_support_button' Item!"; - return false; - } - - return true; -} - -bool MainQMLAdaptor::setStatus(QString status) { - // Find item via 'objectName' - QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); - QQuickItem *item = scene_remote_control->findChild("dbus_api_status_text"); - if (item) { - item->setProperty("text", status); - } else { - qWarning() << "Unable to find 'dbus_api_status_text' Item!"; - return false; - } - - return true; -} - bool MainQMLAdaptor::openMessageDialog(QString title, QString text, QMessageBox::Icon icon) { _messageDialogText = text; _messageDialogTitle = title; -- cgit v1.2.3 From 35343e5158ca441f8001c0a91685f4e93b53cb03 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Sun, 1 Aug 2021 02:22:57 +0200 Subject: Toast: Add a variety of new toast colors; Session complete rewrite; A lot of bugfixing; New available toast colors/types: ToastType.Standard, ToastType.Info, ToastType.Warning ToastType.Success, ToastType.Error --- src/main_qmladaptor.cpp | 84 ++++++++++++++++++------------------------------- 1 file changed, 31 insertions(+), 53 deletions(-) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index 5da0abb..d30243d 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -33,11 +33,22 @@ MainQMLAdaptor::MainQMLAdaptor(QObject *parent, QQmlApplicationEngine* engine, _engine = engine; _dbus_api = dbus_api; + _selected_rwa_host = nullptr; _rwaHostModel = new QList; QTimer *timer = new QTimer(this); - connect(timer, &QTimer::timeout, _dbus_api, QOverload<>::of(&DBusAPI::get_web_app_hosts_request)); + connect(timer, &QTimer::timeout, _dbus_api, + QOverload<>::of(&DBusAPI::get_web_app_hosts_request)); timer->start(10000); + + qmlRegisterUncreatableMetaObject( + Toast::staticMetaObject, // meta object created by Q_NAMESPACE macro + "rwa.toast.type", // import statement (can be any string) + 1, 0, // major and minor version of the import + "ToastType", // name in QML (does not have to match C++ name) + "Error: only enums" // error if someone tries to create a ToastType object + ); + } void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) { @@ -55,11 +66,19 @@ void MainQMLAdaptor::onRwaHostSelected(QString host_uuid) { } Q_ASSERT(_host != nullptr); - qDebug() << "RWAHost was selected!" << _host->uuid() << "aka" << _host->alias(); + _selected_rwa_host = _host; + qDebug() << "RWAHost was selected!" << + _selected_rwa_host->uuid() << + "aka" << + _selected_rwa_host->alias(); setRWAHostSelected(true); } +RWAHost* MainQMLAdaptor::getSelectedRWAHost() { + return _selected_rwa_host; +} + void MainQMLAdaptor::setRWAHostModel(QList *rwa_hosts) { _rwaHostModel = rwa_hosts; emit rwaHostModelChanged(*rwa_hosts); @@ -108,7 +127,13 @@ void MainQMLAdaptor::get_web_app_hosts_response(QJsonDocument *doc) { if (doc == nullptr) { setRWAHostSelected(false); - showToast(tr("Can't connect to underlying session service!"), 9800); + showToast(tr("Can't connect to underlying session service!"), + 9800, + Toast::ToastError); + + // Go to the first page on the stack. + main_content_pop(nullptr); + return; } @@ -308,59 +333,12 @@ bool MainQMLAdaptor::getShowMessageDialog() { return _showMessageDialog; } -bool MainQMLAdaptor::setStatusIndicator(bool active, QColor color) { - // Find item via 'objectName' - QQuickItem *scene_remote_control = _engine->rootObjects().at(0)->findChild("Scene_remote_control"); - QQuickItem *item = scene_remote_control->findChild("dbus_api_status_indicator"); - if (item) { - item->setProperty("active", active); - item->setProperty("color", color); - } else { - qWarning() << "Unable to find 'dbus_api_status_indicator' Item!"; - return false; - } - - return true; -} - -void MainQMLAdaptor::handleCopyToClipboardButtonClick(QString copy_data) { - QClipboard *clipboard = QApplication::clipboard(); - QString originalText = clipboard->text(); - clipboard->setText(copy_data); - qDebug() << "Copied into clipboard:" << copy_data; -} - -void MainQMLAdaptor::handleConnectButtonClick(bool checked) { - emit onConnectButtonClick(checked); -} - -void MainQMLAdaptor::setPin(QString pin) { - _pin = pin; - emit pinChanged(pin); -} -void MainQMLAdaptor::setURL(QString URL) { - _url = URL; - emit urlChanged(URL); -} -void MainQMLAdaptor::setSessionID(QString session_id) { - _session_id = session_id; - emit sessionIDChanged(session_id); -} -QString MainQMLAdaptor::getURL() { - return _url; -} -QString MainQMLAdaptor::getPin() { - return _pin; -} -QString MainQMLAdaptor::getSessionID() { - return _session_id; -} - void MainQMLAdaptor::onCloseHandler() { // Do cleanup things here... emit onCloseSignal(); } -void MainQMLAdaptor::showToast(QString text, uint durationMs) { - emit showToastSignal(text, QString::number(durationMs)); +void MainQMLAdaptor::showToast(QString text, uint durationMs, uint type) { + // type is actually Toast::ToastType + emit showToastSignal(text, QString::number(durationMs), type); } -- cgit v1.2.3 From 0e8f295868e826b89114b55a0aa360cb30d7494f Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Sun, 1 Aug 2021 02:36:42 +0200 Subject: add_server_wizard/add_server_wizard -> add_rwahost_wizard/add_rwahost_wizard --- src/main_qmladaptor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/main_qmladaptor.cpp') diff --git a/src/main_qmladaptor.cpp b/src/main_qmladaptor.cpp index d30243d..688b993 100644 --- a/src/main_qmladaptor.cpp +++ b/src/main_qmladaptor.cpp @@ -290,9 +290,9 @@ void MainQMLAdaptor::main_content_replace(QString scene) { QVariant to_cast = main_content->property("currentItem"); QObject *obj = qvariant_cast(to_cast); if (obj) { - QString scene_add_server_wizard = "Scene_step_1"; + QString scene_add_rwahost_wizard = "Scene_step_1"; if (!(scene.contains(obj->objectName()) || - scene_add_server_wizard.contains(obj->objectName()))) { + scene_add_rwahost_wizard.contains(obj->objectName()))) { QVariant arg = QVariant::fromValue(scene); if (!QMetaObject::invokeMethod(window, "main_content_replace", Q_ARG(QVariant, arg))) { -- cgit v1.2.3