From 6d6bd6fe8fc7a59bbad2f6426d7b34957c187048 Mon Sep 17 00:00:00 2001 From: tanaevms Date: Sun, 3 Sep 2023 18:49:20 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BA=D0=BD=D0=BE=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 24 ++ QML_Balancer.qmlproject | 99 +++++ README.md | 0 content/App.qml | 51 +++ content/CMakeLists.txt | 13 + content/LabelGTL.qml | 11 + content/Screen01.ui.qml | 248 +++++++++++ content/SettingsBar.ui.qml | 405 ++++++++++++++++++ content/Tabbar.qml | 197 +++++++++ content/TextFieldGTL.qml | 35 ++ content/TextGTL.qml | 14 + content/Toggle.ui.qml | 84 ++++ content/fonts/fonts.txt | 1 + content/images/NOTICE.txt | 2 + content/images/button_default.png | Bin 0 -> 1406 bytes content/images/button_pressed.png | Bin 0 -> 1694 bytes content/images/curtain_shadow_handle.png | Bin 0 -> 1787 bytes content/images/info.png | Bin 0 -> 439 bytes content/images/info_selected.png | Bin 0 -> 368 bytes content/images/list.png | Bin 0 -> 179 bytes content/images/list_selected.png | Bin 0 -> 159 bytes content/images/navigation_next_item.png | Bin 0 -> 1341 bytes content/images/navigation_previous_item.png | Bin 0 -> 1343 bytes content/images/search_cancel.png | Bin 0 -> 322 bytes content/images/settings.png | Bin 0 -> 630 bytes content/images/tab_selected.png | Bin 0 -> 217 bytes content/images/tabs_standard.png | Bin 0 -> 1230 bytes content/images/textinput.png | Bin 0 -> 4132 bytes content/images/toolbar.png | Bin 0 -> 1643 bytes content/images/top_curtain_drag_back.png | Bin 0 -> 4383 bytes imports/CMakeLists.txt | 4 + imports/QML_Balancer/CMakeLists.txt | 18 + imports/QML_Balancer/Constants.qml | 27 ++ imports/QML_Balancer/DirectoryFontLoader.qml | 60 +++ imports/QML_Balancer/EventListModel.qml | 41 ++ imports/QML_Balancer/EventListSimulator.qml | 51 +++ imports/QML_Balancer/designer/plugin.metainfo | 13 + imports/QML_Balancer/qmldir | 6 + main.qml | 8 + qmlmodules | 17 + qtquickcontrols2.conf | 15 + src/app_environment.h | 14 + src/import_qml_plugins.h | 9 + src/main.cpp | 62 +++ 44 files changed, 1529 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 QML_Balancer.qmlproject create mode 100644 README.md create mode 100644 content/App.qml create mode 100644 content/CMakeLists.txt create mode 100644 content/LabelGTL.qml create mode 100644 content/Screen01.ui.qml create mode 100644 content/SettingsBar.ui.qml create mode 100644 content/Tabbar.qml create mode 100644 content/TextFieldGTL.qml create mode 100644 content/TextGTL.qml create mode 100644 content/Toggle.ui.qml create mode 100644 content/fonts/fonts.txt create mode 100644 content/images/NOTICE.txt create mode 100644 content/images/button_default.png create mode 100644 content/images/button_pressed.png create mode 100644 content/images/curtain_shadow_handle.png create mode 100644 content/images/info.png create mode 100644 content/images/info_selected.png create mode 100644 content/images/list.png create mode 100644 content/images/list_selected.png create mode 100644 content/images/navigation_next_item.png create mode 100644 content/images/navigation_previous_item.png create mode 100644 content/images/search_cancel.png create mode 100644 content/images/settings.png create mode 100644 content/images/tab_selected.png create mode 100644 content/images/tabs_standard.png create mode 100644 content/images/textinput.png create mode 100644 content/images/toolbar.png create mode 100644 content/images/top_curtain_drag_back.png create mode 100644 imports/CMakeLists.txt create mode 100644 imports/QML_Balancer/CMakeLists.txt create mode 100644 imports/QML_Balancer/Constants.qml create mode 100644 imports/QML_Balancer/DirectoryFontLoader.qml create mode 100644 imports/QML_Balancer/EventListModel.qml create mode 100644 imports/QML_Balancer/EventListSimulator.qml create mode 100644 imports/QML_Balancer/designer/plugin.metainfo create mode 100644 imports/QML_Balancer/qmldir create mode 100644 main.qml create mode 100644 qmlmodules create mode 100644 qtquickcontrols2.conf create mode 100644 src/app_environment.h create mode 100644 src/import_qml_plugins.h create mode 100644 src/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e58a820 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.18) + +project(QML_BalancerApp LANGUAGES CXX) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) + +find_package(Qt6 COMPONENTS Gui Qml Quick) +qt_add_executable(QML_BalancerApp src/main.cpp) + +qt_add_resources(QML_BalancerApp "configuration" + PREFIX "/" + FILES + qtquickcontrols2.conf +) + +target_link_libraries(QML_BalancerApp PRIVATE + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Gui + Qt${QT_VERSION_MAJOR}::Quick + Qt${QT_VERSION_MAJOR}::Qml +) + +include(${CMAKE_CURRENT_SOURCE_DIR}/qmlmodules) diff --git a/QML_Balancer.qmlproject b/QML_Balancer.qmlproject new file mode 100644 index 0000000..cd9ec43 --- /dev/null +++ b/QML_Balancer.qmlproject @@ -0,0 +1,99 @@ +import QmlProject + +Project { + mainFile: "content/App.qml" + + /* Include .qml, .js, and image files from current directory and subdirectories */ + QmlFiles { + directory: "content" + } + + QmlFiles { + directory: "imports" + } + + JavaScriptFiles { + directory: "content" + } + + JavaScriptFiles { + directory: "imports" + } + + ImageFiles { + directory: "content" + } + + Files { + filter: "*.conf" + files: ["qtquickcontrols2.conf"] + } + + Files { + filter: "qmldir" + directory: "." + } + + Files { + filter: "*.ttf;*.otf" + } + + Files { + filter: "*.wav;*.mp3" + } + + Files { + filter: "*.mp4" + } + + Files { + filter: "*.glsl;*.glslv;*.glslf;*.vsh;*.fsh;*.vert;*.frag" + } + + Files { + filter: "*.mesh" + directory: "asset_imports" + } + + Environment { + QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf" + QT_AUTO_SCREEN_SCALE_FACTOR: "1" + QT_LOGGING_RULES: "qt.qml.connections=false" + QT_ENABLE_HIGHDPI_SCALING: "0" + /* Useful for debugging + QSG_VISUALIZE=batches + QSG_VISUALIZE=clip + QSG_VISUALIZE=changes + QSG_VISUALIZE=overdraw + */ + } + + qt6Project: true + + /* List of plugin directories passed to QML runtime */ + importPaths: [ "imports", "asset_imports" ] + + /* Required for deployment */ + targetDirectory: "/opt/QML_Balancer" + + qdsVersion: "3.5" + + quickVersion: "6.2" + + /* If any modules the project imports require widgets (e.g. QtCharts), widgetApp must be true */ + widgetApp: true + + /* args: Specifies command line arguments for qsb tool to generate shaders. + files: Specifies target files for qsb tool. If path is included, it must be relative to this file. + Wildcard '*' can be used in the file name part of the path. + e.g. files: [ "content/shaders/*.vert", "*.frag" ] */ + ShaderTool { + args: "-s --glsl \"100 es,120,150\" --hlsl 50 --msl 12" + files: [ "content/shaders/*" ] + } + + multilanguageSupport: true + supportedLanguages: ["en"] + primaryLanguage: "en" + +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/content/App.qml b/content/App.qml new file mode 100644 index 0000000..2289075 --- /dev/null +++ b/content/App.qml @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Quick Studio Components. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 6.2 +import QtQuick.Window 6.2 +import QML_Balancer +import QtQuick.Controls.Material + +Window { + width: mainScreen.width + height: mainScreen.height + + //Material.theme: darkModeToggle.checked ? Material.Dark : Material.Light + + + + visible: true + title: "Балансировщик" + + Screen01 { + id: mainScreen + } + +} + diff --git a/content/CMakeLists.txt b/content/CMakeLists.txt new file mode 100644 index 0000000..6811415 --- /dev/null +++ b/content/CMakeLists.txt @@ -0,0 +1,13 @@ +### This file is automatically generated by Qt Design Studio. +### Do not change + +qt_add_library(content STATIC) +qt6_add_qml_module(content + URI "content" + VERSION 1.0 + QML_FILES + App.qml + Screen01.ui.qml + RESOURCES + fonts/fonts.txt +) diff --git a/content/LabelGTL.qml b/content/LabelGTL.qml new file mode 100644 index 0000000..e889926 --- /dev/null +++ b/content/LabelGTL.qml @@ -0,0 +1,11 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QML_Balancer 1.0 + +Label { + width: Constants.width + height: Constants.height + font.weight: Font.Normal + font.pointSize: 40 + verticalAlignment: Text.AlignVCenter +} diff --git a/content/Screen01.ui.qml b/content/Screen01.ui.qml new file mode 100644 index 0000000..a212cba --- /dev/null +++ b/content/Screen01.ui.qml @@ -0,0 +1,248 @@ + +/* +This is a UI file (.ui.qml) that is intended to be edited in Qt Design Studio only. +It is supposed to be strictly declarative and only uses a subset of QML. If you edit +this file manually, you might introduce QML code that is not supported by Qt Design Studio. +Check out https://doc.qt.io/qtcreator/creator-quick-ui-forms.html for details on .ui.qml files. +*/ +import QtQuick 6.2 +import QtQuick.Controls 6.2 +import QML_Balancer +import QtQuick.Controls.Material + +Pane { + width: Constants.width + height: Constants.height + + //color: "#606060" + Material.theme: darkModeToggle.checked ? Material.Dark : Material.Light + property url pathImg: "images/textinput.png" + property string headerText: "Шаг 0: Ввод информации(необязательный этап)" + + //textfield0.text: "" //введенные данные с textfield0 + //textfield1.text: "" //введенные данные с textfield1 + //textfield2.text: "" //введенные данные с textfield2 + + + /*SettingsBar { + id: settings + x: 0 + y: 0 + }*/ + Column { + x: -12 + y: -8 + width: 1920 + height: 1072 + rotation: 0 + spacing: 52 + Row { + Toggle { + id: darkModeToggle + text: qsTr("Dark mode") + anchors.top: parent.top + } + ListView { + width: 1097 + height: 62 + //anchors.verticalCenterOffset: -456 + //anchors.horizontalCenterOffset: 1 + + //anchors.centerIn: parent + delegate: TextGTL.mycomponent + + TextGTL { + id: text0 + x: 55 + + text: headerText + elide: Text.ElideNone + leftPadding: 200 + } + } + } + Row { + anchors.top: parent.top + leftPadding: 50 + layoutDirection: Qt.LeftToRight + spacing: 48 + anchors.left: parent.middle + Column { + id: column0 + x: 0 + y: 184 + width: 602 + height: 565 + rotation: 0 + clip: true + spacing: 54 + padding: 0 + //anchors.top: parent.middle + + //add: touchStyle + //add1: touchStyle + //children: [ touchStyle, touchStyle] + LabelGTL { + //anchors.fill: parent + width: 600 + height: 140 + text: "Скорость вращения, об/мин" + font.pointSize: 30 + anchors.top: bottom + rightInset: 0 + verticalAlignment: Text.AlignVCenter + //delegate: TextFieldGTL.mycomponent + + + /*TextFieldGTL { + id: textfield01 + }*/ + } + + LabelGTL { + //anchors.fill: parent + width: 600 + height: 140 + text: "Радиус установки грузов, мм" + //topPadding: 0 + verticalAlignment: Text.AlignVCenter + + font.pointSize: 30 + //delegate: TextFieldGTL.mycomponent + + + /*TextFieldGTL { + id: textfield01 + }*/ + } + LabelGTL { + //anchors.fill: parent + width: 600 + height: 140 + text: "Масса ротора, гр." + + font.pointSize: 30 + + //delegate: TextFieldGTL.mycomponent + + + /*TextFieldGTL { + id: textfield01 + }*/ + } + + + /*ListView { + //anchors.fill: parent + width: 600 + height: 140 + model: 5 + delegate: TextFieldGTL.mycomponent + + TextFieldGTL { + id: textfield11 + } + } + + ListView { + //anchors.fill: parent + width: 600 + height: 140 + model: 5 + delegate: TextFieldGTL.mycomponent + + TextFieldGTL { + id: textfield21 + x: 0 + y: -8 + } + }*/ + } + Column { + id: column1 + x: 792 + y: 184 + width: 602 + height: 565 + rotation: 0 + clip: true + spacing: 54 + padding: 0 + + //add: touchStyle + //add1: touchStyle + //children: [ touchStyle, touchStyle] + ListView { + //anchors.fill: parent + width: 600 + height: 140 + model: 5 + delegate: TextFieldGTL.mycomponent + + TextFieldGTL { + id: textfield0 + } + } + + ListView { + //anchors.fill: parent + width: 600 + height: 140 + model: 5 + delegate: TextFieldGTL.mycomponent + + TextFieldGTL { + id: textfield1 + } + } + + ListView { + //anchors.fill: parent + width: 600 + height: 140 + model: 5 + delegate: TextFieldGTL.mycomponent + + TextFieldGTL { + id: textfield2 + x: 0 + y: -8 + } + } + } + } + } + Button { + id: button + x: 21 + y: 776 + width: 286 + height: 87 + text: qsTr("Button") + } + + /* Rectangle { + id: backButton + width: 0 + //width: opacity ? 60 : 0 + anchors.left: parent + //anchors.leftMargin: 20 + //opacity: stackView.depth > 1 ? 1 : 0 + //anchors.verticalCenter: parent.verticalCenter + antialiasing: true + height: 60 + radius: 4 + color: backmouse.pressed ? "#222" : "transparent" + //Behavior on opacity { NumberAnimation{} } + Image { + anchors.verticalCenter: parent.verticalCenter + source: "images/navigation_previous_item.png" + } + MouseArea { + id: backmouse + anchors.fill: parent + anchors.margins: -10 + //onClicked: stackView.pop() + } + }*/ +} diff --git a/content/SettingsBar.ui.qml b/content/SettingsBar.ui.qml new file mode 100644 index 0000000..8c5beac --- /dev/null +++ b/content/SettingsBar.ui.qml @@ -0,0 +1,405 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Design Studio. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.10 +//import ebikeDesign 1.0 +//import EbikeData 1.0 +import QtQuick.Studio.Components 1.0 +import QtQuick.Controls 2.3 +import QtQuick.Timeline 1.0 +import QtQuick.Layouts 1.3 + +Item { + id: settings + width: Constants.width + height: Constants.height + + state: "closed" + + Rectangle { + id: blocker + x: 0 + width: Constants.width + color: "#464646" + opacity: 0 + anchors.bottom: parent.bottom + anchors.top: stack.bottom + + MouseArea { + id: mouseArea2 + anchors.fill: parent + } + } + + Image { + id: close + x: 564 + y: 44 + source: "images/top_curtain_drag_back.png" + + MouseArea { + id: mouseArea + anchors.rightMargin: -16 + anchors.leftMargin: -16 + anchors.bottomMargin: -16 + anchors.fill: parent + } + } + + Rectangle { + id: stack + x: 0 + y: 44 + width: Constants.width + height: 200 + color: "#0d0d0d" + clip: true + + MouseArea { + anchors.fill: parent + } + + StackLayout { + id: stackLayout + width: Constants.width + currentIndex: tabbar.index + anchors.fill: parent + + Info {} + + GeneralSettings {} + + ViewSettings {} + } + } + + Rectangle { + id: topBar + x: 0 + y: 0 + width: Constants.width + height: 45 + color: "#0d0d0d" + + Image { + id: image4 + x: 1240 + y: 5 + source: "images/search_cancel.png" + } + + Image { + id: image3 + x: 1193 + y: 5 + source: "images/info.png" + } + } + + Image { + id: open + x: 564 + y: 44 + source: "images/top_curtain_drag.png" + + MouseArea { + id: mouseArea1 + anchors.rightMargin: -16 + anchors.leftMargin: -16 + anchors.bottomMargin: -16 + anchors.fill: parent + } + + CustomLabel { + id: customLabel + x: -245 + y: 316 + text: Backend.time + font.pixelSize: 22 + horizontalAlignment: Text.AlignHCenter + anchors.fill: parent + } + } + + Timeline { + id: timeline + animations: [ + TimelineAnimation { + id: openAnimation + onFinished: settings.state = "Open" + loops: 1 + duration: 250 + from: 0 + to: 1000 + running: false + }, + TimelineAnimation { + id: closeAnimation + onFinished: settings.state = "Closed" + loops: 1 + duration: 250 + from: 1000 + to: 0 + running: false + } + ] + endFrame: 1000 + enabled: true + startFrame: 0 + + KeyframeGroup { + target: stack + property: "height" + + Keyframe { + value: 0 + frame: 0 + } + + Keyframe { + easing.bezierCurve: [0.39, 0.575, 0.565, 1, 1, 1] + value: 320 + frame: 1000 + } + + Keyframe { + value: 0 + frame: 89 + } + } + + KeyframeGroup { + target: close + property: "opacity" + Keyframe { + easing.bezierCurve: [0.39, 0.575, 0.565, 1, 1, 1] + value: 1 + frame: 1000 + } + + Keyframe { + value: 0 + frame: 850 + } + + Keyframe { + value: 0 + frame: 0 + } + } + + KeyframeGroup { + target: close + property: "y" + Keyframe { + value: 315 + frame: 850 + } + + Keyframe { + easing.bezierCurve: [0.39, 0.575, 0.565, 1, 1, 1] + value: 360 + frame: 1000 + } + } + + KeyframeGroup { + target: open + property: "opacity" + + Keyframe { + value: 1 + frame: 0 + } + + Keyframe { + value: 0 + frame: 88 + } + } + + KeyframeGroup { + target: tabbar + property: "opacity" + + Keyframe { + value: 0 + frame: 0 + } + + Keyframe { + value: 1 + frame: 1000 + } + } + + KeyframeGroup { + target: blocker + property: "opacity" + Keyframe { + value: 0 + frame: 0 + } + + Keyframe { + value: 0.2 + frame: 1000 + } + + Keyframe { + frame: 794 + value: "0" + } + } + + KeyframeGroup { + target: stackLayout + property: "opacity" + + Keyframe { + value: 0 + frame: 0 + } + + Keyframe { + value: 0 + frame: 300 + } + + Keyframe { + value: 1 + frame: 1000 + } + } + + KeyframeGroup { + target: blocker + property: "anchors.bottomMargin" + Keyframe { + value: 708 + frame: 0 + } + + Keyframe { + value: 0 + frame: 1000 + } + } + } + + Connections { + target: mouseArea + onClicked: { + settings.state = "Closing" + } + } + + Connections { + target: mouseArea1 + onClicked: { + if (settings.state != "Open") + settings.state = "Opening" + } + } + + Tabbar { + id: tabbar + x: 0 + y: 0 + index: 0 + } + + states: [ + State { + name: "Open" + + PropertyChanges { + target: timeline + currentFrame: 1000 + enabled: true + } + }, + State { + name: "Closed" + + PropertyChanges { + target: timeline + currentFrame: 0 + enabled: true + } + }, + State { + name: "Opening" + + PropertyChanges { + target: timeline + enabled: true + } + + PropertyChanges { + target: openAnimation + running: true + } + }, + State { + name: "Closing" + + PropertyChanges { + target: timeline + enabled: true + } + + PropertyChanges { + target: closeAnimation + running: true + } + } + ] +} diff --git a/content/Tabbar.qml b/content/Tabbar.qml new file mode 100644 index 0000000..22de1fc --- /dev/null +++ b/content/Tabbar.qml @@ -0,0 +1,197 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Design Studio. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.10 +//import ebikeDesign 1.0 +import QtQuick.Studio.Components 1.0 +import QtQuick.Controls 2.3 +import QtQuick.Timeline 1.0 +import QtQuick.Layouts 1.3 + +Rectangle { + id: tabbar + width: 1200 + height: 50 + color: "#0d0d0d" + + property int index: 0 + + RowLayout { + y: 0 + anchors.left: parent.left + anchors.right: parent.right + + Image { + id: info + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + source: "images/info.png" + + MouseArea { + id: infoClicked + anchors.rightMargin: -64 + anchors.leftMargin: -64 + anchors.bottomMargin: -4 + anchors.topMargin: -4 + anchors.fill: parent + } + } + + Image { + id: list + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + source: "images/list.png" + + MouseArea { + id: listClicked + anchors.topMargin: -4 + anchors.bottomMargin: -4 + anchors.rightMargin: -64 + anchors.leftMargin: -64 + anchors.fill: parent + } + } + + Image { + id: settings + Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter + source: "images/settings.png" + + MouseArea { + id: settingsClicked + anchors.rightMargin: -64 + anchors.leftMargin: -64 + anchors.bottomMargin: -4 + anchors.topMargin: -4 + anchors.fill: parent + } + } + } + + Rectangle { + id: rectangle + x: 8 + y: 38 + width: 365 + height: 4 + color: "#ffffff" + Behavior on x { + + PropertyAnimation { + duration: 140 + } + } + } + + Connections { + target: listClicked + onClicked: { + tabbar.index = "1" + } + } + + Connections { + target: infoClicked + onClicked: { + tabbar.index = "0" + } + } + + Connections { + target: settingsClicked + onClicked: { + tabbar.index = "2" + } + } + states: [ + State { + name: "Left" + when: tabbar.index === 0 + + PropertyChanges { + target: info + source: "images/info_selected.png" + } + + PropertyChanges { + target: rectangle + x: 8 + } + }, + State { + name: "Middle" + when: tabbar.index === 1 + + PropertyChanges { + target: list + source: "images/list_selected.png" + } + + PropertyChanges { + target: rectangle + x: 418 + } + }, + State { + name: "Right" + when: tabbar.index === 2 + + PropertyChanges { + target: settings + source: "images/settings_selected.png" + } + + PropertyChanges { + target: rectangle + x: 827 + } + } + ] +} + diff --git a/content/TextFieldGTL.qml b/content/TextFieldGTL.qml new file mode 100644 index 0000000..b236025 --- /dev/null +++ b/content/TextFieldGTL.qml @@ -0,0 +1,35 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 +import QML_Balancer 1.0 + +//Item { + + TextField { + id: textfieldgtl + width: 600 + height: 140 + //selectedTextColor: "white" + //placeholderTextColor: "white" + layer.enabled: false + focus: false + antialiasing: false + font.weight: Font.Normal + font.pointSize: 40 + background: Item { + + implicitHeight: 140 + implicitWidth: 600 + BorderImage { + + source: pathImg + border.left: 8 + border.right: 8 + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + } + } + + placeholderText: qsTr("Введите значение") + } +//} diff --git a/content/TextGTL.qml b/content/TextGTL.qml new file mode 100644 index 0000000..03a2d1e --- /dev/null +++ b/content/TextGTL.qml @@ -0,0 +1,14 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +Text { + color: "#b7b7b7" + text: headerText + transformOrigin: Item.Top + font.pointSize: 32 + minimumPointSize: 16 + minimumPixelSize: 16 + font.family: "Verdana" + font.styleName: "Полужирный" + +} diff --git a/content/Toggle.ui.qml b/content/Toggle.ui.qml new file mode 100644 index 0000000..bb8bb9c --- /dev/null +++ b/content/Toggle.ui.qml @@ -0,0 +1,84 @@ +/* +This is a UI file (.ui.qml) that is intended to be edited in Qt Design Studio only. +It is supposed to be strictly declarative and only uses a subset of QML. If you edit +this file manually, you might introduce QML code that is not supported by Qt Design Studio. +Check out https://doc.qt.io/qtcreator/creator-quick-ui-forms.html for details on .ui.qml files. +*/ +/**************************************************************************** +** +** Copyright (C) 2022 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Design Studio. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +/* +This is a UI file (.ui.qml) that is intended to be edited in Qt Design Studio only. +It is supposed to be strictly declarative and only uses a subset of QML. If you edit +this file manually, you might introduce QML code that is not supported by Qt Design Studio. +Check out https://doc.qt.io/qtcreator/creator-quick-ui-forms.html for details on .ui.qml files. +*/ +import QtQuick +import QtQuick.Controls + +Item { + property string text + property alias checked: toggleIndicator.checked + readonly property alias hasFocus: toggleIndicator.activeFocus + implicitWidth: toggleText.width + toggleIndicator.width + implicitHeight: 50 + + Label { + id: toggleText + text: parent.text + anchors.verticalCenter: toggleIndicator.verticalCenter + } + Switch { + id: toggleIndicator + anchors.left: toggleText.right + anchors.rightMargin: 8 + } +} diff --git a/content/fonts/fonts.txt b/content/fonts/fonts.txt new file mode 100644 index 0000000..ab96122 --- /dev/null +++ b/content/fonts/fonts.txt @@ -0,0 +1 @@ +Fonts in this folder are loaded automatically. diff --git a/content/images/NOTICE.txt b/content/images/NOTICE.txt new file mode 100644 index 0000000..93a9afc --- /dev/null +++ b/content/images/NOTICE.txt @@ -0,0 +1,2 @@ +Notice some of these images are derived from Google applications resources. They were provided under the following license: +You may use the materials in this directory without restriction to develop your apps and to use in your apps. diff --git a/content/images/button_default.png b/content/images/button_default.png new file mode 100644 index 0000000000000000000000000000000000000000..6d6cfd9ad25d629e34c4341542fce7fab8bd685a GIT binary patch literal 1406 zcmeAS@N?(olHy`uVBq!ia0vp^wm_`O!3HGTR25Tz6lZ})WHAE+w=f7ZGR&GI!N9e?g*F{zaLoz;FhIrk$aUK86^Q z55aPgL8-<0Ii+Cr=0;Er$b#q^obz)Fic*VR> zydB(G$bwJ}R156XicB1V4U)kOY>=oGI88*jWag&kfy2WL7~)tZkh}+$ch1krFA6S5 zOir~kGc`2^h9kN#x(={akqE0yP^?0dz#A}--~#4cJ1$`Qg_Qz!Trx@YqT@i}*& zo!xwU$EsD{k<*@Qbd{OCd3|}?TT>I?;4iiH^2a}>9^p1Do%8(XJ&W#y1J%r_>}Aut zyG!q-%zJM7A(uJ3@Lme@f(DI@6)h$cGJ`fYs9p}>%v89%B#F^`*+QX94$C}`GEMVw zR$bEQGr5aZXJ(t12lGrdQSJyM-l-GVjC{4kHl#>tDe|Vw3eib8X%gZjb;4w2#DOT^ z+plYQ)LRbr8%wq+zTTy$oWi2=yyRZM^{>gZmI>cc;JswB_h)|X7RwtfLFek%Y_GN1 YKU>(9<>GXYS)dZq)78&qol`;+0G?sUi2wiq literal 0 HcmV?d00001 diff --git a/content/images/button_pressed.png b/content/images/button_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..ab78b6ea363a132ed3210c611bc2622984601e90 GIT binary patch literal 1694 zcmeAS@N?(olHy`uVBq!ia0vp^Ejq&N#aB8wRqxP?KOkzv*x2?hoh zjm(gUk_cZPtK|G#y~LFKq*T3%+ybC#1_ql7DKQ57aVaP$*c7FtSp~VcLA3*Uwn`Z#B?VUc`sL;2 zdgaD?`9*7iAWdWaj57fXq!y z$}cUkRZ;?31P4%e<`%#$$}5KY3g|!mio^naLp=k1xXD0`Hb6gG`R1o&rd7HmmZaJl z85kPt8W`#tnuHjdSs55wnOoZEqp3mI3D)ggl$uzQUlfv`pJNx0S&^EP3*ssm0YkzB zq8C{ORI`mf$QMYy0tXq$L1^NHd|Q&4h6q;_?}B77{R2 z*6QV1q=hz-c1FB{MfQ4;&t57B>1=C6K%amUqt2$u9~n zNK8((Gcz?c28JWLFuD$~Rgnm*Oi-*slE51f8Hb zYQ4)b>C}}*+dW+tH>wpylyUSZwQrr)d;2q6iA~st=GA(BE|X&p=IY}8I33BJ_v~X_F;H9F(OwL6nH%nTk^n2}BF}7&2{L7bEnf7o|qXGL8i4d1n7ri#Ep6qNc zlOtk2<(G%Ys+;d#o|~lm?8<^Wt?reAelOBa$G@oi#9h8WH1FX%7nkJ;Ri&3sH`J}Z z8vEvZ(%H0yVKW!U|5(pg7OtneQ~qB(!{z5Ij2QUYct88gyc6G*U-RQ`=9!CT40-}d uzYp$RTK8I!?cejS?=w2~^L?B5{XN5ax!s9|^H*DeY7kFXKbLh*2~7YeJyo&* literal 0 HcmV?d00001 diff --git a/content/images/curtain_shadow_handle.png b/content/images/curtain_shadow_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..afaf3ec9344cd225b8783c4653ffc5e19d139bee GIT binary patch literal 1787 zcmXX`eLU0q9{-uO#ypG&+fK%Y;$$sMS+QZ5F44;=_t0$75m$*_j^~GMt&meqc^YD; zm$bO;+$l$zcp;aJn>>|vtmOIm;mXZ$f9u>ozTeO1^?AL%-_QH~{=ProoB)4sU2T*$ z006plAI~!Y0O5eS0~`kKn*WWO2ZPpCpTDvJ0AZ+J8vTk46#&5M=$_P|r1uL7ze|{l zn9h|k2eL5cf}`<@Rj_EiQb`kHzK3s2cSuE*&a$UIPY(F%F-}Frrik5XRSk?2UdY+1 zx@zonl@H}cu;lWE#DbFK1Nv(x-bFSDi%8asy=iVoitw@%P13amhh2q}pn_id_P%el zul>CUl}071oBh6cyliv?XESxhH+}~QxW^8O7j#)&BsG00xwC%v!6Eu#dbj{3FdWjZ z@c{~_*tjUyor=GtlVUBy(_m{e|lWBea&(%j|$*2_*-n3`mif_KMq&Ndc(4H@Butnr81x;*@DWp9uh4DAXFS#9D7tP3XZ zAdXJ@6~f~eQ-z9?3z|pfVTozb{hrtW#X-m3ds7WWJ`yT6<5<8t@%h)0j`Xj!^oPwX zhGb)yV_ft^HW#xKX~bbUOOQ?36x#0YREh_ZLOUfZ{n6c^(`kI31=;mF@o2h2*R_-^PPX51EmV5=shw$Zy$9 zT>hZSsT=!YjznZ<1J62dVgtUIWS90J7D@Ypks3r2ejW}nE!*FN z_@y_zBNPj`BU`8m{9+T#r1qcJDFGBWxs{d4D@H&igdUL3_B9SzxJglyMw2-};%U9f zJ=d3rtZ(g=k}VJJ)SjX;xk+$^M+!2gS(&>b01tyw9J{+YlEIK1el)&1Xcxa>YnPxj zP8yted@g7a@(k>rmCp1+wzSDEt@k2GR!{MMJn*ZC^Q~SnuuDK11gEj2TPEoM|JQMk zKdq7Fk=Ocw01L4lqx2u083?hCs<`La5xs3QR3_ga+PqP&|1u#VQqu$aqorCIrNliT zP>27sVeEolX@rVa;QzhPo9AUsSu12-U46pV0RT<~uA{h*y31RU z+>fRXGoRNE$G91Anly}{6QoYo&%?lCR^&&(=fHXU9PrvR#jf>Kxf#oSLs;N_7ck4ER#WB zyBIDg3Z`})-x9`bJeHy}H(L-(-Fizsf86|~46atubjVbvA@}V;K;B zpsIt+5y$E9O_-x5skFcIHrb!p-xzt}VNO_heoCws`ZwIPsLktRE literal 0 HcmV?d00001 diff --git a/content/images/info.png b/content/images/info.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad9192087034e8a8fccaf957e268fbc958d3079 GIT binary patch literal 439 zcmV;o0Z9IdP)T>&MK7_GjRuCZHE>e8(6fdlX|(dE@>75@vMz?D|SzJXlYYH9N&suAE> z5eXeP6H^}+uGPMvA1;AXZ2iNTt_YLXwF};p1)-TtGNOnNwjJUz*gW< zN0W1^Q1n-#tpQBr?OESlJIXWU?{((7p;EWtve1rCtfQwII>;~fx^;aQ){D6EyT3XI h=l~s{19X7D_5(ZKs^#0BU2OmW002ovPDHLkV1gQM#9IIW literal 0 HcmV?d00001 diff --git a/content/images/info_selected.png b/content/images/info_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..25056ff59638f5a00e8c93a1fe2f2ec0709d4ac0 GIT binary patch literal 368 zcmV-$0gwKPP)v`paC?12Cz(O03JXDK#4}4tBZCZq8xQZ2Y|q1qp)cJv;eL=Ht^WECxecNqF^TQ*pht^_EF2A7N87ktMF@c z!>s{VC(OOGi3==AChN8PYO=T!XRgc0$BuoW@>ehzOEXd&k+=tgQ`YtiHi30c`ed!m z3bhmOOJ(BDIw#}bwz_eK&72~?8-oKsn*xAMveu>mrvu(*vgp|NQ=(;;nKgwve3(-g z>QlA4pIjDBcisB>g%t&TbxItcgk6TyYZ79s5Zhm!0W^RH&;T01mplRPwIy;N{57}$ O00002BR0pkS(} zi(^Q{;kVZexeh4sxIK)2DJz@p_`%1C-TK>2BR0pkSb< zi(^Q{;kVZ|@*YqSU^&?A6)QE@jy0m_!3)-6p`S0dGA>?qsnYl?I|ms2xaAdOf8Xj| v)8TUOW~nO+*i3J1JNUedJ4*lpJ`_uTb8tI#=%dUhpy3Rju6{1-oD!M<1^F~- literal 0 HcmV?d00001 diff --git a/content/images/navigation_next_item.png b/content/images/navigation_next_item.png new file mode 100644 index 0000000000000000000000000000000000000000..6665c9d85b8ac4717ccfa7ae07d06c188cd93735 GIT binary patch literal 1341 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 literal 0 HcmV?d00001 diff --git a/content/images/search_cancel.png b/content/images/search_cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..679ce32fe441056d47f499de58c0a8a10380de6c GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEoCO|{#S9GGLLkg|>2BR0px_rz z7srr@!*8!`2ixajw zJ_!}LleK`=^2Fm}ju?RjjWwJ+jnA?R{|jC@)^UDQar2$?ZUG_-o~oaGI;(eqhC}$2 zA4(cr7p500PV_F{@b&2&)|JP)d_?`~tjQAl8WXHSjY68Ne;$WUM)(h|77K00V#WBk5zR&A+RU zoHhOkm-7Z5|GSC$Eq8IaTc5-&FIO#_61c!Dl!CT8xv|QyKkn`}su{0h;WnxNX4*L2 za2*v3eR&|gnc7P;BK(8g{7dq^#=|%&B@d;$m+h;@52sc#Z>|Sb$E_M%|5Y_#XhE)> zHII^4@8RuL3%N7^d@jnWN%!d`|01gM(vPOIze#%C-)|kj4qykc19;i(H*de$L_Z-d Q-v9sr07*qoM6N<$f_xbz?EnA( literal 0 HcmV?d00001 diff --git a/content/images/tab_selected.png b/content/images/tab_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..2345f7a8ef06a6ed09d6c14d7988e24a279da70b GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^fEamT(fRh;MqVaEp4Nx|UBiNc6z(#tjA-amm6+&yqrK}N*Eti97bOo>%tOjvE zUvu}oA>WP1HFwqS3o2)SPVAb?)ALl+w0`&N$A7nF)$FsEGA(4;!+1wr&XxN_+)1Fb O7(8A5T-G@yGywo&no&Fe literal 0 HcmV?d00001 diff --git a/content/images/tabs_standard.png b/content/images/tabs_standard.png new file mode 100644 index 0000000000000000000000000000000000000000..7140ab7b75b2ae40deb654405a6632964705c11c GIT binary patch literal 1230 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 literal 0 HcmV?d00001 diff --git a/content/images/toolbar.png b/content/images/toolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..e9eba4c7442d595517fe863682e58535226eaae4 GIT binary patch literal 1643 zcmeAS@N?(olHy`uVBq!ia0vp^@<1%j!2~3^V-HsVDb50q$YLN*7=#%aX3ddcU|`Y6 z42dX-@b$4u&d=3LOvz75)vL%Y0IFtSu&J;DGILW)5)~?PbMlI0o zV7bVk)Z+Y{Qm}e+V1Qr{W(nL)Xu{~aA`tR+ zaAzS4LN!n=uv05CaRfF<1~afhqE_HE5#f@Vo04`X16W0gSi9$4NvKPSH^xF9h( z)y~Y+)EF3!=)&kaz*a>ftTHl3whBoCZ@@r;3z&25xPa*wRtng0d0NkxW?*1^>FMGa z;=wyN^mgD81A*@1f6G~SEnu!%B(jS4(!M>?>IaMGDQ??3sqC*+)a~!Nw{JD}Z+XW2 zo}btB`4-(B3mhtZgp#-PUi)v-5o*8F=fKUC+ybq=yFxTm+fFu`#BepHWgm!`ppYoF z+VL&3{qnf^&(C_TiraosX`%sJkmBMMk+Wpm9k?RqYTV&pytI~G#yhC}x&EuYnvzy~ z)pos4dR$s1e~(}8;7aE04ZHc)>o!;kSMjkb-rRmdzxc~Mj_8SH&l2aV?O5l~bY0PA z*%XGOvH7;|lTNMc4p_yy$@Xy0&k)(m9)InQYHdDqY2~vwt<9cQigI3@JD-;EyjINaO&!(VFm|1u@k~(m z!}I-}%X+0He>zVN$`Y#)ezu3P^69LOCv#T^Zfu^S*`dEhXzQlV6T4;SE%|Y#I%>no zb8{Sdb!*ZSU3Wd1`pMuC=hjbmY>q0vpSXEPSz1boj$drd!8-Z>M$Zz|*7amR3@Ev_ zXvMtjbBr>QZ@=DpsJj0%dqQWC|Mz&- QpP=f%)78&qol`;+0Qv(+s{jB1 literal 0 HcmV?d00001 diff --git a/content/images/top_curtain_drag_back.png b/content/images/top_curtain_drag_back.png new file mode 100644 index 0000000000000000000000000000000000000000..c0eb9c50f92085d997fc0e2e3281ffbeb794702a GIT binary patch literal 4383 zcmV+)5#a8LP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3#rmLw?-g#UAjIRawmIDp{2xxpNNJ`tXKRaf`C ziO5*e9mhd3nVG`v|NQ&7fANUHdzW%;rI+G)q@H>hd};pmczudb_x(Ql+d27q+{Nd( z4;-?8o&#k+;|Is{#|1S#$LH7MuC8aE_DuAgc$+ZVomskn#Dx{*F@ z=Xte$?`apkPJR17Rf3_J`C@QkM~R;IWCP;sHF(K==Ni5RzK8qnWBYaN-22yW!OOpi zogdGL_%#&HmuEov7Nh65BS}<-9NG7C$zq8q>`?g(VTE{) zwOB(B>n0=FQ%kQS%r~7m`rX4zdhZr4*oCC_leFi z=!#e{^D9=YD;V@xhGov)8AU?mJTc8TzW3?g)B5qS#6~ihZrkZQ1 zwYJ*pXtAZ1TWPhm*4yZzM<^`!(yQyO_dW(U9ZWsAdN5*)8D^Ym=2>Q)ZT2}9@L6f) zRaRYX^))nTRLWnAR;Nw7jx8G~?X>eQyY9C89tW(Qc+$zIoO;^nXS`?a$?Dgv$+yh? zb=Ks`nq@5AarGl>9Io|k3Nbp#mNPOIl92Ig83541a^{<)6fAR=Gv5P6kpo$iY{^lv zjFG{#CFCRTx%B&UFS4fNDoVTwvMRKg`gkC= zL&Zuu6yoY}9;-~PQ@0)2Jx8swo9dXFPTG(a!}TngEH^3{n6(^n!sa*h#bT-s>7(|o zeiJGZ6KwT!u~A~Y#>vuGt{rZb1y=#JG@8n4ZBZg!TJfWcQmkx}w6XHt2-Pep$1zDz z%aZt`QrqCq^z_@O``wAZ{kgm0U_0$Qw6YhR04w)FXjYyUpODzJXg#`a1Wy8Jv)AL- zX{F|Pr0m(HfGes$&Rx3)ii_|OnGsLx3&AL3Cm?xph*~B$XyXhmZH9D4sV&dN30P=@ zFG2g`>L8@fb!G}_mjb`HLu_~SI$PDv)FleBOx1LpRgFQ4sJk?ehH!SB!OfAE*W>4o z)yPrDGNIpzq_DEsHV$eeN|r%8_uANgxnLpF5)^uz+2lx(tPD(au9QQb$q!a4C7r1) z?mTCqcq+RDATe*_pI%q&geZ?2tul4G%#^X0tTJ<()SA>arnwLRq78SlVeYVUP7{$P zXuWMfY+;n;x7XA>t9CUrwU0{*GD)bYPo|B4vnFmnA_YGx#T6;ywl*2*8PX{*|EOX4 zQi1nS2mS}rPRZ^SN@K7Agw*^EBpF0lQHg?L4c_~mGdFD=@CR?i#;IWip z$XW_+VtF9Wg$Apnb)1R^Nu**6n9fvxYcLA&OS2{ouxJ-Y(29cY%Wk@}Lf+C5RKdH* zA(E+$rE?O!9+|CmCS)$@K%00oYk`}cfFadDz(y}h&S9~#kEu2Wz8OVRlOQ#hjevW$ z1s#ov#@AE(;N}UAt?pEA%7csa#B>6TZyt$d0f=rE#e$zVKKkJj%k$=z^(3Q2s%5O> zwiw(SYzBeFU3?>#^UTtc^niLmVjYOjD8)c?g4S*GLYx%y+EBVine-xR<)?uPkTA7p zO|vX&v2h)58Shu;4#*e%j z-v`8O5yM8^xMcwOe0l#YiyMMF3bmUyZa;$@A|LgV$EKVL>erVJI+3|kgwYR0i|kSo z)EEegwWgsNg$QMZGjX$#oi&@n?`lFtK^WWO_%?b9m{B~O6Doq(g#9cC?>TO5{QN}X zLjZTHgfN5;VU%n#5)Z{`b-^lU^A3Wb3N+TQo1fWp+zyv_9BpI~r zVhq^f12NGp3d#!}q?lhYZGO{Vs~z|Hf*V2|bb}&cIWTc1eX{{yc8OnDC}Rn8t5HxQ zYo6^!Q!eVvl7WikV_J(<+yReB03i?RP%)4c#iHuk9$E58P=q%d6cB=WdT-K9b6Cq! zr`yDUAw6BrKvG#%I&EEBg9RkjI#V_n5=U#pU?QcgA*p~50~ArZL(q06&AaHD($p#( z^VC+qWyBLW78U{RP0_#z##dj}aetZT_M8)PX~Idibl*qgN<_(*D4 zKq{Ri250Ytvg-})!ighn$K`K?8rai$eZ057y zcI+n-%&(gE18Jow6D*1qjJVh;yuqaFPz$vo+(?Z6+47xO$SU6XEM7X!uF=xL#-? z{}nuS)7g6jEvg5Huh((9Bg^PHqQMOG=E$t12kuWc|m%}C*r;LYSG0cwqw zX9(;i;=mjc+%O3jqpdhNSlL@Po~5yxyEy9%?()7b?k>$eYdaQ5mNsAw76WTyV_~m| zeTCA-DJ!DnZ6CA_!l4rA1`#9rwdQH-TwPEYLnXtBb#^W{>qezkb8x2L^sIMzyG4^p zTrCz2HEtudmcrg3!gOunuv6@i4t^6hiyaxJ7Q6K~X(G)r!!e6$=di~^YzUmHK)y4y zPlaMf9NG|kFln?(u#N;qwxY%9c=Nf?3QEuBDr^aO%kBT*fTA=sc|a9b>&{wLs)5dN zXRf59pd|XiU`z{mw17v$0-pG)TL{;7(A{-~x0?aCkLY+qq7PiAbs3b*x8<87e{<62 z_~iSgohP2UEvI)=Dt-H?ij zQnbbc^4n$3_Copho!x!0tM+5t?%TfGgz&MCgqRwGsn&%atwIxn-d?vLn!KQjNWQQ+ z+-rnY&K>g_VerJqev0LfP=1eWskwR6KG)w~-*qyM!`vO~Qt(N5u5t!3c=AuEs+OokALh510AGVoDW#9yU8TpWEZ5b}gBjiwDqeHQ_u~choQ9elL;wU6d0fR^v zY26ky{D4^ z000SaNLh0L01FZT01FZU(%pXi00007bV*G`2jl?*3lCx{3DAcPQ@mIJ_X zx~EQS*H%|cgBuCFc z>It{E^>jTUIeKQZp;`GMy&?{FaA4|U#>YAUdfLVM0QydM>2E-s<4(7dt`Eu|-q6lv z)iKt-?drLY{)dYQg2hlATute0h@egA8V_3 zO+H(2`B}-83D^uDo3M|y*1INoyeree*vGhz>s`4MjD3u~>nPrJm=Vc7#@=;k?>ZD< z>|@_+dHFP!mrt{I&G4?=4#qzAy#|97Tv)vX0C>Ir5*r(z*t>F6?gVSIkJ)emz=hRI z7z|d}yNU#?tv(h{uGi}?8x2_z-gRWa+U8?PV{v2SQ*$9J$h(f@U~TiUSvF27e-c`tmY>SUIxJvV` zLIG>Kk2N;CO7yP60ki*Z@bhCQ!n=yT-&LA}v5&ELRhD4vW9(gJk4W}0_O5aPV;^Jh zD$T*z$Jo0nOR$+fCP%l~$13u!X|F5uuBt|4wvQ>fMWJ_xAuC(zy*s4jR+ZjW8DKMf z%%gDpj^y4ofIct_#g9djd)Fu&ztdn<=3SKnmNF_Q`a_RN$t~p%Z-UfQhN3W`f2#c9 zO`Tk03$V&YW9gEgA^mff^v~g4BDw#cb+zcl01K;v zt5U!$$jmN^=JB3hY;}a&zbHg!4Z^v?(Bw+27ev8dB=`TfCd4G+mPBOt!KMOcMzeW_ ztfN6Q+jg3-T?ltc%q?6M!dZn7=K*n+X#xQH2%`5yYMsLIzaTlZ{MNT*-j9vN$QI*` z11ttvJk4y-dir}8DcfUnMYcP&-8K$ZWNS;R_=LNacSV0d&6)Y&NzF2VxeVCMD|6Gc zAO=?Aww9F!%1`>eS!w22$>mz(6bxAeE?8qvTK}BtXQx(e086;S6bZ1|$GM`A#na!O z2t+kFxwQZ+A + +void set_qt_environment() +{ + qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1"); + qputenv("QT_ENABLE_HIGHDPI_SCALING", "0"); + qputenv("QT_LOGGING_RULES", "qt.qml.connections=false"); + qputenv("QT_QUICK_CONTROLS_CONF", ":/qtquickcontrols2.conf"); +} diff --git a/src/import_qml_plugins.h b/src/import_qml_plugins.h new file mode 100644 index 0000000..cdd3b65 --- /dev/null +++ b/src/import_qml_plugins.h @@ -0,0 +1,9 @@ +/* + * This file is automatically generated by Qt Design Studio. + * Do not change. +*/ + +#include + +Q_IMPORT_QML_PLUGIN(contentPlugin) +Q_IMPORT_QML_PLUGIN(QML_BalancerPlugin) diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..aaf1817 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Quick Studio Components. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include + +#include "app_environment.h" +#include "import_qml_plugins.h" + +int main(int argc, char *argv[]) +{ + set_qt_environment(); + + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + const QUrl url(u"qrc:Main/main.qml"_qs); + QObject::connect( + &engine, &QQmlApplicationEngine::objectCreated, &app, + [url](QObject *obj, const QUrl &objUrl) { + if (!obj && url == objUrl) + QCoreApplication::exit(-1); + }, + Qt::QueuedConnection); + + engine.addImportPath(QCoreApplication::applicationDirPath() + "/qml"); + engine.addImportPath(":/"); + + engine.load(url); + + if (engine.rootObjects().isEmpty()) { + return -1; + } + + return app.exec(); +}