RinUI 0.0.10.1__py3-none-any.whl → 0.0.11__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 (34) hide show
  1. RinUI/__init__.py +1 -1
  2. RinUI/components/ContextMenu.qml +1 -1
  3. RinUI/components/MenusAndToolbars/TextInputMenu.qml +38 -0
  4. RinUI/components/Text/TextArea.qml +1 -29
  5. RinUI/components/Text/TextField.qml +1 -29
  6. RinUI/components/Text/TextInput.qml +19 -0
  7. RinUI/components/qmldir +1 -0
  8. RinUI/core/__init__.py +2 -1
  9. RinUI/core/__pycache__/__init__.cpython-38.pyc +0 -0
  10. RinUI/core/__pycache__/config.cpython-38.pyc +0 -0
  11. RinUI/core/__pycache__/launcher.cpython-38.pyc +0 -0
  12. RinUI/core/__pycache__/theme.cpython-38.pyc +0 -0
  13. RinUI/core/__pycache__/translator.cpython-38.pyc +0 -0
  14. RinUI/core/config.py +11 -2
  15. RinUI/core/launcher.py +24 -37
  16. RinUI/core/theme.py +17 -20
  17. RinUI/core/translator.py +25 -0
  18. RinUI/languages/en_US.qm +1 -0
  19. RinUI/languages/en_US.ts +201 -0
  20. RinUI/languages/zh_CN.qm +0 -0
  21. RinUI/languages/zh_CN.ts +204 -0
  22. RinUI/qmldir +1 -0
  23. RinUI/themes/theme.qml +39 -15
  24. RinUI/themes/utils.qml +4 -0
  25. RinUI/windows/FluentWindow.qml +0 -1
  26. RinUI/windows/FluentWindowBase.qml +0 -1
  27. {rinui-0.0.10.1.data → rinui-0.0.11.data}/data/README.md +2 -1
  28. {rinui-0.0.10.1.dist-info → rinui-0.0.11.dist-info}/METADATA +3 -2
  29. {rinui-0.0.10.1.dist-info → rinui-0.0.11.dist-info}/RECORD +34 -27
  30. {rinui-0.0.10.1.data → rinui-0.0.11.data}/data/LICENSE +0 -0
  31. {rinui-0.0.10.1.dist-info → rinui-0.0.11.dist-info}/LICENSE +0 -0
  32. {rinui-0.0.10.1.dist-info → rinui-0.0.11.dist-info}/WHEEL +0 -0
  33. {rinui-0.0.10.1.dist-info → rinui-0.0.11.dist-info}/entry_points.txt +0 -0
  34. {rinui-0.0.10.1.dist-info → rinui-0.0.11.dist-info}/top_level.txt +0 -0
RinUI/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  from .core import *
2
2
 
3
- __version__ = "0.0.10"
3
+ __version__ = "0.0.11"
4
4
  __author__ = "RinLit"
@@ -101,9 +101,9 @@ Popup {
101
101
  }
102
102
 
103
103
  onClicked: {
104
+ contextMenu.close()
104
105
  listView.currentIndex = index
105
106
  contextMenu.itemSelected(index)
106
- contextMenu.close()
107
107
  }
108
108
  }
109
109
  }
