From 76212577cb3fd60d41aab175270ede0b2dcdb038 Mon Sep 17 00:00:00 2001 From: Daniel Teichmann Date: Tue, 29 Jun 2021 15:21:09 +0200 Subject: Add feature: Multiple Scenes; Relocate files --- Toast.qml | 132 ------- ToastManager.qml | 84 ----- main.qml | 711 ------------------------------------ qml.qrc | 13 +- rwa-support-desktopapp.pro | 14 +- src/ListItem.qml | 20 + src/Toast.qml | 132 +++++++ src/ToastManager.qml | 84 +++++ src/main.cpp | 17 +- src/main.qml | 386 ++++++++++++++++++++ src/scenes/Scene_placeholder.qml | 57 +++ src/scenes/Scene_remote_control.qml | 368 +++++++++++++++++++ src/scenes/Scene_remote_view.qml | 366 +++++++++++++++++++ src/scenes/Scene_settings.qml | 29 ++ 14 files changed, 1470 insertions(+), 943 deletions(-) delete mode 100644 Toast.qml delete mode 100644 ToastManager.qml delete mode 100644 main.qml create mode 100644 src/ListItem.qml create mode 100644 src/Toast.qml create mode 100644 src/ToastManager.qml create mode 100644 src/main.qml create mode 100644 src/scenes/Scene_placeholder.qml create mode 100644 src/scenes/Scene_remote_control.qml create mode 100644 src/scenes/Scene_remote_view.qml create mode 100644 src/scenes/Scene_settings.qml diff --git a/Toast.qml b/Toast.qml deleted file mode 100644 index eb65b20..0000000 --- a/Toast.qml +++ /dev/null @@ -1,132 +0,0 @@ -/* - * This file is part of Remote Support Desktop - * https://gitlab.das-netzwerkteam.de/RemoteWebApp/remote-support-desktop - * 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 - * 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 . - */ - -import QtQuick 2.0 -import QtQuick.Controls 2.0 -import QtQuick.Controls.Material 2.3 - -/** - * adapted from StackOverflow: - * http://stackoverflow.com/questions/26879266/make-toast-in-android-by-qml - * GitHub Gist: https://gist.github.com/jonmcclung/bae669101d17b103e94790341301c129 - * Adapted to work with dark/light theming - */ - -/** - * @brief An Android-like timed message text in a box that self-destroys when finished if desired - */ -Control { - - /** - * Public - */ - - /** - * @brief Shows this Toast - * - * @param {string} text Text to show - * @param {real} duration Duration to show in milliseconds, defaults to 3000 - */ - function show(text, duration) { - message.text = text; - if (typeof duration !== "undefined") { // checks if parameter was passed - time = Math.max(duration, 2 * fadeTime); - } - else { - time = defaultTime; - } - console.log("Showing a new toast with display time: " + time); - animation.start(); - } - - property bool selfDestroying: false // whether this Toast will self-destroy when it is finished - - /** - * Private - */ - - id: root - - readonly property real defaultTime: 3000 - property real time: defaultTime - readonly property real fadeTime: 300 - - property real margin: 10 - - anchors { - left: parent.left - right: parent.right - margins: margin - } - - height: message.height + margin - - background: Rectangle { - color: (Material.theme == Material.Dark) ? "#212121" : "#dcdedc" - radius: margin - } - - opacity: 0 - - Text { - id: message - color: (Material.theme == Material.Dark) ? "#f1f1f1" : "#010101" - wrapMode: Text.Wrap - horizontalAlignment: Text.AlignHCenter - anchors { - top: parent.top - left: parent.left - right: parent.right - margins: margin / 2 - } - } - - SequentialAnimation on opacity { - id: animation - running: false - - - NumberAnimation { - to: .9 - duration: fadeTime - } - - PauseAnimation { - duration: time - 2 * fadeTime - } - - NumberAnimation { - to: 0 - duration: fadeTime - } - - onRunningChanged: { - if (!running && selfDestroying) { - root.destroy(); - } - } - } -} diff --git a/ToastManager.qml b/ToastManager.qml deleted file mode 100644 index b448905..0000000 --- a/ToastManager.qml +++ /dev/null @@ -1,84 +0,0 @@ -/* - * This file is part of Remote Support Desktop - * https://gitlab.das-netzwerkteam.de/RemoteWebApp/remote-support-desktop - * 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 - * 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 . - */ - -import QtQuick 2.0 - -/** - * adapted from StackOverflow: - * http://stackoverflow.com/questions/26879266/make-toast-in-android-by-qml - * GitHub Gist: https://gist.github.com/jonmcclung/bae669101d17b103e94790341301c129 - * @brief Manager that creates Toasts dynamically - */ -ListView { - /** - * Public - */ - - /** - * @brief Shows a Toast - * - * @param {string} text Text to show - * @param {real} duration Duration to show in milliseconds, defaults to 3000 - */ - function show(text, duration) { - model.insert(0, {text: text, duration: duration}); - } - - /** - * Private - */ - - id: root - - z: Infinity - spacing: 5 - anchors.fill: parent - // parent.height * 0.1 = height of blue header rectangle on main - anchors.topMargin: parent.height * 0.1 + 5 - verticalLayoutDirection: ListView.TopToBottom - - interactive: false - - displaced: Transition { - NumberAnimation { - properties: "y" - easing.type: Easing.InOutQuad - } - } - - delegate: Toast { - Component.onCompleted: { - if (typeof duration === "undefined") { - show(text); - } - else { - show(text, duration); - } - } - } - - model: ListModel {id: model} -} diff --git a/main.qml b/main.qml deleted file mode 100644 index d76021a..0000000 --- a/main.qml +++ /dev/null @@ -1,711 +0,0 @@ -/* - * This file is part of Remote Support Desktop - * https://gitlab.das-netzwerkteam.de/RemoteWebApp/remote-support-desktop - * 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 - * 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 . - */ - -import QtQuick 2.9 -import QtQuick.Window 2.2 -import QtQuick.Extras 1.4 -import QtQuick.Controls 2.2 -import QtQuick.Dialogs 1.2 -import QtQuick.Controls.Material 2.3 - -ApplicationWindow { - readonly property int normal_width: 650 - readonly property int normal_height: 500 - readonly property bool inPortrait: window.width < window.height - - /* - // Make window not resizeable - maximumWidth: normal_width * 1.25 - maximumHeight: normal_height * 1.25*/ - - // Make window not resizeable - minimumWidth: 400 - minimumHeight: 460 - - width: normal_width - height: normal_height - - id: window - visible: true - title: qsTr("Remote Support for your Desktop") - - onClosing: { - mainqmladaptor.onCloseHandler(); - } - - function minimizeWindow() { - showMinimized(); - console.log("Miniming window now..."); - } - - function showWindow() { - showNormal(); - console.log("Opening window now..."); - } - - MessageDialog { - id: message_dialog - objectName: "message_dialog" - title: qsTr("Remote Support for your Desktop") - text: qsTr("You are not supposed to see this message.\nThis is a bug.") - icon: StandardIcon.Critical - } - - Connections { - target: mainqmladaptor - onShowToastSignal: { - toast.show(text, durationMs) - } - } - - Connections { - target: mainqmladaptor - onShowMessageDialogChanged: { - message_dialog.visible = show - } - } - - - Item { - id: main_content - anchors.leftMargin: 0 - anchors.top: top_menu_bar_frame.bottom - anchors.right: parent.right - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.topMargin: 0 - - StackView { - id: main_content_view - - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.bottom: parent.bottom - anchors.bottomMargin: 0 - anchors.leftMargin: !inPortrait ? (window.width * 0.25) : 0 - anchors.left: parent.left - anchors.top: parent.top - anchors.topMargin: 0 - - Label { - id: dbus_api_status_text - text: "Unknown state of Service" - anchors.leftMargin: 10 + 5 + dbus_api_status_indicator.width - anchors.bottom: parent.bottom - anchors.bottomMargin: 10 - wrapMode: Text.WrapAtWordBoundaryOrAnywhere - verticalAlignment: Text.AlignVCenter - font.pointSize: 11 - fontSizeMode: Text.Fit - objectName: "dbus_api_status_text" - anchors.left: parent.left - - StatusIndicator { - id: dbus_api_status_indicator - width: height - height: parent.height - objectName: "dbus_api_status_indicator" - color: "#73d216" - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.left - anchors.rightMargin: 5 - active: false - } - } - - Label { - id: explain_function_label - text: qsTr("Please tell your remote support partner your access address and your access-PIN to let your partner connect to this computer.") - font.pixelSize: 18 - fontSizeMode: Text.VerticalFit - wrapMode: Text.WordWrap - anchors.left: parent.left - anchors.leftMargin: 10 - anchors.top: parent.top - anchors.topMargin: 10 - anchors.right: parent.right - anchors.rightMargin: 10 - horizontalAlignment: Text.AlignLeft - enabled: false - - color: Material.theme == Material.Light ? "#000000" : "#FFFFFF" - } - - Rectangle { - id: dbus_api_status_line - y: 379 - height: 1 - radius: 1 - anchors.right: parent.right - anchors.rightMargin: 10 - anchors.bottom: dbus_api_status_text.top - anchors.bottomMargin: 10 - opacity: 0.3 - gradient: Gradient { - GradientStop { - position: 0.391 - color: "#ffffff" - } - - GradientStop { - position: 0.975 - color: "#8b8b8b" - } - } - border.width: 1 - border.color: "#00000000" - anchors.left: parent.left - anchors.leftMargin: 10 - } - - Column { - id: column - spacing: 5 - anchors.right: parent.right - anchors.rightMargin: 10 - anchors.left: parent.left - anchors.leftMargin: 10 - anchors.bottom: dbus_api_status_line.top - anchors.bottomMargin: 10 - anchors.top: explain_function_label.bottom - anchors.topMargin: 10 - - Column { - id: url_group - width: parent.width - height: parent.height * 0.25 - spacing: 5 - - Label { - id: your_url_text - height: parent.height/2 - text: qsTr("Remote Support Address") - font.weight: Font.Bold - font.bold: true - verticalAlignment: Text.AlignBottom - horizontalAlignment: Text.AlignLeft - font.pointSize: 14 - fontSizeMode: Text.Fit - } - - TextEdit { - id: url_text - height: parent.height/2 - text: mainqmladaptor.url - anchors.rightMargin: 10 + copy_url_to_clipboard_button.width - anchors.right: parent.right - wrapMode: Text.WrapAtWordBoundaryOrAnywhere - anchors.leftMargin: 10 - verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignLeft - font.pointSize: 15 - - readOnly: true - color: Material.foreground - selectByMouse: true - anchors.left: parent.left - - leftPadding: 5 - Rectangle { - radius: 5 - color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" - height: url_text.height - // whole line + copy-into-clipboard button + some margin - width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5 - x: 0; y: 0 - z: -1 - } - - Button { - id: copy_url_to_clipboard_button - width: copy_url_to_clipboard_image.width + 6 - height: copy_url_to_clipboard_image.height + 6 + 10 - anchors.verticalCenter: parent.verticalCenter - display: AbstractButton.IconOnly - anchors.leftMargin: 5 - anchors.left: url_text.right - highlighted: false - flat: true - - Image { - id: copy_url_to_clipboard_image - x: 0 - y: -26 - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - source: "images/into-clipboard.svg" - opacity: 0.65 - } - - onClicked: { - mainqmladaptor.handleCopyToClipboardButtonClick(url_text.text); - toast.show(qsTr("Copied access address into clipboard!"), "1000"); - } - - ToolTip.text: qsTr("Copy the access address into the clipboard") - hoverEnabled: true - - ToolTip.delay: 1000 - ToolTip.timeout: 5000 - ToolTip.visible: hovered - } - } - } - - Column { - id: pin_group - width: parent.width - height: parent.height * 0.25 - spacing: 5 - - Label { - id: your_pin_text - height: parent.height/2 - text: qsTr("Access-PIN") - font.weight: Font.Bold - font.bold: true - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - font.pointSize: 14 - verticalAlignment: Text.AlignBottom - horizontalAlignment: Text.AlignLeft - } - - TextEdit { - objectName: "pin_text" - id: pin_text - height: parent.height/2 - text: mainqmladaptor.pin - anchors.rightMargin: 10 + copy_pin_to_clipboard_button.width - anchors.right: parent.right - font.pointSize: 15 - anchors.left: parent.left - anchors.leftMargin: 10 - font.letterSpacing: 10 - horizontalAlignment: Text.AlignLeft - verticalAlignment: Text.AlignVCenter - - leftPadding: 5 - Rectangle { - radius: 5 - color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" - height: url_text.height - // whole line + copy-into-clipboard button + some margin - width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5 - x: 0; y: 0 - z: -1 - } - - readOnly: true - color: Material.foreground - wrapMode: Text.WordWrap - selectByMouse: true - - Button { - id: copy_pin_to_clipboard_button - width: copy_pin_to_clipboard_image.width + 6 - height: copy_pin_to_clipboard_image.height + 6 + 10 - anchors.verticalCenter: parent.verticalCenter - flat: true - display: AbstractButton.IconOnly - anchors.left: pin_text.right - anchors.leftMargin: 5 - - Image { - id: copy_pin_to_clipboard_image - anchors.verticalCenter: parent.verticalCenter - opacity: 0.65 - anchors.horizontalCenter: parent.horizontalCenter - source: "images/into-clipboard.svg" - fillMode: Image.PreserveAspectFit - } - - onClicked: { - mainqmladaptor.handleCopyToClipboardButtonClick(pin_text.text); - toast.show(qsTr("Copied PIN into clipboard!"), "1000"); - } - - ToolTip.text: qsTr("Copy the pin into the clipboard") - hoverEnabled: true - - ToolTip.delay: 1000 - ToolTip.timeout: 5000 - ToolTip.visible: hovered - } - } - } - - Column { - id: session_id_group - width: parent.width - height: parent.height * 0.25 - spacing: 5 - - Label { - id: your_session_id_text - height: parent.height/2 - text: qsTr("Session-ID") - font.weight: Font.Bold - font.bold: true - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - font.pointSize: 14 - verticalAlignment: Text.AlignBottom - horizontalAlignment: Text.AlignLeft - fontSizeMode: Text.Fit - } - - TextEdit { - objectName: "session_id_text" - id: session_id_text - height: parent.height/2 - text: mainqmladaptor.session_id - font.letterSpacing: 10 - anchors.rightMargin: 10 + copy_session_id_to_clipboard_button.width - anchors.right: parent.right - font.pointSize: 15 - anchors.left: parent.left - anchors.leftMargin: 10 - horizontalAlignment: Text.AlignLeft - verticalAlignment: Text.AlignVCenter - - leftPadding: 5 - Rectangle { - radius: 5 - color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" - height: url_text.height - // whole line + copy-into-clipboard button + some margin - width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5 - x: 0; y: 0 - z: -1 - } - - readOnly: true - color: Material.foreground - wrapMode: Text.WordWrap - selectByMouse: true - - Button { - id: copy_session_id_to_clipboard_button - width: copy_session_id_to_clipboard_image.width + 6 - height: copy_session_id_to_clipboard_image.height + 6 + 10 - anchors.verticalCenter: parent.verticalCenter - flat: true - display: AbstractButton.IconOnly - anchors.left: session_id_text.right - anchors.leftMargin: 5 - - Image { - id: copy_session_id_to_clipboard_image - opacity: 0.65 - anchors.verticalCenter: parent.verticalCenter - source: "images/into-clipboard.svg" - fillMode: Image.PreserveAspectFit - } - - onClicked: { - mainqmladaptor.handleCopyToClipboardButtonClick(pin_text.text); - toast.show(qsTr("Copied session-ID into clipboard!"), "1000"); - } - - ToolTip.text: qsTr("Copy the session-ID into the clipboard") - hoverEnabled: true - - ToolTip.delay: 1000 - ToolTip.timeout: 5000 - ToolTip.visible: hovered - } - } - } - - Button { - id: start_support_button - height: Math.min(70, parent.height * 0.222) - objectName: "start_support_button" - text: qsTr("Start remote support session") - anchors.right: parent.right - anchors.rightMargin: 0 - checkable: true - - onClicked: mainqmladaptor.handleConnectButtonClick(checked); - } - } - } - } - - ToastManager { - id: toast - anchors.leftMargin: inPortrait ? 0 : parent.width * 0.25 - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - anchors.top: parent.top - } - - Connections { - target: mainqmladaptor - onMessageDialogTextChanged: { - message_dialog.text = text - } - } - - - Connections { - target: mainqmladaptor - onMessageDialogTitleChanged: { - message_dialog.title = title - } - } - - Connections { - target: mainqmladaptor - onMessageDialogIconChanged: { - message_dialog.icon = iconindex - } - } - - Drawer { - id: sidebar_drawer - y: top_menu_bar_frame.height - - width: !inPortrait ? (window.width * 0.25) : (window.width * 0.5) - height: window.height - top_menu_bar_frame.height - - modal: inPortrait - interactive: inPortrait - position: inPortrait ? 0 : 1 - dragMargin: 1 - margins: -2 - visible: !inPortrait - - ListView { - id: sidebar_listview - boundsBehavior: Flickable.StopAtBounds - interactive: true - clip: true - anchors.fill: parent - - footer: ItemDelegate { - id: footer - text: " " + qsTr("Settings") - width: parent.width - - onClicked: { - if (inPortrait) { - sidebar_drawer.close() - } - } - - MenuSeparator { - parent: footer - width: parent.width - anchors.verticalCenter: parent.top - } - } - - model: 5 - delegate: ItemDelegate { - text: qsTr("Title %1").arg(index + 1) - width: parent.width - onClicked: { - if (inPortrait) { - sidebar_drawer.close() - } - } - } - - ScrollIndicator.vertical: ScrollIndicator { } - } - } - - /*Rectangle { - id: side_menu - width: parent.width * 0.333 - color: "#ffffff" - anchors.bottom: parent.bottom - anchors.bottomMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.top: top_menu_bar_frame.bottom - anchors.topMargin: 0 - - visible: !inPortrait - - Drawer { - x: side_menu.x - y: side_menu.y - width: side_menu.width - height: side_menu.height - modal: inPortrait - interactive: inPortrait - position: inPortrait ? 0 : 1 - //visible: true - visible: !inPortrait - } - }*/ - - - Material.theme: theme.position < 1 ? Material.Light : Material.Dark - - ToolBar { - id: top_menu_bar_frame - width: parent.width - height: parent.height * 0.10 - - background: Rectangle { - color: parent.Material.background - border.color: parent.Material.background - } - Material.background: "#0d5eaf" - Material.foreground: "#ffffff" - - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.top: parent.top - anchors.topMargin: 0 - - Switch { - id: theme - width: 150 - implicitWidth: 100 - visible: !inPortrait - - height: parent.height - anchors.margins: 10 - text: qsTr("Dark theme") - anchors.left: parent.left - anchors.verticalCenterOffset: 0 - anchors.leftMargin: 0 - anchors.verticalCenter: parent.verticalCenter - checked: true - } - - Label { - id: header_text - width: 1 - height: parent.height - color: "#ffffff" - text: qsTr("Allow Remote Control") - anchors.left: theme.right - anchors.leftMargin: 5 - horizontalAlignment: Text.AlignRight - padding: 5 - font.family: "Verdana" - font.pointSize: 20 - fontSizeMode: Text.Fit - verticalAlignment: Text.AlignVCenter - anchors.right: parent.right - anchors.rightMargin: 5 - anchors.verticalCenter: parent.verticalCenter - } - - Button { - id: burger_button - width: 50 - height: parent.height + 10 - visible: inPortrait - - - text: "≡" - checkable: false - font.pointSize: 24 - flat: true - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.verticalCenter: parent.verticalCenter - enabled: !sidebar_drawer.opened - - onClicked: { - sidebar_drawer.open() - enabled: false - } - } - - } - - - - /* TabBar { - id: side_menu - width: parent.width * 0.3333 - anchors.bottom: parent.bottom - anchors.bottomMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.top: top_menu_bar_frame.bottom - anchors.topMargin: 0 - - TabButton { - id: firstBtn - text: "Erster Knopf" - - width: side_menu.width - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.top: parent.top - anchors.topMargin: 0 - - onClicked: { - - } - } - - TabButton { - id: secondBtn - text: "Zweiter Knopf" - - width: side_menu.width - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.top: firstBtn.bottom - anchors.topMargin: 0 - } - - TabButton { - id: thirdBtn - text: "Dritter Knopf" - - width: side_menu.width - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.top: secondBtn.bottom - anchors.topMargin: 0 - } - - visible: true - - background: Rectangle { - color: Material.theme == Material.Light ? "#e5f1fd" : "#0b4a8a" - anchors.fill: parent - } - } -*/ - -} diff --git a/qml.qrc b/qml.qrc index cf0ef28..a9f28a1 100644 --- a/qml.qrc +++ b/qml.qrc @@ -1,14 +1,14 @@ - main.qml locales/bin/de_DE.qm locales/bin/main_en.qm locales/de_DE.ts locales/main_en.ts locales/bin/es_ES.qm locales/es_ES.ts - images/logo.png + images/RWA-logo.png images/into-clipboard.svg + src/main.qml src/main.cpp src/main_qmladaptor.cpp src/main_qmladaptor.h @@ -16,8 +16,13 @@ src/RWADBusAdaptor.h src/session.cpp src/session.h - ToastManager.qml - Toast.qml + src/scenes/Scene_remote_control.qml + src/scenes/Scene_remote_view.qml + src/scenes/Scene_settings.qml + src/scenes/Scene_placeholder.qml + src/ListItem.qml + src/ToastManager.qml + src/Toast.qml qtquickcontrols2.conf diff --git a/rwa-support-desktopapp.pro b/rwa-support-desktopapp.pro index 2216370..cfea48f 100644 --- a/rwa-support-desktopapp.pro +++ b/rwa-support-desktopapp.pro @@ -43,14 +43,20 @@ DEFINES += QT_DEPRECATED_WARNINGS # You can also select to disable deprecated APIs only up to a certain version of Qt. DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 -SOURCES += src/main.cpp src/session.cpp src/main_qmladaptor.cpp +SOURCES += src/main.cpp \ + src/main_qmladaptor.cpp \ + src/RWADBusAdaptor.cpp \ + src/session.cpp -HEADERS += src/RWADBusAdaptor.h src/session.h src/main_qmladaptor.h +HEADERS += src/RWADBusAdaptor.h \ + src/main_qmladaptor.h \ + src/RWADBusAdaptor.h \ + src/session.h RESOURCES += qml.qrc # Additional import path used to resolve QML modules in Qt Creator's code model -QML_IMPORT_PATH = +QML_IMPORT_PATH = src/scenes # Additional import path used to resolve QML modules just for Qt Quick Designer QML_DESIGNER_IMPORT_PATH = @@ -59,3 +65,5 @@ QML_DESIGNER_IMPORT_PATH = qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +DISTFILES += diff --git a/src/ListItem.qml b/src/ListItem.qml new file mode 100644 index 0000000..c69af4b --- /dev/null +++ b/src/ListItem.qml @@ -0,0 +1,20 @@ +import QtQuick 2.0 +import QtQuick.Controls.Material 2.3 +import QtQuick.Controls 2.2 + +ItemDelegate { + id: root + width: parent.width + height: 50 + + property string scene_url + + signal listItemClick() + + text: "" + + MouseArea { + anchors.fill: parent + onClicked: listItemClick(); + } +} diff --git a/src/Toast.qml b/src/Toast.qml new file mode 100644 index 0000000..eb65b20 --- /dev/null +++ b/src/Toast.qml @@ -0,0 +1,132 @@ +/* + * This file is part of Remote Support Desktop + * https://gitlab.das-netzwerkteam.de/RemoteWebApp/remote-support-desktop + * 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 + * 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 . + */ + +import QtQuick 2.0 +import QtQuick.Controls 2.0 +import QtQuick.Controls.Material 2.3 + +/** + * adapted from StackOverflow: + * http://stackoverflow.com/questions/26879266/make-toast-in-android-by-qml + * GitHub Gist: https://gist.github.com/jonmcclung/bae669101d17b103e94790341301c129 + * Adapted to work with dark/light theming + */ + +/** + * @brief An Android-like timed message text in a box that self-destroys when finished if desired + */ +Control { + + /** + * Public + */ + + /** + * @brief Shows this Toast + * + * @param {string} text Text to show + * @param {real} duration Duration to show in milliseconds, defaults to 3000 + */ + function show(text, duration) { + message.text = text; + if (typeof duration !== "undefined") { // checks if parameter was passed + time = Math.max(duration, 2 * fadeTime); + } + else { + time = defaultTime; + } + console.log("Showing a new toast with display time: " + time); + animation.start(); + } + + property bool selfDestroying: false // whether this Toast will self-destroy when it is finished + + /** + * Private + */ + + id: root + + readonly property real defaultTime: 3000 + property real time: defaultTime + readonly property real fadeTime: 300 + + property real margin: 10 + + anchors { + left: parent.left + right: parent.right + margins: margin + } + + height: message.height + margin + + background: Rectangle { + color: (Material.theme == Material.Dark) ? "#212121" : "#dcdedc" + radius: margin + } + + opacity: 0 + + Text { + id: message + color: (Material.theme == Material.Dark) ? "#f1f1f1" : "#010101" + wrapMode: Text.Wrap + horizontalAlignment: Text.AlignHCenter + anchors { + top: parent.top + left: parent.left + right: parent.right + margins: margin / 2 + } + } + + SequentialAnimation on opacity { + id: animation + running: false + + + NumberAnimation { + to: .9 + duration: fadeTime + } + + PauseAnimation { + duration: time - 2 * fadeTime + } + + NumberAnimation { + to: 0 + duration: fadeTime + } + + onRunningChanged: { + if (!running && selfDestroying) { + root.destroy(); + } + } + } +} diff --git a/src/ToastManager.qml b/src/ToastManager.qml new file mode 100644 index 0000000..b448905 --- /dev/null +++ b/src/ToastManager.qml @@ -0,0 +1,84 @@ +/* + * This file is part of Remote Support Desktop + * https://gitlab.das-netzwerkteam.de/RemoteWebApp/remote-support-desktop + * 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 + * 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 . + */ + +import QtQuick 2.0 + +/** + * adapted from StackOverflow: + * http://stackoverflow.com/questions/26879266/make-toast-in-android-by-qml + * GitHub Gist: https://gist.github.com/jonmcclung/bae669101d17b103e94790341301c129 + * @brief Manager that creates Toasts dynamically + */ +ListView { + /** + * Public + */ + + /** + * @brief Shows a Toast + * + * @param {string} text Text to show + * @param {real} duration Duration to show in milliseconds, defaults to 3000 + */ + function show(text, duration) { + model.insert(0, {text: text, duration: duration}); + } + + /** + * Private + */ + + id: root + + z: Infinity + spacing: 5 + anchors.fill: parent + // parent.height * 0.1 = height of blue header rectangle on main + anchors.topMargin: parent.height * 0.1 + 5 + verticalLayoutDirection: ListView.TopToBottom + + interactive: false + + displaced: Transition { + NumberAnimation { + properties: "y" + easing.type: Easing.InOutQuad + } + } + + delegate: Toast { + Component.onCompleted: { + if (typeof duration === "undefined") { + show(text); + } + else { + show(text, duration); + } + } + } + + model: ListModel {id: model} +} diff --git a/src/main.cpp b/src/main.cpp index 381bc9c..2b1837a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -61,27 +61,26 @@ int main(int argc, char *argv[]) { QQmlApplicationEngine engine(&app); QScopedPointer main_gui (new MainQMLAdaptor(&app, &engine)); - //MainQMLAdaptor *main_gui = new MainQMLAdaptor(&app, &engine); + // Make mainqmladaptor available to QML engine.rootContext()->setContextProperty("mainqmladaptor", main_gui.data()); qDebug() << "'mainqmladaptor' is now available in QML context."; - engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + engine.load(QUrl(QStringLiteral("qrc:/src/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; QScopedPointer session (new Session(&app, main_gui.data())); - //Session *session = new Session(&app, &engine, main_gui); QObject::connect(main_gui.data(), - SIGNAL(minimizeWindow()), - engine.rootObjects().takeFirst(), - SLOT(minimizeWindow())); + SIGNAL(minimizeWindow()), + engine.rootObjects().takeFirst(), + SLOT(minimizeWindow())); QObject::connect(main_gui.data(), - SIGNAL(showWindow()), - engine.rootObjects().takeFirst(), - SLOT(showWindow())); + SIGNAL(showWindow()), + engine.rootObjects().takeFirst(), + SLOT(showWindow())); // We don't want users to have multiple instances of this app running QString tmpDirPath = QDir::tempPath() + "/rwa.support.desktopapp"; diff --git a/src/main.qml b/src/main.qml new file mode 100644 index 0000000..ac4b503 --- /dev/null +++ b/src/main.qml @@ -0,0 +1,386 @@ +/* + * This file is part of Remote Support Desktop + * https://gitlab.das-netzwerkteam.de/RemoteWebApp/remote-support-desktop + * 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 + * 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 . + */ + +import QtQuick 2.9 +import QtQuick.Window 2.2 +import QtQuick.Extras 1.4 +import QtQuick.Controls 2.2 +import QtQuick.Controls.Styles 1.4 +import QtQuick.Dialogs 1.2 +import QtQuick.Controls.Material 2.3 +import "scenes" as Scenes +//import "ListItem.qml" + +ApplicationWindow { + readonly property int normal_width: 650 + readonly property int normal_height: 500 + readonly property bool inPortrait: window.width < window.height + + minimumWidth: 400 + minimumHeight: 460 + + width: normal_width + height: normal_height + + id: window + visible: true + title: qsTr("Remote Support for your Desktop") + + onClosing: { + mainqmladaptor.onCloseHandler(); + } + + function minimizeWindow() { + showMinimized(); + console.log("Miniming window now..."); + } + + function showWindow() { + showNormal(); + console.log("Opening window now..."); + } + + MessageDialog { + id: message_dialog + objectName: "message_dialog" + title: qsTr("Remote Support for your Desktop") + text: qsTr("You are not supposed to see this message.\nThis is a bug.") + icon: StandardIcon.Critical + } + + Connections { + target: mainqmladaptor + onShowToastSignal: { + toast.show(text, durationMs) + } + } + + Connections { + target: mainqmladaptor + onShowMessageDialogChanged: { + message_dialog.visible = show + } + } + + + StackView { + id: main_content + anchors.top: top_menu_bar_frame.bottom + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.leftMargin: !inPortrait ? sidebar_drawer.width : 0 + anchors.topMargin: 0 + initialItem: "scenes/Scene_placeholder.qml" + +// Scenes.Scene_remote_control { +// id: scene_remote_control +// anchors.bottom: parent.bottom +// anchors.bottomMargin: 0 +// anchors.left: parent.left +// anchors.right: parent.right +// anchors.rightMargin: 0 +// anchors.top: parent.top +// anchors.topMargin: 0 +// visible: false +// } + +// Scenes.Scene_remote_view { +// id: scene_remote_view +// anchors.bottom: parent.bottom +// anchors.bottomMargin: 0 +// anchors.left: parent.left +// anchors.right: parent.right +// anchors.rightMargin: 0 +// anchors.top: parent.top +// anchors.topMargin: 0 +// visible: false +// } + +// Scenes.Scene_settings { +// id: scene_settings +// anchors.bottom: parent.bottom +// anchors.bottomMargin: 0 +// anchors.left: parent.left +// anchors.right: parent.right +// anchors.rightMargin: 0 +// anchors.top: parent.top +// anchors.topMargin: 0 +// visible: false +// } + } + + ToastManager { + id: toast + anchors.leftMargin: inPortrait ? 0 : sidebar_drawer.width + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.top: parent.top + } + + Connections { + target: mainqmladaptor + onMessageDialogTextChanged: { + message_dialog.text = text + } + } + + Connections { + target: mainqmladaptor + onMessageDialogTitleChanged: { + message_dialog.title = title + } + } + + Connections { + target: mainqmladaptor + onMessageDialogIconChanged: { + message_dialog.icon = iconindex + } + } + + Drawer { + id: sidebar_drawer + y: top_menu_bar_frame.height + + width: !inPortrait ? Math.min(300, (window.width * 0.333)) : (window.width * 0.5) + height: window.height - top_menu_bar_frame.height + + modal: inPortrait + interactive: inPortrait + position: inPortrait ? 0 : 1 + dragMargin: 1 + margins: -2 + visible: !inPortrait + + ListView { + id: sidebar_listview + boundsBehavior: Flickable.StopAtBounds + interactive: true + clip: true + anchors.fill: parent + model: mainModel + + /*header: ItemDelegate { + id: header + width: parent.width + height: server_chooser.height + server_chooser_label.height + + Text { + id: server_chooser_label + anchors.top: parent.top + anchors.left: parent.left + anchors.margins: 0 + padding: 15 + height: 35 + color: Material.foreground + text: qsTr("RWA-Server:") + font.bold: true + } + + ComboBox { + id: server_chooser + width: parent.width + parent: header + height: 50 + anchors.left: parent.left + anchors.leftMargin: 15 + anchors.right: parent.right + anchors.rightMargin: 15 + anchors.bottom: header_seperator.top + model: [ "example.com/rwa", "rwa-server.example.org:1000", "rwa.example.com:1337" ] + + popup.width: Math.min(500, server_chooser.contentItem.childrenRect.width) + } + +// Image { +// id: rwa_logo +// anchors.left: parent.left +// anchors.leftMargin: 15 +// anchors.verticalCenter: parent.verticalCenter +// source: "../images/RWA-logo.png" +// height: parent.height +// fillMode: Image.PreserveAspectFit +// } + +// onClicked: { +// main_content.replace("scenes/Scene_settings.qml") +// if (inPortrait) { +// sidebar_drawer.close() +// } +// } + + MenuSeparator { + id: header_seperator + parent: header + width: parent.width + anchors.verticalCenter: parent.bottom + } + }*/ + + footer: ItemDelegate { + id: footer + text: " " + qsTr("Settings") + width: parent.width + + onClicked: { + var scene_url = "scenes/Scene_placeholder.qml" + header_text.text = qsTr("Settings") + if(inPortrait) sidebar_drawer.close() + + if(scene_url.search(main_content.currentItem.objectName) <= 0) { + main_content.replace(scene_url) + } + } + + MenuSeparator { + parent: footer + width: parent.width + anchors.verticalCenter: parent.top + } + } + + VisualItemModel { + id: mainModel + ListItem { + text: " " + qsTr("Remote Control") + scene_url: "scenes/Scene_remote_control.qml" + onListItemClick: { + header_text.text = qsTr("Allow remote control") + if(inPortrait) sidebar_drawer.close() + + if(scene_url.search(main_content.currentItem.objectName) <= 0) { + main_content.replace(scene_url) + } + } + } + ListItem { + text: " " + qsTr("Remote View") + scene_url: "scenes/Scene_remote_view.qml" + onListItemClick: { + header_text.text = qsTr("Allow remote view") + if(inPortrait) sidebar_drawer.close() + + if(scene_url.search(main_content.currentItem.objectName) <= 0) { + main_content.replace(scene_url) + } + } + } + ListItem { + text: " " + qsTr("Add RWA-Server") + scene_url: "scenes/Scene_placeholder.qml" + onListItemClick: { + header_text.text = qsTr("Server addition wizard") + if(inPortrait) sidebar_drawer.close() + + if(scene_url.search(main_content.currentItem.objectName) <= 0) { + main_content.replace(scene_url) + } + } + } + } + + ScrollIndicator.vertical: ScrollIndicator { } + } + } + + // Set dark/light theme based on the slider setting + Material.theme: theme.position < 1 ? Material.Light : Material.Dark + + ToolBar { + id: top_menu_bar_frame + width: parent.width + height: parent.height * 0.10 + + background: Rectangle { + color: parent.Material.background + border.color: parent.Material.background + } + Material.background: "#0d5eaf" + Material.foreground: "#ffffff" + + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.top: parent.top + anchors.topMargin: 0 + + Switch { + id: theme + width: 150 + implicitWidth: 100 + visible: !inPortrait + + height: parent.height + anchors.margins: 10 + text: qsTr("Dark theme") + anchors.left: parent.left + anchors.verticalCenterOffset: 0 + anchors.leftMargin: 0 + anchors.verticalCenter: parent.verticalCenter + checked: true + } + + Label { + id: header_text + height: parent.height + color: "#ffffff" + text: qsTr("Allow Remote Control") + anchors.left: theme.right + anchors.leftMargin: 5 + horizontalAlignment: Text.AlignRight + padding: 5 + font.family: "Verdana" + font.pointSize: 20 + fontSizeMode: Text.Fit + verticalAlignment: Text.AlignVCenter + anchors.right: parent.right + anchors.rightMargin: 5 + anchors.verticalCenter: parent.verticalCenter + } + + Button { + id: burger_button + width: 50 + height: parent.height + 10 + visible: inPortrait + + text: "≡" + checkable: false + font.pointSize: 24 + flat: true + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.verticalCenter: parent.verticalCenter + enabled: !sidebar_drawer.opened + + onClicked: { + sidebar_drawer.open() + enabled: false + } + } + } +} diff --git a/src/scenes/Scene_placeholder.qml b/src/scenes/Scene_placeholder.qml new file mode 100644 index 0000000..fcb6134 --- /dev/null +++ b/src/scenes/Scene_placeholder.qml @@ -0,0 +1,57 @@ +import QtQuick 2.9 +import QtQuick.Window 2.2 +import QtQuick.Extras 1.4 +import QtQuick.Controls 2.2 +import QtQuick.Dialogs 1.2 +import QtQuick.Controls.Material 2.3 + +Item { + id: scene_placeholder + objectName: "Scene_placeholder" + + Rectangle { + id: rectangle + anchors.fill: parent + color: Material.background + + Text { + color: Material.foreground + id: title + + text: qsTr("This is the placeholder scene!") + font.pointSize: 18 + wrapMode: Text.WordWrap + + font.bold: true + horizontalAlignment: Text.AlignHCenter + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: 5 + } + + Text { + color: Material.foreground + anchors.top: title.bottom + anchors.margins: 5 + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + + wrapMode: Text.WordWrap + text: qsTr("The feature you expected here are not yet implemented.") + horizontalAlignment: Text.AlignHCenter + } + } +} + + + + + + + +/*##^## Designer { + D{i:0;autoSize:true;height:480;width:640} +} + ##^##*/ diff --git a/src/scenes/Scene_remote_control.qml b/src/scenes/Scene_remote_control.qml new file mode 100644 index 0000000..ea59ea7 --- /dev/null +++ b/src/scenes/Scene_remote_control.qml @@ -0,0 +1,368 @@ +import QtQuick 2.9 +import QtQuick.Window 2.2 +import QtQuick.Extras 1.4 +import QtQuick.Controls 2.2 +import QtQuick.Dialogs 1.2 +import QtQuick.Controls.Material 2.3 + +Item { + id: scene_remote_control + objectName: "Scene_remote_control" + + Label { + id: dbus_api_status_text + text: "Unknown state of Service" + anchors.leftMargin: 10 + 5 + dbus_api_status_indicator.width + anchors.bottom: parent.bottom + anchors.bottomMargin: 10 + wrapMode: Text.WrapAtWordBoundaryOrAnywhere + verticalAlignment: Text.AlignVCenter + font.pointSize: 11 + fontSizeMode: Text.Fit + objectName: "dbus_api_status_text" + anchors.left: parent.left + + StatusIndicator { + id: dbus_api_status_indicator + width: height + height: parent.height + objectName: "dbus_api_status_indicator" + color: "#73d216" + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.left + anchors.rightMargin: 5 + active: false + } + } + + Label { + id: explain_function_label + text: qsTr("Please tell your remote support partner your access address and your access-PIN to let your partner connect to this computer.") + font.pixelSize: 18 + fontSizeMode: Text.VerticalFit + wrapMode: Text.WordWrap + anchors.left: parent.left + anchors.leftMargin: 10 + anchors.top: parent.top + anchors.topMargin: 10 + anchors.right: parent.right + anchors.rightMargin: 10 + horizontalAlignment: Text.AlignLeft + enabled: false + + color: Material.theme == Material.Light ? "#000000" : "#FFFFFF" + } + + Rectangle { + id: dbus_api_status_line + y: 379 + height: 1 + radius: 1 + anchors.right: parent.right + anchors.rightMargin: 10 + anchors.bottom: dbus_api_status_text.top + anchors.bottomMargin: 10 + opacity: 0.3 + gradient: Gradient { + GradientStop { + position: 0.391 + color: "#ffffff" + } + + GradientStop { + position: 0.975 + color: "#8b8b8b" + } + } + border.width: 1 + border.color: "#00000000" + anchors.left: parent.left + anchors.leftMargin: 10 + } + + Column { + id: column + spacing: 6 + anchors.right: parent.right + anchors.rightMargin: 10 + anchors.left: parent.left + anchors.leftMargin: 10 + anchors.bottom: dbus_api_status_line.top + anchors.bottomMargin: 10 + anchors.top: explain_function_label.bottom + anchors.topMargin: 10 + + Column { + id: url_group + width: parent.width + height: parent.height * 0.25 + spacing: 5 + + Label { + id: your_url_text + height: parent.height/2 + text: qsTr("Remote Support Address") + font.weight: Font.Bold + font.bold: true + verticalAlignment: Text.AlignBottom + horizontalAlignment: Text.AlignLeft + font.pointSize: 14 + fontSizeMode: Text.Fit + } + + TextEdit { + id: url_text + height: parent.height/2 + text: mainqmladaptor.url + anchors.rightMargin: 10 + copy_url_to_clipboard_button.width + anchors.right: parent.right + wrapMode: Text.WrapAtWordBoundaryOrAnywhere + anchors.leftMargin: 10 + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignLeft + font.pointSize: 15 + + readOnly: true + color: Material.foreground + selectByMouse: true + anchors.left: parent.left + + leftPadding: 5 + Rectangle { + radius: 5 + color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" + height: url_text.height + // whole line + copy-into-clipboard button + some margin + width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5 + x: 0; y: 0 + z: -1 + } + + Button { + id: copy_url_to_clipboard_button + width: copy_url_to_clipboard_image.width + 6 + height: copy_url_to_clipboard_image.height + 6 + 10 + anchors.verticalCenter: parent.verticalCenter + display: AbstractButton.IconOnly + anchors.leftMargin: 5 + anchors.left: url_text.right + highlighted: false + flat: true + + Image { + id: copy_url_to_clipboard_image + x: 0 + y: -26 + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + source: "../../images/into-clipboard.svg" + opacity: 0.65 + } + + onClicked: { + mainqmladaptor.handleCopyToClipboardButtonClick(url_text.text); + toast.show(qsTr("Copied access address into clipboard!"), "1000"); + } + + ToolTip.text: qsTr("Copy the access address into the clipboard") + hoverEnabled: true + + ToolTip.delay: 1000 + ToolTip.timeout: 5000 + ToolTip.visible: hovered + } + } + } + + Column { + id: session_id_group + width: parent.width + height: parent.height * 0.25 + spacing: 5 + + Label { + id: your_session_id_text + height: parent.height/2 + text: qsTr("Session-ID") + font.weight: Font.Bold + font.bold: true + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + font.pointSize: 14 + verticalAlignment: Text.AlignBottom + horizontalAlignment: Text.AlignLeft + fontSizeMode: Text.Fit + } + + TextEdit { + objectName: "session_id_text" + id: session_id_text + height: parent.height/2 + text: mainqmladaptor.session_id + font.letterSpacing: 10 + anchors.rightMargin: 10 + copy_session_id_to_clipboard_button.width + anchors.right: parent.right + font.pointSize: 15 + anchors.left: parent.left + anchors.leftMargin: 10 + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + + leftPadding: 5 + Rectangle { + radius: 5 + color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" + height: url_text.height + // whole line + copy-into-clipboard button + some margin + width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5 + x: 0; y: 0 + z: -1 + } + + readOnly: true + color: Material.foreground + wrapMode: Text.WordWrap + selectByMouse: true + + Button { + id: copy_session_id_to_clipboard_button + width: copy_session_id_to_clipboard_image.width + 6 + height: copy_session_id_to_clipboard_image.height + 6 + 10 + anchors.verticalCenter: parent.verticalCenter + flat: true + display: AbstractButton.IconOnly + anchors.left: session_id_text.right + anchors.leftMargin: 5 + + Image { + id: copy_session_id_to_clipboard_image + anchors.horizontalCenter: parent.horizontalCenter + opacity: 0.65 + anchors.verticalCenter: parent.verticalCenter + source: "../../images/into-clipboard.svg" + fillMode: Image.PreserveAspectFit + } + + onClicked: { + mainqmladaptor.handleCopyToClipboardButtonClick(pin_text.text); + toast.show(qsTr("Copied session-ID into clipboard!"), "1000"); + } + + ToolTip.text: qsTr("Copy the session-ID into the clipboard") + hoverEnabled: true + + ToolTip.delay: 1000 + ToolTip.timeout: 5000 + ToolTip.visible: hovered + } + } + } + + Column { + id: pin_group + width: parent.width + height: parent.height * 0.25 + spacing: 5 + + Label { + id: your_pin_text + height: parent.height/2 + text: qsTr("Access-PIN") + font.weight: Font.Bold + font.bold: true + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + font.pointSize: 14 + verticalAlignment: Text.AlignBottom + horizontalAlignment: Text.AlignLeft + } + + TextEdit { + objectName: "pin_text" + id: pin_text + height: parent.height/2 + text: mainqmladaptor.pin + anchors.rightMargin: 10 + copy_pin_to_clipboard_button.width + anchors.right: parent.right + font.pointSize: 15 + anchors.left: parent.left + anchors.leftMargin: 10 + font.letterSpacing: 10 + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + + leftPadding: 5 + Rectangle { + radius: 5 + color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" + height: url_text.height + // whole line + copy-into-clipboard button + some margin + width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5 + x: 0; y: 0 + z: -1 + } + + readOnly: true + color: Material.foreground + wrapMode: Text.WordWrap + selectByMouse: true + + Button { + id: copy_pin_to_clipboard_button + width: copy_pin_to_clipboard_image.width + 6 + height: copy_pin_to_clipboard_image.height + 6 + 10 + anchors.verticalCenter: parent.verticalCenter + flat: true + display: AbstractButton.IconOnly + anchors.left: pin_text.right + anchors.leftMargin: 5 + + Image { + id: copy_pin_to_clipboard_image + anchors.verticalCenter: parent.verticalCenter + opacity: 0.65 + anchors.horizontalCenter: parent.horizontalCenter + source: "../../images/into-clipboard.svg" + fillMode: Image.PreserveAspectFit + } + + onClicked: { + mainqmladaptor.handleCopyToClipboardButtonClick(pin_text.text); + toast.show(qsTr("Copied PIN into clipboard!"), "1000"); + } + + ToolTip.text: qsTr("Copy the pin into the clipboard") + hoverEnabled: true + + ToolTip.delay: 1000 + ToolTip.timeout: 5000 + ToolTip.visible: hovered + } + } + } + + } + + Button { + id: start_support_button + height: Math.min(50) + objectName: "start_support_button" + text: qsTr("Start remote support session") + anchors.rightMargin: column.anchors.leftMargin + anchors.bottom: dbus_api_status_line.top + anchors.bottomMargin: 10 + anchors.right: parent.right + checkable: true + + onClicked: mainqmladaptor.handleConnectButtonClick(checked); + } +} + +/*##^## Designer { + D{i:0;autoSize:true;height:480;width:640} +} + ##^##*/ diff --git a/src/scenes/Scene_remote_view.qml b/src/scenes/Scene_remote_view.qml new file mode 100644 index 0000000..cea5ccf --- /dev/null +++ b/src/scenes/Scene_remote_view.qml @@ -0,0 +1,366 @@ +import QtQuick 2.9 +import QtQuick.Window 2.2 +import QtQuick.Extras 1.4 +import QtQuick.Controls 2.2 +import QtQuick.Dialogs 1.2 +import QtQuick.Controls.Material 2.3 + +Item { + id: scene_remote_view + objectName: "Scene_remote_view" + + Label { + id: dbus_api_status_text + text: "Unknown state of Service" + anchors.leftMargin: 10 + 5 + dbus_api_status_indicator.width + anchors.bottom: parent.bottom + anchors.bottomMargin: 10 + wrapMode: Text.WrapAtWordBoundaryOrAnywhere + verticalAlignment: Text.AlignVCenter + font.pointSize: 11 + fontSizeMode: Text.Fit + objectName: "dbus_api_status_text" + anchors.left: parent.left + + StatusIndicator { + id: dbus_api_status_indicator + width: height + height: parent.height + objectName: "dbus_api_status_indicator" + color: "#73d216" + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.left + anchors.rightMargin: 5 + active: false + } + } + + Label { + id: explain_function_label + text: qsTr("Please tell your remote support partner your access address and your access-PIN to let your partner connect to this computer.") + font.pixelSize: 18 + fontSizeMode: Text.VerticalFit + wrapMode: Text.WordWrap + anchors.left: parent.left + anchors.leftMargin: 10 + anchors.top: parent.top + anchors.topMargin: 10 + anchors.right: parent.right + anchors.rightMargin: 10 + horizontalAlignment: Text.AlignLeft + enabled: false + + color: Material.theme == Material.Light ? "#000000" : "#FFFFFF" + } + + Rectangle { + id: dbus_api_status_line + y: 379 + height: 1 + radius: 1 + anchors.right: parent.right + anchors.rightMargin: 10 + anchors.bottom: dbus_api_status_text.top + anchors.bottomMargin: 10 + opacity: 0.3 + gradient: Gradient { + GradientStop { + position: 0.391 + color: "#ffffff" + } + + GradientStop { + position: 0.975 + color: "#8b8b8b" + } + } + border.width: 1 + border.color: "#00000000" + anchors.left: parent.left + anchors.leftMargin: 10 + } + + Column { + id: column + spacing: 6 + anchors.right: parent.right + anchors.rightMargin: 10 + anchors.left: parent.left + anchors.leftMargin: 10 + anchors.bottom: dbus_api_status_line.top + anchors.bottomMargin: 10 + anchors.top: explain_function_label.bottom + anchors.topMargin: 10 + + Column { + id: url_group + width: parent.width + height: parent.height * 0.25 + spacing: 5 + + Label { + id: your_url_text + height: parent.height/2 + text: qsTr("Remote viewing Address") + font.weight: Font.Bold + font.bold: true + verticalAlignment: Text.AlignBottom + horizontalAlignment: Text.AlignLeft + font.pointSize: 14 + fontSizeMode: Text.Fit + } + + TextEdit { + id: url_text + height: parent.height/2 + text: mainqmladaptor.url + anchors.rightMargin: 10 + copy_url_to_clipboard_button.width + anchors.right: parent.right + wrapMode: Text.WrapAtWordBoundaryOrAnywhere + anchors.leftMargin: 10 + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignLeft + font.pointSize: 15 + + readOnly: true + color: Material.foreground + selectByMouse: true + anchors.left: parent.left + + leftPadding: 5 + Rectangle { + radius: 5 + color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" + height: url_text.height + // whole line + copy-into-clipboard button + some margin + width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5 + x: 0; y: 0 + z: -1 + } + + Button { + id: copy_url_to_clipboard_button + width: copy_url_to_clipboard_image.width + 6 + height: copy_url_to_clipboard_image.height + 6 + 10 + anchors.verticalCenter: parent.verticalCenter + display: AbstractButton.IconOnly + anchors.leftMargin: 5 + anchors.left: url_text.right + highlighted: false + flat: true + + Image { + id: copy_url_to_clipboard_image + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + source: "../../images/into-clipboard.svg" + opacity: 0.65 + } + + onClicked: { + mainqmladaptor.handleCopyToClipboardButtonClick(url_text.text); + toast.show(qsTr("Copied access address into clipboard!"), "1000"); + } + + ToolTip.text: qsTr("Copy the access address into the clipboard") + hoverEnabled: true + + ToolTip.delay: 1000 + ToolTip.timeout: 5000 + ToolTip.visible: hovered + } + } + } + + Column { + id: session_id_group + width: parent.width + height: parent.height * 0.25 + spacing: 5 + + Label { + id: your_session_id_text + height: parent.height/2 + text: qsTr("Session-ID") + font.weight: Font.Bold + font.bold: true + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + font.pointSize: 14 + verticalAlignment: Text.AlignBottom + horizontalAlignment: Text.AlignLeft + fontSizeMode: Text.Fit + } + + TextEdit { + objectName: "session_id_text" + id: session_id_text + height: parent.height/2 + text: mainqmladaptor.session_id + font.letterSpacing: 10 + anchors.rightMargin: 10 + copy_session_id_to_clipboard_button.width + anchors.right: parent.right + font.pointSize: 15 + anchors.left: parent.left + anchors.leftMargin: 10 + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + + leftPadding: 5 + Rectangle { + radius: 5 + color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" + height: url_text.height + // whole line + copy-into-clipboard button + some margin + width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5 + x: 0; y: 0 + z: -1 + } + + readOnly: true + color: Material.foreground + wrapMode: Text.WordWrap + selectByMouse: true + + Button { + id: copy_session_id_to_clipboard_button + width: copy_session_id_to_clipboard_image.width + 6 + height: copy_session_id_to_clipboard_image.height + 6 + 10 + anchors.verticalCenter: parent.verticalCenter + flat: true + display: AbstractButton.IconOnly + anchors.left: session_id_text.right + anchors.leftMargin: 5 + + Image { + id: copy_session_id_to_clipboard_image + anchors.horizontalCenter: parent.horizontalCenter + opacity: 0.65 + anchors.verticalCenter: parent.verticalCenter + source: "../../images/into-clipboard.svg" + fillMode: Image.PreserveAspectFit + } + + onClicked: { + mainqmladaptor.handleCopyToClipboardButtonClick(pin_text.text); + toast.show(qsTr("Copied session-ID into clipboard!"), "1000"); + } + + ToolTip.text: qsTr("Copy the session-ID into the clipboard") + hoverEnabled: true + + ToolTip.delay: 1000 + ToolTip.timeout: 5000 + ToolTip.visible: hovered + } + } + } + + Column { + id: pin_group + width: parent.width + height: parent.height * 0.25 + spacing: 5 + + Label { + id: your_pin_text + height: parent.height/2 + text: qsTr("Access-PIN") + font.weight: Font.Bold + font.bold: true + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + font.pointSize: 14 + verticalAlignment: Text.AlignBottom + horizontalAlignment: Text.AlignLeft + } + + TextEdit { + objectName: "pin_text" + id: pin_text + height: parent.height/2 + text: mainqmladaptor.pin + anchors.rightMargin: 10 + copy_pin_to_clipboard_button.width + anchors.right: parent.right + font.pointSize: 15 + anchors.left: parent.left + anchors.leftMargin: 10 + font.letterSpacing: 10 + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + + leftPadding: 5 + Rectangle { + radius: 5 + color: Material.theme == Material.Light ? "#F0F0F0" : "#383838" + height: url_text.height + // whole line + copy-into-clipboard button + some margin + width: url_text.width + copy_url_to_clipboard_button.width + 5 + 5 + x: 0; y: 0 + z: -1 + } + + readOnly: true + color: Material.foreground + wrapMode: Text.WordWrap + selectByMouse: true + + Button { + id: copy_pin_to_clipboard_button + width: copy_pin_to_clipboard_image.width + 6 + height: copy_pin_to_clipboard_image.height + 6 + 10 + anchors.verticalCenter: parent.verticalCenter + flat: true + display: AbstractButton.IconOnly + anchors.left: pin_text.right + anchors.leftMargin: 5 + + Image { + id: copy_pin_to_clipboard_image + anchors.verticalCenter: parent.verticalCenter + opacity: 0.65 + anchors.horizontalCenter: parent.horizontalCenter + source: "../../images/into-clipboard.svg" + fillMode: Image.PreserveAspectFit + } + + onClicked: { + mainqmladaptor.handleCopyToClipboardButtonClick(pin_text.text); + toast.show(qsTr("Copied PIN into clipboard!"), "1000"); + } + + ToolTip.text: qsTr("Copy the pin into the clipboard") + hoverEnabled: true + + ToolTip.delay: 1000 + ToolTip.timeout: 5000 + ToolTip.visible: hovered + } + } + } + + } + + Button { + id: start_support_button + height: Math.min(50) + objectName: "start_support_button" + text: qsTr("Start remote viewing session") + anchors.rightMargin: column.anchors.leftMargin + anchors.bottom: dbus_api_status_line.top + anchors.bottomMargin: 10 + anchors.right: parent.right + checkable: true + + onClicked: mainqmladaptor.handleConnectButtonClick(checked); + } +} + +/*##^## Designer { + D{i:0;autoSize:true;height:480;width:640} +} + ##^##*/ diff --git a/src/scenes/Scene_settings.qml b/src/scenes/Scene_settings.qml new file mode 100644 index 0000000..5a29071 --- /dev/null +++ b/src/scenes/Scene_settings.qml @@ -0,0 +1,29 @@ +import QtQuick 2.9 +import QtQuick.Window 2.2 +import QtQuick.Extras 1.4 +import QtQuick.Controls 2.2 +import QtQuick.Dialogs 1.2 +import QtQuick.Controls.Material 2.3 + +Item { + id: scene_settings + objectName: "Scene_settings" + + Rectangle { + id: rectangle + anchors.fill: parent + color: Material.background + + Text { + color: Material.foreground + text: "Settings tab!" + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + } + } +} + +/*##^## Designer { + D{i:0;autoSize:true;height:480;width:640} +} + ##^##*/ -- cgit v1.2.3