aboutsummaryrefslogtreecommitdiff
path: root/src/scenes/add_rwahost_wizard
diff options
context:
space:
mode:
Diffstat (limited to 'src/scenes/add_rwahost_wizard')
-rw-r--r--src/scenes/add_rwahost_wizard/Scene_step_1.qml282
-rw-r--r--src/scenes/add_rwahost_wizard/add_rwahost_wizard.cpp124
-rw-r--r--src/scenes/add_rwahost_wizard/add_rwahost_wizard.h61
3 files changed, 467 insertions, 0 deletions
diff --git a/src/scenes/add_rwahost_wizard/Scene_step_1.qml b/src/scenes/add_rwahost_wizard/Scene_step_1.qml
new file mode 100644
index 0000000..873e0fd
--- /dev/null
+++ b/src/scenes/add_rwahost_wizard/Scene_step_1.qml
@@ -0,0 +1,282 @@
+import QtQuick 2.9
+import QtQuick.Window 2.2
+import QtQuick.Extras 1.4
+import QtQuick.Controls 2.2
+import QtQuick.Controls.Material 2.3
+import rwa.toast.type 1.0
+
+/*!
+ * This .qml file is a Scene which can be loaded through for
+ * example a StackView (main_content in main.qml).
+ */
+
+Item {
+ id: scene_server_wizard_step_1
+ objectName: "Scene_step_1"
+
+ Connections {
+ target: add_rwahost_wizard
+ function onStep1Success() {
+ // Go onto the first page of the stack.
+ main_content_pop(null)
+ mainqmladaptor.showToast(qsTr("Successfully added remote web app host."),
+ 5000,
+ ToastType.ToastSuccess);
+ }
+ }
+
+ Connections {
+ target: add_rwahost_wizard
+ function onStep1Failed(reason, toast_type) {
+ mainqmladaptor.showToast(reason,
+ 5000,
+ toast_type)
+ }
+ }
+
+ Rectangle {
+ id: rectangle
+ anchors.fill: parent
+ color: Material.background
+
+ Button {
+ id: next_step1_button
+ text: qsTr("Next Step")
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: 15
+ anchors.right: parent.right
+ anchors.rightMargin: 15
+
+ onClicked: {
+ add_rwahost_wizard.processStep1(host_url.text, host_alias.text)
+ }
+ }
+
+ /*Text {
+ color: Material.foreground
+ id: step_indicator
+
+ text: qsTr("Step 1")
+ anchors.leftMargin: 15
+ anchors.top: parent.top
+ anchors.topMargin: 15
+ font.pointSize: 21
+ wrapMode: Text.WordWrap
+
+ font.bold: true
+ horizontalAlignment: Text.AlignHCenter
+ anchors.left: parent.left
+ anchors.margins: 5
+ }*/
+
+ Text {
+ color: Material.foreground
+ id: explaining_text
+
+ text: qsTr("Please input the address for the "+
+ "remote web app server which you want "+
+ "to connect to.\nIf you don't know "+
+ "what this means, ask your local "+
+ "administrator about it please.\nBefore you can "+
+ "start any remote sessions you will have to "+
+ "be approved for remote support.")
+ font.pointSize: 12
+ anchors.right: parent.right
+ anchors.rightMargin: 15
+ anchors.leftMargin: 15
+ anchors.top: parent.top //step_indicator.bottom
+ anchors.topMargin: 15
+ wrapMode: Text.WordWrap
+
+ anchors.left: parent.left
+ anchors.margins: 5
+ }
+
+ TextField {
+ id: host_url
+ selectByMouse: true
+ placeholderText: qsTr("http://example.com:8000")
+
+ font.pixelSize: 16
+ color: Material.foreground
+ anchors.topMargin: 30
+
+ padding: 15
+ topPadding: 15
+
+ anchors.top: explaining_text.bottom
+ anchors.left: parent.left
+ anchors.leftMargin: 15
+ anchors.right: parent.right
+ anchors.margins: 30
+
+ MouseArea {
+ anchors.fill: parent
+ hoverEnabled: true
+ onHoveredChanged: {
+ if (containsMouse) {
+ host_url_background.state = "hovered"
+ } else if (!host_url.focus) {
+ host_url_background.state = "unhovered"
+ }
+ }
+ onClicked: {
+ host_url.forceActiveFocus();
+ }
+ }
+
+ onFocusChanged: {
+ host_url_background.state = host_url.focus ? "hovered" : "unhovered"
+ }
+
+ background: Rectangle {
+ id: host_url_background
+ color: Material.background
+ border.color: Material.foreground
+ border.width: 1
+ radius: 4
+
+ states: [
+ State {
+ name: "hovered"
+ PropertyChanges {
+ target: host_url_background
+ border.color: "#0178EF"
+ }
+ },
+ State {
+ name: "unhovered"
+ PropertyChanges {
+ target: host_url_background
+ border.color: Material.foreground
+ }
+ }
+ ]
+ transitions: [
+ Transition {
+ from: "*"
+ to: "*"
+ PropertyAnimation {
+ property: "border.color"
+ duration: 100
+ easing.type: Easing.Linear
+ }
+ }
+ ]
+
+ Text {
+ color: Material.foreground
+ text: qsTr("RWA host address")
+ anchors.left: parent.left
+ anchors.leftMargin: 15
+ anchors.verticalCenterOffset: - host_url.height / 2
+ anchors.verticalCenter: parent.verticalCenter
+ leftPadding: 5
+
+ Rectangle {
+ color: Material.background
+ width: parent.width + 5 + 3
+ height: parent.height
+ z: -1
+ }
+ }
+ }
+ }
+
+ TextField {
+ id: host_alias
+ selectByMouse: true
+ placeholderText: qsTr("My example host")
+
+ font.pixelSize: 16
+ color: Material.foreground
+
+ padding: 15
+ topPadding: 15
+
+ anchors.top: host_url.bottom
+ anchors.topMargin: 30
+ anchors.left: parent.left
+ anchors.leftMargin: 15
+ anchors.right: parent.right
+ anchors.margins: 30
+
+ MouseArea {
+ anchors.fill: parent
+ hoverEnabled: true
+ onHoveredChanged: {
+ if (containsMouse) {
+ host_alias_background.state = "hovered"
+ } else if (!host_alias.focus) {
+ host_alias_background.state = "unhovered"
+ }
+ }
+ onClicked: {
+ host_alias.forceActiveFocus();
+ }
+ }
+
+ onFocusChanged: {
+ host_alias_background.state = host_alias.focus ? "hovered" : "unhovered"
+ }
+
+ background: Rectangle {
+ id: host_alias_background
+ color: Material.background
+ border.color: Material.foreground
+ border.width: 1
+ radius: 4
+
+ states: [
+ State {
+ name: "hovered"
+ PropertyChanges {
+ target: host_alias_background
+ border.color: "#0178EF"
+ }
+ },
+ State {
+ name: "unhovered"
+ PropertyChanges {
+ target: host_alias_background
+ border.color: Material.foreground
+ }
+ }
+ ]
+ transitions: [
+ Transition {
+ from: "*"
+ to: "*"
+ PropertyAnimation {
+ property: "border.color"
+ duration: 100
+ easing.type: Easing.Linear
+ }
+ }
+ ]
+
+ Text {
+ color: Material.foreground
+ text: qsTr("RWA host alias")
+ anchors.left: parent.left
+ anchors.leftMargin: 15
+ anchors.verticalCenterOffset: - host_alias.height / 2
+ anchors.verticalCenter: parent.verticalCenter
+ leftPadding: 5
+
+ Rectangle {
+ color: Material.background
+ width: parent.width + 5 + 3
+ height: parent.height
+ z: -1
+ }
+ }
+ }
+ }
+ }
+}
+
+/*##^## Designer {
+ D{i:0;autoSize:true;height:480;width:640}D{i:4;anchors_width:351;anchors_x:279}
+}
+ ##^##*/
diff --git a/src/scenes/add_rwahost_wizard/add_rwahost_wizard.cpp b/src/scenes/add_rwahost_wizard/add_rwahost_wizard.cpp
new file mode 100644
index 0000000..7adbdf9
--- /dev/null
+++ b/src/scenes/add_rwahost_wizard/add_rwahost_wizard.cpp
@@ -0,0 +1,124 @@
+/*
+ * This file is part of Remote Support Desktop
+ * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp
+ * Copyright 2021 Daniel Teichmann <daniel.teichmann@das-netzwerkteam.de>
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the
+ * Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "add_rwahost_wizard.h"
+#include "../../RWADBusAdaptor.h"
+#include "../../RWAHost.h"
+
+AddRWAHostWizard::AddRWAHostWizard(QObject *parent,
+ MainQMLAdaptor *main_gui, DBusAPI *dbus_api) : QObject(parent) {
+ Q_ASSERT(main_gui != nullptr);
+ Q_ASSERT(dbus_api != nullptr);
+
+ _dbus_api = dbus_api;
+ _main_gui = main_gui;
+
+ // _dbus_api --serviceAddWebAppHostResponse-> this.add_web_app_host_response()
+ QObject::connect(_dbus_api,
+ SIGNAL(serviceAddWebAppHostResponse(QJsonDocument*)),
+ this,
+ SLOT(add_web_app_host_response(QJsonDocument*)));
+}
+
+void AddRWAHostWizard::processStep1(QString host_url, QString host_alias) {
+ qDebug() << "Processing Step 1 with args: " << host_url << host_alias;
+
+ if(host_alias == "" || host_url == "") {
+ QString reason = tr("Both textfields can't be empty!");
+ emit step1Failed(reason, Toast::ToastType::ToastWarning);
+ qDebug().noquote() << reason;
+ return;
+ }
+
+ return add_server(host_url, host_alias);
+}
+
+void AddRWAHostWizard::processStep2() {
+ qDebug() << "Processing Step 2 with args: No Args.";
+ emit step2Failed(tr("The features you expected here are not yet implemented."), Toast::ToastType::ToastWarning);
+ // Just show placeholder scene now.
+ emit step2Success();
+}
+
+void AddRWAHostWizard::add_server(QString host_url, QString host_alias) {
+ _dbus_api->add_web_app_host_request(host_url, host_alias);
+}
+
+void AddRWAHostWizard::add_web_app_host_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) {
+ _main_gui->setRWAHostSelected(false);
+ _main_gui->showToast(tr("Can't connect to underlying session service!"),
+ 9800,
+ Toast::ToastType::ToastError);
+ return;
+ }
+
+ // Get the QJsonObject
+ QJsonObject jObject = doc->object();
+ QVariantMap mainMap = jObject.toVariantMap();
+
+ // Status of request
+ QString request_status = mainMap["status"].toString();
+ if (request_status == "success") {
+ _dbus_api->get_web_app_hosts_request();
+
+ qInfo() << "Successfully added a new RWAHost.";
+ emit step1Success();
+ } else {
+ qCritical().noquote() << tr("An error occured while adding a new host!");
+
+ uint toast_type = Toast::ToastType::ToastStandard;
+ QString reason = tr("An error occured while adding a new host!");
+ QString type = mainMap["type"].toString();
+
+ if(type == "connection"){
+ reason = tr("Couldn't connect to the specified host!");
+ toast_type = Toast::ToastType::ToastError;
+ qCritical().noquote() << reason;
+ } else if (type == "duplicate") {
+ reason = tr("The specified host was already added!");
+ toast_type = Toast::ToastType::ToastWarning;
+ qCritical().noquote() << reason;
+ } else if (type == "invalid_url") {
+ reason = tr("The specified host address is not valid!");
+ toast_type = Toast::ToastType::ToastWarning;
+ qCritical().noquote() << reason;
+ } else if (type == "permission_denied") {
+ reason = tr("The specified host address does not grant access!");
+ toast_type = Toast::ToastType::ToastError;
+ qCritical().noquote() << reason;
+ } else if (type == "unsupported_server") {
+ reason = tr("The specified host address is not supported!");
+ toast_type = Toast::ToastType::ToastError;
+ qCritical().noquote() << reason;
+ }
+ emit step1Failed(reason, toast_type);
+
+ return;
+ }
+}
diff --git a/src/scenes/add_rwahost_wizard/add_rwahost_wizard.h b/src/scenes/add_rwahost_wizard/add_rwahost_wizard.h
new file mode 100644
index 0000000..f019be1
--- /dev/null
+++ b/src/scenes/add_rwahost_wizard/add_rwahost_wizard.h
@@ -0,0 +1,61 @@
+/*
+ * This file is part of Remote Support Desktop
+ * https://gitlab.das-netzwerkteam.de/RemoteWebApp/rwa.support.desktopapp
+ * Copyright 2021 Daniel Teichmann <daniel.teichmann@das-netzwerkteam.de>
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the
+ * Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef ADD_RWAHOST_WIZARD_H
+#define ADD_RWAHOST_WIZARD_H
+
+#include <QObject>
+
+#include "../../RWADBusAdaptor.h"
+#include "../../DBusAPI.h"
+#include "../../main_qmladaptor.h"
+
+class AddRWAHostWizard : public QObject
+{
+ Q_OBJECT
+public:
+ explicit AddRWAHostWizard(QObject *parent = nullptr,
+ MainQMLAdaptor *main_gui = nullptr,
+ DBusAPI *dbus_api = nullptr);
+ void add_server(QString host_url, QString host_alias);
+
+private:
+ DBusAPI *_dbus_api;
+ MainQMLAdaptor *_main_gui;
+
+signals:
+ void step1Success();
+ void step1Failed(QString reason, uint toast_type);
+ void step2Success();
+ void step2Failed(QString reason, uint toast_type);
+
+public slots:
+ void processStep1(QString host_url, QString host_alias);
+ void processStep2();
+
+ void add_web_app_host_response(QJsonDocument *doc);
+};
+
+#endif // ADD_SERVER_WIZARD_H