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 --- 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 +++ 9 files changed, 1450 insertions(+), 9 deletions(-) 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 (limited to 'src') 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