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,70 +1,94 @@
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
+ # 匯入顏色設定,用於輸出訊息時的字體顏色
10
+ # Import color settings for console/text output
5
11
  from je_editor.pyside_ui.main_ui.save_settings.user_color_setting_file import actually_color_dict
6
12
 
13
+ # 匯入編輯器元件
14
+ # Import EditorWidget
7
15
  from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
16
+
17
+ # 匯入使用者設定字典,用來保存 Python 解譯器與環境設定
18
+ # Import user settings dictionary for saving Python interpreter and environment settings
8
19
  from je_editor.pyside_ui.main_ui.save_settings.user_setting_file import user_setting_dict
20
+
21
+ # 匯入日誌紀錄器
22
+ # Import logger instance
9
23
  from je_editor.utils.logging.loggin_instance import jeditor_logger
10
24
 
25
+ # 僅在型別檢查時匯入 EditorMain,避免循環依賴
26
+ # Import EditorMain only for type checking (avoids circular dependency)
11
27
  if TYPE_CHECKING:
12
28
  from je_editor.pyside_ui.main_ui.main_editor import EditorMain
29
+
13
30
  import os
14
31
  from pathlib import Path
15
32
 
33
+ # 匯入 Qt 動作、快捷鍵、文字格式、訊息框、輸入框、檔案對話框
34
+ # Import QAction, QKeySequence, QTextCharFormat, QMessageBox, QInputDialog, QFileDialog
16
35
  from PySide6.QtGui import QAction, QKeySequence, QTextCharFormat
17
36
  from PySide6.QtWidgets import QMessageBox, QInputDialog, QFileDialog
18
37
 
38
+ # 匯入 ShellManager,用於執行系統命令 (建立 venv、pip install 等)
39
+ # Import ShellManager for executing shell commands (create venv, pip install, etc.)
19
40
  from je_editor.pyside_ui.code.shell_process.shell_exec import ShellManager
20
41
 
42
+ # 匯入多語言包裝器,用於 UI 多語言顯示
43
+ # Import multi-language wrapper for UI localization
21
44
  from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
22
45
 
23
46
 
47
+ # 設定 Python 環境選單 (venv menu)
48
+ # Set up the Python Environment (venv) menu
24
49
  def set_venv_menu(ui_we_want_to_set: EditorMain) -> None:
25
50
  jeditor_logger.info(f"build_venv_menu.py set_venv_menu ui_we_want_to_set: {ui_we_want_to_set}")
26
51
  ui_we_want_to_set.venv_menu = ui_we_want_to_set.menu.addMenu(
27
52
  language_wrapper.language_word_dict.get("python_env_menu_label"))
28
- # Create an venv
53
+
54
+ # 建立虛擬環境 (Ctrl+Shift+V)
55
+ # Create virtual environment
29
56
  ui_we_want_to_set.venv_menu.change_language_menu = QAction(
30
57
  language_wrapper.language_word_dict.get("python_env_menu_create_venv_label"))
31
- ui_we_want_to_set.venv_menu.change_language_menu.setShortcut(
32
- QKeySequence("Ctrl+Shift+V")
33
- )
58
+ ui_we_want_to_set.venv_menu.change_language_menu.setShortcut(QKeySequence("Ctrl+Shift+V"))
34
59
  ui_we_want_to_set.venv_menu.change_language_menu.triggered.connect(
35
- lambda: create_venv(ui_we_want_to_set)
36
- )
60
+ lambda: create_venv(ui_we_want_to_set))
37
61
  ui_we_want_to_set.venv_menu.addAction(ui_we_want_to_set.venv_menu.change_language_menu)
62
+
63
+ # pip 升級套件 (Ctrl+Shift+U)
38
64
  # pip upgrade package
39
65
  ui_we_want_to_set.venv_menu.pip_upgrade_action = QAction(
40
- language_wrapper.language_word_dict.get("python_env_menu_pip_upgrade_label")
41
- )
42
- ui_we_want_to_set.venv_menu.pip_upgrade_action.setShortcut(
43
- QKeySequence("Ctrl+Shift+U")
44
- )
66
+ language_wrapper.language_word_dict.get("python_env_menu_pip_upgrade_label"))
67
+ ui_we_want_to_set.venv_menu.pip_upgrade_action.setShortcut(QKeySequence("Ctrl+Shift+U"))
45
68
  ui_we_want_to_set.venv_menu.pip_upgrade_action.triggered.connect(
46
- lambda: pip_install_package_update(ui_we_want_to_set)
47
- )
69
+ lambda: pip_install_package_update(ui_we_want_to_set))
48
70
  ui_we_want_to_set.venv_menu.addAction(ui_we_want_to_set.venv_menu.pip_upgrade_action)
