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,98 @@
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 EditorWidget and ProcessInput
11
+ from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
12
+ from je_editor.pyside_ui.main_ui.editor.process_input import ProcessInput
13
+ # 匯入工具函式:顯示「請先關閉目前執行中的程式」訊息框
14
+ # Import utility: show message box if a program is already running
15
+ from je_editor.pyside_ui.main_ui.menu.run_menu.under_run_menu.utils import please_close_current_running_messagebox
16
+ # 匯入日誌紀錄器
17
+ # Import logger instance
18
+ from je_editor.utils.logging.loggin_instance import jeditor_logger
19
+
20
+ # 僅在型別檢查時匯入 EditorMain,避免循環依賴
21
+ # Import EditorMain only for type checking (avoids circular dependency)
22
+ if TYPE_CHECKING:
23
+ from je_editor.pyside_ui.main_ui.main_editor import EditorMain
24
+
25
+ # 匯入 Qt 動作
26
+ # Import QAction
27
+ from PySide6.QtGui import QAction
28
+
29
+ # 匯入 ShellManager,用於執行系統命令
30
+ # Import ShellManager for executing shell commands
31
+ from je_editor.pyside_ui.code.shell_process.shell_exec import ShellManager
32
+
33
+ # 匯入多語言包裝器
34
+ # Import multi-language wrapper for UI localization
35
+ from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
36
+
37
+
38
+ # 設定 Shell 選單
39
+ # Set up the Shell menu
40
+ def set_shell_menu(ui_we_want_to_set: EditorMain) -> None:
41
+ jeditor_logger.info(f"build_shell_menu.py set_shell_menu ui_we_want_to_set: {ui_we_want_to_set}")
42
+ # 在 Run 選單下建立 Shell 子選單
43
+ # Create Shell submenu under Run menu
44
+ ui_we_want_to_set.run_shell_menu = ui_we_want_to_set.run_menu.addMenu(
45
+ language_wrapper.language_word_dict.get("run_menu_run_on_shell_label"))
46
+
47
+ # 建立「在 Shell 執行」動作
48
+ # Add "Run on Shell" action
49
+ ui_we_want_to_set.run_shell_menu.run_on_shell_action = QAction(
50
+ language_wrapper.language_word_dict.get("run_menu_run_on_shell_label"))
51
+ ui_we_want_to_set.run_shell_menu.run_on_shell_action.triggered.connect(
52
+ lambda: shell_exec(ui_we_want_to_set)
53
+ )
54
+ ui_we_want_to_set.run_shell_menu.addAction(ui_we_want_to_set.run_shell_menu.run_on_shell_action)
55
+
56
+ # 建立「顯示 Shell 輸入」動作
57
+ # Add "Show Shell Input" action
58
+ ui_we_want_to_set.run_shell_menu.show_shell_input = QAction(
59
+ language_wrapper.language_word_dict.get("show_shell_input"))
60
+ ui_we_want_to_set.run_shell_menu.show_shell_input.triggered.connect(
61
+ lambda: show_shell_input(ui_we_want_to_set)
62
+ )
63
+ ui_we_want_to_set.run_shell_menu.addAction(ui_we_want_to_set.run_shell_menu.show_shell_input)
64
+
65
+
66
+ # 在 Shell 中執行程式碼
67
+ # Execute code in Shell
68
+ def shell_exec(ui_we_want_to_set: EditorMain) -> None:
69
+ jeditor_logger.info(f"build_shell_menu.py shell_exec ui_we_want_to_set: {ui_we_want_to_set}")
70
+ widget = ui_we_want_to_set.tab_widget.currentWidget()
71
+ if isinstance(widget, EditorWidget):
72
+ # 確保沒有正在執行的 Shell 程式
73
+ # Ensure no shell process is already running
74
+ if widget.exec_shell is None:
75
+ # 建立 ShellManager 並執行當前編輯器中的程式碼
76
+ # Create ShellManager and execute current editor code
77
+ shell_command = ShellManager(
78
+ main_window=widget,
79
+ shell_encoding=ui_we_want_to_set.encoding)
80
+ shell_command.later_init()
81
+ shell_command.exec_shell(
82
+ widget.code_edit.toPlainText() # 直接執行編輯器中的文字
83
+ )
84
+ widget.exec_shell = shell_command
85
+ else:
86
+ # 如果已有 Shell 在執行,顯示提示訊息
87
+ # If a shell process is already running, show message
88
+ please_close_current_running_messagebox(ui_we_want_to_set)
89
+
90
+
91
+ # 顯示 Shell 輸入介面
92
+ # Show Shell input interface
93
+ def show_shell_input(ui_we_want_to_set: EditorMain) -> None:
94
+ jeditor_logger.info(f"build_shell_menu.py show_shell_input ui_we_want_to_set: {ui_we_want_to_set}")
95
+ widget = ui_we_want_to_set.tab_widget.currentWidget()
96
+ if isinstance(widget, EditorWidget):
97
+ widget.shell_input = ProcessInput(widget, "shell")
98
+ widget.shell_input.show()
@@ -0,0 +1,41 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ # 匯入 Qt 訊息框
6
+ # Import QMessageBox for showing message dialogs
7
+ from PySide6.QtWidgets import QMessageBox
8
+
9
+ # 匯入日誌紀錄器
10
+ # Import logger instance
11
+ from je_editor.utils.logging.loggin_instance import jeditor_logger
12
+ # 匯入多語言包裝器,用於多語言顯示
13
+ # Import multi-language wrapper for UI localization
14
+ from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
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
+
22
+ # 顯示「請先關閉目前執行中的程式」訊息框
23
+ # Show a message box: "Please stop the currently running program first"
24
+ def please_close_current_running_messagebox(ui_we_want_to_set: EditorMain):
25
+ # 紀錄日誌,方便除錯
26
+ # Log info for debugging
27
+ jeditor_logger.info(f"utils.py please_close_current_running_messagebox ui_we_want_to_set: {ui_we_want_to_set}")
28
+
29
+ # 建立訊息框,父視窗為主編輯器
30
+ # Create a message box with the main editor as parent
31
+ please_stop_current_running_program_messagebox = QMessageBox(ui_we_want_to_set)
32
+
33
+ # 設定訊息框文字,從多語言字典取得對應語言的提示
34
+ # Set message text, retrieved from multi-language dictionary
35
+ please_stop_current_running_program_messagebox.setText(
36
+ language_wrapper.language_word_dict.get("please_stop_current_running_program")
37
+ )
38
+
39
+ # 顯示訊息框
40
+ # Show the message box
41
+ please_stop_current_running_program_messagebox.show()
@@ -0,0 +1,63 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ # 匯入各種子選單的建構函式
6
+ # Import functions to build different sub-menus
7
+ from je_editor.pyside_ui.main_ui.menu.dock_menu.build_dock_menu import set_dock_menu
8
+ from je_editor.pyside_ui.main_ui.menu.language_menu.build_language_server import set_language_menu
9
+ from je_editor.pyside_ui.main_ui.menu.style_menu.build_style_menu import set_style_menu
10
+ from je_editor.pyside_ui.main_ui.menu.tab_menu.build_tab_menu import set_tab_menu
11
+ from je_editor.pyside_ui.main_ui.menu.text_menu.build_text_menu import set_text_menu
12
+ from je_editor.utils.logging.loggin_instance import jeditor_logger
13
+
14
+ # 啟用未來註解功能,允許型別提示使用字串前向參照
15
+ # Enable future annotations, allowing forward references in type hints
16
+ # TYPE_CHECKING 用於避免在執行時載入不必要的模組
17
+ # TYPE_CHECKING prevents unnecessary imports at runtime
18
+
19
+ if TYPE_CHECKING:
20
+ from je_editor.pyside_ui.main_ui.main_editor import EditorMain
21
+ # 僅在型別檢查時匯入 EditorMain,避免循環依賴
22
+ # Import EditorMain only for type checking
23
+
24
+ from PySide6.QtWidgets import QMenuBar
25
+ # 匯入 QMenuBar,用於建立選單列
26
+ # Import QMenuBar to create the menu bar
27
+
28
+ # 其他子選單建構函式
29
+ # Other sub-menu builders
30
+ from je_editor.pyside_ui.main_ui.menu.check_style_menu.build_check_style_menu import set_check_menu
31
+ from je_editor.pyside_ui.main_ui.menu.file_menu.build_file_menu import set_file_menu
32
+ from je_editor.pyside_ui.main_ui.menu.help_menu.build_help_menu import set_help_menu
33
+ from je_editor.pyside_ui.main_ui.menu.run_menu.build_run_menu import set_run_menu
34
+ from je_editor.pyside_ui.main_ui.menu.python_env_menu.build_venv_menu import set_venv_menu
35
+
36
+
37
+ def set_menu_bar(ui_we_want_to_set: EditorMain) -> None:
38
+ """
39
+ 建立主選單列,並依序加入各種子選單
40
+ Build the main menu bar and add all sub-menus in order
41
+ """
42
+ jeditor_logger.info(f"set_menu_bar.py set_menu_bar ui_we_want_to_set: {ui_we_want_to_set}")
43
+
44
+ # 建立一個新的選單列
45
+ # Create a new menu bar
46
+ ui_we_want_to_set.menu = QMenuBar()
47
+
48
+ # === 加入各種子選單 ===
49
+ # === Add different sub-menus ===
50
+ set_file_menu(ui_we_want_to_set) # 檔案選單 / File menu
51
+ set_run_menu(ui_we_want_to_set) # 執行選單 / Run menu
52
+ set_text_menu(ui_we_want_to_set) # 文字設定選單 / Text menu
53
+ set_check_menu(ui_we_want_to_set) # 程式碼檢查選單 / Code style check menu
54
+ set_help_menu(ui_we_want_to_set) # 幫助選單 / Help menu
55
+ set_venv_menu(ui_we_want_to_set) # Python 虛擬環境選單 / Python venv menu
56
+ set_tab_menu(ui_we_want_to_set) # 分頁選單 / Tab menu
57
+ set_dock_menu(ui_we_want_to_set) # Dock 視窗選單 / Dock menu
58
+ set_style_menu(ui_we_want_to_set) # 介面樣式選單 / Style menu
59
+ set_language_menu(ui_we_want_to_set) # 語言選單 / Language menu
60
+
61
+ # 將選單列設定到主視窗
62
+ # Attach the menu bar to the main editor window
63
+ ui_we_want_to_set.setMenuBar(ui_we_want_to_set.menu)
@@ -0,0 +1,73 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ # 匯入 Qt 動作
6
+ # Import QAction
7
+ from PySide6.QtGui import QAction
8
+
9
+ # 匯入使用者設定字典,用來保存 UI 樣式設定
10
+ # Import user settings dictionary for saving UI style preferences
11
+ from je_editor.pyside_ui.main_ui.save_settings.user_setting_file import user_setting_dict
12
+ # 匯入日誌紀錄器
13
+ # Import logger instance
14
+ from je_editor.utils.logging.loggin_instance import jeditor_logger
15
+
16
+ if TYPE_CHECKING:
17
+ # 僅在型別檢查時匯入 EditorMain,避免循環依賴
18
+ # Import EditorMain only for type checking (avoids circular dependency)
19
+ from je_editor.pyside_ui.main_ui.main_editor import EditorMain
20
+
21
+ # 匯入多語言包裝器,用於 UI 多語言顯示
22
+ # Import multi-language wrapper for UI localization
23
+ from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
24
+
25
+
26
+ # 設定 Style 選單
27
+ # Set up the Style menu
28
+ def set_style_menu(ui_we_want_to_set: EditorMain) -> None:
29
+ jeditor_logger.info(f"build_style_menu.py set_style_menu ui_we_want_to_set: {ui_we_want_to_set}")
30
+
31
+ # 在主選單中新增「Style」子選單
32
+ # Add "Style" submenu under the main menu
33
+ ui_we_want_to_set.menu.style_menu = ui_we_want_to_set.menu.addMenu(
34
+ language_wrapper.language_word_dict.get("style_menu_label")
35
+ )
36
+
37
+ # 預設提供的樣式清單 (深色/淺色不同配色)
38
+ # Predefined style list (dark/light themes with different colors)
39
+ for style in [
40
+ 'dark_amber.xml', 'dark_blue.xml', 'dark_cyan.xml', 'dark_lightgreen.xml',
41
+ 'dark_pink.xml', 'dark_purple.xml', 'dark_red.xml', 'dark_teal.xml',
42
+ 'dark_yellow.xml', 'light_amber.xml', 'light_blue.xml', 'light_cyan.xml',
43
+ 'light_cyan_500.xml', 'light_lightgreen.xml', 'light_pink.xml', 'light_purple.xml'
44
+ ]:
45
+ # 建立一個 QAction,名稱為樣式檔名
46
+ # Create an QAction with the style filename as label
47
+ change_style_action = QAction(style, parent=ui_we_want_to_set.menu.style_menu)
48
+
49
+ # 綁定觸發事件,呼叫 set_style 來套用樣式
50
+ # Connect action to set_style function
51
+ change_style_action.triggered.connect(
52
+ lambda checked=False, action=change_style_action: set_style(ui_we_want_to_set, action)
53
+ )
54
+
55
+ # 將動作加入 Style 選單
56
+ # Add action to the Style menu
57
+ ui_we_want_to_set.menu.style_menu.addAction(change_style_action)
58
+
59
+
60
+ # 套用選擇的樣式
61
+ # Apply the selected style
62
+ def set_style(ui_we_want_to_set: EditorMain, action: QAction) -> None:
63
+ jeditor_logger.info("build_style_menu.py set_style "
64
+ f"ui_we_want_to_set: {ui_we_want_to_set} "
65
+ f"action: {action}")
66
+
67
+ # 呼叫主視窗的 apply_stylesheet 方法,套用選擇的樣式
68
+ # Call main window's apply_stylesheet method to apply the chosen style
69
+ ui_we_want_to_set.apply_stylesheet(ui_we_want_to_set, action.text())
70
+
71
+ # 更新使用者設定,保存目前選擇的樣式
72
+ # Update user settings dictionary to persist the chosen style
73
+ user_setting_dict.update({"ui_style": action.text()})
File without changes
@@ -0,0 +1,275 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from frontengine import FrontEngineMainUI
6
+
7
+ from je_editor.pyside_ui.browser.main_browser_widget import MainBrowserWidget
8
+ from je_editor.pyside_ui.code.variable_inspector.inspector_gui import VariableInspector
9
+ # 匯入各種 UI 元件 (編輯器、瀏覽器、Git、變數檢查器、聊天、控制台、IPython、程式碼比對)
10
+ # Import various UI components (editor, browser, Git, variable inspector, chat, console, IPython, code diff)
11
+ from je_editor.pyside_ui.git_ui.code_diff_compare.code_diff_viewer_widget import DiffViewerWidget
12
+ from je_editor.pyside_ui.git_ui.git_client.git_branch_tree_widget import GitTreeViewGUI
13
+ from je_editor.pyside_ui.git_ui.git_client.git_client_gui import GitGui
14
+ from je_editor.pyside_ui.main_ui.ai_widget.chat_ui import ChatUI
15
+ from je_editor.pyside_ui.main_ui.console_widget.console_gui import ConsoleWidget
16
+ from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
17
+ from je_editor.pyside_ui.main_ui.ipython_widget.rich_jupyter import IpythonWidget
18
+ from je_editor.utils.logging.loggin_instance import jeditor_logger
19
+
20
+ # 啟用未來的註解功能,允許在型別提示中使用字串形式的前向參照
21
+ # Enable future annotations, allowing forward references in type hints
22
+ # TYPE_CHECKING 用於避免在型別檢查時引入不必要的模組
23
+ # TYPE_CHECKING is used to avoid unnecessary imports during type checking
24
+ # 匯入 FrontEngine 主 UI
25
+ # Import the FrontEngine main UI
26
+ # 匯入日誌工具,用於記錄操作
27
+ # Import logger for recording operations
28
+
29
+ if TYPE_CHECKING:
30
+ from je_editor.pyside_ui.main_ui.main_editor import EditorMain
31
+ # 僅在型別檢查時匯入 EditorMain,避免循環依賴
32
+ # Import EditorMain only for type checking to avoid circular imports
33
+
34
+ from PySide6.QtGui import QAction
35
+ # 匯入 QAction,用於建立選單動作
36
+ # Import QAction for creating menu actions
37
+
38
+ from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
39
+
40
+
41
+ # 匯入多語言包裝器,用於支援多語系 UI
42
+ # Import language wrapper for multilingual UI support
43
+
44
+
45
+ def set_tab_menu(ui_we_want_to_set: EditorMain) -> None:
46
+ """
47
+ 設定主編輯器的分頁選單
48
+ Set up the tab menu for the main editor
49
+ """
50
+ jeditor_logger.info(f"build_tab_menu.py set_tab_menu ui_we_want_to_set:{ui_we_want_to_set}")
51
+
52
+ # 建立 Tab 選單 (主容器)
53
+ # Create the Tab menu (main container)
54
+ ui_we_want_to_set.tab_menu = ui_we_want_to_set.menu.addMenu(
55
+ language_wrapper.language_word_dict.get("tab_menu_label")
56
+ )
57
+
58
+ # === Editor 分頁 ===
59
+ # === Editor Tab ===
60
+ ui_we_want_to_set.tab_menu.add_editor_action = QAction(
61
+ language_wrapper.language_word_dict.get("tab_menu_add_editor_label"))
62
+ ui_we_want_to_set.tab_menu.add_editor_action.triggered.connect(
63
+ lambda: add_editor_tab(ui_we_want_to_set)
64
+ )
65
+ ui_we_want_to_set.tab_menu.addAction(ui_we_want_to_set.tab_menu.add_editor_action)
66
+
67
+ # === Front Engine 分頁 ===
68
+ # === Front Engine Tab ===
69
+ ui_we_want_to_set.tab_menu.add_frontengine_action = QAction(
70
+ language_wrapper.language_word_dict.get("tab_menu_add_frontengine_label"))
71
+ ui_we_want_to_set.tab_menu.add_frontengine_action.triggered.connect(
72
+ lambda: add_frontengine_tab(ui_we_want_to_set)
73
+ )
74
+ ui_we_want_to_set.tab_menu.addAction(ui_we_want_to_set.tab_menu.add_frontengine_action)
75
+
76
+ # === Web 瀏覽器分頁 ===
77
+ # === Web Browser Tab ===
78
+ ui_we_want_to_set.tab_menu.add_web_action = QAction(
79
+ language_wrapper.language_word_dict.get("tab_menu_add_web_label"))
80
+ ui_we_want_to_set.tab_menu.add_web_action.triggered.connect(
81
+ lambda: add_web_tab(ui_we_want_to_set)
82
+ )
83
+ ui_we_want_to_set.tab_menu.addAction(ui_we_want_to_set.tab_menu.add_web_action)
84
+
85
+ # === IPython 分頁 ===
86
+ # === IPython Tab ===
87
+ ui_we_want_to_set.tab_menu.add_ipython_action = QAction(
88
+ language_wrapper.language_word_dict.get("tab_menu_ipython_tab_name"))
89
+ ui_we_want_to_set.tab_menu.add_ipython_action.triggered.connect(
90
+ lambda: add_ipython_tab(ui_we_want_to_set)
91
+ )
92
+ ui_we_want_to_set.tab_menu.addAction(ui_we_want_to_set.tab_menu.add_ipython_action)
93
+
94
+ # === Chat UI 分頁 ===
95
+ # === Chat UI Tab ===
96
+ ui_we_want_to_set.tab_menu.add_chat_ui_action = QAction(
97
+ language_wrapper.language_word_dict.get("tab_menu_chat_ui_tab_name"))
98
+ ui_we_want_to_set.tab_menu.add_chat_ui_action.triggered.connect(
99
+ lambda: add_chat_ui_tab(ui_we_want_to_set)
100
+ )
101
+ ui_we_want_to_set.tab_menu.addAction(ui_we_want_to_set.tab_menu.add_chat_ui_action)
102
+
103
+ # === Git Client 分頁 ===
104
+ # === Git Client Tab ===
105
+ ui_we_want_to_set.tab_menu.add_git_client_ui_action = QAction(
106
+ language_wrapper.language_word_dict.get("tab_menu_git_client_tab_name"))
107
+ ui_we_want_to_set.tab_menu.add_git_client_ui_action.triggered.connect(
108
+ lambda: add_git_client_tab(ui_we_want_to_set)
109
+ )
110
+ ui_we_want_to_set.tab_menu.addAction(ui_we_want_to_set.tab_menu.add_git_client_ui_action)
111
+
112
+ # === Git Branch Tree 分頁 ===
113
+ # === Git Branch Tree Tab ===
114
+ ui_we_want_to_set.tab_menu.add_git_branch_view_ui_action = QAction(
115
+ language_wrapper.language_word_dict.get("tab_menu_git_branch_tree_view_tab_name"))
116
+ ui_we_want_to_set.tab_menu.add_git_branch_view_ui_action.triggered.connect(
117
+ lambda: add_git_tree_view_tab(ui_we_want_to_set)
118
+ )
119
+ ui_we_want_to_set.tab_menu.addAction(ui_we_want_to_set.tab_menu.add_git_branch_view_ui_action)
120
+
121
+ # === Variable Inspector 分頁 ===
122
+ # === Variable Inspector Tab ===
123
+ ui_we_want_to_set.tab_menu.add_variable_inspector_ui_action = QAction(
124
+ language_wrapper.language_word_dict.get("tab_menu_variable_inspector_tab_name"))
125
+ ui_we_want_to_set.tab_menu.add_variable_inspector_ui_action.triggered.connect(
126
+ lambda: add_variable_inspector_tab(ui_we_want_to_set)
127
+ )
128
+ ui_we_want_to_set.tab_menu.addAction(ui_we_want_to_set.tab_menu.add_variable_inspector_ui_action)
129
+
130
+ # === Console 分頁 ===
131
+ # === Console Tab ===
132
+ ui_we_want_to_set.tab_menu.add_console_widget_ui_action = QAction(
133
+ language_wrapper.language_word_dict.get("tab_menu_console_widget_tab_name"))
134
+ ui_we_want_to_set.tab_menu.add_console_widget_ui_action.triggered.connect(
135
+ lambda: add_console_widget_tab(ui_we_want_to_set)
136
+ )
137
+ ui_we_want_to_set.tab_menu.addAction(ui_we_want_to_set.tab_menu.add_console_widget_ui_action)
138
+
139
+ # === Code Diff Viewer 分頁 ===
140
+ # === Code Diff Viewer Tab ===
141
+ ui_we_want_to_set.tab_menu.add_code_diff_viewer_ui_action = QAction(
142
+ language_wrapper.language_word_dict.get("tab_code_diff_viewer_tab_name"))
143
+ ui_we_want_to_set.tab_menu.add_code_diff_viewer_ui_action.triggered.connect(
144
+ lambda: add_code_diff_compare_tab(ui_we_want_to_set)
145
+ )
146
+ ui_we_want_to_set.tab_menu.addAction(ui_we_want_to_set.tab_menu.add_code_diff_viewer_ui_action)
147
+
148
+
149
+ # === 以下為各分頁新增函式 ===
150
+ # === Functions to add each tab ===
151
+
152
+ def add_editor_tab(ui_we_want_to_set: EditorMain):
153
+ # 新增 Editor 分頁
154
+ # Add Editor tab
155
+ jeditor_logger.info(f"build_tab_menu.py add editor tab ui_we_want_to_set: {ui_we_want_to_set}")
156
+ widget = EditorWidget(ui_we_want_to_set)
157
+ ui_we_want_to_set.tab_widget.addTab(
158
+ widget,
159
+ f"{language_wrapper.language_word_dict.get('tab_menu_editor_tab_name')} "
160
+ f"{ui_we_want_to_set.tab_widget.count()}")
161
+ return widget
162
+
163
+
164
+ def add_frontengine_tab(ui_we_want_to_set: EditorMain):
165
+ # 新增 FrontEngine 分頁
166
+ # Add FrontEngine tab
167
+ jeditor_logger.info(f"build_tab_menu.py add frontengine tab ui_we_want_to_set: {ui_we_want_to_set}")
168
+ ui_we_want_to_set.tab_widget.addTab(
169
+ FrontEngineMainUI(show_system_tray_ray=False, redirect_output=False),
170
+ f"{language_wrapper.language_word_dict.get('tab_menu_frontengine_tab_name')} "
171
+ f"{ui_we_want_to_set.tab_widget.count()}")
172
+
173
+
174
+ def add_web_tab(ui_we_want_to_set: EditorMain):
175
+ # 紀錄日誌:新增 Web 分頁
176
+ # Log: add a Web tab
177
+ jeditor_logger.info(f"build_tab_menu.py add web tab ui_we_want_to_set: {ui_we_want_to_set}")
178
+ # 在主編輯器的 tab_widget 中新增一個瀏覽器分頁
179
+ # Add a browser tab into the main editor's tab_widget
180
+ ui_we_want_to_set.tab_widget.addTab(
181
+ MainBrowserWidget(), # 建立瀏覽器元件 / Create browser widget
182
+ f"{language_wrapper.language_word_dict.get('tab_menu_web_tab_name')} "
183
+ f"{ui_we_want_to_set.tab_widget.count()}" # 分頁名稱包含序號 / Tab name with index
184
+ )
185
+
186
+
187
+ def add_ipython_tab(ui_we_want_to_set: EditorMain):
188
+ # 紀錄日誌:新增 IPython 分頁
189
+ # Log: add an IPython tab
190
+ jeditor_logger.info(f"build_tab_menu.py add ipython tab ui_we_want_to_set: {ui_we_want_to_set}")
191
+ # 在主編輯器中新增 IPython 互動式分頁
192
+ # Add an IPython interactive tab
193
+ ui_we_want_to_set.tab_widget.addTab(
194
+ IpythonWidget(ui_we_want_to_set), # 建立 IPython 元件 / Create IPython widget
195
+ f"{language_wrapper.language_word_dict.get('tab_menu_ipython_tab_name')} "
196
+ f"{ui_we_want_to_set.tab_widget.count()}"
197
+ )
198
+
199
+
200
+ def add_chat_ui_tab(ui_we_want_to_set: EditorMain):
201
+ # 紀錄日誌:新增 Chat UI 分頁
202
+ # Log: add a Chat UI tab
203
+ jeditor_logger.info(f"build_tab_menu.py add chat_ui tab ui_we_want_to_set: {ui_we_want_to_set}")
204
+ # 在主編輯器中新增聊天分頁
205
+ # Add a chat tab into the main editor
206
+ ui_we_want_to_set.tab_widget.addTab(
207
+ ChatUI(ui_we_want_to_set), # 建立聊天元件 / Create Chat UI widget
208
+ f"{language_wrapper.language_word_dict.get('tab_menu_chat_ui_tab_name')} "
209
+ f"{ui_we_want_to_set.tab_widget.count()}"
210
+ )
211
+
212
+
213
+ def add_git_client_tab(ui_we_want_to_set: EditorMain):
214
+ # 紀錄日誌:新增 Git Client 分頁
215
+ # Log: add a Git Client tab
216
+ jeditor_logger.info(f"build_tab_menu.py add git client tab ui_we_want_to_set: {ui_we_want_to_set}")
217
+ # 在主編輯器中新增 Git 客戶端分頁
218
+ # Add a Git client tab
219
+ ui_we_want_to_set.tab_widget.addTab(
220
+ GitGui(), # 建立 Git GUI 元件 / Create Git GUI widget
221
+ f"{language_wrapper.language_word_dict.get('tab_menu_git_client_tab_name')} "
222
+ f"{ui_we_want_to_set.tab_widget.count()}"
223
+ )
224
+
225
+
226
+ def add_git_tree_view_tab(ui_we_want_to_set: EditorMain):
227
+ # 紀錄日誌:新增 Git Branch Tree 分頁
228
+ # Log: add a Git Branch Tree tab
229
+ jeditor_logger.info(f"build_tab_menu.py add git tree view tab ui_we_want_to_set: {ui_we_want_to_set}")
230
+ # 在主編輯器中新增 Git 分支樹狀圖分頁
231
+ # Add a Git branch tree view tab
232
+ ui_we_want_to_set.tab_widget.addTab(
233
+ GitTreeViewGUI(), # 建立 Git Tree View 元件 / Create Git Tree View widget
234
+ f"{language_wrapper.language_word_dict.get('tab_menu_git_branch_tree_view_tab_name')} "
235
+ f"{ui_we_want_to_set.tab_widget.count()}"
236
+ )
237
+
238
+
239
+ def add_variable_inspector_tab(ui_we_want_to_set: EditorMain):
240
+ # 紀錄日誌:新增 Variable Inspector 分頁
241
+ # Log: add a Variable Inspector tab
242
+ jeditor_logger.info(f"build_tab_menu.py add variable inspector tab ui_we_want_to_set: {ui_we_want_to_set}")
243
+ # 在主編輯器中新增變數檢查器分頁
244
+ # Add a variable inspector tab
245
+ ui_we_want_to_set.tab_widget.addTab(
246
+ VariableInspector(), # 建立變數檢查器元件 / Create Variable Inspector widget
247
+ f"{language_wrapper.language_word_dict.get('tab_menu_variable_inspector_tab_name')} "
248
+ f"{ui_we_want_to_set.tab_widget.count()}"
249
+ )
250
+
251
+
252
+ def add_console_widget_tab(ui_we_want_to_set: EditorMain):
253
+ # 紀錄日誌:新增 Console 分頁
254
+ # Log: add a Console tab
255
+ jeditor_logger.info(f"build_tab_menu.py add console widget tab ui_we_want_to_set: {ui_we_want_to_set}")
256
+ # 在主編輯器中新增動態控制台分頁
257
+ # Add a dynamic console tab
258
+ ui_we_want_to_set.tab_widget.addTab(
259
+ ConsoleWidget(), # 建立控制台元件 / Create Console widget
260
+ f"{language_wrapper.language_word_dict.get('tab_menu_console_widget_tab_name')} "
261
+ f"{ui_we_want_to_set.tab_widget.count()}"
262
+ )
263
+
264
+
265
+ def add_code_diff_compare_tab(ui_we_want_to_set: EditorMain):
266
+ # 紀錄日誌:新增 Code Diff Compare 分頁
267
+ # Log: add a Code Diff Compare tab
268
+ jeditor_logger.info(f"build_tab_menu.py add code diff compare tab ui_we_want_to_set: {ui_we_want_to_set}")
269
+ # 在主編輯器中新增程式碼差異比較分頁
270
+ # Add a code diff comparison tab
271
+ ui_we_want_to_set.tab_widget.addTab(
272
+ DiffViewerWidget(), # 建立程式碼比對元件 / Create Code Diff Viewer widget
273
+ f"{language_wrapper.language_word_dict.get('tab_code_diff_viewer_tab_name')} "
274
+ f"{ui_we_want_to_set.tab_widget.count()}"
275
+ )
File without changes