je-editor 0.0.104__py3-none-any.whl → 0.0.228__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 (151) hide show
  1. je_editor/__init__.py +26 -21
  2. je_editor/__main__.py +1 -1
  3. je_editor/code_scan/ruff_thread.py +58 -0
  4. je_editor/code_scan/watchdog_implement.py +56 -0
  5. je_editor/code_scan/watchdog_thread.py +78 -0
  6. je_editor/git_client/commit_graph.py +77 -0
  7. je_editor/git_client/git_action.py +175 -0
  8. je_editor/git_client/git_cli.py +66 -0
  9. je_editor/pyside_ui/browser/browser_download_window.py +75 -0
  10. je_editor/pyside_ui/browser/browser_serach_lineedit.py +51 -0
  11. je_editor/pyside_ui/browser/browser_view.py +87 -0
  12. je_editor/pyside_ui/browser/browser_widget.py +103 -0
  13. je_editor/pyside_ui/browser/main_browser_widget.py +85 -0
  14. je_editor/pyside_ui/code/auto_save/auto_save_manager.py +60 -0
  15. je_editor/pyside_ui/code/auto_save/auto_save_thread.py +59 -0
  16. je_editor/pyside_ui/code/code_format/pep8_format.py +130 -0
  17. je_editor/pyside_ui/code/code_process/code_exec.py +267 -0
  18. je_editor/pyside_ui/code/plaintext_code_edit/code_edit_plaintext.py +412 -0
  19. je_editor/pyside_ui/code/running_process_manager.py +48 -0
  20. je_editor/pyside_ui/code/shell_process/shell_exec.py +236 -0
  21. je_editor/pyside_ui/code/syntax/python_syntax.py +99 -0
  22. je_editor/pyside_ui/code/syntax/syntax_setting.py +95 -0
  23. je_editor/pyside_ui/code/textedit_code_result/code_record.py +75 -0
  24. je_editor/pyside_ui/code/variable_inspector/inspector_gui.py +172 -0
  25. je_editor/pyside_ui/dialog/ai_dialog/set_ai_dialog.py +71 -0
  26. je_editor/pyside_ui/dialog/file_dialog/create_file_dialog.py +68 -0
  27. je_editor/pyside_ui/dialog/file_dialog/open_file_dialog.py +111 -0
  28. je_editor/pyside_ui/dialog/file_dialog/save_file_dialog.py +67 -0
  29. je_editor/pyside_ui/dialog/search_ui/search_error_box.py +49 -0
  30. je_editor/pyside_ui/dialog/search_ui/search_text_box.py +49 -0
  31. je_editor/pyside_ui/git_ui/code_diff_compare/code_diff_viewer_widget.py +90 -0
  32. je_editor/pyside_ui/git_ui/code_diff_compare/line_number_code_viewer.py +141 -0
  33. je_editor/pyside_ui/git_ui/code_diff_compare/multi_file_diff_viewer.py +88 -0
  34. je_editor/pyside_ui/git_ui/code_diff_compare/side_by_side_diff_widget.py +284 -0
  35. je_editor/pyside_ui/git_ui/git_client/commit_table.py +65 -0
  36. je_editor/pyside_ui/git_ui/git_client/git_branch_tree_widget.py +156 -0
  37. je_editor/pyside_ui/git_ui/git_client/git_client_gui.py +799 -0
  38. je_editor/pyside_ui/git_ui/git_client/graph_view.py +218 -0
  39. je_editor/pyside_ui/main_ui/ai_widget/ai_config.py +34 -0
  40. je_editor/pyside_ui/main_ui/ai_widget/ask_thread.py +36 -0
  41. je_editor/pyside_ui/main_ui/ai_widget/chat_ui.py +147 -0
  42. je_editor/pyside_ui/main_ui/ai_widget/langchain_interface.py +84 -0
  43. je_editor/pyside_ui/main_ui/console_widget/console_gui.py +162 -0
  44. je_editor/pyside_ui/main_ui/console_widget/qprocess_adapter.py +84 -0
  45. je_editor/pyside_ui/main_ui/dock/__init__.py +0 -0
  46. je_editor/pyside_ui/main_ui/dock/destroy_dock.py +50 -0
  47. je_editor/pyside_ui/main_ui/editor/__init__.py +0 -0
  48. je_editor/pyside_ui/main_ui/editor/editor_widget.py +301 -0
  49. je_editor/pyside_ui/main_ui/editor/editor_widget_dock.py +70 -0
  50. je_editor/pyside_ui/main_ui/editor/process_input.py +101 -0
  51. je_editor/pyside_ui/main_ui/ipython_widget/__init__.py +0 -0
  52. je_editor/pyside_ui/main_ui/ipython_widget/rich_jupyter.py +78 -0
  53. je_editor/pyside_ui/main_ui/main_editor.py +369 -0
  54. je_editor/pyside_ui/main_ui/menu/__init__.py +0 -0
  55. je_editor/pyside_ui/main_ui/menu/check_style_menu/__init__.py +0 -0
  56. je_editor/pyside_ui/main_ui/menu/check_style_menu/build_check_style_menu.py +104 -0
  57. je_editor/pyside_ui/main_ui/menu/dock_menu/__init__.py +0 -0
  58. je_editor/pyside_ui/main_ui/menu/dock_menu/build_dock_menu.py +208 -0
  59. je_editor/pyside_ui/main_ui/menu/file_menu/__init__.py +0 -0
  60. je_editor/pyside_ui/main_ui/menu/file_menu/build_file_menu.py +186 -0
  61. je_editor/pyside_ui/main_ui/menu/help_menu/__init__.py +0 -0
  62. je_editor/pyside_ui/main_ui/menu/help_menu/build_help_menu.py +100 -0
  63. je_editor/pyside_ui/main_ui/menu/language_menu/__init__.py +0 -0
  64. je_editor/pyside_ui/main_ui/menu/language_menu/build_language_server.py +89 -0
  65. je_editor/pyside_ui/main_ui/menu/python_env_menu/__init__.py +0 -0
  66. je_editor/pyside_ui/main_ui/menu/python_env_menu/build_venv_menu.py +238 -0
  67. je_editor/pyside_ui/main_ui/menu/run_menu/__init__.py +0 -0
  68. je_editor/pyside_ui/main_ui/menu/run_menu/build_run_menu.py +160 -0
  69. je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/__init__.py +0 -0
  70. je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/build_debug_menu.py +109 -0
  71. je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/build_program_menu.py +101 -0
  72. je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/build_shell_menu.py +98 -0
  73. je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/utils.py +41 -0
  74. je_editor/pyside_ui/main_ui/menu/set_menu_bar.py +63 -0
  75. je_editor/pyside_ui/main_ui/menu/style_menu/__init__.py +0 -0
  76. je_editor/pyside_ui/main_ui/menu/style_menu/build_style_menu.py +73 -0
  77. je_editor/pyside_ui/main_ui/menu/tab_menu/__init__.py +0 -0
  78. je_editor/pyside_ui/main_ui/menu/tab_menu/build_tab_menu.py +275 -0
  79. je_editor/pyside_ui/main_ui/menu/text_menu/__init__.py +0 -0
  80. je_editor/pyside_ui/main_ui/menu/text_menu/build_text_menu.py +135 -0
  81. je_editor/pyside_ui/main_ui/save_settings/__init__.py +0 -0
  82. je_editor/pyside_ui/main_ui/save_settings/setting_utils.py +33 -0
  83. je_editor/pyside_ui/main_ui/save_settings/user_color_setting_file.py +103 -0
  84. je_editor/pyside_ui/main_ui/save_settings/user_setting_file.py +58 -0
  85. je_editor/pyside_ui/main_ui/system_tray/__init__.py +0 -0
  86. je_editor/pyside_ui/main_ui/system_tray/extend_system_tray.py +90 -0
  87. je_editor/start_editor.py +32 -8
  88. je_editor/utils/encodings/python_encodings.py +100 -97
  89. je_editor/utils/exception/exception_tags.py +11 -11
  90. je_editor/utils/file/open/open_file.py +38 -22
  91. je_editor/utils/file/save/save_file.py +40 -16
  92. je_editor/utils/json/json_file.py +36 -15
  93. je_editor/utils/json_format/json_process.py +38 -2
  94. je_editor/utils/logging/__init__.py +0 -0
  95. je_editor/utils/logging/loggin_instance.py +57 -0
  96. je_editor/utils/multi_language/__init__.py +0 -0
  97. je_editor/utils/multi_language/english.py +221 -0
  98. je_editor/utils/multi_language/multi_language_wrapper.py +54 -0
  99. je_editor/utils/multi_language/traditional_chinese.py +214 -0
  100. je_editor/utils/redirect_manager/redirect_manager_class.py +67 -25
  101. je_editor/utils/venv_check/__init__.py +0 -0
  102. je_editor/utils/venv_check/check_venv.py +51 -0
  103. je_editor-0.0.228.dist-info/METADATA +99 -0
  104. je_editor-0.0.228.dist-info/RECORD +140 -0
  105. {je_editor-0.0.104.dist-info → je_editor-0.0.228.dist-info}/WHEEL +1 -1
  106. {je_editor-0.0.104.dist-info → je_editor-0.0.228.dist-info/licenses}/LICENSE +1 -1
  107. je_editor/pyside_ui/auto_save/auto_save_thread.py +0 -34
  108. je_editor/pyside_ui/code_editor/code_edit_plaintext.py +0 -143
  109. je_editor/pyside_ui/code_process/code_exec.py +0 -190
  110. je_editor/pyside_ui/code_result/code_record.py +0 -39
  111. je_editor/pyside_ui/colors/global_color.py +0 -4
  112. je_editor/pyside_ui/file_dialog/open_file_dialog.py +0 -27
  113. je_editor/pyside_ui/file_dialog/save_file_dialog.py +0 -24
  114. je_editor/pyside_ui/main_ui/editor_main_ui/main_editor.py +0 -183
  115. je_editor/pyside_ui/main_ui_setting/ui_setting.py +0 -36
  116. je_editor/pyside_ui/menu/menu_bar/check_style_menu/build_check_style_menu.py +0 -44
  117. je_editor/pyside_ui/menu/menu_bar/file_menu/build_file_menu.py +0 -30
  118. je_editor/pyside_ui/menu/menu_bar/help_menu/build_help_menu.py +0 -39
  119. je_editor/pyside_ui/menu/menu_bar/run_menu/build_run_menu.py +0 -102
  120. je_editor/pyside_ui/menu/menu_bar/set_menu_bar.py +0 -24
  121. je_editor/pyside_ui/menu/menu_bar/venv_menu/build_venv_menu.py +0 -74
  122. je_editor/pyside_ui/search_ui/search_error_box.py +0 -20
  123. je_editor/pyside_ui/search_ui/search_text_box.py +0 -20
  124. je_editor/pyside_ui/shell_process/shell_exec.py +0 -157
  125. je_editor/pyside_ui/syntax/python_syntax.py +0 -99
  126. je_editor/pyside_ui/treeview/project_treeview/set_project_treeview.py +0 -47
  127. je_editor/pyside_ui/user_setting/user_setting_file.py +0 -23
  128. je_editor-0.0.104.dist-info/METADATA +0 -84
  129. je_editor-0.0.104.dist-info/RECORD +0 -69
  130. /je_editor/{pyside_ui/auto_save → code_scan}/__init__.py +0 -0
  131. /je_editor/{pyside_ui/code_editor → git_client}/__init__.py +0 -0
  132. /je_editor/pyside_ui/{code_process → browser}/__init__.py +0 -0
  133. /je_editor/pyside_ui/{code_result → code}/__init__.py +0 -0
  134. /je_editor/pyside_ui/{colors → code/auto_save}/__init__.py +0 -0
  135. /je_editor/pyside_ui/{file_dialog → code/code_format}/__init__.py +0 -0
  136. /je_editor/pyside_ui/{main_ui/editor_main_ui → code/code_process}/__init__.py +0 -0
  137. /je_editor/pyside_ui/{main_ui_setting → code/plaintext_code_edit}/__init__.py +0 -0
  138. /je_editor/pyside_ui/{menu → code/shell_process}/__init__.py +0 -0
  139. /je_editor/pyside_ui/{menu/menu_bar → code/syntax}/__init__.py +0 -0
  140. /je_editor/pyside_ui/{menu/menu_bar/check_style_menu → code/textedit_code_result}/__init__.py +0 -0
  141. /je_editor/pyside_ui/{menu/menu_bar/file_menu → code/variable_inspector}/__init__.py +0 -0
  142. /je_editor/pyside_ui/{menu/menu_bar/help_menu → dialog}/__init__.py +0 -0
  143. /je_editor/pyside_ui/{menu/menu_bar/run_menu → dialog/ai_dialog}/__init__.py +0 -0
  144. /je_editor/pyside_ui/{menu/menu_bar/venv_menu → dialog/file_dialog}/__init__.py +0 -0
  145. /je_editor/pyside_ui/{search_ui → dialog/search_ui}/__init__.py +0 -0
  146. /je_editor/pyside_ui/{shell_process → git_ui}/__init__.py +0 -0
  147. /je_editor/pyside_ui/{syntax → git_ui/code_diff_compare}/__init__.py +0 -0
  148. /je_editor/pyside_ui/{treeview → git_ui/git_client}/__init__.py +0 -0
  149. /je_editor/pyside_ui/{treeview/project_treeview → main_ui/ai_widget}/__init__.py +0 -0
  150. /je_editor/pyside_ui/{user_setting → main_ui/console_widget}/__init__.py +0 -0
  151. {je_editor-0.0.104.dist-info → je_editor-0.0.228.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,208 @@
1
+ from __future__ import annotations # 啟用未來版本的型別註解功能 / Enable postponed evaluation of type annotations
2
+
3
+ from pathlib import Path
4
+ from typing import TYPE_CHECKING
5
+
6
+ from PySide6.QtCore import Qt
7
+ from PySide6.QtGui import QAction
8
+ from PySide6.QtWidgets import QFileDialog
9
+ from frontengine import FrontEngineMainUI # 外部模組 FrontEngine 的主 UI / External FrontEngine main UI
10
+
11
+ from je_editor.pyside_ui.browser.main_browser_widget import MainBrowserWidget
12
+ from je_editor.pyside_ui.code.variable_inspector.inspector_gui import VariableInspector
13
+ # 匯入專案內的各種 Dockable widget / Import various dockable widgets from project
14
+ from je_editor.pyside_ui.git_ui.code_diff_compare.code_diff_viewer_widget import DiffViewerWidget
15
+ from je_editor.pyside_ui.git_ui.git_client.git_branch_tree_widget import GitTreeViewGUI
16
+ from je_editor.pyside_ui.git_ui.git_client.git_client_gui import GitGui
17
+ from je_editor.pyside_ui.main_ui.ai_widget.chat_ui import ChatUI
18
+ from je_editor.pyside_ui.main_ui.console_widget.console_gui import ConsoleWidget
19
+ from je_editor.pyside_ui.main_ui.dock.destroy_dock import DestroyDock
20
+ from je_editor.pyside_ui.main_ui.editor.editor_widget_dock import FullEditorWidget
21
+ from je_editor.pyside_ui.main_ui.ipython_widget.rich_jupyter import IpythonWidget
22
+ from je_editor.utils.file.open.open_file import read_file # 檔案讀取工具 / File reading utility
23
+ from je_editor.utils.logging.loggin_instance import jeditor_logger # 日誌紀錄器 / Logger
24
+ from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper # 多語系支援 / Multi-language wrapper
25
+
26
+ if TYPE_CHECKING:
27
+ from je_editor.pyside_ui.main_ui.main_editor import EditorMain # 僅在型別檢查時匯入 / Import only for type checking
28
+
29
+
30
+ def set_dock_menu(ui_we_want_to_set: EditorMain) -> None:
31
+ """
32
+ 建立 Dock 功能選單,並加入各種 Dock 視窗的動作 (Action)。
33
+ Create the Dock menu and add actions for different dockable widgets.
34
+ """
35
+ jeditor_logger.info(f"build_dock_menu.py set_dock_menu ui_we_want_to_set: {ui_we_want_to_set}")
36
+
37
+ # === 建立 Dock 主選單 / Create Dock main menu ===
38
+ ui_we_want_to_set.dock_menu = ui_we_want_to_set.menu.addMenu(
39
+ language_wrapper.language_word_dict.get("dock_menu_label"))
40
+
41
+ # === Browser Dock ===
42
+ ui_we_want_to_set.dock_menu.new_dock_browser_action = QAction(
43
+ language_wrapper.language_word_dict.get("dock_browser_label"))
44
+ ui_we_want_to_set.dock_menu.new_dock_browser_action.triggered.connect(
45
+ lambda: add_dock_widget(ui_we_want_to_set)
46
+ )
47
+ ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_dock_browser_action)
48
+
49
+ # === Editor Dock ===
50
+ ui_we_want_to_set.dock_menu.new_tab_dock_editor_action = QAction(
51
+ language_wrapper.language_word_dict.get("dock_editor_label"))
52
+ ui_we_want_to_set.dock_menu.new_tab_dock_editor_action.triggered.connect(
53
+ lambda: add_dock_widget(ui_we_want_to_set, "editor")
54
+ )
55
+ ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_tab_dock_editor_action)
56
+
57
+ # === FrontEngine Dock ===
58
+ ui_we_want_to_set.dock_menu.new_frontengine = QAction(
59
+ language_wrapper.language_word_dict.get("dock_frontengine_label"))
60
+ ui_we_want_to_set.dock_menu.new_frontengine.triggered.connect(
61
+ lambda: add_dock_widget(ui_we_want_to_set, "frontengine")
62
+ )
63
+ ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_frontengine)
64
+
65
+ # === Ipython Dock ===
66
+ ui_we_want_to_set.dock_menu.new_ipython = QAction(
67
+ language_wrapper.language_word_dict.get("dock_ipython_label"))
68
+ ui_we_want_to_set.dock_menu.new_ipython.triggered.connect(
69
+ lambda: add_dock_widget(ui_we_want_to_set, "ipython")
70
+ )
71
+ ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_ipython)
72
+
73
+ # === ChatUI Dock ===
74
+ ui_we_want_to_set.dock_menu.new_chat_ui = QAction(
75
+ language_wrapper.language_word_dict.get("chat_ui_dock_label"))
76
+ ui_we_want_to_set.dock_menu.new_chat_ui.triggered.connect(
77
+ lambda: add_dock_widget(ui_we_want_to_set, "chat_ui")
78
+ )
79
+ ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_chat_ui)
80
+
81
+ # === Git Client Dock ===
82
+ ui_we_want_to_set.dock_menu.new_git_client = QAction(
83
+ language_wrapper.language_word_dict.get("tab_menu_git_client_tab_name"))
84
+ ui_we_want_to_set.dock_menu.new_git_client.triggered.connect(
85
+ lambda: add_dock_widget(ui_we_want_to_set, "git_client")
86
+ )
87
+ ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_git_client)
88
+
89
+ # === Git Branch Tree View Dock ===
90
+ ui_we_want_to_set.dock_menu.new_git_branch_view = QAction(
91
+ language_wrapper.language_word_dict.get("tab_menu_git_branch_tree_view_tab_name"))
92
+ ui_we_want_to_set.dock_menu.new_git_branch_view.triggered.connect(
93
+ lambda: add_dock_widget(ui_we_want_to_set, "git_branch_tree_view")
94
+ )
95
+ ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_git_branch_view)
96
+
97
+ # === Variable Inspector Dock ===
98
+ ui_we_want_to_set.dock_menu.new_variable_inspector = QAction(
99
+ language_wrapper.language_word_dict.get("tab_menu_variable_inspector_tab_name"))
100
+ ui_we_want_to_set.dock_menu.new_variable_inspector.triggered.connect(
101
+ lambda: add_dock_widget(ui_we_want_to_set, "variable_inspector")
102
+ )
103
+ ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_variable_inspector)
104
+
105
+ # === Console Dock ===
106
+ ui_we_want_to_set.dock_menu.new_dynamic_console = QAction(
107
+ language_wrapper.language_word_dict.get("tab_menu_console_widget_tab_name"))
108
+ ui_we_want_to_set.dock_menu.new_dynamic_console.triggered.connect(
109
+ lambda: add_dock_widget(ui_we_want_to_set, "console_widget")
110
+ )
111
+ ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_dynamic_console)
112
+
113
+ # === Code Diff Viewer Dock ===
114
+ ui_we_want_to_set.dock_menu.new_code_diff_viewer = QAction(
115
+ language_wrapper.language_word_dict.get("tab_code_diff_viewer_tab_name"))
116
+ ui_we_want_to_set.dock_menu.new_code_diff_viewer.triggered.connect(
117
+ lambda: add_dock_widget(ui_we_want_to_set, "code_diff_viewer")
118
+ )
119
+ ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_code_diff_viewer)
120
+
121
+
122
+ def add_dock_widget(ui_we_want_to_set: EditorMain, widget_type: str = None):
123
+ """
124
+ 根據 widget_type 新增對應的 Dock 視窗,並加到主視窗右側。
125
+ Add a dock widget based on widget_type and attach it to the right side of the main window.
126
+ """
127
+ jeditor_logger.info("build_dock_menu.py add_dock_widget "
128
+ f"ui_we_want_to_set: {ui_we_want_to_set} "
129
+ f"widget_type: {widget_type}")
130
+
131
+ # 建立一個可銷毀的 Dock 容器
132
+ # Create a destroyable dock container
133
+ dock_widget = DestroyDock()
134
+
135
+ if widget_type == "editor":
136
+ # 開啟檔案選擇對話框,讓使用者選擇要打開的檔案
137
+ # Open file dialog for selecting a file
138
+ file_path = QFileDialog().getOpenFileName(
139
+ parent=ui_we_want_to_set,
140
+ dir=str(Path.cwd()) # 預設目錄為當前工作目錄 / Default directory is current working directory
141
+ )[0]
142
+ if file_path is not None and file_path != "":
143
+ # 建立一個完整的編輯器 Dock,並載入檔案內容
144
+ # Create a full editor dock and load file content
145
+ widget = FullEditorWidget(current_file=file_path)
146
+ file_content = read_file(file_path)[1] # 讀取檔案內容 / Read file content
147
+ widget.code_edit.setPlainText(file_content)
148
+ dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("dock_editor_title"))
149
+ dock_widget.setWidget(widget)
150
+
151
+ elif widget_type == "frontengine":
152
+ # 建立 FrontEngine Dock
153
+ # Create FrontEngine dock
154
+ dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("dock_frontengine_title"))
155
+ dock_widget.setWidget(FrontEngineMainUI(redirect_output=False))
156
+
157
+ elif widget_type == "ipython":
158
+ # 建立 Ipython 互動式控制台 Dock
159
+ # Create Ipython interactive console dock
160
+ dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("dock_ipython_title"))
161
+ dock_widget.setWidget(IpythonWidget(ui_we_want_to_set))
162
+
163
+ elif widget_type == "chat_ui":
164
+ # 建立 ChatUI Dock
165
+ # Create ChatUI dock
166
+ dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("chat_ui_dock_label"))
167
+ dock_widget.setWidget(ChatUI(ui_we_want_to_set))
168
+
169
+ elif widget_type == "git_client":
170
+ # 建立 Git 客戶端 Dock
171
+ # Create Git client dock
172
+ dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("tab_menu_git_client_tab_name"))
173
+ dock_widget.setWidget(GitGui())
174
+
175
+ elif widget_type == "git_branch_tree_view":
176
+ # 建立 Git 分支樹視圖 Dock
177
+ # Create Git branch tree view dock
178
+ dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("tab_menu_git_branch_tree_view_tab_name"))
179
+ dock_widget.setWidget(GitTreeViewGUI())
180
+
181
+ elif widget_type == "variable_inspector":
182
+ # 建立變數檢查器 Dock
183
+ # Create variable inspector dock
184
+ dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("tab_menu_variable_inspector_tab_name"))
185
+ dock_widget.setWidget(VariableInspector())
186
+
187
+ elif widget_type == "console_widget":
188
+ # 建立動態 Console Dock
189
+ # Create dynamic console dock
190
+ dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("tab_menu_console_widget_tab_name"))
191
+ dock_widget.setWidget(ConsoleWidget())
192
+
193
+ elif widget_type == "code_diff_viewer":
194
+ # 建立程式碼差異比較視圖 Dock
195
+ # Create code diff viewer dock
196
+ dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("tab_code_diff_viewer_tab_name"))
197
+ dock_widget.setWidget(DiffViewerWidget())
198
+
199
+ else:
200
+ # 預設為瀏覽器 Dock
201
+ # Default: Browser dock
202
+ dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("dock_browser_title"))
203
+ dock_widget.setWidget(MainBrowserWidget())
204
+
205
+ # 如果成功建立了 widget,將其加到主視窗右側 Dock 區域
206
+ # If widget is created, add it to the right dock area of the main window
207
+ if dock_widget.widget() is not None:
208
+ ui_we_want_to_set.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, dock_widget)
File without changes
@@ -0,0 +1,186 @@
1
+ # 匯入未來功能,允許延遲型別註解 (Python 3.7+ 常用)
2
+ # Import future feature: postponed evaluation of type annotations
3
+ from __future__ import annotations
4
+
5
+ # 用於型別檢查 (避免循環匯入問題)
6
+ # For type checking only (avoids circular imports)
7
+ from typing import TYPE_CHECKING
8
+
9
+ # 匯入使用者設定字典,用來保存 UI 設定
10
+ # Import user settings dictionary for saving UI preferences
11
+ from je_editor.pyside_ui.main_ui.save_settings.user_setting_file import user_setting_dict
12
+ # 匯入 Python 編碼清單 (例如 utf-8, gbk 等)
13
+ # Import list of Python encodings (e.g., utf-8, gbk, etc.)
14
+ from je_editor.utils.encodings.python_encodings import python_encodings_list
15
+ # 匯入日誌紀錄器
16
+ # Import logger instance
17
+ from je_editor.utils.logging.loggin_instance import jeditor_logger
18
+ # 匯入多語言包裝器,用於 UI 多語言顯示
19
+ # Import multi-language wrapper for UI localization
20
+ from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
21
+
22
+ # 僅在型別檢查時匯入 EditorMain,避免循環依賴
23
+ # Import EditorMain only for type checking (avoids circular dependency)
24
+ if TYPE_CHECKING:
25
+ from je_editor.pyside_ui.main_ui.main_editor import EditorMain
26
+
27
+ # 匯入 Qt 動作與字型資料庫
28
+ # Import QAction and QFontDatabase from PySide6
29
+ from PySide6.QtGui import QAction, QFontDatabase
30
+
31
+ # 匯入檔案對話框 (新建、開啟、儲存)
32
+ # Import file dialogs (create, open, save)
33
+ from je_editor.pyside_ui.dialog.file_dialog.create_file_dialog import CreateFileDialog
34
+ from je_editor.pyside_ui.dialog.file_dialog.open_file_dialog import choose_file_get_open_file_path, \
35
+ choose_dir_get_dir_path
36
+ from je_editor.pyside_ui.dialog.file_dialog.save_file_dialog import choose_file_get_save_file_path
37
+
38
+
39
+ # 設定檔案選單 (File Menu)
40
+ # Set up the File menu
41
+ def set_file_menu(ui_we_want_to_set: EditorMain) -> None:
42
+ jeditor_logger.info("build_file_menu.py add_dock_widget "
43
+ f"ui_we_want_to_set: {ui_we_want_to_set}")
44
+ # 建立 File 選單
45
+ # Create File menu
46
+ ui_we_want_to_set.file_menu = ui_we_want_to_set.menu.addMenu(
47
+ language_wrapper.language_word_dict.get("file_menu_label"))
48
+
49
+ # 新建檔案動作
50
+ # New File action
51
+ ui_we_want_to_set.file_menu.new_file_action = QAction(
52
+ language_wrapper.language_word_dict.get("file_menu_new_file_label"))
53
+ ui_we_want_to_set.file_menu.new_file_action.setShortcut("Ctrl+n")
54
+ ui_we_want_to_set.file_menu.new_file_action.triggered.connect(
55
+ lambda: show_create_file_dialog(ui_we_want_to_set)
56
+ )
57
+ ui_we_want_to_set.file_menu.addAction(ui_we_want_to_set.file_menu.new_file_action)
58
+
59
+ # 開啟檔案動作
60
+ # Open File action
61
+ ui_we_want_to_set.file_menu.open_file_action = QAction(
62
+ language_wrapper.language_word_dict.get("file_menu_open_file_label"))
63
+ ui_we_want_to_set.file_menu.open_file_action.setShortcut("Ctrl+o")
64
+ ui_we_want_to_set.file_menu.open_file_action.triggered.connect(
65
+ lambda: choose_file_get_open_file_path(parent_qt_instance=ui_we_want_to_set)
66
+ )
67
+ ui_we_want_to_set.file_menu.addAction(ui_we_want_to_set.file_menu.open_file_action)
68
+
69
+ # 開啟資料夾動作
70
+ # Open Folder action
71
+ ui_we_want_to_set.file_menu.open_folder_action = QAction(
72
+ language_wrapper.language_word_dict.get("file_menu_open_folder_label"))
73
+ ui_we_want_to_set.file_menu.open_folder_action.setShortcut("Ctrl+K")
74
+ ui_we_want_to_set.file_menu.open_folder_action.triggered.connect(
75
+ lambda: choose_dir_get_dir_path(parent_qt_instance=ui_we_want_to_set)
76
+ )
77
+ ui_we_want_to_set.file_menu.addAction(ui_we_want_to_set.file_menu.open_folder_action)
78
+
79
+ # 儲存檔案動作
80
+ # Save File action
81
+ ui_we_want_to_set.file_menu.save_file_action = QAction(
82
+ language_wrapper.language_word_dict.get("file_menu_save_file_label"))
83
+ ui_we_want_to_set.file_menu.save_file_action.setShortcut("Ctrl+s")
84
+ ui_we_want_to_set.file_menu.save_file_action.triggered.connect(
85
+ lambda: choose_file_get_save_file_path(parent_qt_instance=ui_we_want_to_set)
86
+ )
87
+ ui_we_want_to_set.file_menu.addAction(ui_we_want_to_set.file_menu.save_file_action)
88
+
89
+ # 加入字型與編碼選單
90
+ # Add font and encoding menus
91
+ add_font_menu(ui_we_want_to_set)
92
+ add_font_size_menu(ui_we_want_to_set)
93
+ add_encoding_menu(ui_we_want_to_set)
94
+
95
+
96
+ # 建立編碼選單
97
+ # Add Encoding menu
98
+ def add_encoding_menu(ui_we_want_to_set: EditorMain) -> None:
99
+ jeditor_logger.info("build_file_menu.py add_encoding_menu "
100
+ f"ui_we_want_to_set: {ui_we_want_to_set}")
101
+ ui_we_want_to_set.file_menu.encoding_menu = ui_we_want_to_set.file_menu.addMenu(
102
+ language_wrapper.language_word_dict.get("file_menu_encoding_label"))
103
+ for encoding in python_encodings_list:
104
+ encoding_action = QAction(encoding, parent=ui_we_want_to_set.file_menu.encoding_menu)
105
+ encoding_action.triggered.connect(
106
+ lambda checked=False, action=encoding_action: set_encoding(ui_we_want_to_set, action))
107
+ ui_we_want_to_set.file_menu.encoding_menu.addAction(encoding_action)
108
+
109
+
110
+ # 設定編碼
111
+ # Set encoding
112
+ def set_encoding(ui_we_want_to_set: EditorMain, action: QAction) -> None:
113
+ jeditor_logger.info("build_file_menu.py set_encoding "
114
+ f"ui_we_want_to_set: {ui_we_want_to_set} "
115
+ f"action: {action}")
116
+ ui_we_want_to_set.encoding = action.text()
117
+ user_setting_dict.update({"encoding": action.text()})
118
+
119
+
120
+ # 顯示新建檔案對話框
121
+ # Show Create File dialog
122
+ def show_create_file_dialog(ui_we_want_to_set: EditorMain):
123
+ jeditor_logger.info("build_file_menu.py show_create_file_dialog "
124
+ f"ui_we_want_to_set: {ui_we_want_to_set}")
125
+ ui_we_want_to_set.create_file_dialog = CreateFileDialog()
126
+ ui_we_want_to_set.create_file_dialog.show()
127
+
128
+
129
+ # 建立字型選單
130
+ # Add Font menu
131
+ def add_font_menu(ui_we_want_to_set: EditorMain) -> None:
132
+ jeditor_logger.info("build_file_menu.py add_font_menu "
133
+ f"ui_we_want_to_set: {ui_we_want_to_set}")
134
+ ui_we_want_to_set.file_menu.font_menu = ui_we_want_to_set.file_menu.addMenu(
135
+ language_wrapper.language_word_dict.get("file_menu_font_label"))
136
+ for family in QFontDatabase().families():
137
+ font_action = QAction(family, parent=ui_we_want_to_set.file_menu.font_menu)
138
+ font_action.triggered.connect(lambda checked=False, action=font_action: set_font(ui_we_want_to_set, action))
139
+ ui_we_want_to_set.file_menu.font_menu.addAction(font_action)
140
+
141
+
142
+ # 設定字型
143
+ # Set Font
144
+ def set_font(ui_we_want_to_set: EditorMain, action: QAction) -> None:
145
+ jeditor_logger.info("build_file_menu.py set_font "
146
+ f"ui_we_want_to_set: {ui_we_want_to_set}")
147
+ ui_we_want_to_set.setStyleSheet(
148
+ f"font-size: {ui_we_want_to_set.font().pointSize()}pt;"
149
+ f"font-family: {action.text()};"
150
+ )
151
+ user_setting_dict.update({"ui_font": action.text()})
152
+
153
+
154
+ # 建立字型大小選單
155
+ # Add Font Size menu
156
+ def add_font_size_menu(ui_we_want_to_set: EditorMain) -> None:
157
+ jeditor_logger.info("build_file_menu.py add_font_size_menu "
158
+ f"ui_we_want_to_set: {ui_we_want_to_set}")
159
+ ui_we_want_to_set.file_menu.font_size_menu = ui_we_want_to_set.file_menu.addMenu(
160
+ language_wrapper.language_word_dict.get("file_menu_font_size_label"))
161
+ for size in range(12, 38, 2): # 12 到 36,每次增加 2
162
+ font_action = QAction(str(size), parent=ui_we_want_to_set.file_menu)
163
+ font_action.triggered.connect(
164
+ lambda checked=False, action=font_action: set_font_size(ui_we_want_to_set, action))
165
+ ui_we_want_to_set.file_menu.font_size_menu.addAction(font_action)
166
+
167
+
168
+ # 設定字型大小
169
+ # Set Font Size
170
+ def set_font_size(ui_we_want_to_set: EditorMain, action: QAction) -> None:
171
+ # 紀錄日誌,方便除錯與追蹤
172
+ # Log information for debugging and tracking
173
+ jeditor_logger.info("build_file_menu.py set_font_size "
174
+ f"ui_we_want_to_set: {ui_we_want_to_set} "
175
+ f"action: {action}")
176
+
177
+ # 使用 Qt 的 setStyleSheet 設定整體 UI 的字型樣式
178
+ # Apply stylesheet to set the font size and keep the current font family
179
+ ui_we_want_to_set.setStyleSheet(
180
+ f"font-size: {int(action.text())}pt;" # 設定字型大小 (pt)
181
+ f"font-family: {ui_we_want_to_set.font().family()};" # 保持目前的字型家族
182
+ )
183
+
184
+ # 更新使用者設定字典,保存字型大小設定
185
+ # Update user settings dictionary to persist font size preference
186
+ user_setting_dict.update({"ui_font_size": int(action.text())})
File without changes
@@ -0,0 +1,100 @@
1
+ # 匯入未來功能,允許延遲型別註解 (Python 3.7+ 常用)
2
+ # Import future feature: postponed evaluation of type annotations
3
+ from __future__ import annotations
4
+
5
+ # 僅用於型別檢查,避免循環匯入
6
+ # For type checking only (avoids circular imports)
7
+ from typing import TYPE_CHECKING
8
+
9
+ # 匯入內建瀏覽器元件,用於在程式內開啟網頁
10
+ # Import embedded browser widget for opening web pages inside the app
11
+ from je_editor.pyside_ui.browser.main_browser_widget import MainBrowserWidget
12
+ # 匯入日誌紀錄器
13
+ # Import logger instance
14
+ from je_editor.utils.logging.loggin_instance import jeditor_logger
15
+
16
+ # 僅在型別檢查時匯入 EditorMain,避免循環依賴
17
+ # Import EditorMain only for type checking (avoids circular dependency)
18
+ if TYPE_CHECKING:
19
+ from je_editor.pyside_ui.main_ui.main_editor import EditorMain
20
+
21
+ # 匯入 Qt 動作與訊息框
22
+ # Import QAction and QMessageBox from PySide6
23
+ from PySide6.QtGui import QAction
24
+ from PySide6.QtWidgets import QMessageBox
25
+
26
+ # 匯入多語言包裝器,用於 UI 多語言顯示
27
+ # Import multi-language wrapper for UI localization
28
+ from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
29
+
30
+
31
+ # 設定「說明」選單 (Help Menu)
32
+ # Set up the Help menu
33
+ def set_help_menu(ui_we_want_to_set: EditorMain) -> None:
34
+ jeditor_logger.info("build_help_menu.py set_help_menu "
35
+ f"ui_we_want_to_set: {ui_we_want_to_set}")
36
+
37
+ # 建立 Help 選單
38
+ # Create Help menu
39
+ ui_we_want_to_set.help_menu = ui_we_want_to_set.menu.addMenu(
40
+ language_wrapper.language_word_dict.get("help_menu_label"))
41
+
42
+ # 建立「開啟 GitHub」動作
43
+ # Add "Open GitHub" action
44
+ ui_we_want_to_set.help_menu.help_github_action = QAction(
45
+ language_wrapper.language_word_dict.get("help_menu_open_github_label"))
46
+ ui_we_want_to_set.help_menu.help_github_action.triggered.connect(
47
+ lambda: open_web_browser(
48
+ ui_we_want_to_set,
49
+ "https://github.com/Integrated-Testing-Environment/je_editor",
50
+ language_wrapper.language_word_dict.get("help_menu_open_github_label"))
51
+ )
52
+ ui_we_want_to_set.help_menu.addAction(ui_we_want_to_set.help_menu.help_github_action)
53
+
54
+ # 建立「開啟文件」動作
55
+ # Add "Open Documentation" action
56
+ ui_we_want_to_set.help_menu.help_doc_action = QAction(
57
+ language_wrapper.language_word_dict.get("help_menu_open_doc_label"))
58
+ ui_we_want_to_set.help_menu.help_doc_action.triggered.connect(
59
+ lambda: open_web_browser(
60
+ ui_we_want_to_set,
61
+ "https://je-editor.readthedocs.io/en/latest/",
62
+ language_wrapper.language_word_dict.get("help_menu_open_doc_label"))
63
+ )
64
+ ui_we_want_to_set.help_menu.addAction(ui_we_want_to_set.help_menu.help_doc_action)
65
+
66
+ # 建立「關於」動作
67
+ # Add "About" action
68
+ ui_we_want_to_set.help_menu.help_about_action = QAction(
69
+ language_wrapper.language_word_dict.get("help_menu_open_about_label"))
70
+ ui_we_want_to_set.help_menu.help_about_action.triggered.connect(
71
+ show_about
72
+ )
73
+ ui_we_want_to_set.help_menu.addAction(ui_we_want_to_set.help_menu.help_about_action)
74
+
75
+
76
+ # 開啟內建瀏覽器分頁
77
+ # Open a new tab in the embedded browser
78
+ def open_web_browser(ui_we_want_to_set: EditorMain, url: str, tab_name: str):
79
+ jeditor_logger.info("build_help_menu.py open_web_browser "
80
+ f"ui_we_want_to_set: {ui_we_want_to_set} "
81
+ f"url: {url} "
82
+ f"tab_name: {tab_name}")
83
+ ui_we_want_to_set.tab_widget.addTab(
84
+ MainBrowserWidget(start_url=url), # 建立瀏覽器元件並載入指定 URL
85
+ f"{tab_name}{ui_we_want_to_set.tab_widget.count()}" # 分頁名稱 + 當前分頁數
86
+ )
87
+
88
+
89
+ # 顯示「關於」訊息框
90
+ # Show "About" message box
91
+ def show_about():
92
+ jeditor_logger.info("build_help_menu.py show_about")
93
+ message_box = QMessageBox()
94
+ message_box.setText(
95
+ """
96
+ JEditor
97
+ Create by JE-Chen 2020 ~ Now
98
+ """
99
+ )
100
+ message_box.exec()
@@ -0,0 +1,89 @@
1
+ # 匯入未來功能,允許延遲型別註解 (Python 3.7+ 常用)
2
+ # Import future feature: postponed evaluation of type annotations
3
+ from __future__ import annotations
4
+
5
+ # 僅用於型別檢查,避免循環匯入
6
+ # For type checking only (avoids circular imports)
7
+ from typing import TYPE_CHECKING
8
+
9
+ # 匯入 Qt 動作與訊息框
10
+ # Import QAction and QMessageBox from PySide6
11
+ from PySide6.QtGui import QAction
12
+ from PySide6.QtWidgets import QMessageBox
13
+
14
+ # 匯入使用者設定字典,用來保存語言設定
15
+ # Import user settings dictionary for saving language preferences
16
+ from je_editor.pyside_ui.main_ui.save_settings.user_setting_file import user_setting_dict
17
+ # 匯入日誌紀錄器
18
+ # Import logger instance
19
+ from je_editor.utils.logging.loggin_instance import jeditor_logger
20
+
21
+ # 僅在型別檢查時匯入 EditorMain,避免循環依賴
22
+ # Import EditorMain only for type checking (avoids circular dependency)
23
+ if TYPE_CHECKING:
24
+ from je_editor.pyside_ui.main_ui.main_editor import EditorMain
25
+
26
+ # 匯入多語言包裝器,用於 UI 多語言顯示
27
+ # Import multi-language wrapper for UI localization
28
+ from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
29
+
30
+
31
+ # 設定語言選單
32
+ # Set up the Language menu
33
+ def set_language_menu(ui_we_want_to_set: EditorMain) -> None:
34
+ jeditor_logger.info(f"build_language_server.py set_language_menu ui_we_want_to_set: {ui_we_want_to_set}")
35
+
36
+ # 建立 Language 選單
37
+ # Create Language menu
38
+ ui_we_want_to_set.language_menu = ui_we_want_to_set.menu.addMenu(
39
+ language_wrapper.language_word_dict.get("language_menu_label")
40
+ )
41
+
42
+ # 建立「切換到英文」動作
43
+ # Add "Switch to English" action
44
+ ui_we_want_to_set.language_menu.change_to_english_language_action = QAction(
45
+ language_wrapper.language_word_dict.get("language_menu_bar_english")
46
+ )
47
+ ui_we_want_to_set.language_menu.change_to_english_language_action.triggered.connect(
48
+ lambda: set_language("English", ui_we_want_to_set)
49
+ )
50
+
51
+ # 建立「切換到繁體中文」動作
52
+ # Add "Switch to Traditional Chinese" action
53
+ ui_we_want_to_set.language_menu.change_to_traditional_chinese_language_action = QAction(
54
+ language_wrapper.language_word_dict.get("language_menu_bar_traditional_chinese")
55
+ )
56
+ ui_we_want_to_set.language_menu.change_to_traditional_chinese_language_action.triggered.connect(
57
+ lambda: set_language("Traditional_Chinese", ui_we_want_to_set)
58
+ )
59
+
60
+ # 將動作加入選單
61
+ # Add actions to the menu
62
+ ui_we_want_to_set.language_menu.addAction(
63
+ ui_we_want_to_set.language_menu.change_to_english_language_action
64
+ )
65
+ ui_we_want_to_set.language_menu.addAction(
66
+ ui_we_want_to_set.language_menu.change_to_traditional_chinese_language_action
67
+ )
68
+
69
+
70
+ # 設定語言
71
+ # Set the application language
72
+ def set_language(language: str, ui_we_want_to_set: EditorMain) -> None:
73
+ jeditor_logger.info("build_language_server.py set_language "
74
+ f"language: {language} "
75
+ f"ui_we_want_to_set: {ui_we_want_to_set}")
76
+
77
+ # 重設語言 (更新多語言字典)
78
+ # Reset language (update multi-language dictionary)
79
+ language_wrapper.reset_language(language)
80
+
81
+ # 更新使用者設定,保存語言偏好
82
+ # Update user settings dictionary to persist language preference
83
+ user_setting_dict.update({"language": language})
84
+
85
+ # 顯示提示訊息,提醒使用者需要重新啟動程式
86
+ # Show a message box to remind user to restart the application
87
+ message_box = QMessageBox(ui_we_want_to_set)
88
+ message_box.setText(language_wrapper.language_word_dict.get("language_menu_bar_please_restart_messagebox"))
89
+ message_box.show()