49
- # pip package
71
+
72
+ # pip 安裝套件 (Ctrl+Shift+P)
73
+ # pip install package
50
74
  ui_we_want_to_set.venv_menu.pip_action = QAction(
51
75
  language_wrapper.language_word_dict.get("python_env_menu_pip_label"))
52
- ui_we_want_to_set.venv_menu.pip_action.setShortcut(
53
- QKeySequence("Ctrl+Shift+P")
54
- )
76
+ ui_we_want_to_set.venv_menu.pip_action.setShortcut(QKeySequence("Ctrl+Shift+P"))
55
77
  ui_we_want_to_set.venv_menu.pip_action.triggered.connect(
56
- lambda: pip_install_package(ui_we_want_to_set)
57
- )
78
+ lambda: pip_install_package(ui_we_want_to_set))
58
79
  ui_we_want_to_set.venv_menu.addAction(ui_we_want_to_set.venv_menu.pip_action)
59
- # choose python interpreter
80
+
81
+ # 選擇 Python 解譯器
82
+ # Choose Python interpreter
60
83
  ui_we_want_to_set.venv_menu.choose_interpreter_action = QAction(
61
84
  language_wrapper.language_word_dict.get("python_env_menu_choose_interpreter_label"))
62
85
  ui_we_want_to_set.venv_menu.choose_interpreter_action.triggered.connect(
63
- lambda: chose_python_interpreter(ui_we_want_to_set)
64
- )
86
+ lambda: chose_python_interpreter(ui_we_want_to_set))
65
87
  ui_we_want_to_set.venv_menu.addAction(ui_we_want_to_set.venv_menu.choose_interpreter_action)
66
88
 
67
89
 
90
+ # 建立虛擬環境
91
+ # Create virtual environment
68
92
  def create_venv(ui_we_want_to_set: EditorMain) -> None:
69
93
  jeditor_logger.info(f"build_venv_menu.py create_venv ui_we_want_to_set: {ui_we_want_to_set}")
70
94
  widget = ui_we_want_to_set.tab_widget.currentWidget()
@@ -72,25 +96,31 @@ def create_venv(ui_we_want_to_set: EditorMain) -> None:
72
96
  widget.python_compiler = ui_we_want_to_set.python_compiler
73
97
  venv_path = Path(os.getcwd() + "/venv")
74
98
  if not venv_path.exists():
99
+ # 使用 ShellManager 執行 python -m venv venv
100
+ # Use ShellManager to run python -m venv venv
75
101
  create_venv_shell = ShellManager(main_window=widget, after_done_function=widget.code_edit.check_env,
76
102
  shell_encoding=ui_we_want_to_set.encoding)
77
103
  create_venv_shell.later_init()
78
- create_venv_shell.exec_shell(
79
- [f"{create_venv_shell.compiler_path}", "-m", "venv", "venv"]
80
- )
81
- text_cursor = widget.code_result.textCursor()
104
+ create_venv_shell.exec_shell([f"{create_venv_shell.compiler_path}", "-m", "venv", "venv"])
105
+
106
+ # 在編輯器輸出區顯示訊息
107
+ # Show message in editor output area
108
+ text_cursor = widget.code_result.textCursor()
82
109
  text_format = QTextCharFormat()
83
110
  text_format.setForeground(actually_color_dict.get("normal_output_color"))
84
- text_cursor.insertText(
85
- language_wrapper.language_word_dict.get("python_env_menu_creating_venv_message"), text_format)
111
+ text_cursor.insertText(language_wrapper.language_word_dict.get("python_env_menu_creating_venv_message"),
112
+ text_format)
86
113
  text_cursor.insertBlock()
87
114
  else:
115
+ # 如果 venv 已存在,顯示提示訊息
116
+ # If venv exists, show message
88
117
  message_box = QMessageBox()
89
- message_box.setText(
90
- language_wrapper.language_word_dict.get("python_env_menu_venv_exists"))
118
+ message_box.setText(language_wrapper.language_word_dict.get("python_env_menu_venv_exists"))
91
119
  message_box.exec()
92
120
 
93
121
 
122
+ # 使用 pip 安裝套件 (通用函式)
123
+ # Run pip install command (general function)
94
124
  def shell_pip_install(ui_we_want_to_set: EditorMain, pip_install_command_list: list):
