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
@@ -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,4 +0,0 @@
1
- from PySide6.QtGui import QColor
2
-
3
- error_color: QColor = QColor(255, 51, 51)
4
- output_color: QColor = QColor(255, 255, 255)
@@ -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()