commit 1165cc94eb3891bcf398b67e88721b905df9511c Author: Denis V. Dedkov Date: Wed Apr 12 18:28:22 2023 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a0b530 --- /dev/null +++ b/.gitignore @@ -0,0 +1,74 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc +/.qmake.cache +/.qmake.stash + +# qtcreator generated files +*.pro.user* +CMakeLists.txt.user* + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..14aff2b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,32 @@ +cmake_minimum_required(VERSION 3.16) + +project(components VERSION 0.1 LANGUAGES CXX) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(QT_QML_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + +find_package(Qt6 6.2 COMPONENTS Quick REQUIRED) + +qt_add_library(components SHARED) +qt_add_qml_module(components + URI ru.ded.components + VERSION 1.0 + QML_FILES MainMenu.qml MenuBackButton.qml SubtitledItemDelegate.qml +) + +set_target_properties(components PROPERTIES + MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} + MACOSX_BUNDLE TRUE + WIN32_EXECUTABLE TRUE +) + +target_compile_definitions(components + PRIVATE $<$,$>:QT_QML_DEBUG>) +target_link_libraries(components + PRIVATE Qt6::Quick) + +target_include_directories(components PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + diff --git a/MainMenu.qml b/MainMenu.qml new file mode 100644 index 0000000..5346d01 --- /dev/null +++ b/MainMenu.qml @@ -0,0 +1,61 @@ +import QtQuick 2.15 +import QtQuick.Controls 2.15 + +Drawer { + property alias logo: logoImage.source + property alias appName: appNameLabel.text + property alias model: menuRepeater.model + property alias connected: connectionLabel.connected + + signal actionSelected(var action) + + width: parent.width * 0.66 + height: parent.height + + Column { + anchors.fill: parent + + Row { + width: parent.width + height: 100 + + Image { + id: logoImage + + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.margins: 10 + } + + Column { + anchors.verticalCenter: parent.verticalCenter + + Label { + id: appNameLabel + + font.pointSize: 20 + } + + Label { + id: connectionLabel + + property bool connected: false + + text: connected ? qsTr("Online") : qsTr("Offline") + color: connected ? "green" : "red" + } + } + } + + Repeater { + id: menuRepeater + + delegate: ItemDelegate { + width: parent.width + + text: model.title + onClicked: actionSelected(model.action) + } + } + } +} diff --git a/MenuBackButton.qml b/MenuBackButton.qml new file mode 100644 index 0000000..97313db --- /dev/null +++ b/MenuBackButton.qml @@ -0,0 +1,84 @@ +import QtQuick 2.15 + +Item { + id: root + + width: 40 + height: 40 + + property double iconMarigns: 8 + property double iconHeight: width - iconMarigns * 2 + signal clicked() + signal back() + + SystemPalette { + id: palette + } + + MouseArea { + id: ma + + anchors.fill: parent + } + + Rectangle { + id: bar1 + x: root.iconMarigns + y: root.iconMarigns + root.iconHeight / 6 + width: root.iconHeight + height: root.iconHeight / 9 + antialiasing: true + + color: palette.button + } + + Rectangle { + id: bar2 + x: root.iconMarigns + y: root.iconMarigns + root.iconHeight / 2 - height / 2 + width: root.iconHeight + height: root.iconHeight / 9 + antialiasing: true + + color: palette.button + } + + Rectangle { + id: bar3 + x: root.iconMarigns + y: root.iconMarigns + root.iconHeight / 2 + height * 2 + width: root.iconHeight + height: root.iconHeight / 9 + antialiasing: true + + color: palette.button + } + + property int animationDuration: 450 + + state: "menu" + states: [ + State { + name: "menu" + PropertyChanges { target: ma; onClicked: root.clicked() } + }, + + State { + name: "back" + PropertyChanges { target: root; rotation: 180 } + PropertyChanges { target: bar1; rotation: 45; width: root.iconHeight / 3 * 2; x: root.iconMarigns + root.iconHeight / 2; y: root.iconMarigns + root.iconHeight / 4 } + PropertyChanges { target: bar2; width: root.iconHeight / 6 * 5 + 1; x: root.iconMarigns + root.iconHeight / 9 } + PropertyChanges { target: bar3; rotation: -45; width: root.iconHeight / 3 * 2; x: root.iconMarigns + root.iconHeight / 2; y: root.iconMarigns + root.iconHeight / 3 * 2 } + PropertyChanges { target: ma; onClicked: root.back() } + } + ] + + transitions: [ + Transition { + RotationAnimation { target: root; direction: RotationAnimation.Clockwise; duration: animationDuration; easing.type: Easing.InOutQuad } + PropertyAnimation { target: bar1; properties: "rotation, width, x, y"; duration: animationDuration; easing.type: Easing.InOutQuad } + PropertyAnimation { target: bar2; properties: "rotation, width, x, y"; duration: animationDuration; easing.type: Easing.InOutQuad } + PropertyAnimation { target: bar3; properties: "rotation, width, x, y"; duration: animationDuration; easing.type: Easing.InOutQuad } + } + ] +} diff --git a/SubtitledItemDelegate.qml b/SubtitledItemDelegate.qml new file mode 100644 index 0000000..df5d8d0 --- /dev/null +++ b/SubtitledItemDelegate.qml @@ -0,0 +1,24 @@ +import QtQuick 2.0 +import QtQuick.Controls 2.2 + +ItemDelegate { + id: root + + property string subtitle: "" + + contentItem: Column { + Label { + id: titleLabel + + width: parent.width + text: root.text + } + + Label { + width: parent.width + font.pixelSize: titleLabel.font.pixelSize - 2 + text: root.subtitle + opacity: 0.8 + } + } +} diff --git a/qmldir b/qmldir new file mode 100644 index 0000000..c625163 --- /dev/null +++ b/qmldir @@ -0,0 +1,2 @@ +module ru.ded.components +plugin components