je-editor 0.0.223__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.
- je_editor/git_client/commit_graph.py +7 -7
- je_editor/git_client/git_action.py +0 -7
- je_editor/pyside_ui/browser/browser_widget.py +24 -11
- je_editor/pyside_ui/browser/main_browser_widget.py +40 -27
- je_editor/pyside_ui/code/auto_save/auto_save_manager.py +34 -2
- je_editor/pyside_ui/code/auto_save/auto_save_thread.py +19 -6
- je_editor/pyside_ui/code/code_format/pep8_format.py +53 -9
- je_editor/pyside_ui/code/code_process/code_exec.py +88 -52
- je_editor/pyside_ui/code/plaintext_code_edit/code_edit_plaintext.py +116 -55
- je_editor/pyside_ui/code/running_process_manager.py +19 -1
- je_editor/pyside_ui/code/shell_process/shell_exec.py +71 -48
- je_editor/pyside_ui/code/syntax/python_syntax.py +45 -10
- je_editor/pyside_ui/code/syntax/syntax_setting.py +40 -12
- je_editor/pyside_ui/code/textedit_code_result/code_record.py +34 -12
- je_editor/pyside_ui/code/variable_inspector/inspector_gui.py +53 -6
- je_editor/pyside_ui/dialog/ai_dialog/set_ai_dialog.py +30 -3
- je_editor/pyside_ui/dialog/file_dialog/create_file_dialog.py +35 -2
- je_editor/pyside_ui/dialog/file_dialog/open_file_dialog.py +33 -5
- je_editor/pyside_ui/dialog/file_dialog/save_file_dialog.py +25 -3
- je_editor/pyside_ui/dialog/search_ui/search_error_box.py +26 -1
- je_editor/pyside_ui/dialog/search_ui/search_text_box.py +26 -1
- je_editor/pyside_ui/git_ui/code_diff_compare/code_diff_viewer_widget.py +11 -11
- je_editor/pyside_ui/git_ui/git_client/commit_table.py +46 -8
- je_editor/pyside_ui/git_ui/git_client/git_branch_tree_widget.py +49 -15
- je_editor/pyside_ui/git_ui/git_client/graph_view.py +64 -20
- je_editor/pyside_ui/main_ui/ai_widget/ai_config.py +20 -5
- je_editor/pyside_ui/main_ui/ai_widget/ask_thread.py +20 -1
- je_editor/pyside_ui/main_ui/ai_widget/chat_ui.py +56 -41
- je_editor/pyside_ui/main_ui/ai_widget/langchain_interface.py +45 -6
- je_editor/pyside_ui/main_ui/console_widget/console_gui.py +44 -12
- je_editor/pyside_ui/main_ui/console_widget/qprocess_adapter.py +34 -13
- je_editor/pyside_ui/main_ui/dock/destroy_dock.py +33 -2
- je_editor/pyside_ui/main_ui/editor/editor_widget.py +104 -20
- je_editor/pyside_ui/main_ui/editor/editor_widget_dock.py +34 -7
- je_editor/pyside_ui/main_ui/editor/process_input.py +38 -11
- je_editor/pyside_ui/main_ui/ipython_widget/rich_jupyter.py +46 -11
- je_editor/pyside_ui/main_ui/main_editor.py +175 -37
- je_editor/pyside_ui/main_ui/menu/check_style_menu/build_check_style_menu.py +51 -28
- je_editor/pyside_ui/main_ui/menu/dock_menu/build_dock_menu.py +80 -22
- je_editor/pyside_ui/main_ui/menu/file_menu/build_file_menu.py +70 -17
- je_editor/pyside_ui/main_ui/menu/help_menu/build_help_menu.py +34 -3
- je_editor/pyside_ui/main_ui/menu/language_menu/build_language_server.py +41 -1
- je_editor/pyside_ui/main_ui/menu/python_env_menu/build_venv_menu.py +100 -42
- je_editor/pyside_ui/main_ui/menu/run_menu/build_run_menu.py +57 -7
- je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/build_debug_menu.py +50 -4
- je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/build_program_menu.py +52 -6
- je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/build_shell_menu.py +44 -4
- je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/utils.py +23 -1
- je_editor/pyside_ui/main_ui/menu/set_menu_bar.py +37 -12
- je_editor/pyside_ui/main_ui/menu/style_menu/build_style_menu.py +44 -7
- je_editor/pyside_ui/main_ui/menu/tab_menu/build_tab_menu.py +126 -28
- je_editor/pyside_ui/main_ui/menu/text_menu/build_text_menu.py +65 -1
- je_editor/pyside_ui/main_ui/save_settings/setting_utils.py +18 -1
- je_editor/pyside_ui/main_ui/save_settings/user_color_setting_file.py +33 -3
- je_editor/pyside_ui/main_ui/save_settings/user_setting_file.py +38 -11
- je_editor/pyside_ui/main_ui/system_tray/extend_system_tray.py +39 -2
- je_editor/start_editor.py +26 -1
- je_editor/utils/encodings/python_encodings.py +101 -98
- je_editor/utils/file/open/open_file.py +36 -19
- je_editor/utils/file/save/save_file.py +35 -14
- je_editor/utils/json/json_file.py +29 -14
- je_editor/utils/json_format/json_process.py +33 -2
- je_editor/utils/logging/loggin_instance.py +38 -8
- je_editor/utils/multi_language/multi_language_wrapper.py +29 -4
- je_editor/utils/redirect_manager/redirect_manager_class.py +49 -11
- je_editor/utils/venv_check/check_venv.py +45 -15
- {je_editor-0.0.223.dist-info → je_editor-0.0.224.dist-info}/METADATA +1 -1
- {je_editor-0.0.223.dist-info → je_editor-0.0.224.dist-info}/RECORD +71 -71
- {je_editor-0.0.223.dist-info → je_editor-0.0.224.dist-info}/WHEEL +0 -0
- {je_editor-0.0.223.dist-info → je_editor-0.0.224.dist-info}/licenses/LICENSE +0 -0
- {je_editor-0.0.223.dist-info → je_editor-0.0.224.dist-info}/top_level.txt +0 -0
|
@@ -1,81 +1,104 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
1
|
+
from __future__ import annotations # 啟用未來版本的型別註解功能 / Enable postponed evaluation of type annotations
|
|
2
2
|
|
|
3
|
-
from typing import TYPE_CHECKING
|
|
3
|
+
from typing import TYPE_CHECKING # 僅在型別檢查時使用,避免循環匯入 / Used only for type checking to avoid circular imports
|
|
4
4
|
|
|
5
|
-
from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget
|
|
6
|
-
from je_editor.utils.logging.loggin_instance import jeditor_logger
|
|
7
|
-
from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper
|
|
5
|
+
from je_editor.pyside_ui.main_ui.editor.editor_widget import EditorWidget # 編輯器分頁元件 / Editor tab widget
|
|
6
|
+
from je_editor.utils.logging.loggin_instance import jeditor_logger # 專案內的日誌紀錄器 / Project logger
|
|
7
|
+
from je_editor.utils.multi_language.multi_language_wrapper import language_wrapper # 多語系支援 / Multi-language wrapper
|
|
8
8
|
|
|
9
9
|
if TYPE_CHECKING:
|
|
10
|
-
from je_editor.pyside_ui.main_ui.main_editor import EditorMain
|
|
11
|
-
from PySide6.QtGui import QAction, QKeySequence
|
|
12
|
-
from yapf.yapflib.yapf_api import FormatCode
|
|
10
|
+
from je_editor.pyside_ui.main_ui.main_editor import EditorMain # 僅在型別檢查時匯入 / Import only for type checking
|
|
13
11
|
|
|
14
|
-
from
|
|
12
|
+
from PySide6.QtGui import QAction, QKeySequence # Qt 動作與快捷鍵 / Qt actions and shortcuts
|
|
13
|
+
from yapf.yapflib.yapf_api import FormatCode # YAPF 程式碼格式化工具 / YAPF code formatter
|
|
14
|
+
|
|
15
|
+
from je_editor.utils.json_format.json_process import reformat_json # JSON 格式化工具 / JSON reformatter
|
|
15
16
|
|
|
16
17
|
|
|
17
18
|
def set_check_menu(ui_we_want_to_set: EditorMain) -> None:
|
|
19
|
+
"""
|
|
20
|
+
建立「程式碼檢查/格式化」選單,並加入三個功能:
|
|
21
|
+
- 使用 YAPF 重新格式化 Python 程式碼
|
|
22
|
+
- 重新格式化 JSON
|
|
23
|
+
- 檢查 Python 檔案格式
|
|
24
|
+
|
|
25
|
+
Create "Check/Format Code" menu with three actions:
|
|
26
|
+
- Reformat Python code with YAPF
|
|
27
|
+
- Reformat JSON
|
|
28
|
+
- Check Python file format
|
|
29
|
+
"""
|
|
18
30
|
jeditor_logger.info(f"build_check_style_menu.py set_check_menu ui_we_want_to_set: {ui_we_want_to_set}")
|
|
31
|
+
|
|
32
|
+
# 在主選單中新增一個子選單 / Add submenu to main menu
|
|
19
33
|
ui_we_want_to_set.check_menu = ui_we_want_to_set.menu.addMenu(
|
|
20
34
|
language_wrapper.language_word_dict.get("check_code_style_menu_label"))
|
|
21
|
-
|
|
35
|
+
|
|
36
|
+
# === 1. Yapf Python 程式碼格式化 / Yapf Python code reformat ===
|
|
22
37
|
ui_we_want_to_set.check_menu.yapf_check_python_action = QAction(
|
|
23
38
|
language_wrapper.language_word_dict.get("yapf_reformat_label"))
|
|
24
39
|
ui_we_want_to_set.check_menu.yapf_check_python_action.setShortcut(
|
|
25
|
-
QKeySequence("Ctrl+Shift+Y"))
|
|
40
|
+
QKeySequence("Ctrl+Shift+Y")) # 設定快捷鍵 / Set shortcut
|
|
26
41
|
ui_we_want_to_set.check_menu.yapf_check_python_action.triggered.connect(
|
|
27
|
-
lambda: yapf_check_python_code(
|
|
28
|
-
ui_we_want_to_set
|
|
29
|
-
)
|
|
42
|
+
lambda: yapf_check_python_code(ui_we_want_to_set)
|
|
30
43
|
)
|
|
31
44
|
ui_we_want_to_set.check_menu.addAction(ui_we_want_to_set.check_menu.yapf_check_python_action)
|
|
32
|
-
|
|
45
|
+
|
|
46
|
+
# === 2. JSON 重新格式化 / Reformat JSON ===
|
|
33
47
|
ui_we_want_to_set.check_menu.reformat_json_action = QAction(
|
|
34
48
|
language_wrapper.language_word_dict.get("reformat_json_label"))
|
|
35
49
|
ui_we_want_to_set.check_menu.reformat_json_action.setShortcut("Ctrl+j")
|
|
36
50
|
ui_we_want_to_set.check_menu.reformat_json_action.triggered.connect(
|
|
37
|
-
lambda: reformat_json_text(
|
|
38
|
-
ui_we_want_to_set
|
|
39
|
-
)
|
|
51
|
+
lambda: reformat_json_text(ui_we_want_to_set)
|
|
40
52
|
)
|
|
41
53
|
ui_we_want_to_set.check_menu.addAction(ui_we_want_to_set.check_menu.reformat_json_action)
|
|
42
|
-
|
|
54
|
+
|
|
55
|
+
# === 3. Python 格式檢查 / Python format check ===
|
|
43
56
|
ui_we_want_to_set.check_menu.check_python_format = QAction(
|
|
44
57
|
language_wrapper.language_word_dict.get("python_format_checker"))
|
|
45
58
|
ui_we_want_to_set.check_menu.check_python_format.setShortcut("Ctrl+Alt+p")
|
|
46
59
|
ui_we_want_to_set.check_menu.check_python_format.triggered.connect(
|
|
47
|
-
lambda: check_python_format(
|
|
48
|
-
ui_we_want_to_set
|
|
49
|
-
)
|
|
60
|
+
lambda: check_python_format(ui_we_want_to_set)
|
|
50
61
|
)
|
|
51
62
|
ui_we_want_to_set.check_menu.addAction(ui_we_want_to_set.check_menu.check_python_format)
|
|
52
63
|
|
|
53
64
|
|
|
54
65
|
def yapf_check_python_code(ui_we_want_to_set: EditorMain) -> None:
|
|
66
|
+
"""
|
|
67
|
+
使用 YAPF 重新格式化目前分頁中的 Python 程式碼
|
|
68
|
+
Reformat current tab's Python code using YAPF
|
|
69
|
+
"""
|
|
55
70
|
jeditor_logger.info(f"build_check_style_menu.py yapf_check_python_code ui_we_want_to_set: {ui_we_want_to_set}")
|
|
56
71
|
widget = ui_we_want_to_set.tab_widget.currentWidget()
|
|
57
72
|
if isinstance(widget, EditorWidget):
|
|
58
|
-
code_text = widget.code_edit.toPlainText()
|
|
59
|
-
widget.code_result.setPlainText("")
|
|
73
|
+
code_text = widget.code_edit.toPlainText() # 取得編輯器文字 / Get code text
|
|
74
|
+
widget.code_result.setPlainText("") # 清空結果區域 / Clear result area
|
|
60
75
|
format_code = FormatCode(
|
|
61
76
|
unformatted_source=code_text,
|
|
62
|
-
style_config="google"
|
|
77
|
+
style_config="google" # 使用 Google 風格 / Use Google style
|
|
63
78
|
)
|
|
64
79
|
if isinstance(format_code, tuple):
|
|
65
|
-
widget.code_edit.setPlainText(format_code[0])
|
|
80
|
+
widget.code_edit.setPlainText(format_code[0]) # 將格式化後的程式碼寫回編輯器 / Write formatted code back
|
|
66
81
|
|
|
67
82
|
|
|
68
83
|
def reformat_json_text(ui_we_want_to_set: EditorMain) -> None:
|
|
84
|
+
"""
|
|
85
|
+
重新格式化目前分頁中的 JSON 文字
|
|
86
|
+
Reformat JSON text in the current editor tab
|
|
87
|
+
"""
|
|
69
88
|
jeditor_logger.info(f"build_check_style_menu.py reformat_json_text ui_we_want_to_set: {ui_we_want_to_set}")
|
|
70
89
|
widget = ui_we_want_to_set.tab_widget.currentWidget()
|
|
71
90
|
if isinstance(widget, EditorWidget):
|
|
72
91
|
code_text = widget.code_edit.toPlainText()
|
|
73
92
|
widget.code_result.setPlainText("")
|
|
74
|
-
widget.code_edit.setPlainText(reformat_json(code_text))
|
|
93
|
+
widget.code_edit.setPlainText(reformat_json(code_text)) # 呼叫 JSON 格式化工具 / Call JSON reformatter
|
|
75
94
|
|
|
76
95
|
|
|
77
96
|
def check_python_format(ui_we_want_to_set: EditorMain) -> None:
|
|
97
|
+
"""
|
|
98
|
+
呼叫 EditorWidget 的檔案格式檢查功能
|
|
99
|
+
Call EditorWidget's file format checker
|
|
100
|
+
"""
|
|
78
101
|
jeditor_logger.info(f"build_check_style_menu.py check_python_format ui_we_want_to_set: {ui_we_want_to_set}")
|
|
79
102
|
widget = ui_we_want_to_set.tab_widget.currentWidget()
|
|
80
103
|
if isinstance(widget, EditorWidget):
|
|
81
|
-
widget.check_file_format()
|
|
104
|
+
widget.check_file_format()
|
|
@@ -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,8 +6,9 @@ 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
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
|
|
@@ -18,82 +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
|
-
|
|
22
|
-
from je_editor.utils.
|
|
23
|
-
from je_editor.utils.
|
|
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
|
-
|
|
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
|
-
|
|
49
|
+
|
|
50
|
+
# === Editor Dock ===
|
|
41
51
|
ui_we_want_to_set.dock_menu.new_tab_dock_editor_action = QAction(
|
|
42
52
|
language_wrapper.language_word_dict.get("dock_editor_label"))
|
|
43
53
|
ui_we_want_to_set.dock_menu.new_tab_dock_editor_action.triggered.connect(
|
|
44
54
|
lambda: add_dock_widget(ui_we_want_to_set, "editor")
|
|
45
55
|
)
|
|
46
56
|
ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_tab_dock_editor_action)
|
|
47
|
-
|
|
57
|
+
|
|
58
|
+
# === FrontEngine Dock ===
|
|
48
59
|
ui_we_want_to_set.dock_menu.new_frontengine = QAction(
|
|
49
60
|
language_wrapper.language_word_dict.get("dock_frontengine_label"))
|
|
50
61
|
ui_we_want_to_set.dock_menu.new_frontengine.triggered.connect(
|
|
51
62
|
lambda: add_dock_widget(ui_we_want_to_set, "frontengine")
|
|
52
63
|
)
|
|
53
64
|
ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_frontengine)
|
|
54
|
-
|
|
65
|
+
|
|
66
|
+
# === Ipython Dock ===
|
|
55
67
|
ui_we_want_to_set.dock_menu.new_ipython = QAction(
|
|
56
68
|
language_wrapper.language_word_dict.get("dock_ipython_label"))
|
|
57
69
|
ui_we_want_to_set.dock_menu.new_ipython.triggered.connect(
|
|
58
70
|
lambda: add_dock_widget(ui_we_want_to_set, "ipython")
|
|
59
71
|
)
|
|
60
72
|
ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_ipython)
|
|
61
|
-
|
|
73
|
+
|
|
74
|
+
# === ChatUI Dock ===
|
|
62
75
|
ui_we_want_to_set.dock_menu.new_chat_ui = QAction(
|
|
63
76
|
language_wrapper.language_word_dict.get("chat_ui_dock_label"))
|
|
64
77
|
ui_we_want_to_set.dock_menu.new_chat_ui.triggered.connect(
|
|
65
78
|
lambda: add_dock_widget(ui_we_want_to_set, "chat_ui")
|
|
66
79
|
)
|
|
67
80
|
ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_chat_ui)
|
|
68
|
-
|
|
81
|
+
|
|
82
|
+
# === Git Client Dock ===
|
|
69
83
|
ui_we_want_to_set.dock_menu.new_git_client = QAction(
|
|
70
84
|
language_wrapper.language_word_dict.get("tab_menu_git_client_tab_name"))
|
|
71
85
|
ui_we_want_to_set.dock_menu.new_git_client.triggered.connect(
|
|
72
86
|
lambda: add_dock_widget(ui_we_want_to_set, "git_client")
|
|
73
87
|
)
|
|
74
88
|
ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_git_client)
|
|
75
|
-
|
|
89
|
+
|
|
90
|
+
# === Git Branch Tree View Dock ===
|
|
76
91
|
ui_we_want_to_set.dock_menu.new_git_branch_view = QAction(
|
|
77
92
|
language_wrapper.language_word_dict.get("tab_menu_git_branch_tree_view_tab_name"))
|
|
78
93
|
ui_we_want_to_set.dock_menu.new_git_branch_view.triggered.connect(
|
|
79
94
|
lambda: add_dock_widget(ui_we_want_to_set, "git_branch_tree_view")
|
|
80
95
|
)
|
|
81
96
|
ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_git_branch_view)
|
|
82
|
-
|
|
97
|
+
|
|
98
|
+
# === Variable Inspector Dock ===
|
|
83
99
|
ui_we_want_to_set.dock_menu.new_variable_inspector = QAction(
|
|
84
100
|
language_wrapper.language_word_dict.get("tab_menu_variable_inspector_tab_name"))
|
|
85
101
|
ui_we_want_to_set.dock_menu.new_variable_inspector.triggered.connect(
|
|
86
102
|
lambda: add_dock_widget(ui_we_want_to_set, "variable_inspector")
|
|
87
103
|
)
|
|
88
104
|
ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_variable_inspector)
|
|
89
|
-
|
|
105
|
+
|
|
106
|
+
# === Console Dock ===
|
|
90
107
|
ui_we_want_to_set.dock_menu.new_dynamic_console = QAction(
|
|
91
108
|
language_wrapper.language_word_dict.get("tab_menu_console_widget_tab_name"))
|
|
92
109
|
ui_we_want_to_set.dock_menu.new_dynamic_console.triggered.connect(
|
|
93
110
|
lambda: add_dock_widget(ui_we_want_to_set, "console_widget")
|
|
94
111
|
)
|
|
95
112
|
ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_dynamic_console)
|
|
96
|
-
|
|
113
|
+
|
|
114
|
+
# === Code Diff Viewer Dock ===
|
|
97
115
|
ui_we_want_to_set.dock_menu.new_code_diff_viewer = QAction(
|
|
98
116
|
language_wrapper.language_word_dict.get("tab_code_diff_viewer_tab_name"))
|
|
99
117
|
ui_we_want_to_set.dock_menu.new_code_diff_viewer.triggered.connect(
|
|
@@ -101,51 +119,91 @@ def set_dock_menu(ui_we_want_to_set: EditorMain) -> None:
|
|
|
101
119
|
)
|
|
102
120
|
ui_we_want_to_set.dock_menu.addAction(ui_we_want_to_set.dock_menu.new_code_diff_viewer)
|
|
103
121
|
|
|
122
|
+
|
|
104
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
|
+
"""
|
|
105
128
|
jeditor_logger.info("build_dock_menu.py add_dock_widget "
|
|
106
129
|
f"ui_we_want_to_set: {ui_we_want_to_set} "
|
|
107
130
|
f"widget_type: {widget_type}")
|
|
108
|
-
|
|
131
|
+
|
|
132
|
+
# 建立一個可銷毀的 Dock 容器
|
|
133
|
+
# Create a destroyable dock container
|
|
109
134
|
dock_widget = DestroyDock()
|
|
135
|
+
|
|
110
136
|
if widget_type == "editor":
|
|
137
|
+
# 開啟檔案選擇對話框,讓使用者選擇要打開的檔案
|
|
138
|
+
# Open file dialog for selecting a file
|
|
111
139
|
file_path = QFileDialog().getOpenFileName(
|
|
112
140
|
parent=ui_we_want_to_set,
|
|
113
|
-
dir=str(Path.cwd())
|
|
141
|
+
dir=str(Path.cwd()) # 預設目錄為當前工作目錄 / Default directory is current working directory
|
|
114
142
|
)[0]
|
|
115
143
|
if file_path is not None and file_path != "":
|
|
144
|
+
# 建立一個完整的編輯器 Dock,並載入檔案內容
|
|
145
|
+
# Create a full editor dock and load file content
|
|
116
146
|
widget = FullEditorWidget(current_file=file_path)
|
|
117
|
-
file_content = read_file(file_path)[1]
|
|
118
|
-
widget.code_edit.setPlainText(
|
|
119
|
-
file_content
|
|
120
|
-
)
|
|
147
|
+
file_content = read_file(file_path)[1] # 讀取檔案內容 / Read file content
|
|
148
|
+
widget.code_edit.setPlainText(file_content)
|
|
121
149
|
dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("dock_editor_title"))
|
|
122
150
|
dock_widget.setWidget(widget)
|
|
151
|
+
|
|
123
152
|
elif widget_type == "frontengine":
|
|
153
|
+
# 建立 FrontEngine Dock
|
|
154
|
+
# Create FrontEngine dock
|
|
124
155
|
dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("dock_frontengine_title"))
|
|
125
156
|
dock_widget.setWidget(FrontEngineMainUI(redirect_output=False))
|
|
157
|
+
|
|
126
158
|
elif widget_type == "ipython":
|
|
159
|
+
# 建立 Ipython 互動式控制台 Dock
|
|
160
|
+
# Create Ipython interactive console dock
|
|
127
161
|
dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("dock_ipython_title"))
|
|
128
162
|
dock_widget.setWidget(IpythonWidget(ui_we_want_to_set))
|
|
163
|
+
|
|
129
164
|
elif widget_type == "chat_ui":
|
|
165
|
+
# 建立 ChatUI Dock
|
|
166
|
+
# Create ChatUI dock
|
|
130
167
|
dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("chat_ui_dock_label"))
|
|
131
168
|
dock_widget.setWidget(ChatUI(ui_we_want_to_set))
|
|
169
|
+
|
|
132
170
|
elif widget_type == "git_client":
|
|
171
|
+
# 建立 Git 客戶端 Dock
|
|
172
|
+
# Create Git client dock
|
|
133
173
|
dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("tab_menu_git_client_tab_name"))
|
|
134
174
|
dock_widget.setWidget(GitGui())
|
|
175
|
+
|
|
135
176
|
elif widget_type == "git_branch_tree_view":
|
|
177
|
+
# 建立 Git 分支樹視圖 Dock
|
|
178
|
+
# Create Git branch tree view dock
|
|
136
179
|
dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("tab_menu_git_branch_tree_view_tab_name"))
|
|
137
180
|
dock_widget.setWidget(GitTreeViewGUI())
|
|
181
|
+
|
|
138
182
|
elif widget_type == "variable_inspector":
|
|
183
|
+
# 建立變數檢查器 Dock
|
|
184
|
+
# Create variable inspector dock
|
|
139
185
|
dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("tab_menu_variable_inspector_tab_name"))
|
|
140
186
|
dock_widget.setWidget(VariableInspector())
|
|
187
|
+
|
|
141
188
|
elif widget_type == "console_widget":
|
|
189
|
+
# 建立動態 Console Dock
|
|
190
|
+
# Create dynamic console dock
|
|
142
191
|
dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("tab_menu_console_widget_tab_name"))
|
|
143
192
|
dock_widget.setWidget(ConsoleWidget())
|
|
193
|
+
|
|
144
194
|
elif widget_type == "code_diff_viewer":
|
|
195
|
+
# 建立程式碼差異比較視圖 Dock
|
|
196
|
+
# Create code diff viewer dock
|
|
145
197
|
dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("tab_code_diff_viewer_tab_name"))
|
|
146
198
|
dock_widget.setWidget(DiffViewerWidget())
|
|
199
|
+
|
|
147
200
|
else:
|
|
201
|
+
# 預設為瀏覽器 Dock
|
|
202
|
+
# Default: Browser dock
|
|
148
203
|
dock_widget.setWindowTitle(language_wrapper.language_word_dict.get("dock_browser_title"))
|
|
149
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
|
|
150
208
|
if dock_widget.widget() is not None:
|
|
151
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
|
-
|
|
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
|
|
|
9
|
+
# 匯入內建瀏覽器元件,用於在程式內開啟網頁
|
|
10
|
+
# Import embedded browser widget for opening web pages inside the app
|
|
5
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
|
-
MainBrowserWidget(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()
|