je-editor 0.0.222__py3-none-any.whl → 0.0.224__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.

Potentially problematic release.


This version of je-editor might be problematic. Click here for more details.

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