95
125
  jeditor_logger.info("build_venv_menu.py create_venv "
96
126
  f"ui_we_want_to_set: {ui_we_want_to_set} "
@@ -100,10 +130,14 @@ def shell_pip_install(ui_we_want_to_set: EditorMain, pip_install_command_list: l
100
130
  widget.python_compiler = ui_we_want_to_set.python_compiler
101
131
  venv_path = Path(os.getcwd() + "/venv")
102
132
  if not venv_path.exists():
133
+ # 如果 venv 不存在,提醒使用者先建立
134
+ # If venv does not exist, remind user to create it first
103
135
  message_box = QMessageBox()
104
136
  message_box.setText(language_wrapper.language_word_dict.get("python_env_menu_please_create_venv"))
105
137
  message_box.exec()
106
138
  else:
139
+ # 彈出輸入框,讓使用者輸入套件名稱
140
+ # Ask user to input package name
107
141
  ask_package_dialog = QInputDialog()
108
142
  package_text, press_ok = ask_package_dialog.getText(
109
143
  ui_we_want_to_set,
@@ -113,11 +147,11 @@ def shell_pip_install(ui_we_want_to_set: EditorMain, pip_install_command_list: l
113
147
  if press_ok:
114
148
  pip_install_shell = ShellManager(main_window=widget, shell_encoding=ui_we_want_to_set.encoding)
115
149
  pip_install_shell.later_init()
116
- pip_install_shell.exec_shell(
117
- pip_install_command_list
118
- )
150
+ pip_install_shell.exec_shell(pip_install_command_list)
119
151
 
120
152
 
153
+ # 偵測 venv 是否存在
154
+ # Detect if venv exists
121
155
  def detect_venv() -> bool:
122
156
  jeditor_logger.info("build_venv_menu.py detect_venv")
123
157
  venv_path = Path(os.getcwd() + "/venv")
@@ -126,15 +160,17 @@ def detect_venv() -> bool:
126
160
  message_box.setText(language_wrapper.language_word_dict.get("python_env_menu_please_create_venv"))
127
161
  message_box.exec()
128
162
  return False
129
- return True
130
-
131
163
 
164
+ # pip 安裝或更新套件
165
+ # pip install or update package
132
166
  def pip_install_package_update(ui_we_want_to_set: EditorMain) -> None:
133
167
  jeditor_logger.info(f"build_venv_menu.py pip_install_package_update ui_we_want_to_set: {ui_we_want_to_set}")
134
168
  widget = ui_we_want_to_set.tab_widget.currentWidget()
135
169
  if isinstance(widget, EditorWidget):
136
170
  widget.python_compiler = ui_we_want_to_set.python_compiler
137
- if detect_venv:
171
+ if detect_venv():
172
+ # 彈出輸入框,讓使用者輸入要安裝或更新的套件名稱
173
+ # Ask user to input package name to install or update
138
174
  ask_package_dialog = QInputDialog()
139
175
  package_text, press_ok = ask_package_dialog.getText(
140
176
  ui_we_want_to_set,
@@ -142,20 +178,31 @@ def pip_install_package_update(ui_we_want_to_set: EditorMain) -> None:
142
178
  language_wrapper.language_word_dict.get("python_env_menu_install_or_update_package_messagebox_label")
143
179
  )
144
180
  if press_ok:
145
- pip_install_shell = ShellManager(main_window=widget, after_done_function=widget.code_edit.check_env,
146
- shell_encoding=ui_we_want_to_set.encoding)
181
+ # 使用 ShellManager 執行 pip install -U
182
+ # Use ShellManager to run pip install -U
183
+ pip_install_shell = ShellManager(
184
+ main_window=widget,
185
+ after_done_function=widget.code_edit.check_env,
186
+ shell_encoding=ui_we_want_to_set.encoding
187
+ )
147
188
  pip_install_shell.later_init()
148
189
  pip_install_shell.exec_shell(
149
190
  [f"{pip_install_shell.compiler_path}", "-m", "pip", "install", f"{package_text}", "-U"]
150
191
  )
151
192
 
152
193
 
194
+ # pip 安裝套件 (不加 -U)
195
+ # pip install package (without -U)
153
196
  def pip_install_package(ui_we_want_to_set: EditorMain) -> None:
154
197
  jeditor_logger.info(f"build_venv_menu.py pip_install_package ui_we_want_to_set: {ui_we_want_to_set}")
155
198
  widget = ui_we_want_to_set.tab_widget.currentWidget()
156
199
  if isinstance(widget, EditorWidget):
157
200
  widget.python_compiler = ui_we_want_to_set.python_compiler
158
- if detect_venv:
201
+ # ⚠️ 同樣需要加上 () 呼叫 detect_venv
202
+ # ⚠️ Same here: should be detect_venv()
203
+ if detect_venv():
204
+ # 彈出輸入框,讓使用者輸入要安裝的套件名稱
205
+ # Ask user to input package name
159
206
  ask_package_dialog = QInputDialog()
160
207
  package_text, press_ok = ask_package_dialog.getText(
161
208
  ui_we_want_to_set,
@@ -163,14 +210,21 @@ def pip_install_package(ui_we_want_to_set: EditorMain) -> None:
163
210
  language_wrapper.language_word_dict.get("python_env_menu_install_package_messagebox_label")
164
211
  )
165
212
  if press_ok:
166
- pip_install_shell = ShellManager(main_window=widget, after_done_function=widget.code_edit.check_env,
167
- shell_encoding=ui_we_want_to_set.encoding)
213
+ # 使用 ShellManager 執行 pip install
214
+ # Use ShellManager to run pip install
215
+ pip_install_shell = ShellManager(
216
+ main_window=widget,
217
+ after_done_function=widget.code_edit.check_env,
218
+ shell_encoding=ui_we_want_to_set.encoding
219
+ )
168
220
  pip_install_shell.later_init()
169
221
  pip_install_shell.exec_shell(
170
222
  [f"{pip_install_shell.compiler_path}", "-m", "pip", "install", f"{package_text}"]
171
223
  )
172
224
 
173
225
 
226
+ # 選擇 Python 解譯器
227
+ # Choose Python interpreter
174
228
  def chose_python_interpreter(ui_we_want_to_set: EditorMain):
175
229
  jeditor_logger.info(f"build_venv_menu.py chose_python_interpreter ui_we_want_to_set: {ui_we_want_to_set}")
176
230
  file_path = QFileDialog().getOpenFileName(
@@ -178,5 +232,9 @@ def chose_python_interpreter(ui_we_want_to_set: EditorMain):
178
232
  dir=str(Path.cwd())
179
233
  )[0]
180
234
  if file_path is not None and file_path != "":
235
+ # 更新主程式的 Python 解譯器路徑
236
+ # Update main editor's Python interpreter path
181
237
  ui_we_want_to_set.python_compiler = file_path
182
- user_setting_dict.update({"python_compiler": file_path})
238
+ # 同時更新使用者設定,讓下次啟動時能記住
239
+ # Update user settings so it persists across sessions
240
+ user_setting_dict.update({"python_compiler": file_path})
@@ -2,61 +2,98 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
+ # 匯入 Qt 訊息框
6
+ # Import QMessageBox for showing dialogs
5
7
  from PySide6.QtWidgets import QMessageBox
6
8
 
9
+ # 匯入執行中程序管理器,用於統一管理所有程式/除錯器/Shell 執行實例
10
+ # Import run_instance_manager for managing all running processes
7
11
  from je_editor.pyside_ui.code.running_process_manager import run_instance_manager
12
+
13
+ # 匯入編輯器元件
14
+ # Import EditorWidget
8
15
  from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
16
+
17
+ # 匯入子選單建構函式 (Program / Debug / Shell)
18
+ # Import submenu builders (Program / Debug / Shell)
9
19
  from je_editor.pyside_ui.main_ui.menu.run_menu.under_run_menu.build_debug_menu import set_debug_menu
10
20
  from je_editor.pyside_ui.main_ui.menu.run_menu.under_run_menu.build_program_menu import set_program_menu
11
21
  from je_editor.pyside_ui.main_ui.menu.run_menu.under_run_menu.build_shell_menu import set_shell_menu
22
+
23
+ # 匯入日誌紀錄器
24
+ # Import logger instance
12
25
  from je_editor.utils.logging.loggin_instance import jeditor_logger
13
26
 
14
27
  if TYPE_CHECKING:
15
28
  from je_editor.pyside_ui.main_ui.main_editor import EditorMain
29
+
30
+ # 匯入 Qt 動作
31
+ # Import QAction
16
32
  from PySide6.QtGui import QAction
17
33
 
34
+ # 匯入多語言包裝器
35
+ # Import multi-language wrapper for UI localization
18
36
  from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
19
37
 
20
38
 
39
+ # 設定 Run 選單
40
+ # Set up the Run menu
21
41
  def set_run_menu(ui_we_want_to_set: EditorMain) -> None:
22
42
  jeditor_logger.info(f"build_run_menu.py set_run_menu ui_we_want_to_set: {ui_we_want_to_set}")
43
+ # 建立 Run 選單
44
+ # Create Run menu
23
45
  ui_we_want_to_set.run_menu = ui_we_want_to_set.menu.addMenu(
24
46
  language_wrapper.language_word_dict.get("run_menu_label"))
47
+
48
+ # 加入子選單:Program / Shell / Debug
49
+ # Add submenus: Program / Shell / Debug
25
50
  set_program_menu(ui_we_want_to_set)
26
51
  set_shell_menu(ui_we_want_to_set)
27
52
  set_debug_menu(ui_we_want_to_set)
28
- # Clean result
53
+
54
+ # 清除結果
55
+ # Clear execution result
29
56
  ui_we_want_to_set.run_menu.clean_result_action = QAction(
30
57
  language_wrapper.language_word_dict.get("run_menu_clear_result_label"))
31
58
  ui_we_want_to_set.run_menu.clean_result_action.triggered.connect(
32
59
  lambda: clean_result(ui_we_want_to_set)
33
60
  )
34
61
  ui_we_want_to_set.run_menu.addAction(ui_we_want_to_set.run_menu.clean_result_action)
35
- # Close program
62
+
63
+ # 停止目前程式
64
+ # Stop current program
36
65
  ui_we_want_to_set.run_menu.stop_program_action = QAction(
37
66
  language_wrapper.language_word_dict.get("run_menu_stop_program_label"))
38
67
  ui_we_want_to_set.run_menu.stop_program_action.triggered.connect(
39
68
  lambda: stop_program(ui_we_want_to_set)
40
69
  )
41
70
  ui_we_want_to_set.run_menu.addAction(ui_we_want_to_set.run_menu.stop_program_action)
42
- # Close all program
71
+
72
+ # 停止所有程式
73
+ # Stop all programs
43
74
  ui_we_want_to_set.run_menu.stop_all_program_action = QAction(
44
75
  language_wrapper.language_word_dict.get("run_menu_stop_all_program_label"))
45
76
  ui_we_want_to_set.run_menu.stop_all_program_action.triggered.connect(
46
77
  stop_all_program
47
78
  )
48
79
  ui_we_want_to_set.run_menu.addAction(ui_we_want_to_set.run_menu.stop_all_program_action)
49
- # Run help menu
80
+
81
+ # Run 說明子選單
82
+ # Run Help submenu
50
83
  ui_we_want_to_set.run_menu.run_help_menu = ui_we_want_to_set.run_menu.addMenu(
51
84
  language_wrapper.language_word_dict.get("run_menu_run_help_label"))
52
- # Run help action
85
+
86
+ # Run 說明動作
87
+ # Run Help action
53
88
  ui_we_want_to_set.run_menu.run_help_menu.run_help_action = QAction(
54
89
  language_wrapper.language_word_dict.get("run_menu_run_help_label"))
55
90
  ui_we_want_to_set.run_menu.run_help_menu.run_help_action.triggered.connect(
56
91
  show_run_help
57
92
  )
58
93
  ui_we_want_to_set.run_menu.run_help_menu.addAction(ui_we_want_to_set.run_menu.run_help_menu.run_help_action)
59
- # Shell help action
94
+
95
+ # Shell 說明動作
96
+ # Shell Help action
60
97
  ui_we_want_to_set.run_menu.run_help_menu.shell_help_action = QAction(
61
98
  language_wrapper.language_word_dict.get("run_menu_shell_help_label"))
62
99
  ui_we_want_to_set.run_menu.run_help_menu.shell_help_action.triggered.connect(
@@ -65,29 +102,38 @@ def set_run_menu(ui_we_want_to_set: EditorMain) -> None:
65
102
  ui_we_want_to_set.run_menu.run_help_menu.addAction(ui_we_want_to_set.run_menu.run_help_menu.shell_help_action)
66
103
 
67
104
 
105
+ # 停止目前分頁的程式 / Shell / 除錯器
106
+ # Stop current tab's program / shell / debugger
68
107
  def stop_program(ui_we_want_to_set: EditorMain) -> None:
69
108
  jeditor_logger.info(f"build_run_menu.py stop_program ui_we_want_to_set: {ui_we_want_to_set}")
70
109
  widget = ui_we_want_to_set.tab_widget.currentWidget()
71
110
  if isinstance(widget, EditorWidget):
111
+ # 停止程式
72
112
  if widget.exec_program is not None:
73
113
  if widget.exec_program.process is not None:
74
114
  widget.exec_program.process.terminate()
75
115
  widget.exec_program = None
116
+ # 停止 Shell
76
117
  if widget.exec_shell is not None:
77
118
  if widget.exec_shell.process is not None:
78
119
  widget.exec_shell.process.terminate()
79
120
  widget.exec_shell = None
121
+ # 停止除錯器
80
122
  if widget.exec_python_debugger is not None:
81
123
  if widget.exec_python_debugger.process is not None:
82
124
  widget.exec_python_debugger.process.terminate()
83
125
  widget.exec_python_debugger = None
84
126
 
85
127
 
128
+ # 停止所有執行中的程式
129
+ # Stop all running programs
86
130
  def stop_all_program() -> None:
87
131
  jeditor_logger.info("build_run_menu.py stop_all_program")
88
132
  run_instance_manager.close_all_instance()
89
133
 
90
134
 
135
+ # 清除目前分頁的輸出結果
136
+ # Clear current tab's output result
91
137
  def clean_result(ui_we_want_to_set: EditorMain) -> None:
92
138
  jeditor_logger.info(f"build_run_menu.py clean_result ui_we_want_to_set: {ui_we_want_to_set}")
93
139
  widget = ui_we_want_to_set.tab_widget.currentWidget()
@@ -95,6 +141,8 @@ def clean_result(ui_we_want_to_set: EditorMain) -> None:
95
141
  widget.code_result.setPlainText("")
96
142
 
97
143
 
144
+ # 顯示 Run 說明
145
+ # Show Run help
98
146
  def show_run_help() -> None:
99
147
  jeditor_logger.info("build_run_menu.py show_run_help")
100
148
  message_box = QMessageBox()
@@ -104,10 +152,12 @@ def show_run_help() -> None:
104
152
  message_box.exec()
105
153
 
106
154
 
155
+ # 顯示 Shell 說明
156
+ # Show Shell help
107
157
  def show_shell_help() -> None:
108
158
  jeditor_logger.info("build_run_menu.py show_shell_help")
109
159
  message_box = QMessageBox()
110
160
  message_box.setText(
111
161
  language_wrapper.language_word_dict.get("run_menu_shell_run_tip")
112
162
  )
113
- message_box.exec()
163
+ message_box.exec()
@@ -1,34 +1,66 @@
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
+ # 匯入編輯器元件與輸入處理
10
+ # Import EditorWidget and ProcessInput
5
11
  from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
6
12
  from je_editor.pyside_ui.main_ui.editor.process_input import ProcessInput
13
+
14
+ # 匯入工具函式:顯示「請先關閉目前執行中的程式」訊息框
15
+ # Import utility: show message box if a program is already running
7
16
  from je_editor.pyside_ui.main_ui.menu.run_menu.under_run_menu.utils import please_close_current_running_messagebox
17
+
18
+ # 匯入日誌紀錄器
19
+ # Import logger instance
8
20
  from je_editor.utils.logging.loggin_instance import jeditor_logger
9
21
 
22
+ # 僅在型別檢查時匯入 EditorMain,避免循環依賴
23
+ # Import EditorMain only for type checking (avoids circular dependency)
10
24
  if TYPE_CHECKING:
11
25
  from je_editor.pyside_ui.main_ui.main_editor import EditorMain
26
+
27
+ # 匯入 Qt 動作
28
+ # Import QAction
12
29
  from PySide6.QtGui import QAction
13
30
 
31
+ # 匯入程式執行管理器 (ExecManager)
32
+ # Import ExecManager for running/debugging code
14
33
  from je_editor.pyside_ui.code.code_process.code_exec import ExecManager
34
+
35
+ # 匯入檔案儲存對話框
36
+ # Import file save dialog
15
37
  from je_editor.pyside_ui.dialog.file_dialog.save_file_dialog import choose_file_get_save_file_path
38
+
39
+ # 匯入多語言包裝器
40
+ # Import multi-language wrapper for UI localization
16
41
  from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
17
42
 
18
43
 
44
+ # 設定 Debug 選單
45
+ # Set up the Debug menu
19
46
  def set_debug_menu(ui_we_want_to_set: EditorMain) -> None:
20
47
  jeditor_logger.info(f"build_debug_menu.py set_debug_menu ui_we_want_to_set: {ui_we_want_to_set}")
21
- # Debug menu inside run menu
48
+ # Run 選單下建立 Debug 子選單
49
+ # Create Debug submenu under Run menu
22
50
  ui_we_want_to_set.debug_menu = ui_we_want_to_set.run_menu.addMenu(
23
51
  language_wrapper.language_word_dict.get("editor_debugger_input_title_label"))
24
- # Run debugger
52
+
53
+ # 建立「執行除錯器」動作
54
+ # Add "Run Debugger" action
25
55
  ui_we_want_to_set.debug_menu.run_debugger_action = QAction(
26
56
  language_wrapper.language_word_dict.get("run_menu_run_debugger"))
27
57
  ui_we_want_to_set.debug_menu.run_debugger_action.triggered.connect(
28
58
  lambda: run_debugger(ui_we_want_to_set)
29
59
  )
30
60
  ui_we_want_to_set.debug_menu.addAction(ui_we_want_to_set.debug_menu.run_debugger_action)
31
- # Show debugger input
61
+
62
+ # 建立「顯示除錯輸入」動作
63
+ # Add "Show Debugger Input" action
32
64
  ui_we_want_to_set.debug_menu.show_shell_input = QAction(
33
65
  language_wrapper.language_word_dict.get("show_debugger_input"))
34
66
  ui_we_want_to_set.debug_menu.show_shell_input.triggered.connect(
@@ -37,29 +69,43 @@ def set_debug_menu(ui_we_want_to_set: EditorMain) -> None:
37
69
  ui_we_want_to_set.debug_menu.addAction(ui_we_want_to_set.debug_menu.show_shell_input)
38
70
 
39
71
 
72
+ # 執行除錯器 (pdb)
73
+ # Run debugger (pdb)
40
74
  def run_debugger(ui_we_want_to_set: EditorMain) -> None:
41
75
  jeditor_logger.info(f"build_debug_menu.py run_debugger ui_we_want_to_set: {ui_we_want_to_set}")
42
76
  widget = ui_we_want_to_set.tab_widget.currentWidget()
43
77
  if isinstance(widget, EditorWidget):
78
+ # 確保沒有正在執行的除錯器
79
+ # Ensure no debugger is already running
44
80
  if widget.exec_python_debugger is None:
45
81
  widget.python_compiler = ui_we_want_to_set.python_compiler
82
+ # 要求使用者選擇儲存檔案路徑
83
+ # Ask user to choose save file path
46
84
  if choose_file_get_save_file_path(ui_we_want_to_set):
85
+ # 建立程式執行管理器,並以 pdb 模式執行
86
+ # Create ExecManager and run with pdb
47
87
  code_exec = ExecManager(widget, program_encoding=ui_we_want_to_set.encoding)
48
88
  code_exec.later_init()
49
89
  code_exec.code_result = widget.debugger_result
50
90
  code_exec.exec_code(
51
91
  widget.current_file, exec_prefix=["-m", "pdb"]
52
92
  )
93
+ # 綁定除錯器與輸入介面
94
+ # Bind debugger and input interface
53
95
  widget.exec_python_debugger = code_exec
54
96
  widget.debugger_input = ProcessInput(widget)
55
97
  widget.debugger_input.show()
56
98
  else:
99
+ # 如果已有程式在執行,顯示提示訊息
100
+ # If a program is already running, show message
57
101
  please_close_current_running_messagebox(ui_we_want_to_set)
58
102
 
59
103
 
104
+ # 顯示除錯輸入介面
105
+ # Show debugger input interface
60
106
  def show_debugger_input(ui_we_want_to_set: EditorMain) -> None:
61
107
  jeditor_logger.info(f"build_debug_menu.py show_debugger_input ui_we_want_to_set: {ui_we_want_to_set}")
62
108
  widget = ui_we_want_to_set.tab_widget.currentWidget()
63
109
  if isinstance(widget, EditorWidget):
64
110
  widget.debugger_input = ProcessInput(widget, "debugger")
65
- widget.debugger_input.show()
111
+ widget.debugger_input.show()
@@ -1,33 +1,69 @@
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
5
11
  from PySide6.QtGui import QAction
6
12
 
13
+ # 匯入程式執行管理器 (ExecManager)
14
+ # Import ExecManager for running code
7
15
  from je_editor.pyside_ui.code.code_process.code_exec import ExecManager
16
+
17
+ # 匯入檔案儲存對話框
18
+ # Import file save dialog
8
19
  from je_editor.pyside_ui.dialog.file_dialog.save_file_dialog import choose_file_get_save_file_path
20
+
21
+ # 匯入編輯器元件
22
+ # Import EditorWidget
9
23
  from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
24
+
25
+ # 匯入輸入處理 (用於程式輸入)
26
+ # Import ProcessInput for handling program input
10
27
  from je_editor.pyside_ui.main_ui.editor.process_input import ProcessInput
28
+
29
+ # 匯入工具函式:顯示「請先關閉目前執行中的程式」訊息框
30
+ # Import utility: show message box if a program is already running
11
31
  from je_editor.pyside_ui.main_ui.menu.run_menu.under_run_menu.utils import please_close_current_running_messagebox
32
+
33
+ # 匯入日誌紀錄器
34
+ # Import logger instance
12
35
  from je_editor.utils.logging.loggin_instance import jeditor_logger
36
+
37
+ # 匯入多語言包裝器
38
+ # Import multi-language wrapper for UI localization
13
39
  from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
14
40
 
41
+ # 僅在型別檢查時匯入 EditorMain,避免循環依賴
42
+ # Import EditorMain only for type checking (avoids circular dependency)
15
43
  if TYPE_CHECKING:
16
44
  from je_editor.pyside_ui.main_ui.main_editor import EditorMain
17
45
 
18
46
 
47
+ # 設定「執行程式」選單
48
+ # Set up the "Run Program" menu
19
49
  def set_program_menu(ui_we_want_to_set: EditorMain) -> None:
20
50
  jeditor_logger.info(f"build_program_menu.py set_program_menu ui_we_want_to_set: {ui_we_want_to_set}")
51
+ # 在 Run 選單下建立 Program 子選單
52
+ # Create Program submenu under Run menu
21
53
  ui_we_want_to_set.run_program_menu = ui_we_want_to_set.run_menu.addMenu(
22
54
  language_wrapper.language_word_dict.get("run_menu_run_program_label"))
23
- # Run program
55
+
56
+ # 建立「執行程式」動作
57
+ # Add "Run Program" action
24
58
  ui_we_want_to_set.run_program_menu.run_program_action = QAction(
25
59
  language_wrapper.language_word_dict.get("run_menu_run_program_label"))
26
60
  ui_we_want_to_set.run_program_menu.run_program_action.triggered.connect(
27
61
  lambda: run_program(ui_we_want_to_set)
28
62
  )
29
63
  ui_we_want_to_set.run_program_menu.addAction(ui_we_want_to_set.run_program_menu.run_program_action)
30
- # Show shell input
64
+
65
+ # 建立「顯示程式輸入」動作
66
+ # Add "Show Program Input" action
31
67
  ui_we_want_to_set.run_program_menu.show_shell_input = QAction(
32
68
  language_wrapper.language_word_dict.get("show_program_input"))
33
69
  ui_we_want_to_set.run_program_menu.show_shell_input.triggered.connect(
@@ -36,26 +72,36 @@ def set_program_menu(ui_we_want_to_set: EditorMain) -> None:
36
72
  ui_we_want_to_set.run_program_menu.addAction(ui_we_want_to_set.run_program_menu.show_shell_input)
37
73
 
38
74
 
75
+ # 執行程式
76
+ # Run program
39
77
  def run_program(ui_we_want_to_set: EditorMain) -> None:
40
78
  jeditor_logger.info(f"build_program_menu.py run_program ui_we_want_to_set: {ui_we_want_to_set}")
41
79
  widget = ui_we_want_to_set.tab_widget.currentWidget()
42
80
  if isinstance(widget, EditorWidget):
81
+ # 確保沒有正在執行的程式
82
+ # Ensure no program is already running
43
83
  if widget.exec_program is None:
44
84
  widget.python_compiler = ui_we_want_to_set.python_compiler
85
+ # 要求使用者選擇儲存檔案路徑
86
+ # Ask user to choose save file path
45
87
  if choose_file_get_save_file_path(ui_we_want_to_set):
88
+ # 建立程式執行管理器並執行程式
89
+ # Create ExecManager and run program
46
90
  code_exec = ExecManager(widget, program_encoding=ui_we_want_to_set.encoding)
47
91
  code_exec.later_init()
48
- code_exec.exec_code(
49
- widget.current_file
50
- )
92
+ code_exec.exec_code(widget.current_file)
51
93
  widget.exec_program = code_exec
52
94
  else:
95
+ # 如果已有程式在執行,顯示提示訊息
96
+ # If a program is already running, show message
53
97
  please_close_current_running_messagebox(ui_we_want_to_set)
54
98
 
55
99
 
100
+ # 顯示程式輸入介面
101
+ # Show program input interface
56
102
  def show_program_input(ui_we_want_to_set: EditorMain) -> None:
57
103
  jeditor_logger.info(f"build_program_menu.py show_program_input ui_we_want_to_set: {ui_we_want_to_set}")
58
104
  widget = ui_we_want_to_set.tab_widget.currentWidget()
59
105
  if isinstance(widget, EditorWidget):
60
106
  widget.program_input = ProcessInput(widget, "program")
61
- widget.program_input.show()
107
+ widget.program_input.show()