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.
- je_editor/__init__.py +26 -21
- je_editor/__main__.py +1 -1
- je_editor/code_scan/ruff_thread.py +58 -0
- je_editor/code_scan/watchdog_implement.py +56 -0
- je_editor/code_scan/watchdog_thread.py +78 -0
- je_editor/git_client/commit_graph.py +77 -0
- je_editor/git_client/git_action.py +175 -0
- je_editor/git_client/git_cli.py +66 -0
- je_editor/pyside_ui/browser/browser_download_window.py +75 -0
- je_editor/pyside_ui/browser/browser_serach_lineedit.py +51 -0
- je_editor/pyside_ui/browser/browser_view.py +87 -0
- je_editor/pyside_ui/browser/browser_widget.py +103 -0
- je_editor/pyside_ui/browser/main_browser_widget.py +85 -0
- je_editor/pyside_ui/code/auto_save/auto_save_manager.py +60 -0
- je_editor/pyside_ui/code/auto_save/auto_save_thread.py +59 -0
- je_editor/pyside_ui/code/code_format/pep8_format.py +130 -0
- je_editor/pyside_ui/code/code_process/code_exec.py +267 -0
- je_editor/pyside_ui/code/plaintext_code_edit/code_edit_plaintext.py +412 -0
- je_editor/pyside_ui/code/running_process_manager.py +48 -0
- je_editor/pyside_ui/code/shell_process/shell_exec.py +236 -0
- je_editor/pyside_ui/code/syntax/python_syntax.py +99 -0
- je_editor/pyside_ui/code/syntax/syntax_setting.py +95 -0
- je_editor/pyside_ui/code/textedit_code_result/code_record.py +75 -0
- je_editor/pyside_ui/code/variable_inspector/inspector_gui.py +172 -0
- je_editor/pyside_ui/dialog/ai_dialog/set_ai_dialog.py +71 -0
- je_editor/pyside_ui/dialog/file_dialog/create_file_dialog.py +68 -0
- je_editor/pyside_ui/dialog/file_dialog/open_file_dialog.py +111 -0
- je_editor/pyside_ui/dialog/file_dialog/save_file_dialog.py +67 -0
- je_editor/pyside_ui/dialog/search_ui/search_error_box.py +49 -0
- je_editor/pyside_ui/dialog/search_ui/search_text_box.py +49 -0
- je_editor/pyside_ui/git_ui/code_diff_compare/code_diff_viewer_widget.py +90 -0
- je_editor/pyside_ui/git_ui/code_diff_compare/line_number_code_viewer.py +141 -0
- je_editor/pyside_ui/git_ui/code_diff_compare/multi_file_diff_viewer.py +88 -0
- je_editor/pyside_ui/git_ui/code_diff_compare/side_by_side_diff_widget.py +284 -0
- je_editor/pyside_ui/git_ui/git_client/commit_table.py +65 -0
- je_editor/pyside_ui/git_ui/git_client/git_branch_tree_widget.py +156 -0
- je_editor/pyside_ui/git_ui/git_client/git_client_gui.py +799 -0
- je_editor/pyside_ui/git_ui/git_client/graph_view.py +218 -0
- je_editor/pyside_ui/main_ui/ai_widget/ai_config.py +34 -0
- je_editor/pyside_ui/main_ui/ai_widget/ask_thread.py +36 -0
- je_editor/pyside_ui/main_ui/ai_widget/chat_ui.py +147 -0
- je_editor/pyside_ui/main_ui/ai_widget/langchain_interface.py +84 -0
- je_editor/pyside_ui/main_ui/console_widget/console_gui.py +162 -0
- je_editor/pyside_ui/main_ui/console_widget/qprocess_adapter.py +84 -0
- je_editor/pyside_ui/main_ui/dock/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/dock/destroy_dock.py +50 -0
- je_editor/pyside_ui/main_ui/editor/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/editor/editor_widget.py +301 -0
- je_editor/pyside_ui/main_ui/editor/editor_widget_dock.py +70 -0
- je_editor/pyside_ui/main_ui/editor/process_input.py +101 -0
- je_editor/pyside_ui/main_ui/ipython_widget/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/ipython_widget/rich_jupyter.py +78 -0
- je_editor/pyside_ui/main_ui/main_editor.py +369 -0
- je_editor/pyside_ui/main_ui/menu/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/menu/check_style_menu/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/menu/check_style_menu/build_check_style_menu.py +104 -0
- je_editor/pyside_ui/main_ui/menu/dock_menu/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/menu/dock_menu/build_dock_menu.py +208 -0
- je_editor/pyside_ui/main_ui/menu/file_menu/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/menu/file_menu/build_file_menu.py +186 -0
- je_editor/pyside_ui/main_ui/menu/help_menu/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/menu/help_menu/build_help_menu.py +100 -0
- je_editor/pyside_ui/main_ui/menu/language_menu/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/menu/language_menu/build_language_server.py +89 -0
- je_editor/pyside_ui/main_ui/menu/python_env_menu/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/menu/python_env_menu/build_venv_menu.py +238 -0
- je_editor/pyside_ui/main_ui/menu/run_menu/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/menu/run_menu/build_run_menu.py +160 -0
- je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/build_debug_menu.py +109 -0
- je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/build_program_menu.py +101 -0
- je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/build_shell_menu.py +98 -0
- je_editor/pyside_ui/main_ui/menu/run_menu/under_run_menu/utils.py +41 -0
- je_editor/pyside_ui/main_ui/menu/set_menu_bar.py +63 -0
- je_editor/pyside_ui/main_ui/menu/style_menu/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/menu/style_menu/build_style_menu.py +73 -0
- je_editor/pyside_ui/main_ui/menu/tab_menu/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/menu/tab_menu/build_tab_menu.py +275 -0
- je_editor/pyside_ui/main_ui/menu/text_menu/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/menu/text_menu/build_text_menu.py +135 -0
- je_editor/pyside_ui/main_ui/save_settings/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/save_settings/setting_utils.py +33 -0
- je_editor/pyside_ui/main_ui/save_settings/user_color_setting_file.py +103 -0
- je_editor/pyside_ui/main_ui/save_settings/user_setting_file.py +58 -0
- je_editor/pyside_ui/main_ui/system_tray/__init__.py +0 -0
- je_editor/pyside_ui/main_ui/system_tray/extend_system_tray.py +90 -0
- je_editor/start_editor.py +32 -8
- je_editor/utils/encodings/python_encodings.py +100 -97
- je_editor/utils/exception/exception_tags.py +11 -11
- je_editor/utils/file/open/open_file.py +38 -22
- je_editor/utils/file/save/save_file.py +40 -16
- je_editor/utils/json/json_file.py +36 -15
- je_editor/utils/json_format/json_process.py +38 -2
- je_editor/utils/logging/__init__.py +0 -0
- je_editor/utils/logging/loggin_instance.py +57 -0
- je_editor/utils/multi_language/__init__.py +0 -0
- je_editor/utils/multi_language/english.py +221 -0
- je_editor/utils/multi_language/multi_language_wrapper.py +54 -0
- je_editor/utils/multi_language/traditional_chinese.py +214 -0
- je_editor/utils/redirect_manager/redirect_manager_class.py +67 -25
- je_editor/utils/venv_check/__init__.py +0 -0
- je_editor/utils/venv_check/check_venv.py +51 -0
- je_editor-0.0.228.dist-info/METADATA +99 -0
- je_editor-0.0.228.dist-info/RECORD +140 -0
- {je_editor-0.0.104.dist-info → je_editor-0.0.228.dist-info}/WHEEL +1 -1
- {je_editor-0.0.104.dist-info → je_editor-0.0.228.dist-info/licenses}/LICENSE +1 -1
- je_editor/pyside_ui/auto_save/auto_save_thread.py +0 -34
- je_editor/pyside_ui/code_editor/code_edit_plaintext.py +0 -143
- je_editor/pyside_ui/code_process/code_exec.py +0 -190
- je_editor/pyside_ui/code_result/code_record.py +0 -39
- je_editor/pyside_ui/colors/global_color.py +0 -4
- je_editor/pyside_ui/file_dialog/open_file_dialog.py +0 -27
- je_editor/pyside_ui/file_dialog/save_file_dialog.py +0 -24
- je_editor/pyside_ui/main_ui/editor_main_ui/main_editor.py +0 -183
- je_editor/pyside_ui/main_ui_setting/ui_setting.py +0 -36
- je_editor/pyside_ui/menu/menu_bar/check_style_menu/build_check_style_menu.py +0 -44
- je_editor/pyside_ui/menu/menu_bar/file_menu/build_file_menu.py +0 -30
- je_editor/pyside_ui/menu/menu_bar/help_menu/build_help_menu.py +0 -39
- je_editor/pyside_ui/menu/menu_bar/run_menu/build_run_menu.py +0 -102
- je_editor/pyside_ui/menu/menu_bar/set_menu_bar.py +0 -24
- je_editor/pyside_ui/menu/menu_bar/venv_menu/build_venv_menu.py +0 -74
- je_editor/pyside_ui/search_ui/search_error_box.py +0 -20
- je_editor/pyside_ui/search_ui/search_text_box.py +0 -20
- je_editor/pyside_ui/shell_process/shell_exec.py +0 -157
- je_editor/pyside_ui/syntax/python_syntax.py +0 -99
- je_editor/pyside_ui/treeview/project_treeview/set_project_treeview.py +0 -47
- je_editor/pyside_ui/user_setting/user_setting_file.py +0 -23
- je_editor-0.0.104.dist-info/METADATA +0 -84
- je_editor-0.0.104.dist-info/RECORD +0 -69
- /je_editor/{pyside_ui/auto_save → code_scan}/__init__.py +0 -0
- /je_editor/{pyside_ui/code_editor → git_client}/__init__.py +0 -0
- /je_editor/pyside_ui/{code_process → browser}/__init__.py +0 -0
- /je_editor/pyside_ui/{code_result → code}/__init__.py +0 -0
- /je_editor/pyside_ui/{colors → code/auto_save}/__init__.py +0 -0
- /je_editor/pyside_ui/{file_dialog → code/code_format}/__init__.py +0 -0
- /je_editor/pyside_ui/{main_ui/editor_main_ui → code/code_process}/__init__.py +0 -0
- /je_editor/pyside_ui/{main_ui_setting → code/plaintext_code_edit}/__init__.py +0 -0
- /je_editor/pyside_ui/{menu → code/shell_process}/__init__.py +0 -0
- /je_editor/pyside_ui/{menu/menu_bar → code/syntax}/__init__.py +0 -0
- /je_editor/pyside_ui/{menu/menu_bar/check_style_menu → code/textedit_code_result}/__init__.py +0 -0
- /je_editor/pyside_ui/{menu/menu_bar/file_menu → code/variable_inspector}/__init__.py +0 -0
- /je_editor/pyside_ui/{menu/menu_bar/help_menu → dialog}/__init__.py +0 -0
- /je_editor/pyside_ui/{menu/menu_bar/run_menu → dialog/ai_dialog}/__init__.py +0 -0
- /je_editor/pyside_ui/{menu/menu_bar/venv_menu → dialog/file_dialog}/__init__.py +0 -0
- /je_editor/pyside_ui/{search_ui → dialog/search_ui}/__init__.py +0 -0
- /je_editor/pyside_ui/{shell_process → git_ui}/__init__.py +0 -0
- /je_editor/pyside_ui/{syntax → git_ui/code_diff_compare}/__init__.py +0 -0
- /je_editor/pyside_ui/{treeview → git_ui/git_client}/__init__.py +0 -0
- /je_editor/pyside_ui/{treeview/project_treeview → main_ui/ai_widget}/__init__.py +0 -0
- /je_editor/pyside_ui/{user_setting → main_ui/console_widget}/__init__.py +0 -0
- {je_editor-0.0.104.dist-info → je_editor-0.0.228.dist-info}/top_level.txt +0 -0
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import os.path
|
|
2
|
-
import queue
|
|
3
|
-
import shutil
|
|
4
|
-
import subprocess
|
|
5
|
-
import sys
|
|
6
|
-
from pathlib import Path
|
|
7
|
-
from threading import Thread
|
|
8
|
-
|
|
9
|
-
from PySide6.QtCore import QTimer
|
|
10
|
-
from PySide6.QtWidgets import QMainWindow, QTextEdit
|
|
11
|
-
|
|
12
|
-
from je_editor.pyside_ui.colors.global_color import error_color, output_color
|
|
13
|
-
from je_editor.utils.exception.exception_tags import compiler_not_found_error, je_editor_init_error
|
|
14
|
-
from je_editor.utils.exception.exception_tags import file_not_fond_error
|
|
15
|
-
from je_editor.utils.exception.exceptions import JEditorExecException, JEditorException
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
class ExecManager(object):
|
|
19
|
-
|
|
20
|
-
def __init__(
|
|
21
|
-
self,
|
|
22
|
-
main_window=None,
|
|
23
|
-
program_language="python",
|
|
24
|
-
program_encoding="utf-8",
|
|
25
|
-
program_buffer=10240000,
|
|
26
|
-
):
|
|
27
|
-
"""
|
|
28
|
-
:param main_window: tkinter main window
|
|
29
|
-
:param program_language: which program language
|
|
30
|
-
:param program_encoding: which encoding
|
|
31
|
-
"""
|
|
32
|
-
self.read_program_error_output_from_thread = None
|
|
33
|
-
self.read_program_output_from_thread = None
|
|
34
|
-
self.main_window: QMainWindow = main_window
|
|
35
|
-
self.code_result: [QTextEdit, None] = None
|
|
36
|
-
self.timer: [QTimer, None] = None
|
|
37
|
-
self.still_run_program = True
|
|
38
|
-
self.process = None
|
|
39
|
-
self.run_output_queue = queue.Queue()
|
|
40
|
-
self.run_error_queue = queue.Queue()
|
|
41
|
-
self.program_language = program_language
|
|
42
|
-
self.program_encoding = program_encoding
|
|
43
|
-
self.program_buffer = program_buffer
|
|
44
|
-
|
|
45
|
-
def later_init(self):
|
|
46
|
-
if self.main_window is not None:
|
|
47
|
-
self.code_result: QTextEdit = self.main_window.code_result
|
|
48
|
-
self.timer = QTimer(self.main_window)
|
|
49
|
-
else:
|
|
50
|
-
raise JEditorException(je_editor_init_error)
|
|
51
|
-
|
|
52
|
-
def exec_code(self, exec_file_name):
|
|
53
|
-
"""
|
|
54
|
-
:param exec_file_name: string file will open to run
|
|
55
|
-
:return: if error return result and True else return result and False
|
|
56
|
-
"""
|
|
57
|
-
try:
|
|
58
|
-
self.exit_program()
|
|
59
|
-
self.code_result.setPlainText("")
|
|
60
|
-
reformat_os_file_path = os.path.abspath(exec_file_name)
|
|
61
|
-
# detect file is exist
|
|
62
|
-
try:
|
|
63
|
-
if not Path(exec_file_name).exists():
|
|
64
|
-
raise JEditorExecException(file_not_fond_error)
|
|
65
|
-
except OSError as error:
|
|
66
|
-
raise JEditorExecException(error)
|
|
67
|
-
if sys.platform in ["win32", "cygwin", "msys"]:
|
|
68
|
-
venv_path = Path(os.getcwd() + "/venv/Scripts")
|
|
69
|
-
else:
|
|
70
|
-
venv_path = Path(os.getcwd() + "/venv/bin")
|
|
71
|
-
if venv_path.is_dir() and venv_path.exists():
|
|
72
|
-
compiler_path = shutil.which(
|
|
73
|
-
cmd="python3",
|
|
74
|
-
path=str(venv_path)
|
|
75
|
-
)
|
|
76
|
-
else:
|
|
77
|
-
compiler_path = shutil.which(cmd="python3")
|
|
78
|
-
if compiler_path is None:
|
|
79
|
-
compiler_path = shutil.which(
|
|
80
|
-
cmd="python",
|
|
81
|
-
path=str(venv_path)
|
|
82
|
-
)
|
|
83
|
-
else:
|
|
84
|
-
compiler_path = shutil.which(cmd="python")
|
|
85
|
-
if compiler_path is None:
|
|
86
|
-
raise JEditorExecException(compiler_not_found_error)
|
|
87
|
-
exec_file = reformat_os_file_path
|
|
88
|
-
# run program
|
|
89
|
-
execute_program_list = [compiler_path, exec_file]
|
|
90
|
-
self.process = subprocess.Popen(
|
|
91
|
-
execute_program_list,
|
|
92
|
-
stdout=subprocess.PIPE,
|
|
93
|
-
stderr=subprocess.PIPE,
|
|
94
|
-
shell=True
|
|
95
|
-
)
|
|
96
|
-
self.still_run_program = True
|
|
97
|
-
# program output message queue thread
|
|
98
|
-
self.read_program_output_from_thread = Thread(
|
|
99
|
-
target=self.read_program_output_from_process,
|
|
100
|
-
daemon=True
|
|
101
|
-
)
|
|
102
|
-
self.read_program_output_from_thread.start()
|
|
103
|
-
# program error message queue thread
|
|
104
|
-
self.read_program_error_output_from_thread = Thread(
|
|
105
|
-
target=self.read_program_error_output_from_process,
|
|
106
|
-
daemon=True
|
|
107
|
-
)
|
|
108
|
-
self.read_program_error_output_from_thread.start()
|
|
109
|
-
# show which file execute
|
|
110
|
-
self.code_result.append(compiler_path + " " + reformat_os_file_path)
|
|
111
|
-
# start tkinter_ui update
|
|
112
|
-
# start timer
|
|
113
|
-
self.timer = QTimer(self.main_window)
|
|
114
|
-
self.timer.setInterval(1)
|
|
115
|
-
self.timer.timeout.connect(self.pull_text)
|
|
116
|
-
self.timer.start()
|
|
117
|
-
except Exception as error:
|
|
118
|
-
self.code_result.setTextColor(error_color)
|
|
119
|
-
self.code_result.append(str(error))
|
|
120
|
-
self.code_result.setTextColor(output_color)
|
|
121
|
-
|
|
122
|
-
# tkinter_ui update method
|
|
123
|
-
def pull_text(self):
|
|
124
|
-
try:
|
|
125
|
-
self.code_result.setTextColor(error_color)
|
|
126
|
-
if not self.run_error_queue.empty():
|
|
127
|
-
error_message = self.run_error_queue.get_nowait()
|
|
128
|
-
error_message = str(error_message).strip()
|
|
129
|
-
if error_message:
|
|
130
|
-
self.code_result.append(error_message)
|
|
131
|
-
self.code_result.setTextColor(output_color)
|
|
132
|
-
if not self.run_output_queue.empty():
|
|
133
|
-
output_message = self.run_output_queue.get_nowait()
|
|
134
|
-
output_message = str(output_message).strip()
|
|
135
|
-
if output_message:
|
|
136
|
-
self.code_result.append(output_message)
|
|
137
|
-
except queue.Empty:
|
|
138
|
-
pass
|
|
139
|
-
if self.process.returncode == 0:
|
|
140
|
-
self.timer.stop()
|
|
141
|
-
self.exit_program()
|
|
142
|
-
elif self.process.returncode is not None:
|
|
143
|
-
self.timer.stop()
|
|
144
|
-
self.exit_program()
|
|
145
|
-
if self.still_run_program:
|
|
146
|
-
# poll return code
|
|
147
|
-
self.process.poll()
|
|
148
|
-
|
|
149
|
-
# exit program change run flag to false and clean read thread and queue and process
|
|
150
|
-
def exit_program(self):
|
|
151
|
-
self.still_run_program = False
|
|
152
|
-
if self.read_program_output_from_thread is not None:
|
|
153
|
-
self.read_program_output_from_thread = None
|
|
154
|
-
if self.read_program_error_output_from_thread is not None:
|
|
155
|
-
self.read_program_error_output_from_thread = None
|
|
156
|
-
self.print_and_clear_queue()
|
|
157
|
-
if self.process is not None:
|
|
158
|
-
self.process.terminate()
|
|
159
|
-
print(f"Program exit with code {self.process.returncode}")
|
|
160
|
-
self.process = None
|
|
161
|
-
|
|
162
|
-
def print_and_clear_queue(self):
|
|
163
|
-
try:
|
|
164
|
-
for std_output in iter(self.run_output_queue.get_nowait, None):
|
|
165
|
-
std_output = str(std_output).strip()
|
|
166
|
-
if std_output:
|
|
167
|
-
self.code_result.append(std_output)
|
|
168
|
-
self.code_result.setTextColor(error_color)
|
|
169
|
-
for std_err in iter(self.run_error_queue.get_nowait, None):
|
|
170
|
-
std_err = str(std_err).strip()
|
|
171
|
-
if std_err:
|
|
172
|
-
self.code_result.append(std_err)
|
|
173
|
-
self.code_result.setTextColor(output_color)
|
|
174
|
-
except queue.Empty:
|
|
175
|
-
pass
|
|
176
|
-
self.run_output_queue = queue.Queue()
|
|
177
|
-
self.run_error_queue = queue.Queue()
|
|
178
|
-
|
|
179
|
-
def read_program_output_from_process(self):
|
|
180
|
-
while self.still_run_program:
|
|
181
|
-
program_output_data = self.process.stdout.raw.read(self.program_buffer).decode(self.program_encoding)
|
|
182
|
-
self.run_output_queue.put_nowait(program_output_data)
|
|
183
|
-
|
|
184
|
-
def read_program_error_output_from_process(self):
|
|
185
|
-
while self.still_run_program:
|
|
186
|
-
program_error_output_data = self.process.stderr.raw.read(self.program_buffer).decode(self.program_encoding)
|
|
187
|
-
self.run_error_queue.put_nowait(program_error_output_data)
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
exec_manage = ExecManager()
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
from PySide6.QtGui import QTextDocument, QAction
|
|
2
|
-
from PySide6.QtWidgets import QTextEdit
|
|
3
|
-
|
|
4
|
-
from je_editor.pyside_ui.search_ui.search_error_box import SearchResultBox
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class CodeRecord(QTextEdit):
|
|
8
|
-
|
|
9
|
-
def __init__(self):
|
|
10
|
-
super().__init__()
|
|
11
|
-
self.setLineWrapMode(self.LineWrapMode.NoWrap)
|
|
12
|
-
self.setReadOnly(True)
|
|
13
|
-
# Search Result
|
|
14
|
-
self.search_result_action = QAction("Search Error")
|
|
15
|
-
self.search_result_action.setShortcut("Ctrl+e")
|
|
16
|
-
self.search_result_action.triggered.connect(
|
|
17
|
-
self.start_search_result_dialog
|
|
18
|
-
)
|
|
19
|
-
self.addAction(self.search_result_action)
|
|
20
|
-
|
|
21
|
-
def start_search_result_dialog(self):
|
|
22
|
-
self.search_result_box = SearchResultBox()
|
|
23
|
-
self.search_result_box.search_back_button.clicked.connect(
|
|
24
|
-
self.find_back_text
|
|
25
|
-
)
|
|
26
|
-
self.search_result_box.search_next_button.clicked.connect(
|
|
27
|
-
self.find_next_text
|
|
28
|
-
)
|
|
29
|
-
self.search_result_box.show()
|
|
30
|
-
|
|
31
|
-
def find_next_text(self):
|
|
32
|
-
if self.search_result_box.isVisible():
|
|
33
|
-
text = self.search_result_box.search_input.text()
|
|
34
|
-
self.find(text)
|
|
35
|
-
|
|
36
|
-
def find_back_text(self):
|
|
37
|
-
if self.search_result_box.isVisible():
|
|
38
|
-
text = self.search_result_box.search_input.text()
|
|
39
|
-
self.find(text, QTextDocument.FindFlag.FindBackward)
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
|
|
3
|
-
from PySide6.QtWidgets import QFileDialog
|
|
4
|
-
|
|
5
|
-
from je_editor.pyside_ui.auto_save.auto_save_thread import SaveThread
|
|
6
|
-
from je_editor.utils.file.open.open_file import read_file
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def choose_file_get_open_filename(parent_qt_instance):
|
|
10
|
-
filename = QFileDialog().getOpenFileName(
|
|
11
|
-
parent=parent_qt_instance,
|
|
12
|
-
dir=os.getcwd()
|
|
13
|
-
)[0]
|
|
14
|
-
if filename is not None and filename != "":
|
|
15
|
-
parent_qt_instance.current_file = filename
|
|
16
|
-
file_content = read_file(filename)[1]
|
|
17
|
-
parent_qt_instance.code_edit.setPlainText(
|
|
18
|
-
file_content
|
|
19
|
-
)
|
|
20
|
-
if parent_qt_instance.auto_save_thread is None:
|
|
21
|
-
parent_qt_instance.auto_save_thread = SaveThread(
|
|
22
|
-
parent_qt_instance.current_file,
|
|
23
|
-
parent_qt_instance.code_edit.toPlainText()
|
|
24
|
-
)
|
|
25
|
-
parent_qt_instance.auto_save_thread.start()
|
|
26
|
-
if parent_qt_instance.auto_save_thread is not None:
|
|
27
|
-
parent_qt_instance.auto_save_thread.file = parent_qt_instance.current_file
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
|
|
3
|
-
from PySide6.QtWidgets import QFileDialog
|
|
4
|
-
|
|
5
|
-
from je_editor.utils.file.save.save_file import write_file
|
|
6
|
-
from je_editor.pyside_ui.auto_save.auto_save_thread import SaveThread
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def choose_file_get_save_filename(parent_qt_instance):
|
|
10
|
-
filename = QFileDialog().getSaveFileName(
|
|
11
|
-
parent=parent_qt_instance,
|
|
12
|
-
dir=os.getcwd()
|
|
13
|
-
)[0]
|
|
14
|
-
if filename is not None and filename != "":
|
|
15
|
-
parent_qt_instance.current_file = filename
|
|
16
|
-
write_file(filename, parent_qt_instance.code_edit.toPlainText())
|
|
17
|
-
if parent_qt_instance.auto_save_thread is None:
|
|
18
|
-
parent_qt_instance.auto_save_thread = SaveThread(
|
|
19
|
-
parent_qt_instance.current_file,
|
|
20
|
-
parent_qt_instance.code_edit.toPlainText()
|
|
21
|
-
)
|
|
22
|
-
parent_qt_instance.auto_save_thread.start()
|
|
23
|
-
elif parent_qt_instance.auto_save_thread is not None:
|
|
24
|
-
parent_qt_instance.auto_save_thread.file = parent_qt_instance.current_file
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import sys
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
|
|
5
|
-
from PySide6.QtCore import QTimer
|
|
6
|
-
from PySide6.QtGui import QFontDatabase, QAction, QIcon
|
|
7
|
-
from PySide6.QtWidgets import QMainWindow, QSystemTrayIcon
|
|
8
|
-
from qt_material import QtStyleTools
|
|
9
|
-
|
|
10
|
-
from je_editor.pyside_ui.auto_save.auto_save_thread import SaveThread
|
|
11
|
-
from je_editor.pyside_ui.code_process.code_exec import exec_manage
|
|
12
|
-
from je_editor.pyside_ui.colors.global_color import error_color, output_color
|
|
13
|
-
from je_editor.pyside_ui.main_ui_setting.ui_setting import set_ui
|
|
14
|
-
from je_editor.pyside_ui.menu.menu_bar.set_menu_bar import set_menu_bar
|
|
15
|
-
from je_editor.pyside_ui.shell_process.shell_exec import shell_manager
|
|
16
|
-
from je_editor.pyside_ui.treeview.project_treeview.set_project_treeview import set_project_treeview
|
|
17
|
-
from je_editor.pyside_ui.user_setting.user_setting_file import write_user_setting, user_setting_dict, read_user_setting
|
|
18
|
-
from je_editor.utils.encodings.python_encodings import python_encodings_list
|
|
19
|
-
from je_editor.utils.file.open.open_file import read_file
|
|
20
|
-
from je_editor.utils.redirect_manager.redirect_manager_class import redirect_manager_instance
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class EditorMain(QMainWindow, QtStyleTools):
|
|
24
|
-
|
|
25
|
-
def __init__(self):
|
|
26
|
-
super(EditorMain, self).__init__()
|
|
27
|
-
# Windows setup
|
|
28
|
-
self.id = "JEditor"
|
|
29
|
-
# Venv
|
|
30
|
-
self.venv_path = None
|
|
31
|
-
if sys.platform in ["win32", "cygwin", "msys"]:
|
|
32
|
-
from ctypes import windll
|
|
33
|
-
windll.shell32.SetCurrentProcessExplicitAppUserModelID(self.id)
|
|
34
|
-
# set python buffered
|
|
35
|
-
os.environ["PYTHONUNBUFFERED"] = "1"
|
|
36
|
-
# Auto save thread
|
|
37
|
-
self.auto_save_thread = None
|
|
38
|
-
# current file
|
|
39
|
-
self.current_file = None
|
|
40
|
-
# Font
|
|
41
|
-
self.font_database = QFontDatabase()
|
|
42
|
-
# Color
|
|
43
|
-
# Timer to redirect error or message
|
|
44
|
-
self.redirect_timer = QTimer(self)
|
|
45
|
-
self.redirect_timer.setInterval(1)
|
|
46
|
-
self.redirect_timer.timeout.connect(self.redirect)
|
|
47
|
-
self.redirect_timer.start()
|
|
48
|
-
set_ui(self)
|
|
49
|
-
set_project_treeview(self)
|
|
50
|
-
set_menu_bar(self)
|
|
51
|
-
# Set font and font size menu
|
|
52
|
-
self.add_font_menu()
|
|
53
|
-
self.add_font_size_menu()
|
|
54
|
-
# Set encoding menu
|
|
55
|
-
self.add_encoding_menu()
|
|
56
|
-
if self.current_file is not None and self.auto_save_thread is None:
|
|
57
|
-
self.auto_save_thread = SaveThread(
|
|
58
|
-
self.current_file,
|
|
59
|
-
self.code_edit.code_edit.toPlainText()
|
|
60
|
-
)
|
|
61
|
-
self.auto_save_thread.start()
|
|
62
|
-
# Set Icon
|
|
63
|
-
self.icon_path = Path(os.getcwd() + "/je_driver_icon.ico")
|
|
64
|
-
self.icon = QIcon(str(self.icon_path))
|
|
65
|
-
if self.icon.isNull() is False:
|
|
66
|
-
self.setWindowIcon(self.icon)
|
|
67
|
-
self.system_icon = QSystemTrayIcon()
|
|
68
|
-
self.system_icon.setIcon(self.icon)
|
|
69
|
-
# Init shell manager
|
|
70
|
-
shell_manager.main_window = self
|
|
71
|
-
shell_manager.later_init()
|
|
72
|
-
# Put Redirect on last to trace exception
|
|
73
|
-
redirect_manager_instance.set_redirect(self, True)
|
|
74
|
-
# Add style menu
|
|
75
|
-
self.add_style_menu()
|
|
76
|
-
|
|
77
|
-
def add_style_menu(self):
|
|
78
|
-
self.menu.style_menu = self.menu.addMenu("UI Style")
|
|
79
|
-
for style in [
|
|
80
|
-
'dark_amber.xml', 'dark_blue.xml', 'dark_cyan.xml', 'dark_lightgreen.xml', 'dark_pink.xml',
|
|
81
|
-
'dark_purple.xml', 'dark_red.xml', 'dark_teal.xml', 'dark_yellow.xml', 'light_amber.xml',
|
|
82
|
-
'light_blue.xml', 'light_cyan.xml', 'light_cyan_500.xml', 'light_lightgreen.xml',
|
|
83
|
-
'light_pink.xml', 'light_purple.xml', 'light_red.xml', 'light_teal.xml', 'light_yellow.xml'
|
|
84
|
-
]:
|
|
85
|
-
change_style_action = QAction(style, parent=self)
|
|
86
|
-
change_style_action.triggered.connect(self.set_style)
|
|
87
|
-
self.menu.style_menu.addAction(change_style_action)
|
|
88
|
-
|
|
89
|
-
def set_style(self):
|
|
90
|
-
self.apply_stylesheet(self, self.sender().text())
|
|
91
|
-
|
|
92
|
-
def startup_setting(self):
|
|
93
|
-
read_user_setting()
|
|
94
|
-
# self.code_edit.setFont(
|
|
95
|
-
# self.font_database.font(
|
|
96
|
-
# user_setting_dict.get("font", "Lato"),
|
|
97
|
-
# "",
|
|
98
|
-
# user_setting_dict.get("font_size", 12)
|
|
99
|
-
# )
|
|
100
|
-
# )
|
|
101
|
-
self.code_edit.setStyleSheet(
|
|
102
|
-
f"font-size: {user_setting_dict.get('font_size', 12)}pt;"
|
|
103
|
-
f"font-family: {user_setting_dict.get('font', 'Lato')};"
|
|
104
|
-
)
|
|
105
|
-
self.code_result.setStyleSheet(
|
|
106
|
-
f"font-size: {user_setting_dict.get('font_size', 12)}pt;"
|
|
107
|
-
f"font-family: {user_setting_dict.get('font', 'Lato')};"
|
|
108
|
-
)
|
|
109
|
-
last_file = user_setting_dict.get("last_file", None)
|
|
110
|
-
if last_file is not None:
|
|
111
|
-
last_file_path = Path(last_file)
|
|
112
|
-
if last_file_path.is_file() and last_file_path.exists():
|
|
113
|
-
self.current_file = str(last_file_path)
|
|
114
|
-
self.code_edit.setPlainText(read_file(self.current_file)[1])
|
|
115
|
-
|
|
116
|
-
def add_font_menu(self):
|
|
117
|
-
self.font_menu = self.text_menu.addMenu("Font")
|
|
118
|
-
for family in self.font_database.families():
|
|
119
|
-
font_action = QAction(family, parent=self)
|
|
120
|
-
font_action.triggered.connect(self.set_font)
|
|
121
|
-
self.font_menu.addAction(font_action)
|
|
122
|
-
|
|
123
|
-
def add_font_size_menu(self):
|
|
124
|
-
self.font_size_menu = self.text_menu.addMenu("Font Size")
|
|
125
|
-
for size in range(12, 38, 2):
|
|
126
|
-
font_action = QAction(str(size), parent=self)
|
|
127
|
-
font_action.triggered.connect(self.set_font_size)
|
|
128
|
-
self.font_size_menu.addAction(font_action)
|
|
129
|
-
|
|
130
|
-
def set_font(self):
|
|
131
|
-
self.code_edit.setStyleSheet(
|
|
132
|
-
f"font-size: {self.code_edit.font().pointSize()}pt;"
|
|
133
|
-
f"font-family: {self.sender().text()};"
|
|
134
|
-
)
|
|
135
|
-
self.code_result.setStyleSheet(
|
|
136
|
-
f"font-size: {self.code_result.font().pointSize()}pt;"
|
|
137
|
-
f"font-family: {self.sender().text()};"
|
|
138
|
-
)
|
|
139
|
-
user_setting_dict.update({"font": self.sender().text()})
|
|
140
|
-
|
|
141
|
-
def set_font_size(self):
|
|
142
|
-
self.code_edit.setStyleSheet(
|
|
143
|
-
f"font-size: {int(self.sender().text())}pt;"
|
|
144
|
-
f"font-family: {self.code_edit.font().family()};"
|
|
145
|
-
)
|
|
146
|
-
self.code_result.setStyleSheet(
|
|
147
|
-
f"font-size: {int(self.sender().text())}pt;"
|
|
148
|
-
f"font-family: {self.code_result.font().family()};"
|
|
149
|
-
)
|
|
150
|
-
user_setting_dict.update({"font_size": int(self.sender().text())})
|
|
151
|
-
|
|
152
|
-
def add_encoding_menu(self):
|
|
153
|
-
self.encoding_menu = self.file_menu.addMenu("Encodings")
|
|
154
|
-
for encoding in python_encodings_list:
|
|
155
|
-
encoding_action = QAction(encoding, parent=self)
|
|
156
|
-
encoding_action.triggered.connect(self.set_encoding)
|
|
157
|
-
self.encoding_menu.addAction(encoding_action)
|
|
158
|
-
|
|
159
|
-
def set_encoding(self):
|
|
160
|
-
shell_manager.program_encoding = self.sender().text()
|
|
161
|
-
exec_manage.program_encoding = self.sender().text()
|
|
162
|
-
user_setting_dict.update({"encoding": self.sender().text()})
|
|
163
|
-
|
|
164
|
-
def redirect(self):
|
|
165
|
-
if self.auto_save_thread is not None:
|
|
166
|
-
self.auto_save_thread.text_to_write = self.code_edit.toPlainText()
|
|
167
|
-
if not redirect_manager_instance.std_out_queue.empty():
|
|
168
|
-
output_message = redirect_manager_instance.std_out_queue.get_nowait()
|
|
169
|
-
output_message = str(output_message).strip()
|
|
170
|
-
if output_message:
|
|
171
|
-
self.code_result.append(output_message)
|
|
172
|
-
self.code_result.setTextColor(error_color)
|
|
173
|
-
if not redirect_manager_instance.std_err_queue.empty():
|
|
174
|
-
error_message = redirect_manager_instance.std_err_queue.get_nowait()
|
|
175
|
-
error_message = str(error_message).strip()
|
|
176
|
-
if error_message:
|
|
177
|
-
self.code_result.append(error_message)
|
|
178
|
-
self.code_result.setTextColor(output_color)
|
|
179
|
-
|
|
180
|
-
def closeEvent(self, event) -> None:
|
|
181
|
-
super().closeEvent(event)
|
|
182
|
-
user_setting_dict.update({"last_file": str(self.current_file)})
|
|
183
|
-
write_user_setting()
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
from PySide6.QtCore import Qt
|
|
2
|
-
from PySide6.QtWidgets import QMainWindow, QScrollArea, QGridLayout, QWidget, QSplitter
|
|
3
|
-
|
|
4
|
-
from je_editor.pyside_ui.code_editor.code_edit_plaintext import CodeEditor
|
|
5
|
-
from je_editor.pyside_ui.code_result.code_record import CodeRecord
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def set_ui(ui_we_want_to_set: QMainWindow):
|
|
9
|
-
# set qt window
|
|
10
|
-
ui_we_want_to_set.main_widget = QWidget()
|
|
11
|
-
ui_we_want_to_set.grid_layout = QGridLayout(ui_we_want_to_set.main_widget)
|
|
12
|
-
ui_we_want_to_set.grid_layout.setContentsMargins(0, 0, 0, 0)
|
|
13
|
-
ui_we_want_to_set.setCentralWidget(ui_we_want_to_set.main_widget)
|
|
14
|
-
ui_we_want_to_set.setWindowTitle("JEditor")
|
|
15
|
-
# Splitter
|
|
16
|
-
ui_we_want_to_set.edit_splitter = QSplitter()
|
|
17
|
-
ui_we_want_to_set.edit_splitter.setOrientation(Qt.Orientation.Vertical)
|
|
18
|
-
ui_we_want_to_set.edit_splitter.setChildrenCollapsible(False)
|
|
19
|
-
# code edit and code result plaintext
|
|
20
|
-
ui_we_want_to_set.code_edit = CodeEditor()
|
|
21
|
-
ui_we_want_to_set.code_result = CodeRecord()
|
|
22
|
-
ui_we_want_to_set.code_edit_scroll_area = QScrollArea()
|
|
23
|
-
ui_we_want_to_set.code_edit_scroll_area.setWidgetResizable(True)
|
|
24
|
-
ui_we_want_to_set.code_edit_scroll_area.setViewportMargins(0, 0, 0, 0)
|
|
25
|
-
ui_we_want_to_set.code_edit_scroll_area.setWidget(ui_we_want_to_set.code_edit)
|
|
26
|
-
ui_we_want_to_set.code_result_scroll_area = QScrollArea()
|
|
27
|
-
ui_we_want_to_set.code_result_scroll_area.setWidgetResizable(True)
|
|
28
|
-
ui_we_want_to_set.code_result_scroll_area.setViewportMargins(0, 0, 0, 0)
|
|
29
|
-
ui_we_want_to_set.code_result_scroll_area.setWidget(ui_we_want_to_set.code_result)
|
|
30
|
-
ui_we_want_to_set.grid_layout.setRowStretch(0, 10)
|
|
31
|
-
ui_we_want_to_set.grid_layout.setColumnStretch(1, 10)
|
|
32
|
-
ui_we_want_to_set.edit_splitter.addWidget(ui_we_want_to_set.code_edit_scroll_area)
|
|
33
|
-
ui_we_want_to_set.edit_splitter.addWidget(ui_we_want_to_set.code_result_scroll_area)
|
|
34
|
-
ui_we_want_to_set.edit_splitter.setStretchFactor(0, 7)
|
|
35
|
-
ui_we_want_to_set.grid_layout.addWidget(ui_we_want_to_set.edit_splitter, 0, 1)
|
|
36
|
-
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
from PySide6.QtGui import QAction
|
|
2
|
-
from PySide6.QtWidgets import QMainWindow
|
|
3
|
-
from yapf.yapflib.yapf_api import FormatCode
|
|
4
|
-
|
|
5
|
-
from je_editor.utils.json_format.json_process import reformat_json
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def set_check_menu(ui_we_want_to_set: QMainWindow):
|
|
9
|
-
# Yapf code check
|
|
10
|
-
ui_we_want_to_set.check_menu.check_python_action = QAction("yapf")
|
|
11
|
-
ui_we_want_to_set.check_menu.check_python_action.setShortcut("Ctrl+y")
|
|
12
|
-
ui_we_want_to_set.check_menu.check_python_action.triggered.connect(
|
|
13
|
-
lambda: check_python_code(
|
|
14
|
-
ui_we_want_to_set
|
|
15
|
-
)
|
|
16
|
-
)
|
|
17
|
-
ui_we_want_to_set.check_menu.addAction(ui_we_want_to_set.check_menu.check_python_action)
|
|
18
|
-
# Reformat JSON
|
|
19
|
-
ui_we_want_to_set.check_menu.reformat_json_action = QAction("Reformat JSON")
|
|
20
|
-
ui_we_want_to_set.check_menu.reformat_json_action.setShortcut("Ctrl+j")
|
|
21
|
-
ui_we_want_to_set.check_menu.reformat_json_action.triggered.connect(
|
|
22
|
-
lambda: reformat_json_text(
|
|
23
|
-
ui_we_want_to_set
|
|
24
|
-
)
|
|
25
|
-
)
|
|
26
|
-
ui_we_want_to_set.check_menu.addAction(ui_we_want_to_set.check_menu.reformat_json_action)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def check_python_code(ui_we_want_to_set):
|
|
30
|
-
code_text = ui_we_want_to_set.code_edit.toPlainText()
|
|
31
|
-
ui_we_want_to_set.code_result.setPlainText("")
|
|
32
|
-
format_code = FormatCode(
|
|
33
|
-
unformatted_source=code_text,
|
|
34
|
-
verify=True,
|
|
35
|
-
style_config="google"
|
|
36
|
-
)
|
|
37
|
-
if isinstance(format_code, tuple):
|
|
38
|
-
ui_we_want_to_set.code_edit.setPlainText(format_code[0])
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
def reformat_json_text(ui_we_want_to_set):
|
|
42
|
-
code_text = ui_we_want_to_set.code_edit.toPlainText()
|
|
43
|
-
ui_we_want_to_set.code_result.setPlainText("")
|
|
44
|
-
ui_we_want_to_set.code_edit.setPlainText(reformat_json(code_text))
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import shutil
|
|
3
|
-
import sys
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
|
|
6
|
-
from PySide6.QtGui import QAction
|
|
7
|
-
from PySide6.QtWidgets import QMainWindow, QMessageBox, QInputDialog
|
|
8
|
-
|
|
9
|
-
from je_editor.pyside_ui.file_dialog.open_file_dialog import choose_file_get_open_filename
|
|
10
|
-
from je_editor.pyside_ui.file_dialog.save_file_dialog import choose_file_get_save_filename
|
|
11
|
-
from je_editor.pyside_ui.shell_process.shell_exec import shell_manager
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def set_file_menu(ui_we_want_to_set: QMainWindow):
|
|
15
|
-
ui_we_want_to_set.file_menu.open_file_action = QAction("Open File")
|
|
16
|
-
ui_we_want_to_set.file_menu.open_file_action.setShortcut(
|
|
17
|
-
"Ctrl+o"
|
|
18
|
-
)
|
|
19
|
-
ui_we_want_to_set.file_menu.open_file_action.triggered.connect(
|
|
20
|
-
lambda: choose_file_get_open_filename(parent_qt_instance=ui_we_want_to_set)
|
|
21
|
-
)
|
|
22
|
-
ui_we_want_to_set.file_menu.addAction(ui_we_want_to_set.file_menu.open_file_action)
|
|
23
|
-
ui_we_want_to_set.file_menu.save_file_action = QAction("Save File")
|
|
24
|
-
ui_we_want_to_set.file_menu.save_file_action.setShortcut(
|
|
25
|
-
"Ctrl+s"
|
|
26
|
-
)
|
|
27
|
-
ui_we_want_to_set.file_menu.save_file_action.triggered.connect(
|
|
28
|
-
lambda: choose_file_get_save_filename(parent_qt_instance=ui_we_want_to_set)
|
|
29
|
-
)
|
|
30
|
-
ui_we_want_to_set.file_menu.addAction(ui_we_want_to_set.file_menu.save_file_action)
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import webbrowser
|
|
2
|
-
|
|
3
|
-
from PySide6.QtGui import QAction
|
|
4
|
-
from PySide6.QtWidgets import QMainWindow, QMessageBox
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
def set_help_menu(ui_we_want_to_set: QMainWindow):
|
|
8
|
-
ui_we_want_to_set.help_menu .help_github_action = QAction("GitHub")
|
|
9
|
-
ui_we_want_to_set.help_menu .help_github_action.triggered.connect(
|
|
10
|
-
lambda: open_web_browser("https://github.com/Integrated-Testing-Environment/je_editor")
|
|
11
|
-
)
|
|
12
|
-
ui_we_want_to_set.help_menu.addAction(ui_we_want_to_set.help_menu .help_github_action)
|
|
13
|
-
|
|
14
|
-
ui_we_want_to_set.help_menu .help_doc_action = QAction("Doc")
|
|
15
|
-
ui_we_want_to_set.help_menu .help_doc_action.triggered.connect(
|
|
16
|
-
lambda: open_web_browser("https://je-editor.readthedocs.io/en/latest/")
|
|
17
|
-
)
|
|
18
|
-
ui_we_want_to_set.help_menu.addAction(ui_we_want_to_set.help_menu .help_doc_action)
|
|
19
|
-
|
|
20
|
-
ui_we_want_to_set.help_menu .help_about_action = QAction("About")
|
|
21
|
-
ui_we_want_to_set.help_menu .help_about_action.triggered.connect(
|
|
22
|
-
show_about
|
|
23
|
-
)
|
|
24
|
-
ui_we_want_to_set.help_menu.addAction(ui_we_want_to_set.help_menu.help_about_action)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def open_web_browser(url: str):
|
|
28
|
-
webbrowser.open(url=url)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def show_about():
|
|
32
|
-
message_box = QMessageBox()
|
|
33
|
-
message_box.setText(
|
|
34
|
-
"""
|
|
35
|
-
JEditor
|
|
36
|
-
Create by JE-Chen
|
|
37
|
-
"""
|
|
38
|
-
)
|
|
39
|
-
message_box.exec()
|