فهرست منبع

Initial commit

Denis V. Dedkov 2 سال پیش
کامیت
1165cc94eb
6فایلهای تغییر یافته به همراه277 افزوده شده و 0 حذف شده
  1. 74 0
      .gitignore
  2. 32 0
      CMakeLists.txt
  3. 61 0
      MainMenu.qml
  4. 84 0
      MenuBackButton.qml
  5. 24 0
      SubtitledItemDelegate.qml
  6. 2 0
      qmldir

+ 74 - 0
.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
+

+ 32 - 0
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 $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
+target_link_libraries(components
+    PRIVATE Qt6::Quick)
+
+target_include_directories(components PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
+

+ 61 - 0
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)
+            }
+        }
+    }
+}

+ 84 - 0
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 }
+        }
+    ]
+}

+ 24 - 0
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
+        }
+    }
+}

+ 2 - 0
qmldir

@@ -0,0 +1,2 @@
+module ru.ded.components
+plugin components