RinUI 0.1.0__py3-none-any.whl → 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. RinUI/__init__.py +4 -4
  2. RinUI/assets/fonts/FluentSystemIcons-Index.js +5255 -5255
  3. RinUI/components/Base.qml +78 -78
  4. RinUI/components/BasicInput/Button.qml +146 -146
  5. RinUI/components/BasicInput/CheckBox.qml +98 -98
  6. RinUI/components/BasicInput/ComboBox.qml +159 -159
  7. RinUI/components/BasicInput/DropDownButton.qml +20 -20
  8. RinUI/components/BasicInput/Hyperlink.qml +17 -17
  9. RinUI/components/BasicInput/PillButton.qml +10 -10
  10. RinUI/components/BasicInput/RadioButton.qml +94 -94
  11. RinUI/components/BasicInput/RoundButton.qml +26 -26
  12. RinUI/components/BasicInput/Slider.qml +212 -212
  13. RinUI/components/BasicInput/Switch.qml +101 -101
  14. RinUI/components/BasicInput/ToggleButton.qml +10 -10
  15. RinUI/components/BasicInput/ToolButton.qml +30 -30
  16. RinUI/components/ContextMenu.qml +183 -183
  17. RinUI/components/DateAndTime/DatePicker.qml +142 -140
  18. RinUI/components/DateAndTime/PickerView.qml +223 -223
  19. RinUI/components/DateAndTime/TimePicker.qml +114 -114
  20. RinUI/components/DialogsAndFlyouts/Dialog.qml +106 -106
  21. RinUI/components/DialogsAndFlyouts/DialogButtonBox.qml +47 -47
  22. RinUI/components/DialogsAndFlyouts/Flyout.qml +87 -87
  23. RinUI/components/DialogsAndFlyouts/Popup.qml +110 -106
  24. RinUI/components/FocusIndicator.qml +33 -33
  25. RinUI/components/IconWidget.qml +52 -52
  26. RinUI/components/Indicator.qml +89 -89
  27. RinUI/components/Layout/Expander.qml +159 -159
  28. RinUI/components/Layout/SettingExpander.qml +66 -66
  29. RinUI/components/Layout/SettingItem.qml +70 -70
  30. RinUI/components/ListAndCollections/Clip.qml +21 -21
  31. RinUI/components/ListAndCollections/Frame.qml +43 -43
  32. RinUI/components/ListAndCollections/ListView.qml +104 -104
  33. RinUI/components/ListAndCollections/ListViewDelegate.qml +82 -82
  34. RinUI/components/ListAndCollections/SettingCard.qml +72 -72
  35. RinUI/components/ListAndCollections/TableView.qml +81 -81
  36. RinUI/components/ListAndCollections/TableViewDelegate.qml +88 -88
  37. RinUI/components/Media/Avatar.qml +82 -82
  38. RinUI/components/MenusAndToolbars/Menu.qml +150 -150
  39. RinUI/components/MenusAndToolbars/MenuBar.qml +42 -42
  40. RinUI/components/MenusAndToolbars/MenuItem.qml +131 -131
  41. RinUI/components/MenusAndToolbars/MenuItemGroup.qml +43 -43
  42. RinUI/components/MenusAndToolbars/MenuSeparator.qml +13 -13
  43. RinUI/components/MenusAndToolbars/TextInputMenu.qml +37 -37
  44. RinUI/components/MenusAndToolbars/ToolSeparator.qml +16 -16
  45. RinUI/components/Navigation/ErrorPage.qml +48 -48
  46. RinUI/components/Navigation/NavigationBar.qml +179 -179
  47. RinUI/components/Navigation/NavigationItem.qml +193 -193
  48. RinUI/components/Navigation/NavigationSubItem.qml +103 -103
  49. RinUI/components/Navigation/NavigationView.qml +228 -227
  50. RinUI/components/Navigation/Segmented.qml +16 -16
  51. RinUI/components/Navigation/SegmentedItem.qml +107 -107
  52. RinUI/components/Navigation/SelectorBar.qml +12 -12
  53. RinUI/components/Navigation/SelectorBarItem.qml +88 -88
  54. RinUI/components/ScrollBar.qml +204 -204
  55. RinUI/components/ScrollView.qml +12 -12
  56. RinUI/components/Shadow.qml +47 -47
  57. RinUI/components/StatusAndInfo/InfoBadge.qml +77 -77
  58. RinUI/components/StatusAndInfo/InfoBar.qml +256 -251
  59. RinUI/components/StatusAndInfo/ProgressBar.qml +126 -126
  60. RinUI/components/StatusAndInfo/ProgressRing.qml +149 -0
  61. RinUI/components/StatusAndInfo/Toast.qml +236 -236
  62. RinUI/components/StatusAndInfo/ToolTip.qml +93 -93
  63. RinUI/components/Text/SpinBox.qml +150 -133
  64. RinUI/components/Text/Text.qml +44 -44
  65. RinUI/components/Text/TextArea.qml +117 -117
  66. RinUI/components/Text/TextField.qml +113 -113
  67. RinUI/components/Text/TextInput.qml +47 -47
  68. RinUI/components/qmldir +80 -80
  69. RinUI/core/__init__.py +4 -4
  70. RinUI/core/config.py +129 -129
  71. RinUI/core/launcher.py +129 -129
  72. RinUI/core/theme.py +339 -339
  73. RinUI/core/translator.py +25 -25
  74. RinUI/hooks/__init__.py +3 -3
  75. RinUI/hooks/hook-RinUI.py +3 -3
  76. RinUI/qmldir +108 -104
  77. RinUI/themes/Appearance.qml +36 -0
  78. RinUI/themes/Colors.qml +36 -0
  79. RinUI/themes/dark.qml +145 -145
  80. RinUI/themes/light.qml +145 -145
  81. RinUI/themes/qmldir +9 -6
  82. RinUI/themes/theme.qml +151 -149
  83. RinUI/themes/utils.qml +37 -37
  84. RinUI/utils/Animation.qml +12 -12
  85. RinUI/utils/FloatLayer.qml +132 -123
  86. RinUI/utils/FontIconLoader.qml +13 -13
  87. RinUI/utils/Position.qml +19 -19
  88. RinUI/utils/Severity.qml +13 -13
  89. RinUI/utils/Typography.qml +17 -17
  90. RinUI/utils/qmldir +4 -4
  91. RinUI/windows/CtrlBtn.qml +118 -118
  92. RinUI/windows/FluentPage.qml +92 -92
  93. RinUI/windows/FluentWindow.qml +31 -30
  94. RinUI/windows/FluentWindowBase.qml +158 -158
  95. RinUI/windows/TitleBar.qml +135 -135
  96. RinUI/windows/qmldir +7 -7
  97. RinUI/windows/window/ApplicationWindow.qml +8 -8
  98. RinUI/windows/window/Window.qml +118 -118
  99. {rinui-0.1.0.data → rinui-0.1.1.data}/data/LICENSE +21 -21
  100. {rinui-0.1.0.data → rinui-0.1.1.data}/data/README.md +100 -100
  101. {rinui-0.1.0.dist-info → rinui-0.1.1.dist-info}/METADATA +116 -115
  102. rinui-0.1.1.dist-info/RECORD +112 -0
  103. {rinui-0.1.0.dist-info → rinui-0.1.1.dist-info}/WHEEL +1 -1
  104. {rinui-0.1.0.dist-info → rinui-0.1.1.dist-info/licenses}/LICENSE +21 -21
  105. RinUI/__pycache__/__init__.cpython-38.pyc +0 -0
  106. RinUI/config/rin_ui.json +0 -8
  107. RinUI/core/__pycache__/__init__.cpython-38.pyc +0 -0
  108. RinUI/core/__pycache__/config.cpython-38.pyc +0 -0
  109. RinUI/core/__pycache__/launcher.cpython-38.pyc +0 -0
  110. RinUI/core/__pycache__/theme.cpython-38.pyc +0 -0
  111. RinUI/core/__pycache__/translator.cpython-38.pyc +0 -0
  112. rinui-0.1.0.dist-info/RECORD +0 -116
  113. {rinui-0.1.0.dist-info → rinui-0.1.1.dist-info}/entry_points.txt +0 -0
  114. {rinui-0.1.0.dist-info → rinui-0.1.1.dist-info}/top_level.txt +0 -0