@@ -0,0 +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
+ }
38
+ }
@@ -15,36 +15,8 @@ TextArea {
15
15
  enabled: editable
16
16
 
17
17
  // Menu
18
- Menu {
18
+ TextInputMenu {
19
19
  id: contextMenu
20
- position: -1
21
- Action {
22
- icon.name: "ic_fluent_cut_20_regular"
23
- text: qsTr("Cut")
24
- enabled: root.selectedText.length > 0 && root.editable // 选中&可编辑
25
- shortcut: "Ctrl+X"
26
- onTriggered: root.cut()
27
- }
28
- Action {
29
- icon.name: "ic_fluent_copy_20_regular"
30
- text: qsTr("Copy")
31
- enabled: root.selectedText.length > 0 // 选中内容
32
- shortcut: "Ctrl+C"
33
- onTriggered: root.copy()
34
- }
35
- Action {
36
- icon.name: "ic_fluent_clipboard_paste_20_regular"
37
- text: qsTr("Paste")
38
- enabled: root.editable
39
- shortcut: "Ctrl+V"
40
- onTriggered: root.paste()
41
- }
42
- Action {
43
- icon.name: " "
44
- text: qsTr("Select All")
45
- shortcut: "Ctrl+A"
46
- onTriggered: root.selectAll()
47
- }
48
20
  }
49
21
 
50
22
  MouseArea {
@@ -15,36 +15,8 @@ TextField {
15
15
  enabled: editable
16
16
 
17
17
  // Menu
18
- Menu {
18
+ TextInputMenu {
19
19
  id: contextMenu
20
- position: -1
21
- Action {
22
- icon.name: "ic_fluent_cut_20_regular"
23
- text: qsTr("Cut")
24
- enabled: root.selectedText.length > 0 && root.editable // 选中&可编辑
25
- shortcut: "Ctrl+X"
26
- onTriggered: root.cut()
27
- }
28
- Action {
29
- icon.name: "ic_fluent_copy_20_regular"
30
- text: qsTr("Copy")
31
- enabled: root.selectedText.length > 0 // 选中内容
32
- shortcut: "Ctrl+C"
33
- onTriggered: root.copy()
34
- }
35
- Action {
36
- icon.name: "ic_fluent_clipboard_paste_20_regular"
37
- text: qsTr("Paste")
38
- enabled: root.editable
39
- shortcut: "Ctrl+V"
40
- onTriggered: root.paste()
41
- }
42
- Action {
43
- icon.name: " "
44
- text: qsTr("Select All")
45
- shortcut: "Ctrl+A"
46
- onTriggered: root.selectAll()
47
- }
48
20
  }
49
21
 
50
22
  MouseArea {
@@ -13,6 +13,25 @@ TextInput {
13
13
  color: Theme.currentTheme.colors.textColor
14
14
  selectionColor: Theme.currentTheme.colors.primaryColor
15
15
 
16
+ // Menu
17
+ TextInputMenu {
18
+ id: contextMenu
19
+ }
20
+
21
+ MouseArea {
22
+ anchors.fill: parent
23
+ acceptedButtons: Qt.RightButton
24
+ propagateComposedEvents: true
25
+ onPressed: (mouse) => {
26
+ if (mouse.button === Qt.RightButton)
27
+ contextMenu.popup(mouse.scenePosition)
28
+ mouse.accepted = false
29
+ }
30
+
31
+ // 鼠标
32
+ cursorShape: Qt.IBeamCursor
33
+ }
34
+
16
35
  font.pixelSize: {
17
36
  switch (typography) {
18
37
  case Typography.Display: return Theme.currentTheme.typography.displaySize;
RinUI/components/qmldir CHANGED
@@ -47,6 +47,7 @@ Text 1.0 Text/Text.qml
47
47
 
48
48
  # Menus & Toolbars
49
49
  Menu 1.0 MenusAndToolbars/Menu.qml
50
+ TextInputMenu 1.0 MenusAndToolbars/TextInputMenu.qml
50
51
  MenuItem 1.0 MenusAndToolbars/MenuItem.qml
51
52
  MenuItemGroup 1.0 MenusAndToolbars/MenuItemGroup.qml
52
53
  MenuSeparator 1.0 MenusAndToolbars/MenuSeparator.qml
RinUI/core/__init__.py CHANGED
@@ -1,3 +1,4 @@
1
1
  from .theme import ThemeManager
2
2
  from .launcher import RinUIWindow
3
- from .config import DEFAULT_CONFIG, ConfigCenter, PATH, Theme, BackdropEffect
3
+ from .config import DEFAULT_CONFIG, RinConfig, PATH, Theme, BackdropEffect, ConfigManager
4
+ from .translator import RinUITranslator
Binary file
RinUI/core/config.py CHANGED
@@ -2,6 +2,7 @@ import os
2
2
  import json
3
3
  import platform
4
4
  import sys
5
+ from PySide6.QtCore import QLocale
5
6
  from enum import Enum
6
7
 
7
8
 
@@ -36,7 +37,6 @@ BASE_DIR = os.path.abspath(os.getcwd())
36
37
  PATH = os.path.join(BASE_DIR, "RinUI/config")
37
38
  RINUI_PATH = resource_path(os.path.join(rinui_core_path, "../../")) # 使用 resource_path 处理路径
38
39
  DEFAULT_CONFIG = {
39
- "language": "zh_CN",
40
40
  "theme": {
41
41
  "current_theme": "Auto",
42
42
  },
@@ -62,8 +62,13 @@ class BackdropEffect(Enum):
62
62
  Tabbed = "tabbed"
63
63
 
64
64
 
65
- class ConfigCenter:
65
+ class ConfigManager:
66
66
  def __init__(self, path, filename):
67
+ """
68
+ Json Config Manager
69
+ :param path: json config file path
70
+ :param filename: json config file name (eg: rin_ui.json)
71
+ """
67
72
  self.path = path
68
73
  self.filename = filename
69
74
  self.config = {}
@@ -118,3 +123,7 @@ class ConfigCenter:
118
123
 
119
124
  def __repr__(self):
120
125
  return json.dumps(self.config, ensure_ascii=False, indent=4)
126
+
127
+
128
+ RinConfig = ConfigManager(path=PATH, filename='rin_ui.json')
129
+ RinConfig.load_config(DEFAULT_CONFIG) # 加载配置
RinUI/core/launcher.py CHANGED
@@ -1,33 +1,20 @@
1
1
  import os
2
2
  import sys
3
3
 
4
- from PySide6.QtCore import QCoreApplication, QUrl
4
+ from PySide6.QtCore import QCoreApplication, QUrl, QObject
5
5
  from PySide6.QtGui import QIcon
6
- from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
6
+ from PySide6.QtWidgets import QApplication
7
7
  from PySide6.QtQml import QQmlApplicationEngine
8
- from .theme import ThemeManager
9
- from .config import BackdropEffect, is_windows, Theme, RINUI_PATH
10
-
11
8
 
12
- class TestWindow(QWidget):
13
- def __init__(self, theme_manager):
14
- super().__init__()
15
- layout = QVBoxLayout()
16
- self.setLayout(layout)
17
- self.setWindowTitle("Test Window")
18
- btn = QPushButton(theme_manager.current_theme)
19
- btn.clicked.connect(
20
- lambda: theme_manager.toggle_theme("Light" if theme_manager.current_theme == "Dark" else "Dark")
21
- )
22
- self.layout().addWidget(btn)
23
- self.resize(400, 300)
9
+ from .theme import ThemeManager
10
+ from .config import BackdropEffect, is_windows, Theme, RINUI_PATH, RinConfig
24
11
 
25
12
 
26
13
  class RinUIWindow:
27
14
  def __init__(self, qml_path: str):
28
15
  """
29
- 创建基于 RinUI QML 应用程序。
30
- :param qml_path: str, QML 文件路径
16
+ Create an application window with RinUI.
17
+ :param qml_path: str, QML file path (eg = "path/to/main.qml")
31
18
  """
32
19
  super().__init__()
33
20
  if hasattr(self, "_initialized") and self._initialized:
@@ -35,29 +22,29 @@ class RinUIWindow:
35
22
  self._initialized = True
36
23
  print("✨ RinUIWindow Initializing")
37
24
 
25
+ # 退出清理
26
+ app_instance = QCoreApplication.instance()
27
+ if not app_instance:
28
+ raise RuntimeError("QApplication must be created before RinUIWindow.")
29
+
38
30
  self.engine = QQmlApplicationEngine()
39
31
  self.theme_manager = ThemeManager()
40
32
  self.qml_path = qml_path
41
33
  self.autoSetWindowsEffect = True
42
34
 
35
+ app_instance.aboutToQuit.connect(self.theme_manager.clean_up)
43
36
  self._setup_application()
44
37
  self.print_startup_info()
45
38
 
46
- # 退出清理
47
- app_instance = QCoreApplication.instance()
48
- if app_instance:
49
- app_instance.aboutToQuit.connect(self.theme_manager.clean_up)
50
-
51
- def _setup_application(self):
39
+ def _setup_application(self) -> None:
52
40
  """Setup"""
53
41
  # RInUI 模块
54
- rinui_import_path = RINUI_PATH
55
- print(f"UI Module Path: {rinui_import_path}")
42
+ print(f"UI Module Path: {RINUI_PATH}")
56
43
 
57
- if os.path.exists(rinui_import_path):
58
- self.engine.addImportPath(rinui_import_path)
44
+ if os.path.exists(RINUI_PATH):
45
+ self.engine.addImportPath(RINUI_PATH)
59
46
  else:
60
- raise FileNotFoundError(f"Cannot find RinUI module: {rinui_import_path}")
47
+ raise FileNotFoundError(f"Cannot find RinUI module: {RINUI_PATH}")
61
48
 
62
49
  # 主题管理器
63
50
  self.engine.rootContext().setContextProperty("ThemeManager", self.theme_manager)
@@ -77,8 +64,8 @@ class RinUIWindow:
77
64
 
78
65
  def setIcon(self, path: str) -> None:
79
66
  """
80
- 设置应用程序图标。
81
- :param path: str, 图标路径
67
+ Sets the icon for the application.
68
+ :param path: str, icon file path (eg = "path/to/icon.png")
82
69
  :return:
83
70
  """
84
71
  app_instance = QApplication.instance()
@@ -88,7 +75,7 @@ class RinUIWindow:
88
75
  else:
89
76
  raise RuntimeError("Cannot set icon before QApplication is created.")
90
77
 
91
- def _apply_windows_effects(self):
78
+ def _apply_windows_effects(self) -> None:
92
79
  """
93
80
  Apply Windows effects to the window.
94
81
  :return:
@@ -98,7 +85,7 @@ class RinUIWindow:
98
85
  self.theme_manager.apply_window_effects()
99
86
 
100
87
  # func名称遵循 Qt 命名规范
101
- def setBackdropEffect(self, effect: BackdropEffect):
88
+ def setBackdropEffect(self, effect: BackdropEffect) -> None:
102
89
  """
103
90
  Sets the backdrop effect for the window. (Only available on Windows)
104
91
  :param effect: BackdropEffect, type of backdrop effect(Acrylic, Mica, Tabbed, None_)
@@ -108,7 +95,7 @@ class RinUIWindow:
108
95
  raise OSError("Only can set backdrop effect on Windows platform.")
109
96
  self.theme_manager.apply_backdrop_effect(effect.value)
110
97
 
111
- def setTheme(self, theme: Theme):
98
+ def setTheme(self, theme: Theme) -> None:
112
99
  """
113
100
  Sets the theme for the window.
114
101
  :param theme: Theme, type of theme(Auto, Dark, Light)
@@ -116,7 +103,7 @@ class RinUIWindow:
116
103
  """
117
104
  self.theme_manager.toggle_theme(theme.value)
118
105
 
119
- def __getattr__(self, name):
106
+ def __getattr__(self, name) -> QObject:
120
107
  """获取 QML 窗口属性"""
121
108
  try:
122
109
  root = object.__getattribute__(self, "root_window")
@@ -124,7 +111,7 @@ class RinUIWindow:
124
111
  except AttributeError:
125
112
  raise AttributeError(f"\"RinUIWindow\" object has no attribute '{name}'")
126
113
 
127
- def print_startup_info(self):
114
+ def print_startup_info(self) -> None:
128
115
  border = "=" * 40
129
116
  print(f"\n{border}")
130
117
  print("✨ RinUIWindow Loaded Successfully!")
RinUI/core/theme.py CHANGED
@@ -4,7 +4,7 @@ import time
4
4
 
5
5
  from PySide6.QtCore import QObject, Signal, Slot, QThread
6
6
 
7
- from .config import DEFAULT_CONFIG, ConfigCenter, PATH, is_win10, is_windows, is_win11, BackdropEffect
7
+ from .config import DEFAULT_CONFIG, RinConfig, is_win10, is_windows, is_win11, BackdropEffect
8
8
  import sys
9
9
  import darkdetect
10
10
 
@@ -99,7 +99,7 @@ class ThemeManager(QObject):
99
99
  清理资源并停止主题监听。
100
100
  """
101
101
  if self.listener:
102
- self.config.save_config()
102
+ RinConfig.save_config()
103
103
  print("Save config.")
104
104
  self.listener.stop()
105
105
  self.listener.wait() # 等待线程结束
@@ -129,11 +129,8 @@ class ThemeManager(QObject):
129
129
  self.current_theme = DEFAULT_CONFIG["theme"]["current_theme"] # 当前主题
130
130
  self.is_darkdetect_supported = check_darkdetect_support()
131
131
 
132
- self.config = ConfigCenter(PATH, "rin_ui.json") # 配置中心
133
- self.config.load_config(DEFAULT_CONFIG) # 加载配置
134
-
135
132
  try:
136
- self.current_theme = self.config["theme"]["current_theme"]
133
+ self.current_theme = RinConfig["theme"]["current_theme"]
137
134
  except Exception as e:
138
135
  print(f"Failed to load config because of {e}, using default config")
139
136
 
@@ -154,7 +151,7 @@ class ThemeManager(QObject):
154
151
  self.windows.append(hwnd)
155
152
  print(f"Window handle set: {hwnd}")
156
153
 
157
- def _handle_system_theme(self, system_theme):
154
+ def _handle_system_theme(self):
158
155
  if self.current_theme == "Auto":
159
156
  self._update_window_theme()
160
157
  self.themeChanged.emit(self._actual_theme())
@@ -190,7 +187,7 @@ class ThemeManager(QObject):
190
187
  elif is_win10() and effect_type == BackdropEffect.Acrylic.value:
191
188
  self._apply_win10_effect(effect_type, hwnd)
192
189
 
193
- self.config["backdrop_effect"] = effect_type
190
+ RinConfig["backdrop_effect"] = effect_type
194
191
  print(
195
192
  f"Applied \"{effect_type.strip().capitalize()}\" effect with "
196
193
  f"{platform.system() + '11' if is_win11() else '10'}"
@@ -202,7 +199,7 @@ class ThemeManager(QObject):
202
199
  应用 Windows 10 背景效果
203
200
  :param effect_type: str, 背景效果类型(acrylic, tabbed(actually blur)
204
201
  """
205
- backdrop_color = self.config["win10_feat"]["backdrop_dark" if self.is_dark_theme() else "backdrop_light"]
202
+ backdrop_color = RinConfig["win10_feat"]["backdrop_dark" if self.is_dark_theme() else "backdrop_light"]
206
203
 
207
204
  accent = ACCENT_POLICY()
208
205
  accent.AccentState = ACCENT_STATES[effect_type]
@@ -257,8 +254,8 @@ class ThemeManager(QObject):
257
254
  ctypes.byref(ctypes.c_int(self.theme_dict[actual_theme])),
258
255
  ctypes.sizeof(ctypes.c_int)
259
256
  )
260
- elif is_win10() and self.config["backdrop_effect"] == BackdropEffect.Acrylic.value:
261
- self._apply_win10_effect(self.config["backdrop_effect"], hwnd)
257
+ elif is_win10() and RinConfig["backdrop_effect"] == BackdropEffect.Acrylic.value:
258
+ self._apply_win10_effect(RinConfig["backdrop_effect"], hwnd)
262
259
  else:
263
260
  print(f"Cannot apply backdrop on {platform.system()}")
264
261
 
@@ -281,7 +278,7 @@ class ThemeManager(QObject):
281
278
  if self.current_theme != theme:
282
279
  print(f"Switching to '{theme}' theme")
283
280
  self.current_theme = theme
284
- self.config["theme"]["current_theme"] = theme
281
+ RinConfig["theme"]["current_theme"] = theme
285
282
  self._update_window_theme()
286
283
  self.themeChanged.emit(self._actual_theme())
287
284
 
@@ -301,18 +298,18 @@ class ThemeManager(QObject):
301
298
  @Slot(result=str)
302
299
  def get_backdrop_effect(self):
303
300
  """获取当前背景效果"""
304
- return self.config["backdrop_effect"]
301
+ return RinConfig["backdrop_effect"]
302
+
303
+ @Slot(str)
304
+ def set_theme_color(self, color):
305
+ """设置当前主题颜色"""
306
+ RinConfig["theme_color"] = color
307
+ RinConfig.save_config()
305
308
 
306
309
  @Slot(result=str)
307
310
  def get_theme_color(self):
308
311
  """获取当前主题颜色"""
309
- return self.config["theme_color"]
310
-
311
- @Slot(result=str)
312
- def set_theme_color(self, color):
313
- """设置当前主题颜色"""
314
- self.config["theme_color"] = color
315
- self.config.save_config()
312
+ return RinConfig["theme_color"]
316
313
 
317
314
  @Slot(QObject, result=int)
318
315
  def getWindowId(self, window):
@@ -0,0 +1,25 @@
1
+ from PySide6.QtCore import QTranslator, QLocale
2
+ from .config import RINUI_PATH
3
+ import os
4
+
5
+
6
+ class RinUITranslator(QTranslator):
7
+ """
8
+ RinUI i18n translator.
9
+ :param locale: QLocale, optional, default is system locale
10
+ """
11
+ def __init__(self, locale: QLocale = QLocale.system().name(), parent=None): # follow system
12
+ super().__init__(parent)
13
+ self.load(locale or QLocale())
14
+
15
+ def load(self, locale: QLocale) -> bool:
16
+ """
17
+ Load translation file for the given locale.
18
+ :param locale: QLocale, the locale to load (eg = QLocale(QLocale.Chinese, QLocale.China), QLocale("zh_CN"))
19
+ :return: bool
20
+ """
21
+ print(f"🌏 Current locale: {locale.name()}")
22
+ path = os.path.join(RINUI_PATH, "RinUI", "languages", f"{locale.name()}.qm")
23
+ if not os.path.exists(path):
24
+ raise FileNotFoundError(f"Cannot find translation file: {path}")
25
+ return super().load(path)
@@ -0,0 +1 @@
1
+ <�d��!�`���
@@ -0,0 +1,201 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!DOCTYPE TS>
3
+ <TS version="2.1">
4
+ <context>
5
+ <name>CtrlBtn</name>
6
+ <message>
7
+ <location filename="../windows/CtrlBtn.qml" line="19"/>
8
+ <source>Maximize</source>
9
+ <translation type="unfinished"></translation>
10
+ </message>
11
+ <message>
12
+ <location filename="../windows/CtrlBtn.qml" line="19"/>
13
+ <source>Minimize</source>
14
+ <translation type="unfinished"></translation>
15
+ </message>
16
+ <message>
17
+ <location filename="../windows/CtrlBtn.qml" line="19"/>
18
+ <source>Close</source>
19
+ <translation type="unfinished"></translation>
20
+ </message>
21
+ <message>
22
+ <location filename="../windows/CtrlBtn.qml" line="19"/>
23
+ <source>Unknown</source>
24
+ <translation type="unfinished"></translation>
25
+ </message>
26
+ </context>
27
+ <context>
28
+ <name>DatePicker</name>
29
+ <message>
30
+ <location filename="../components/DateAndTime/DatePicker.qml" line="98"/>
31
+ <source>year</source>
32
+ <translation type="unfinished"></translation>
33
+ </message>
34
+ <message>
35
+ <location filename="../components/DateAndTime/DatePicker.qml" line="99"/>
36
+ <source>month</source>
37
+ <translation type="unfinished"></translation>
38
+ </message>
39
+ <message>
40
+ <location filename="../components/DateAndTime/DatePicker.qml" line="100"/>
41
+ <source>day</source>
42
+ <translation type="unfinished"></translation>
43
+ </message>
44
+ </context>
45
+ <context>
46
+ <name>ErrorPage</name>
47
+ <message>
48
+ <location filename="../components/Navigation/ErrorPage.qml" line="21"/>
49
+ <source>Sorry, something went wrong!</source>
50
+ <translation type="unfinished"></translation>
51
+ </message>
52
+ <message>
53
+ <location filename="../components/Navigation/ErrorPage.qml" line="30"/>
54
+ <source> load failed!
55
+
56
+ Because of </source>
57
+ <translation type="unfinished"></translation>
58
+ </message>
59
+ <message>
60
+ <location filename="../components/Navigation/ErrorPage.qml" line="30"/>
61
+ <source>
62
+ Please try again later.</source>
63
+ <translation type="unfinished"></translation>
64
+ </message>
65
+ <message>
66
+ <location filename="../components/Navigation/ErrorPage.qml" line="41"/>
67
+ <source>Retry</source>
68
+ <translation type="unfinished"></translation>
69
+ </message>
70
+ </context>
71
+ <context>
72
+ <name>FluentWindow</name>
73
+ <message>
74
+ <location filename="../windows/FluentWindow.qml" line="11"/>
75
+ <source>Fluent Window</source>
76
+ <translation type="unfinished"></translation>
77
+ </message>
78
+ </context>
79
+ <context>
80
+ <name>FluentWindowBase</name>
81
+ <message>
82
+ <location filename="../windows/FluentWindowBase.qml" line="11"/>
83
+ <source>Fluent Window Base</source>
84
+ <translation type="unfinished"></translation>
85
+ </message>
86
+ </context>
87
+ <context>
88
+ <name>InfoBar</name>
89
+ <message>
90
+ <location filename="../components/StatusAndInfo/InfoBar.qml" line="171"/>
91
+ <source>Close</source>
92
+ <translation type="unfinished"></translation>
93
+ </message>
94
+ </context>
95
+ <context>
96
+ <name>NavigationBar</name>
97
+ <message>
98
+ <location filename="../components/Navigation/NavigationBar.qml" line="98"/>
99
+ <source>Back</source>
100
+ <translation type="unfinished"></translation>
101
+ </message>
102
+ <message>
103
+ <location filename="../components/Navigation/NavigationBar.qml" line="137"/>
104
+ <source>Open Navigation</source>
105
+ <translation type="unfinished"></translation>
106
+ </message>
107
+ <message>
108
+ <location filename="../components/Navigation/NavigationBar.qml" line="137"/>
109
+ <source>Close Navigation</source>
110
+ <translation type="unfinished"></translation>
111
+ </message>
112
+ </context>
113
+ <context>
114
+ <name>PickerView</name>
115
+ <message>
116
+ <location filename="../components/DateAndTime/PickerView.qml" line="26"/>
117
+ <source>AM</source>
118
+ <translation type="unfinished"></translation>
119
+ </message>
120
+ <message>
121
+ <location filename="../components/DateAndTime/PickerView.qml" line="26"/>
122
+ <source>PM</source>
123
+ <translation type="unfinished"></translation>
124
+ </message>
125
+ </context>
126
+ <context>
127
+ <name>Switch</name>
128
+ <message>
129
+ <location filename="../components/BasicInput/Switch.qml" line="15"/>
130
+ <source>On</source>
131
+ <translation type="unfinished"></translation>
132
+ </message>
133
+ <message>
134
+ <location filename="../components/BasicInput/Switch.qml" line="16"/>
135
+ <source>Off</source>
136
+ <translation type="unfinished"></translation>
137
+ </message>
138
+ </context>
139
+ <context>
140
+ <name>TextInputMenu</name>
141
+ <message>
142
+ <location filename="../components/MenusAndToolbars/TextInputMenu.qml" line="13"/>
143
+ <source>Cut</source>
144
+ <translation type="unfinished"></translation>
145
+ </message>
146
+ <message>
147
+ <location filename="../components/MenusAndToolbars/TextInputMenu.qml" line="20"/>
148
+ <source>Copy</source>
149
+ <translation type="unfinished"></translation>
150
+ </message>
151
+ <message>
152
+ <location filename="../components/MenusAndToolbars/TextInputMenu.qml" line="27"/>
153
+ <source>Paste</source>
154
+ <translation type="unfinished"></translation>
155
+ </message>
156
+ <message>
157
+ <location filename="../components/MenusAndToolbars/TextInputMenu.qml" line="34"/>
158
+ <source>Select All</source>
159
+ <translation type="unfinished"></translation>
160
+ </message>
161
+ </context>
162
+ <context>
163
+ <name>TimePicker</name>
164
+ <message>
165
+ <location filename="../components/DateAndTime/TimePicker.qml" line="10"/>
166
+ <source>AM</source>
167
+ <translation type="unfinished"></translation>
168
+ </message>
169
+ <message>
170
+ <location filename="../components/DateAndTime/TimePicker.qml" line="11"/>
171
+ <source>PM</source>
172
+ <translation type="unfinished"></translation>
173
+ </message>
174
+ <message>
175
+ <location filename="../components/DateAndTime/TimePicker.qml" line="12"/>
176
+ <source>hour</source>
177
+ <translation type="unfinished"></translation>
178
+ </message>
179
+ <message>
180
+ <location filename="../components/DateAndTime/TimePicker.qml" line="13"/>
181
+ <source>minute</source>
182
+ <translation type="unfinished"></translation>
183
+ </message>
184
+ </context>
185
+ <context>
186
+ <name>TitleBar</name>
187
+ <message>
188
+ <location filename="../windows/TitleBar.qml" line="133"/>
189
+ <source>Fluent TitleBar</source>
190
+ <translation type="unfinished"></translation>
191
+ </message>
192
+ </context>
193
+ <context>
194
+ <name>Toast</name>
195
+ <message>
196
+ <location filename="../components/StatusAndInfo/Toast.qml" line="156"/>
197
+ <source>Close</source>
198
+ <translation type="unfinished"></translation>
199
+ </message>
200
+ </context>
201
+ </TS>
Binary file
@@ -0,0 +1,204 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!DOCTYPE TS>
3
+ <TS version="2.1" language="zh_CN" sourcelanguage="en_US">
4
+ <context>
5
+ <name>CtrlBtn</name>
6
+ <message>
7
+ <location filename="../windows/CtrlBtn.qml" line="19"/>
8
+ <source>Maximize</source>
9
+ <translation>最大化</translation>
10
+ </message>
11
+ <message>
12
+ <location filename="../windows/CtrlBtn.qml" line="19"/>
13
+ <source>Minimize</source>
14
+ <translation>最小化</translation>
15
+ </message>
16
+ <message>
17
+ <location filename="../windows/CtrlBtn.qml" line="19"/>
18
+ <source>Close</source>
19
+ <translation>关闭</translation>
20
+ </message>
21
+ <message>
22
+ <location filename="../windows/CtrlBtn.qml" line="19"/>
23
+ <source>Unknown</source>
24
+ <translation>未知</translation>
25
+ </message>
26
+ </context>
27
+ <context>
28
+ <name>DatePicker</name>
29
+ <message>
30
+ <location filename="../components/DateAndTime/DatePicker.qml" line="98"/>
31
+ <source>year</source>
32
+ <translation>年</translation>
33
+ </message>
34
+ <message>
35
+ <location filename="../components/DateAndTime/DatePicker.qml" line="99"/>
36
+ <source>month</source>
37
+ <translation>月</translation>
38
+ </message>
39
+ <message>
40
+ <location filename="../components/DateAndTime/DatePicker.qml" line="100"/>
41
+ <source>day</source>
42
+ <translation>日</translation>
43
+ </message>
44
+ </context>
45
+ <context>
46
+ <name>ErrorPage</name>
47
+ <message>
48
+ <location filename="../components/Navigation/ErrorPage.qml" line="21"/>
49
+ <source>Sorry, something went wrong!</source>
50
+ <translation>抱歉,出错了!</translation>
51
+ </message>
52
+ <message>
53
+ <location filename="../components/Navigation/ErrorPage.qml" line="30"/>
54
+ <source> load failed!
55
+
56
+ Because of </source>
57
+ <translation> 加载 QML 失败!
58
+
59
+ 由于 </translation>
60
+ </message>
61
+ <message>
62
+ <location filename="../components/Navigation/ErrorPage.qml" line="30"/>
63
+ <source>
64
+ Please try again later.</source>
65
+ <translation>
66
+ 请稍后重试。</translation>
67
+ </message>
68
+ <message>
69
+ <location filename="../components/Navigation/ErrorPage.qml" line="41"/>
70
+ <source>Retry</source>
71
+ <translation>重试</translation>
72
+ </message>
73
+ </context>
74
+ <context>
75
+ <name>FluentWindow</name>
76
+ <message>
77
+ <location filename="../windows/FluentWindow.qml" line="11"/>
78
+ <source>Fluent Window</source>
79
+ <translation>流畅窗口</translation>
80
+ </message>
81
+ </context>
82
+ <context>
83
+ <name>FluentWindowBase</name>
84
+ <message>
85
+ <location filename="../windows/FluentWindowBase.qml" line="11"/>
86
+ <source>Fluent Window Base</source>
87
+ <translation>流畅窗口基类</translation>
88
+ </message>
89
+ </context>
90
+ <context>
91
+ <name>InfoBar</name>
92
+ <message>
93
+ <location filename="../components/StatusAndInfo/InfoBar.qml" line="171"/>
94
+ <source>Close</source>
95
+ <translation>关闭</translation>
96
+ </message>
97
+ </context>
98
+ <context>
99
+ <name>NavigationBar</name>
100
+ <message>
101
+ <location filename="../components/Navigation/NavigationBar.qml" line="98"/>
102
+ <source>Back</source>
103
+ <translation>返回</translation>
104
+ </message>
105
+ <message>
106
+ <location filename="../components/Navigation/NavigationBar.qml" line="137"/>
107
+ <source>Open Navigation</source>
108
+ <translation>展开导航</translation>
109
+ </message>
110
+ <message>
111
+ <location filename="../components/Navigation/NavigationBar.qml" line="137"/>
112
+ <source>Close Navigation</source>
113
+ <translation>收起导航</translation>
114
+ </message>
115
+ </context>
116
+ <context>
117
+ <name>PickerView</name>
118
+ <message>
119
+ <location filename="../components/DateAndTime/PickerView.qml" line="26"/>
120
+ <source>AM</source>
121
+ <translation>上午</translation>
122
+ </message>
123
+ <message>
124
+ <location filename="../components/DateAndTime/PickerView.qml" line="26"/>
125
+ <source>PM</source>
126
+ <translation>下午</translation>
127
+ </message>
128
+ </context>
129
+ <context>
130
+ <name>Switch</name>
131
+ <message>
132
+ <location filename="../components/BasicInput/Switch.qml" line="15"/>
133
+ <source>On</source>
134
+ <translation>启用</translation>
135
+ </message>
136
+ <message>
137
+ <location filename="../components/BasicInput/Switch.qml" line="16"/>
138
+ <source>Off</source>
139
+ <translation>禁用</translation>
140
+ </message>
141
+ </context>
142
+ <context>
143
+ <name>TextInputMenu</name>
144
+ <message>
145
+ <location filename="../components/MenusAndToolbars/TextInputMenu.qml" line="13"/>
146
+ <source>Cut</source>
147
+ <translation>剪切</translation>
148
+ </message>
149
+ <message>
150
+ <location filename="../components/MenusAndToolbars/TextInputMenu.qml" line="20"/>
151
+ <source>Copy</source>
152
+ <translation>复制</translation>
153
+ </message>
154
+ <message>
155
+ <location filename="../components/MenusAndToolbars/TextInputMenu.qml" line="27"/>
156
+ <source>Paste</source>
157
+ <translation>粘贴</translation>
158
+ </message>
159
+ <message>
160
+ <location filename="../components/MenusAndToolbars/TextInputMenu.qml" line="34"/>
161
+ <source>Select All</source>
162
+ <translation>全选</translation>
163
+ </message>
164
+ </context>
165
+ <context>
166
+ <name>TimePicker</name>
167
+ <message>
168
+ <location filename="../components/DateAndTime/TimePicker.qml" line="10"/>
169
+ <source>AM</source>
170
+ <translation>上午</translation>
171
+ </message>
172
+ <message>
173
+ <location filename="../components/DateAndTime/TimePicker.qml" line="11"/>
174
+ <source>PM</source>
175
+ <translation>下午</translation>
176
+ </message>
177
+ <message>
178
+ <location filename="../components/DateAndTime/TimePicker.qml" line="12"/>
179
+ <source>hour</source>
180
+ <translation>小时</translation>
181
+ </message>
182
+ <message>
183
+ <location filename="../components/DateAndTime/TimePicker.qml" line="13"/>
184
+ <source>minute</source>
185
+ <translation>分钟</translation>
186
+ </message>
187
+ </context>
188
+ <context>
189
+ <name>TitleBar</name>
190
+ <message>
191
+ <location filename="../windows/TitleBar.qml" line="133"/>
192
+ <source>Fluent TitleBar</source>
193
+ <translation>流畅标题栏</translation>
194
+ </message>
195
+ </context>
196
+ <context>
197
+ <name>Toast</name>
198
+ <message>
199
+ <location filename="../components/StatusAndInfo/Toast.qml" line="156"/>
200
+ <source>Close</source>
201
+ <translation type="unfinished">关闭</translation>
202
+ </message>
203
+ </context>
204
+ </TS>
RinUI/qmldir CHANGED
@@ -61,6 +61,7 @@ TableViewDelegate 1.0 components/ListAndCollections/TableViewDelegate.qml
61
61
 
62
62
  # Menus & Toolbars
63
63
  Menu 1.0 components/MenusAndToolbars/Menu.qml
64
+ TextInputMenu 1.0 components/MenusAndToolbars/TextInputMenu.qml
64
65
  MenuItem 1.0 components/MenusAndToolbars/MenuItem.qml
65
66
  MenuItemGroup 1.0 components/MenusAndToolbars/MenuItemGroup.qml
66
67
  MenuSeparator 1.0 components/MenusAndToolbars/MenuSeparator.qml
RinUI/themes/theme.qml CHANGED
@@ -6,6 +6,17 @@ Item {
6
6
  id: themeManager
7
7
 
8
8
  property var currentTheme: null
9
+ readonly property var mode: ({
10
+ Light: "Light",
11
+ Dark: "Dark",
12
+ Auto: "Auto"
13
+ })
14
+ readonly property var effect: ({
15
+ Mica: "mica",
16
+ Acrylic: "acrylic",
17
+ Tabbed: "tabbed",
18
+ None: "none"
19
+ })
9
20
 
10
21
  // 初始化时设置默认主题
11
22
  Component.onCompleted: {
@@ -17,12 +28,12 @@ Item {
17
28
  }
18
29
  }
19
30
 
20
- function isThemeMgrInitialized() {
31
+ function _isThemeMgrInitialized() {
21
32
  return typeof ThemeManager!== "undefined"
22
33
  }
23
34
 
24
35
  function setBackdropEffect(effect) {
25
- if (!isThemeMgrInitialized()) {
36
+ if (!_isThemeMgrInitialized()) {
26
37
  console.error("ThemeManager is not defined.")
27
38
  return -1
28
39
  }
@@ -30,7 +41,7 @@ Item {
30
41
  }
31
42
 
32
43
  function sendDragWindowEvent(window) {
33
- if (!isThemeMgrInitialized()) {
44
+ if (!_isThemeMgrInitialized()) {
34
45
  console.error("ThemeManager is not defined.")
35
46
  return -1
36
47
  }
@@ -38,15 +49,28 @@ Item {
38
49
  }
39
50
 
40
51
  function getBackdropEffect() {
41
- if (!isThemeMgrInitialized()) {
52
+ if (!_isThemeMgrInitialized()) {
42
53
  console.error("ThemeManager is not defined.")
43
54
  return -1
44
55
  }
45
56
  return ThemeManager.get_backdrop_effect()
46
57
  }
47
58
 
59
+ function setThemeColor(color) {
60
+ if (!_isThemeMgrInitialized()) {
61
+ console.error("ThemeManager is not defined.")
62
+ return -1
63
+ }
64
+ if (typeof color !== "string") {
65
+ console.error("Invalid color format. Expected a string.")
66
+ return -1
67
+ }
68
+ Utils.primaryColor = color
69
+ ThemeManager.set_theme_color(color)
70
+ }
71
+
48
72
  function getThemeColor() {
49
- if (!isThemeMgrInitialized()) {
73
+ if (!_isThemeMgrInitialized()) {
50
74
  console.error("ThemeManager is not defined.")
51
75
  return -1
52
76
  }
@@ -54,7 +78,7 @@ Item {
54
78
  }
55
79
 
56
80
  function getTheme() {
57
- if (!isThemeMgrInitialized()) {
81
+ if (!_isThemeMgrInitialized()) {
58
82
  console.error("ThemeManager is not defined.")
59
83
  return -1
60
84
  }
@@ -64,33 +88,33 @@ Item {
64
88
  // 本来打算写多主题支持的()
65
89
 
66
90
  function toggleMode() {
67
- if (!isThemeMgrInitialized()) {
91
+ if (!_isThemeMgrInitialized()) {
68
92
  console.error("ThemeManager is not defined.")
69
93
  return -1
70
94
  }
71
- var mode = ThemeManager.get_theme()
95
+ let theme_mode;
72
96
  if (!currentTheme.isDark) {
73
- mode = "Dark"
97
+ theme_mode = mode.Dark
74
98
  } else {
75
- mode = "Light"
99
+ theme_mode = mode.Light
76
100
  }
77
- setTheme(mode)
101
+ setTheme(theme_mode)
78
102
  }
79
103
 
80
104
  // 切换主题
81
- function setTheme(mode) {
82
- if (!isThemeMgrInitialized()) {
105
+ function setTheme(theme_mode: mode) {
106
+ if (!_isThemeMgrInitialized()) {
83
107
  console.error("ThemeManager is not defined.")
84
108
  currentTheme = Qt.createQmlObject("import '../themes'; Light {}", themeManager)
85
109
  return
86
110
  }
87
111
 
88
112
  // Call Python backend to toggle theme
89
- ThemeManager.toggle_theme(mode)
113
+ ThemeManager.toggle_theme(theme_mode)
90
114
 
91
115
  // Get the actual theme name
92
116
  var themeName = ThemeManager.get_theme_name()
93
- if (themeName === "Auto") {
117
+ if (themeName === mode.Auto) {
94
118
  // Get the actual theme applied (Light or Dark)
95
119
  themeName = ThemeManager.get_theme()
96
120
  }
RinUI/themes/utils.qml CHANGED
@@ -12,6 +12,10 @@ QtObject {
12
12
  property var fontIconIndex: Icons.FluentIcons // 字体图标索引
13
13
 
14
14
  property color primaryColor: "#605ed2" // 默认主题色
15
+ property QtObject colors: Theme.currentTheme.colors // 主题颜色
16
+ property QtObject appearance: Theme.currentTheme.appearance // 界面外观
17
+ property QtObject typography: Theme.currentTheme.typography // 字体
18
+
15
19
  property int windowDragArea: 5 // 窗口可拖动范围 (px)
16
20
  property int dialogMaximumWidth: 600 // 对话框最大宽度 (px)
17
21
  property int dialogMinimumWidth: 320 // 对话框最小宽度 (px)
@@ -8,7 +8,6 @@ import "../windows"
8
8
  FluentWindowBase {
9
9
  id: window
10
10
  // visible: true
11
- title: qsTr("Fluent Window")
12
11
  width: 900
13
12
  height: 600
14
13
  minimumWidth: 400
@@ -8,7 +8,6 @@ import "../components"
8
8
  ApplicationWindow {
9
9
  id: baseWindow
10
10
  // visible: true
11
- title: qsTr("Fluent Window Base")
12
11
  width: 800
13
12
  height: 600
14
13
  minimumWidth: 400
@@ -20,7 +20,8 @@ With simple configuration, you can quickly develop elegant UI interfaces in the
20
20
  * Elegant Fluent Design controls (WIP)
21
21
  * Dark and light mode, automatic switching
22
22
  * Compatible with original QML control names
23
- * Multi-language support (WIP)
23
+ * i18n Internationalization
24
+ * Multi-programming language support (WIP)
24
25
  * Theme system (WIP)
25
26
  * Development documentation, [preview](https://ui.rinlit.cn/) now. (WIP)
26
27
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: RinUI
3
- Version: 0.0.10.1
3
+ Version: 0.0.11
4
4
  Summary: A Fluent Design-like UI library for Qt Quick (QML) based on PySide6
5
5
  Author-email: RinLit <lintu233_qwq@icloud.com>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -35,7 +35,8 @@ With simple configuration, you can quickly develop elegant UI interfaces in the
35
35
  * Elegant Fluent Design controls (WIP)
36
36
  * Dark and light mode, automatic switching
37
37
  * Compatible with original QML control names
38
- * Multi-language support (WIP)
38
+ * i18n Internationalization
39
+ * Multi-programming language support (WIP)
39
40
  * Theme system (WIP)
40
41
  * Development documentation, [preview](https://ui.rinlit.cn/) now. (WIP)
41
42
 
@@ -1,18 +1,18 @@
1
- RinUI/__init__.py,sha256=P1Pu8kQzTikIsIIJmukwaSMmpUG_r5fxnqgjAux3l0s,70
2
- RinUI/qmldir,sha256=Wml5zu7-V4EYjyDzCpJaEJxTDQOhigwnFQm7ab2k4lo,3448
1
+ RinUI/__init__.py,sha256=6NEDNeQPBw4wJo11D_tIr6r6uLYhpQwaVSm6Pt0617Q,70
2
+ RinUI/qmldir,sha256=WaMo4f8R8BoA2t3Dh-6q6SIa-U-zLlOQfryAaiFilRk,3513
3
3
  RinUI/__pycache__/__init__.cpython-38.pyc,sha256=Q-pcVUmh-8iobgHu0oaBXsCfhJCw7rvRiaQFjLI6H6M,221
4
4
  RinUI/assets/fonts/FluentSystemIcons-Index.js,sha256=XCgcjUnuZjdsjXUu37llGDpQW8sSJbxwmh-hG6UTB2A,258677
5
5
  RinUI/assets/fonts/FluentSystemIcons-Resizable.ttf,sha256=-IfF3NT1eODD0vOLVLC0Z2U5bsR6woSQAziX3qD1TqU,1447252
6
6
  RinUI/assets/img/default_app_icon.png,sha256=hegCgNlRFhVCTBhrY3ESzPeMWlkZOe5IgXsHWeTArPQ,93928
7
7
  RinUI/components/Base.qml,sha256=YifNpJR3iywAhbWkzGciOF-fyL_eb6YohrgLjDOxTkA,2439
8
- RinUI/components/ContextMenu.qml,sha256=8pLS_fXVFn7uFfx3gz0Bd1SvPMXryeYv1GnU3VlLTiI,5780
8
+ RinUI/components/ContextMenu.qml,sha256=GV2SOLNxhgKDHRpZoJU6fahDvJiP98NC2E1Ujosw4yA,5780
9
9
  RinUI/components/FocusIndicator.qml,sha256=R54F-CtUEeNmtoFmCX2Wo-7dom6MAhiWqN8vFapzUPo,926
10
10
  RinUI/components/IconWidget.qml,sha256=pJtNZYWxde-2_e0rALv_jZNByNx1Oir4wJ8hWmdKrns,1736
11
11
  RinUI/components/Indicator.qml,sha256=yIC96KZo6vhXE1aEX7wz2m2iwb8KXBWCqgxKrsLomT8,2627
12
12
  RinUI/components/ScrollBar.qml,sha256=01Qo9eAYRzEQhIU4oD2E7lCLdFGCmekhO32z-DCqo4o,7118
13
13
  RinUI/components/ScrollView.qml,sha256=S6GuZm9lptsZduH-xVDGKkS3BqGqi8EmyiBFvbVFAgM,275
14
14
  RinUI/components/Shadow.qml,sha256=YmVgAPAIY69ur57EDMDKMihx6ucI973SWyff01L8r0s,1638
15
- RinUI/components/qmldir,sha256=TfQyDUQZFpKilIHajbrHCU4UQBOH3IW1AVpDUVLKekk,2241
15
+ RinUI/components/qmldir,sha256=6hGG_NbPWNIs7jsNbCVbagCmItp47GmpSIZLVCfNggw,2295
16
16
  RinUI/components/BasicInput/Button.qml,sha256=vyi214-iYvp82u5pg2xHWJwjKifZKSt2NXTuvYlRFHg,5430
17
17
  RinUI/components/BasicInput/CheckBox.qml,sha256=hFSaKw5LLqSVZXTASQ5csCkTHUOBRZ700v4hm6uEfFM,3183
18
18
  RinUI/components/BasicInput/ComboBox.qml,sha256=OOJSoLGBnNJ8O--htkZfT8VDu7jAwHYbS-B_NB9J-SA,4748
@@ -47,6 +47,7 @@ RinUI/components/MenusAndToolbars/MenuBar.qml,sha256=HR1pSTqklkLFiGkOTGxgRO9WFts
47
47
  RinUI/components/MenusAndToolbars/MenuItem.qml,sha256=XghKdgYVksNKS1zufNtE96c0pnTQg6Dig_8ZNGqip84,3915
48
48
  RinUI/components/MenusAndToolbars/MenuItemGroup.qml,sha256=ywDv4KypNoTQbiDTeIedBj7Dfvcy9jdFtwwK7hSaozE,1057
49
49
  RinUI/components/MenusAndToolbars/MenuSeparator.qml,sha256=Z2G339bFrwOzRpWSqqahjmgJL5u-k-sw3g1uAHXerxQ,270
50
+ RinUI/components/MenusAndToolbars/TextInputMenu.qml,sha256=Xiqh-gnDHhFY8JvaPgVc4fPiISU29uzrEck1K-P87PI,976
50
51
  RinUI/components/MenusAndToolbars/ToolSeparator.qml,sha256=rZXXNnvKw3yZVptj1bOronPDkiYCId1ffAt-a3t-ea4,430
51
52
  RinUI/components/Navigation/ErrorPage.qml,sha256=uQ3UBby1vP6-SBjw1_7aU6hRNXmcqNdBKzC-EuB6a7U,1087
52
53
  RinUI/components/Navigation/NavigationBar.qml,sha256=RR8PjDNl0lqfwcvnx0EvooAnVx4db6Q8o1L03ghzdlE,5075
@@ -61,25 +62,31 @@ RinUI/components/StatusAndInfo/Toast.qml,sha256=9T8i9JswzGEXZM8CeZbwWsILEbzymy2Z
61
62
  RinUI/components/StatusAndInfo/ToolTip.qml,sha256=js0t8IJ6bnYt8JHHMQwS49MQOhaBjLNYP_libFbZROk,2757
62
63
  RinUI/components/Text/SpinBox.qml,sha256=YC1CjlHauP081qtseFQuSDNCUsCnCgtjh8nfgPqCZfU,4229
63
64
  RinUI/components/Text/Text.qml,sha256=-VaPy0W4d8mE6C1crSA0ADReKdA_NlghxaS5iV_8RYg,1758
64
- RinUI/components/Text/TextArea.qml,sha256=BQmJIUHyWuTgTr4FP1XvFfGDFwt5bTT8rZ-v_eam-O8,4758
65
- RinUI/components/Text/TextField.qml,sha256=2S6x5iUWyemwm5vlywpK6YHy_QAezfZnznVVHDignH8,4570
66
- RinUI/components/Text/TextInput.qml,sha256=dShTgTHPgZcwy4qI-fCxXtBBcR4ebkl94hipq5Nadn4,1210
65
+ RinUI/components/Text/TextArea.qml,sha256=BA2YdHVfslv2d1AfHlPp-fpAK5tkWp6KgpU3FGetS1Q,3823
66
+ RinUI/components/Text/TextField.qml,sha256=Jdh8RqyGUB35lSLnv_662651eJsZEllXwGoaUS82HxU,3635
67
+ RinUI/components/Text/TextInput.qml,sha256=FI-ru7-hxG5aDJwUkMTRKbTkSgGmSgKC1inzSpDmNHM,1658
67
68
  RinUI/config/rin_ui.json,sha256=rDCS0TVFt1VowGlcW_jqOM81DWwkV7S8Z5rae2p4TSk,149
68
- RinUI/core/__init__.py,sha256=lm9MTtS7ZrvwpRDXatPehvJSnLPKnet4MY3R5T69kxM,147
69
- RinUI/core/config.py,sha256=l4LZZ54XsP6r7ZmhslgxonrTFX16qOojtKejILwJsv8,3554
70
- RinUI/core/launcher.py,sha256=qRKdBqLYmM4_ZqMeFl-6tBkpkqKEjSvgtqDf5zfiJE0,5119
71
- RinUI/core/theme.py,sha256=q8vqq5LP1zlGCLMmOfNQv47qcMtoDYqm0J7HwIC74g4,11203
72
- RinUI/core/__pycache__/__init__.cpython-38.pyc,sha256=UVtd9E2Qhoc6XOdcEVXncZHsI4yETMhwEaWxB6kw8Qg,362
73
- RinUI/core/__pycache__/config.cpython-38.pyc,sha256=Zh8NQ7EoG4Y_fMfu3UJLOUJP2E-sitgYbfbZ_2x-Js0,4122
74
- RinUI/core/__pycache__/launcher.cpython-38.pyc,sha256=VY7h9U7tS1HuHm2J2oZCt2mHExeJAa5O0yGxwoADXJA,5336
75
- RinUI/core/__pycache__/theme.cpython-38.pyc,sha256=CqxoFJO4dwpFfdqWnD5FlCqMEj_xWMvayoFaQCpvf7I,10041
69
+ RinUI/core/__init__.py,sha256=wNpVVuBWj3pX0eiq0P01QuN4oFxo_4bK5yuyj4vSO4Q,200
70
+ RinUI/core/config.py,sha256=0G1Wy2rT6b2FfRuJz3SHpoXiDnp7R012Al_9YYbdlz0,3851
71
+ RinUI/core/launcher.py,sha256=nZNa7Dt3LLhixODeleOof_KKwTojZi-6RSPLvaJtQE8,4745
72
+ RinUI/core/theme.py,sha256=cWTiVvCSIh5sLCZlZ1dB8VY0-fCrLULPVlj1TFjjKbU,11011
73
+ RinUI/core/translator.py,sha256=uFenyvJC-jD8S6Tm17OXeVQHp4kTwryHWGxqk9xbe44,975
74
+ RinUI/core/__pycache__/__init__.cpython-38.pyc,sha256=sEdnIYG9JymqK4ZnVJGwZZ-YopukgvFwAV3gLSvkQVw,433
75
+ RinUI/core/__pycache__/config.cpython-38.pyc,sha256=-LD5V93EHU-KlCDi3vBSEBr5yPkemkhFuygc9y1UXvA,4368
76
+ RinUI/core/__pycache__/launcher.cpython-38.pyc,sha256=yy-MEDwxSJCbyrOeACABF4eSK-_IHuV2Tl2zmhtyEuU,4788
77
+ RinUI/core/__pycache__/theme.cpython-38.pyc,sha256=h2oJQHNyjT12J4FG9uWED4gyMMqDma6P-vbxGCO3es0,9919
78
+ RinUI/core/__pycache__/translator.cpython-38.pyc,sha256=JAKIX3emlSjFSMZaI9sxMHJ19not7gEIyvmvSRjJeoo,1423
76
79
  RinUI/hooks/__init__.py,sha256=zer67JRQ-h9uvQmutYU2Us5oBjSJnBVzgR1Sl_5aPF0,77
77
80
  RinUI/hooks/hook-RinUI.py,sha256=9DW9x8zgpEsZpaAAUW-0LE_B69od1wBcUviVRnrAfMI,119
81
+ RinUI/languages/en_US.qm,sha256=mVm1ELFdGJN4SK0TAH4wRZ0umTxn5WS62_wY-TVpXIU,16
82
+ RinUI/languages/en_US.ts,sha256=G4-J3m4FUwJRhYvJg9aqS4MYXVu6TQV_GvPBAJVrV-0,6804
83
+ RinUI/languages/zh_CN.qm,sha256=bQCxv9OfHL8xJbBZYXPZvpPJ6v_czMeVin5Kdnn7LSA,1697
84
+ RinUI/languages/zh_CN.ts,sha256=fKkkNsnSkFtPXpDiHWhoNnbmGGbTnGz81lrZYeSFVaE,6578
78
85
  RinUI/themes/dark.qml,sha256=2SV9KS2Wj-kILefm2qHg4rcNbo99gice88MiEJcNM3I,5396
79
86
  RinUI/themes/light.qml,sha256=4zcR9Xye6iSq6pSywEaOryhTRgAlHeJoEnp9YsaG5gQ,5343
80
87
  RinUI/themes/qmldir,sha256=cpBqpZ_vfZyOwWzAT9MEEVruyJkSWi3RVV6Qj0RVrGI,125
81
- RinUI/themes/theme.qml,sha256=AAviilBJ6aXBjjmc1dpSxvzAnlmYWGUTBXbMW2ee6cs,3693
82
- RinUI/themes/utils.qml,sha256=iXrUTUcMQZpS1kaq3oUwXivswv18FGImVVL2hXtr_B0,1481
88
+ RinUI/themes/theme.qml,sha256=zuMlMOn80U738znBR8_KCeMKYMXt3dKuvGreAm58FKI,4396
89
+ RinUI/themes/utils.qml,sha256=g7rx6WS_F4zZJneUIVCHv_4RUT4Hdh01XllZlAh1lfI,1712
83
90
  RinUI/utils/Animation.qml,sha256=Z--MRYr-bZqKX_QyZ4c0Z74g72i0k7aPzTBEUhTfiGo,146
84
91
  RinUI/utils/FloatLayer.qml,sha256=W-TaM8gCt6YWU46V_pDonyxNMlR-iEcg27FMl-FYV58,3323
85
92
  RinUI/utils/FontIconLoader.qml,sha256=DEUH-GlcI5q0PbCsvsvq1t-uPzEZo0-A-Gqt5t1eoFg,307
@@ -89,17 +96,17 @@ RinUI/utils/Typography.qml,sha256=uScq2PNHI_pW-vcyp2SDLL1pkMyspD_ffrx0Qg2Ha7c,24
89
96
  RinUI/utils/qmldir,sha256=0tTlmbIgNtRRNgqAJ2IAloJIAtwO6lXITV3ciaWLpCs,193
90
97
  RinUI/windows/CtrlBtn.qml,sha256=R4c_ZQxv2SFNnuOsCnq0_dH3THEQkZVl41ZFkVG8IR0,3390
91
98
  RinUI/windows/FluentPage.qml,sha256=UBhBZcQbO5hJNmXlOLlDVWSVYBlu73wa1CAKlxgjows,2840
92
- RinUI/windows/FluentWindow.qml,sha256=3GkWomOiS1sGPcQ7SQZxl65v-nIIbgig_M2tjy-WQq0,890
93
- RinUI/windows/FluentWindowBase.qml,sha256=vsVnvkO_RshTEPQ_bKFEjIzJFJnAR11vDi0m9akF_PI,4822
99
+ RinUI/windows/FluentWindow.qml,sha256=FBsc2Wl16oS4KIuN4d0uMP35jSluq2y4l0DZnfWVdoM,856
100
+ RinUI/windows/FluentWindowBase.qml,sha256=kt9AG1_ACilx5cMhjMQ6OfBz8EPMjwOJBV5xJ04_mNo,4783
94
101
  RinUI/windows/TitleBar.qml,sha256=Vs0LR1ZW5kTVbkJpIFvH5uUGVWj2Gjtjq25XmF8TJK8,3875
95
102
  RinUI/windows/qmldir,sha256=8zVLwFf2mHV3QKp13YnR6OkayRpZl7bHpxSdRdBthK4,212
96
103
  RinUI/windows/window/ApplicationWindow.qml,sha256=sVgqmUEk0bh0QfmF5trs7-W3FaEdYUIYDx7Tv5Pdeww,196
97
104
  RinUI/windows/window/Window.qml,sha256=hQ6aPNv37my-A1cB3EwrxKr8HeYzQqv2LFlS8XCdqto,3603
98
- rinui-0.0.10.1.data/data/LICENSE,sha256=5tTvyBFn2yeDG5EfIkn4FRJKHXNKRomDVGxssfzXtqg,1084
99
- rinui-0.0.10.1.data/data/README.md,sha256=gx8GTGDQ3Kw1HJVjgYd0k77CLdLxAdEQL9vZZJde08o,2980
100
- rinui-0.0.10.1.dist-info/LICENSE,sha256=5tTvyBFn2yeDG5EfIkn4FRJKHXNKRomDVGxssfzXtqg,1084
101
- rinui-0.0.10.1.dist-info/METADATA,sha256=2PFX3hcvxYXB40Iusz85g8rdJj2AZEW99HcP41jtyio,3521
102
- rinui-0.0.10.1.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
103
- rinui-0.0.10.1.dist-info/entry_points.txt,sha256=taxuZYCggoQa2LPubwcurQYRjBRC4cNYOjWaqOYZVxw,54
104
- rinui-0.0.10.1.dist-info/top_level.txt,sha256=vKKjXBXEw5OFRIzTxZWUC5ZOj0CK5e3atbymBB4eJ6w,6
105
- rinui-0.0.10.1.dist-info/RECORD,,
105
+ rinui-0.0.11.data/data/LICENSE,sha256=5tTvyBFn2yeDG5EfIkn4FRJKHXNKRomDVGxssfzXtqg,1084
106
+ rinui-0.0.11.data/data/README.md,sha256=NEnYKDxzNSeXWIHuD3md8TyAJkR1dGq_2PU7UPd-hvo,3021
107
+ rinui-0.0.11.dist-info/LICENSE,sha256=5tTvyBFn2yeDG5EfIkn4FRJKHXNKRomDVGxssfzXtqg,1084
108
+ rinui-0.0.11.dist-info/METADATA,sha256=lvS8bpJBdfc0vCEHY3lcFU3h7mJK7jdUmojHP2QY8YI,3560
109
+ rinui-0.0.11.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
110
+ rinui-0.0.11.dist-info/entry_points.txt,sha256=taxuZYCggoQa2LPubwcurQYRjBRC4cNYOjWaqOYZVxw,54
111
+ rinui-0.0.11.dist-info/top_level.txt,sha256=vKKjXBXEw5OFRIzTxZWUC5ZOj0CK5e3atbymBB4eJ6w,6
112
+ rinui-0.0.11.dist-info/RECORD,,
File without changes