@@ -1,43 +1,43 @@
1
- import QtQuick 2.15
2
-
3
- QtObject {
4
- id: root
5
-
6
- // 用法同ButtonGroup
7
- property bool exclusive: true
8
- property var items: []
9
- property Item checkedItem: null
10
- readonly property int checkState: {
11
- let count = 0;
12
- for (let b of items)
13
- if (b.checked)
14
- count++;
15
- return count === 0 ? Qt.Unchecked :
16
- count === items.length ? Qt.Checked :
17
- Qt.PartiallyChecked;
18
- }
19
-
20
-
21
- // 方法 / functions //
22
- function register(button) {
23
- if (items.indexOf(button) === -1)
24
- items.push(button)
25
- }
26
-
27
- function unregister(button) {
28
- const idx = items.indexOf(button)
29
- if (idx !== -1)
30
- items.splice(idx, 1)
31
- }
32
-
33
- function updateCheck(button) {
34
- if (exclusive) {
35
- for (let b of items) {
36
- b.checked = (b === button)
37
- }
38
- checkedItem = button
39
- } else {
40
- checkedItem = button.checked ? button : null
41
- }
42
- }
43
- }
1
+ import QtQuick 2.15
2
+
3
+ QtObject {
4
+ id: root
5
+
6
+ // 用法同ButtonGroup
7
+ property bool exclusive: true
8
+ property var items: []
9
+ property Item checkedItem: null
10
+ readonly property int checkState: {
11
+ let count = 0;
12
+ for (let b of items)
13
+ if (b.checked)
14
+ count++;
15
+ return count === 0 ? Qt.Unchecked :
16
+ count === items.length ? Qt.Checked :
17
+ Qt.PartiallyChecked;
18
+ }
19
+
20
+
21
+ // 方法 / functions //
22
+ function register(button) {
23
+ if (items.indexOf(button) === -1)
24
+ items.push(button)
25
+ }
26
+
27
+ function unregister(button) {
28
+ const idx = items.indexOf(button)
29
+ if (idx !== -1)
30
+ items.splice(idx, 1)
31
+ }
32
+
33
+ function updateCheck(button) {
34
+ if (exclusive) {
35
+ for (let b of items) {
36
+ b.checked = (b === button)
37
+ }
38
+ checkedItem = button
39
+ } else {
40
+ checkedItem = button.checked ? button : null
41
+ }
42
+ }
43
+ }
@@ -1,14 +1,14 @@
1
- import QtQuick 2.15
2
- import QtQuick.Controls.Basic 2.15
3
- import "../../themes"
4
- import "../../components"
5
-
6
-
7
- MenuSeparator {
8
- id: root
9
-
10
- contentItem: Rectangle {
11
- implicitHeight: 1
12
- color: Theme.currentTheme.colors.dividerBorderColor
13
- }
1
+ import QtQuick 2.15
2
+ import QtQuick.Controls.Basic 2.15
3
+ import "../../themes"
4
+ import "../../components"
5
+
6
+
7
+ MenuSeparator {
8
+ id: root
9
+
10
+ contentItem: Rectangle {
11
+ implicitHeight: 1
12
+ color: Theme.currentTheme.colors.dividerBorderColor
13
+ }
14
14
  }
@@ -1,38 +1,38 @@
1
- import QtQuick 2.15
2
- import QtQuick.Controls 2.15
3
- import "../../themes"
4
- import "../../components"
5
-
6
-
7
- // Menu
8
- Menu {
9
- id: contextMenu
10
- position: -1
11
- Action {
12
- icon.name: "ic_fluent_cut_20_regular"
13
- text: qsTr("Cut")
14
- enabled: root.selectedText.length > 0 && root.editable // 选中&可编辑
15
- shortcut: "Ctrl+X"
16
- onTriggered: root.cut()
17
- }
18
- Action {
19
- icon.name: "ic_fluent_copy_20_regular"
20
- text: qsTr("Copy")
21
- enabled: root.selectedText.length > 0 // 选中内容
22
- shortcut: "Ctrl+C"
23
- onTriggered: root.copy()
24
- }
25
- Action {
26
- icon.name: "ic_fluent_clipboard_paste_20_regular"
27
- text: qsTr("Paste")
28
- enabled: root.editable
29
- shortcut: "Ctrl+V"
30
- onTriggered: root.paste()
31
- }
32
- Action {
33
- icon.name: " "
34
- text: qsTr("Select All")
35
- shortcut: "Ctrl+A"
36
- onTriggered: root.selectAll()
37
- }
1
+ import QtQuick 2.15
2
+ import QtQuick.Controls 2.15
3
+ import "../../themes"
4
+ import "../../components"
5
+
6
+
7
+ // Menu
8
+ Menu {
9
+ id: contextMenu
10
+ position: -1
11
+ Action {
12
+ icon.name: "ic_fluent_cut_20_regular"
13
+ text: qsTr("Cut")
14
+ enabled: root.selectedText.length > 0 && root.editable // 选中&可编辑
15
+ shortcut: "Ctrl+X"
16
+ onTriggered: root.cut()
17
+ }
18
+ Action {
19
+ icon.name: "ic_fluent_copy_20_regular"
20
+ text: qsTr("Copy")
21
+ enabled: root.selectedText.length > 0 // 选中内容
22
+ shortcut: "Ctrl+C"
23
+ onTriggered: root.copy()
24
+ }
25
+ Action {
26
+ icon.name: "ic_fluent_clipboard_paste_20_regular"
27
+ text: qsTr("Paste")
28
+ enabled: root.editable
29
+ shortcut: "Ctrl+V"
30
+ onTriggered: root.paste()
31
+ }
32
+ Action {
33
+ icon.name: " "
34
+ text: qsTr("Select All")
35
+ shortcut: "Ctrl+A"
36
+ onTriggered: root.selectAll()
37
+ }
38
38
  }
@@ -1,17 +1,17 @@
1
- import QtQuick 2.15
2
- import QtQuick.Controls.Basic 2.15
3
- import "../../themes"
4
- import "../../components"
5
-
6
-
7
- ToolSeparator {
8
- padding: vertical ? 2 : 2
9
- topPadding: vertical ? 2 : 2
10
- bottomPadding: vertical ? 2 : 2
11
-
12
- contentItem: Rectangle {
13
- implicitWidth: parent.vertical ? 1 : 16
14
- implicitHeight: parent.vertical ? 16 : 1
15
- color: Theme.currentTheme.colors.dividerBorderColor
16
- }
1
+ import QtQuick 2.15
2
+ import QtQuick.Controls.Basic 2.15
3
+ import "../../themes"
4
+ import "../../components"
5
+
6
+
7
+ ToolSeparator {
8
+ padding: vertical ? 2 : 2
9
+ topPadding: vertical ? 2 : 2
10
+ bottomPadding: vertical ? 2 : 2
11
+
12
+ contentItem: Rectangle {
13
+ implicitWidth: parent.vertical ? 1 : 16
14
+ implicitHeight: parent.vertical ? 16 : 1
15
+ color: Theme.currentTheme.colors.dividerBorderColor
16
+ }
17
17
  }
@@ -1,48 +1,48 @@
1
- import QtQuick 2.15
2
- import QtQuick.Controls 2.15
3
- import QtQuick.Layouts 2.15
4
- import RinUI
5
-
6
- FluentPage {
7
- id: errorPage
8
-
9
- property string errorMessage: "ERROR_MSG"
10
- property string page: "page"
11
-
12
- spacing: 4
13
-
14
- Item {
15
- height: 64
16
- }
17
-
18
- Text {
19
- Layout.alignment: Qt.AlignHCenter
20
- typography: Typography.Subtitle
21
- text: qsTr("Sorry, something went wrong!")
22
- }
23
-
24
- Text {
25
- Layout.preferredWidth: parent.width * 0.8
26
- Layout.alignment: Qt.AlignHCenter
27
- horizontalAlignment: Text.AlignHCenter
28
- wrapMode: Text.WordWrap
29
- typography: Typography.Body
30
- text: page + qsTr(" load failed! \n\n Because of ") + errorMessage + qsTr("\nPlease try again later.")
31
- }
32
-
33
- Item {
34
- height: 8
35
- }
36
-
37
-
38
- Button {
39
- Layout.alignment: Qt.AlignHCenter
40
- id: retryButton
41
- text: qsTr("Retry")
42
- // buttonType: "primary"
43
- onClicked: {
44
- // 重新加载 Home 页
45
- safePush(errorPage.page, true)
46
- }
47
- }
48
- }
1
+ import QtQuick 2.15
2
+ import QtQuick.Controls 2.15
3
+ import QtQuick.Layouts 2.15
4
+ import RinUI
5
+
6
+ FluentPage {
7
+ id: errorPage
8
+
9
+ property string errorMessage: "ERROR_MSG"
10
+ property string page: "page"
11
+
12
+ spacing: 4
13
+
14
+ Item {
15
+ height: 64
16
+ }
17
+
18
+ Text {
19
+ Layout.alignment: Qt.AlignHCenter
20
+ typography: Typography.Subtitle
21
+ text: qsTr("Sorry, something went wrong!")
22
+ }
23
+
24
+ Text {
25
+ Layout.preferredWidth: parent.width * 0.8
26
+ Layout.alignment: Qt.AlignHCenter
27
+ horizontalAlignment: Text.AlignHCenter
28
+ wrapMode: Text.WordWrap
29
+ typography: Typography.Body
30
+ text: page + qsTr(" load failed! \n\n Because of ") + errorMessage + qsTr("\nPlease try again later.")
31
+ }
32
+
33
+ Item {
34
+ height: 8
35
+ }
36
+
37
+
38
+ Button {
39
+ Layout.alignment: Qt.AlignHCenter
40
+ id: retryButton
41
+ text: qsTr("Retry")
42
+ // buttonType: "primary"
43
+ onClicked: {
44
+ // 重新加载 Home 页
45
+ safePush(errorPage.page, true)
46
+ }
47
+ }
48
+ }
@@ -1,179 +1,179 @@
1
- import QtQuick 2.15
2
- import QtQuick.Controls 2.15
3
- import "../../components"
4
- import "../../themes"
5
-
6
-
7
- Item {
8
- id: navigationBar
9
- // implicitWidth: collapsed ? 40 : expandWidth
10
- height: parent.height
11
-
12
- property bool collapsed: false
13
- property var navigationItems: [
14
- // {title: "Title", page: "path/to/page.qml", icon: undefined}
15
- ]
16
-
17
- // property int currentSubIndex: -1
18
- property bool titleBarEnabled: true
19
- property int expandWidth: 280
20
- property int minimumExpandWidth: 900
21
-
22
- property alias windowTitle: titleLabel.text
23
- property alias windowIcon: iconLabel.source
24
- property int windowWidth: minimumExpandWidth
25
- property var stackView: parent.stackView
26
-
27
- property string currentPage: "" // 当前页面的URL
28
- property var lastPages: [] // 历史页面的URL栈
29
-
30
- function isNotOverMinimumWidth() { // 判断窗口是否小于最小宽度
31
- return windowWidth < minimumExpandWidth;
32
- }
33
-
34
- // 展开收缩动画 //
35
- width: collapsed ? 40 : expandWidth
36
- implicitWidth: isNotOverMinimumWidth() ? 40 : collapsed ? 40 : expandWidth
37
-
38
- Behavior on width {
39
- NumberAnimation {
40
- duration: Utils.animationSpeed
41
- easing.type: Easing.OutQuint
42
- }
43
- }
44
- Behavior on implicitWidth {
45
- NumberAnimation {
46
- duration: Utils.animationSpeed
47
- easing.type: Easing.OutQuint
48
- }
49
- }
50
-
51
- Rectangle {
52
- id: background
53
- anchors.fill: parent
54
- anchors.margins: -5
55
- anchors.topMargin: -title.height
56
- radius: Theme.currentTheme.appearance.windowRadius
57
- color: Theme.currentTheme.colors.backgroundAcrylicColor
58
- border.color: Theme.currentTheme.colors.flyoutBorderColor
59
- z: -1
60
- visible: isNotOverMinimumWidth() && !collapsed ? 1 : 0
61
-
62
- Behavior on visible {
63
- NumberAnimation {
64
- duration: collapsed ? Utils.animationSpeed / 2 : 50
65
- }
66
- }
67
-
68
- layer.enabled: true
69
- layer.effect: Shadow {
70
- style: "flyout"
71
- source: background
72
- }
73
- }
74
-
75
- Row {
76
- id: title
77
- anchors.left: parent.left
78
- anchors.bottom: parent.top
79
- height: titleBarHeight
80
- spacing: 16
81
- visible: navigationBar.titleBarEnabled
82
-
83
- // 返回按钮
84
- ToolButton {
85
- flat: true
86
- anchors.verticalCenter: parent.verticalCenter
87
- icon.name: "ic_fluent_arrow_left_20_regular"
88
- onClicked: navigationView.safePop()
89
- width: 40
90
- height: 40
91
- size: 16
92
- enabled: lastPages.length > 1
93
-
94
- ToolTip {
95
- parent: parent
96
- delay: 500
97
- visible: parent.hovered
98
- text: qsTr("Back")
99
- }
100
- }
101
-
102
- //图标
103
- IconWidget {
104
- id: iconLabel
105
- size: 16
106
- anchors.verticalCenter: parent.verticalCenter
107
- }
108
-
109
- //标题
110
- Text {
111
- id: titleLabel
112
- anchors.verticalCenter: parent.verticalCenter
113
-
114
- typography: Typography.Caption
115
- // text: title
116
- }
117
- }
118
-
119
- // 收起切换按钮
120
- ToolButton {
121
- id: collapseButton
122
- flat: true
123
- width: 40
124
- height: 38
125
- // icon.name: collapsed ? "ic_fluent_chevron_right_20_regular" : "ic_fluent_chevron_left_20_regular"
126
- icon.name: "ic_fluent_navigation_20_regular"
127
- size: 19
128
-
129
- onClicked: {
130
- collapsed = !collapsed
131
- }
132
-
133
- ToolTip {
134
- parent: parent
135
- delay: 500
136
- visible: parent.hovered && !parent.pressed
137
- text: collapsed ? qsTr("Open Navigation") : qsTr("Close Navigation")
138
- }
139
- }
140
-
141
- Flickable {
142
- id: flickable
143
- anchors.fill: parent
144
- anchors.topMargin: 40
145
- contentWidth: parent.width
146
- contentHeight: navigationColumn.implicitHeight
147
- clip: true
148
-
149
- Column {
150
- id: navigationColumn
151
- width: flickable.width
152
- spacing: 2
153
-
154
- Repeater {
155
- model: navigationBar.navigationItems
156
- delegate: NavigationItem {
157
- id: item
158
- itemData: modelData
159
- currentPage: navigationBar.stackView
160
-
161
- // 子菜单重置
162
- Connections {
163
- target: navigationBar
164
- function onCollapsedChanged() {
165
- if (!navigationBar.collapsed) {
166
- return
167
- }
168
- item.collapsed = navigationBar.collapsed
169
- }
170
- }
171
- }
172
- }
173
- }
174
-
175
- ScrollBar.vertical: ScrollBar {
176
- policy: ScrollBar.AsNeeded
177
- }
178
- }
179
- }
1
+ import QtQuick 2.15
2
+ import QtQuick.Controls 2.15
3
+ import "../../components"
4
+ import "../../themes"
5
+
6
+
7
+ Item {
8
+ id: navigationBar
9
+ // implicitWidth: collapsed ? 40 : expandWidth
10
+ height: parent.height
11
+
12
+ property bool collapsed: false
13
+ property var navigationItems: [
14
+ // {title: "Title", page: "path/to/page.qml", icon: undefined}
15
+ ]
16
+
17
+ // property int currentSubIndex: -1
18
+ property bool titleBarEnabled: true
19
+ property int expandWidth: 280
20
+ property int minimumExpandWidth: 900
21
+
22
+ property alias windowTitle: titleLabel.text
23
+ property alias windowIcon: iconLabel.source
24
+ property int windowWidth: minimumExpandWidth
25
+ property var stackView: parent.stackView
26
+
27
+ property string currentPage: "" // 当前页面的URL
28
+ property var lastPages: [] // 历史页面的URL栈
29
+
30
+ function isNotOverMinimumWidth() { // 判断窗口是否小于最小宽度
31
+ return windowWidth < minimumExpandWidth;
32
+ }
33
+
34
+ // 展开收缩动画 //
35
+ width: collapsed ? 40 : expandWidth
36
+ implicitWidth: isNotOverMinimumWidth() ? 40 : collapsed ? 40 : expandWidth
37
+
38
+ Behavior on width {
39
+ NumberAnimation {
40
+ duration: Utils.animationSpeed
41
+ easing.type: Easing.OutQuint
42
+ }
43
+ }
44
+ Behavior on implicitWidth {
45
+ NumberAnimation {
46
+ duration: Utils.animationSpeed
47
+ easing.type: Easing.OutQuint
48
+ }
49
+ }
50
+
51
+ Rectangle {
52
+ id: background
53
+ anchors.fill: parent
54
+ anchors.margins: -5
55
+ anchors.topMargin: -title.height
56
+ radius: Theme.currentTheme.appearance.windowRadius
57
+ color: Theme.currentTheme.colors.backgroundAcrylicColor
58
+ border.color: Theme.currentTheme.colors.flyoutBorderColor
59
+ z: -1
60
+ visible: isNotOverMinimumWidth() && !collapsed ? 1 : 0
61
+
62
+ Behavior on visible {
63
+ NumberAnimation {
64
+ duration: collapsed ? Utils.animationSpeed / 2 : 50
65
+ }
66
+ }
67
+
68
+ layer.enabled: true
69
+ layer.effect: Shadow {
70
+ style: "flyout"
71
+ source: background
72
+ }
73
+ }
74
+
75
+ Row {
76
+ id: title
77
+ anchors.left: parent.left
78
+ anchors.bottom: parent.top
79
+ height: titleBarHeight
80
+ spacing: 16
81
+ visible: navigationBar.titleBarEnabled
82
+
83
+ // 返回按钮
84
+ ToolButton {
85
+ flat: true
86
+ anchors.verticalCenter: parent.verticalCenter
87
+ icon.name: "ic_fluent_arrow_left_20_regular"
88
+ onClicked: navigationView.safePop()
89
+ width: 40
90
+ height: 40
91
+ size: 16
92
+ enabled: lastPages.length > 1
93
+
94
+ ToolTip {
95
+ parent: parent
96
+ delay: 500
97
+ visible: parent.hovered
98
+ text: qsTr("Back")
99
+ }
100
+ }
101
+
102
+ //图标
103
+ IconWidget {
104
+ id: iconLabel
105
+ size: 16
106
+ anchors.verticalCenter: parent.verticalCenter
107
+ }
108
+
109
+ //标题
110
+ Text {
111
+ id: titleLabel
112
+ anchors.verticalCenter: parent.verticalCenter
113
+
114
+ typography: Typography.Caption
115
+ // text: title
116
+ }
117
+ }
118
+
119
+ // 收起切换按钮
120
+ ToolButton {
121
+ id: collapseButton
122
+ flat: true
123
+ width: 40
124
+ height: 38
125
+ // icon.name: collapsed ? "ic_fluent_chevron_right_20_regular" : "ic_fluent_chevron_left_20_regular"
126
+ icon.name: "ic_fluent_navigation_20_regular"
127
+ size: 19
128
+
129
+ onClicked: {
130
+ collapsed = !collapsed
131
+ }
132
+
133
+ ToolTip {
134
+ parent: parent
135
+ delay: 500
136
+ visible: parent.hovered && !parent.pressed
137
+ text: collapsed ? qsTr("Open Navigation") : qsTr("Close Navigation")
138
+ }
139
+ }
140
+
141
+ Flickable {
142
+ id: flickable
143
+ anchors.fill: parent
144
+ anchors.topMargin: 40
145
+ contentWidth: parent.width
146
+ contentHeight: navigationColumn.implicitHeight
147
+ clip: true
148
+
149
+ Column {
150
+ id: navigationColumn
151
+ width: flickable.width
152
+ spacing: 2
153
+
154
+ Repeater {
155
+ model: navigationBar.navigationItems
156
+ delegate: NavigationItem {
157
+ id: item
158
+ itemData: modelData
159
+ currentPage: navigationBar.stackView
160
+
161
+ // 子菜单重置
162
+ Connections {
163
+ target: navigationBar
164
+ function onCollapsedChanged() {
165
+ if (!navigationBar.collapsed) {
166
+ return
167
+ }
168
+ item.collapsed = navigationBar.collapsed
169
+ }
170
+ }
171
+ }
172
+ }
173
+ }
174
+
175
+ ScrollBar.vertical: ScrollBar {
176
+ policy: ScrollBar.AsNeeded
177
+ }
178
+ }
179
+ }