diff --git a/pyminer/ui/base/widgets/codeeditwidget.py b/pyminer/ui/base/widgets/codeeditwidget.py index cabdf33999b1616ffcf1443108c8dc8b12b10383..fd2430d8dc1e0c80b8bfe94f26b78b77f1c6c4b9 100644 --- a/pyminer/ui/base/widgets/codeeditwidget.py +++ b/pyminer/ui/base/widgets/codeeditwidget.py @@ -266,7 +266,7 @@ class PMCodeEdit(QTextEdit): self.updateUi() def updateUi(self): - self.doc_tab_widget.refresh() + self.doc_tab_widget.refresh_modified_status() self.doc_tab_widget.is_all_files_saved() print('refresh!') # self.fileSaveAction.setEnabled(self.document().isModified()) diff --git a/pyminer_new/extensions/extensionlib/extension_lib.py b/pyminer_new/extensions/extensionlib/extension_lib.py new file mode 100644 index 0000000000000000000000000000000000000000..3a7830ee94280bf467d6cda6aba73a218d2e91d9 --- /dev/null +++ b/pyminer_new/extensions/extensionlib/extension_lib.py @@ -0,0 +1,10 @@ +def wrapper(): + from pyminer_new.extensions.extensions_manager.manager import extensions_manager + class ExtensionLib: + def get_interface(self,name): + return extensions_manager.get_ext_by_name(name).public_interface + def insert_widget(self,widget,insert_mode,config=None): + extensions_manager.ui_inserters[insert_mode](widget,insert_mode,config) + return ExtensionLib + +extension_lib=wrapper()() \ No newline at end of file diff --git a/pyminer_new/extensions/extensionlib/pmext.py b/pyminer_new/extensions/extensionlib/pmext.py index a5f8a855f0554faec5a280c25e89325907840acd..2f042e21a93465a963ee2008ed599075f0903268 100644 --- a/pyminer_new/extensions/extensionlib/pmext.py +++ b/pyminer_new/extensions/extensionlib/pmext.py @@ -83,6 +83,14 @@ class PluginInterface(object): PluginInterface.get_main_window().switch_toolbar(toolbar_name) @staticmethod + def show_tool_bar(toolbar_name: str): + ''' + 切换工具栏 + :param toolbar_name: + :return: + ''' + PluginInterface.get_main_window().show_toolbar(toolbar_name) + @staticmethod def append_widget_to_toolbar(toolbar_name: str, widget: QWidget): PluginInterface.get_toolbar(toolbar_name).addWidget(widget) diff --git a/pyminer_new/extensions/extensions_manager/ExtensionLoader.py b/pyminer_new/extensions/extensions_manager/ExtensionLoader.py index 354b5ae0ce88814200ad715a6451360290a25971..9fea362eed3bfd36f25cc01f9354929013bbec08 100644 --- a/pyminer_new/extensions/extensions_manager/ExtensionLoader.py +++ b/pyminer_new/extensions/extensions_manager/ExtensionLoader.py @@ -5,6 +5,7 @@ import json from collections import namedtuple from pyminer_new.extensions.extensions_manager import log from pyminer_new.pmutil import get_root_dir +import copy # package.json大概结构 # { @@ -45,6 +46,8 @@ BASEDIR = get_root_dir() Info = namedtuple('Info', ['icon', 'name', 'display_name', 'version', 'description', 'path']) +class PublicInterface: + pass class ExtensionLoader: def load(self, file, ui_inserters): @@ -57,22 +60,27 @@ class ExtensionLoader: self.description = self.package['description'] self.icon = self.package['icon'] self.path = os.path.join(BASEDIR, 'extensions/packages/', self.name) # 扩展文件夹路径 - self.main = self.load_obj( + main_class = self.load_class( { 'file': 'main.py', 'class_name': 'Extension' }, 'class_name' ) - self.interface = self.load_obj(self.package['interface'], 'interface') - if getattr(self.interface, 'ui_inserters', None): - for key in self.interface.ui_inserters: - self.ui_inserters[f'extension_{self.name}_{key}'] = self.interface.ui_inserters[key] - self.main.interface = self.interface - self.main.widgets = [] + + self.interface = self.load_class(self.package['interface'], 'interface')() + self.public_interface=self.create_public_interface(self.interface) + + for key in getattr(self.interface, 'ui_inserters', []): + self.ui_inserters[f'extension_{self.name}_{key}'] = self.interface.ui_inserters[key] + + main_class.interface = self.interface + main_class.public_interface=self.interface + main_class.widgets = [] for widget in self.package['widgets']: - widget_obj = self.load_widget(widget) - self.main.widgets.append(widget_obj) + widget_class = self.load_widget(widget) + main_class.widgets.append(widget_class) + self.main=main_class() self.binding_info() return self.main except KeyError as e: @@ -108,7 +116,7 @@ class ExtensionLoader: del sys.path[i] return model - def load_obj(self, obj, class_name): + def load_class(self, obj, class_name): if not obj: return None if not (obj.get('file') and obj.get(class_name)): @@ -118,17 +126,25 @@ class ExtensionLoader: model = self.run_code(path) if model: if getattr(model, obj[class_name], None): - return getattr(model, obj[class_name], None)() + return getattr(model, obj[class_name], None) else: log.error(f"{obj['file']}文件中不存在{obj[class_name]}类") else: log.error(f"{obj['file']}文件不存在或有误") def load_widget(self, widget): - widget_obj = self.load_obj(widget, 'widget') + widget_class = self.load_class(widget, 'widget') try: - self.ui_inserters[widget['position']].insert(widget_obj, widget['config']) - return widget_obj + if widget.get('auto_insert',True): + self.ui_inserters[widget['position']].insert(widget_class(), widget['config']) + return widget_class except KeyError as e: log.error(f"插件{self.name}的widgets配置不正确!") log.error(f"位置:{widget}") + + def create_public_interface(self,interface): + public_interface=PublicInterface() + for i in dir(interface): + if not i.startswith('_'): + setattr(public_interface,i,getattr(interface,i)) + return public_interface diff --git a/pyminer_new/extensions/extensions_manager/UIInster.py b/pyminer_new/extensions/extensions_manager/UIInster.py index 6ca945fd5a019aa1c5f034e0d06d3cb5d4342875..de9a81cbb6f423719aefe581d128d606c9ff13ae 100644 --- a/pyminer_new/extensions/extensions_manager/UIInster.py +++ b/pyminer_new/extensions/extensions_manager/UIInster.py @@ -17,7 +17,7 @@ class BaseInserter: @classmethod def insert(cls, widget: 'QWidget', config=None): print("BaseInserter.insert({widget},{config})".format(widget=repr(widget), config=repr(config))) - # raise NotImplementedError + raise NotImplementedError class NewTab(BaseInserter): @@ -31,22 +31,23 @@ class InsertIntoTab(BaseInserter): class NewToolBar(BaseInserter): @classmethod def insert(cls, widget: 'QWidget', config=None): + name = config['name'] text = config['text'] - print(name,text,widget) PluginInterface.add_tool_bar(name,widget,text) -class NewSubWindow(BaseInserter): + +class NewDockWindow(BaseInserter): @classmethod - def insert(cls, widget: 'QWidget', config=None, side: str = 'left'): - print('config is', config) - dock_name = config['name'] # 'plugin_widget %f'%time.time() - text = config['text'] # 'this is a test name!' - print('widget is', widget) + def insert(cls, widget: 'QWidget', config=None): + dock_name = config['name'] + text = config['text'] + side = config['side'] PluginInterface.add_docked_widget(dock_name=dock_name, widget=widget, text=text, side=side) + ui_inserters = { - 'new_dock_window':NewSubWindow, + 'new_dock_window':NewDockWindow, 'new_toolbar': NewToolBar } diff --git a/pyminer_new/extensions/extensions_manager/readme.drawio b/pyminer_new/extensions/extensions_manager/readme.drawio new file mode 100644 index 0000000000000000000000000000000000000000..080c8be1a97f10d47811517ab75928b458ba37d9 --- /dev/null +++ b/pyminer_new/extensions/extensions_manager/readme.drawio @@ -0,0 +1 @@ +7VrZbuM2FP0aAu1Lod3ko+RlWiBFC+ShM08DxmJsdWTRkOnY7tf3kqJW0ktQO5lxCgQBeXkpkeeQd5ORP17tP5V0vfydpyxHnpPukT9Bnhf6GP5LwaESBIEWLMosrURuK3jM/mFa6GjpNkvZpqcoOM9Ftu4L57wo2Fz0ZLQs+a6v9szz/lvXdMEMweOc5qb0rywVy0qKvVEr/5Vli2X9Zjci1ciK1sp6J5slTfmuI/KnyB+XnIuqtdqPWS6xq3Gp5s2OjDYLK1khLpmg1/VC863em16XONSbXZR8u0Z+shEl/8bGPOelGvAJGY9n8ODkmRdiRldZLun8REu64kWq5R19xwlmBFaRmIvU635hpWB7G4X0qV5OixKcLsZXTJQH0NOz/PqIHGrodX/X8uRhLVt2OAocLaT6bCyaZ7fwQUMjaEfTO48mgFmkTOq7gMRumQn2uKZzObqDuwKypVjleviWkJMjkJvQvgl0vgndNEJ4hgg0ApQkKIkMMGHloo8YzbNFAe057JMBCIncXwY3N9YDqyxN5XQr9C05zneDfj3qDQ62ea4DCzfeFagJLNQQhEOEJ2g6QskExVNJFgG+RsfJ+gFPfj0a9bGPTOxdxwJ+dAXwQwv4gDCWIAP4MUYYGiFKYnlZ7gdz7zzk3o0gjwzIM2lMniVudwuwG1ocpc2iuMEVIB4ZEG8zZe+nKL5LEzJA2/cuRPsa5xmfcq2hNORxKBuEgDn5aZt9zYqN3Fi5+fmOGPD7DDT9DgO24Ca8AgG1r+4wkGdPBraQC6xlc37IMwC5PA/wU8XGw1MjoPNvC8XRH1sBT2FvwMSx2P0oE6PzlieyMIGvwYRroM5SSO10l5diyRe8oPm0lQ6iwlbngfO1xvdvJsRB56l0K3ifJrbPxGc9Xba/yPYvoe5N9p2hyaHuFLC1z/UDZKczS3bbaapXz3sDpjd8W85ZLzwRtFywWkvzJIE9eRxKllORvfRzahu7ampclvTQUVhz8MqbzpP/lIKOxR1eeGeQCZ/Rd4kzOFnVCtpz1mzlsqNnSQ6l9Y1lDCftsYOwqyQYkSqkS2RUVwXWiaNC7QTh4B7ToVfbEG+Y51uMyK3yIdcMEN/FqvwYFsINTBMR3MRCGFc6Gl5pTPqPqNakZw0OwCtv9+h/x3LzYzO69rG5+MaTd2W3YfRLZ8TO7juxdOubbJQDhmH5kZv82qBhFPTfE7qng4Yz+v89aLDV3oyyqA4jIETAshoHf3U2ZxzbD5NjXBAf3CzJsCXcGMUzVbMLFXvRZSXUsRQCsQlRtFdq5kQzaCSITOQRaAPLs8WVDxQ9RoNr61qKAbeKHj2zGGA6lyKN5WdKiX1ON5tsfiT0a9z0d+PDu/46utA5dFAPT5Rgbu1DKsdm+BDzQYMCRjT8/nUlZ2QUDaPw9LqG+v51nVFzz/oZLKSmOFJ2CoxRYHdPYKRIrCRgvIi0XNCVqSw0ApUAB+oLxtRWmcTSJsax8m7g5pLO9KNlTJvB1ToPnErHVz/kt6a2L+d6CI+1ply5+tISTxrlbnFUWWdQmCrL2ywSJoJddvV7cbNrtRLiqD2a62+wCpQHn7XIfGAz7ZPBRbN89HRH17HT0G1/dVFdjvanK/70Xw== \ No newline at end of file diff --git a/pyminer_new/extensions/packages/code_editor/editor.py b/pyminer_new/extensions/packages/code_editor/editor.py index 256f089558192a5a797b0d42709f3e53037658d7..8b90d2a7988d078d1c6fa952e758a655dca51fd5 100644 --- a/pyminer_new/extensions/packages/code_editor/editor.py +++ b/pyminer_new/extensions/packages/code_editor/editor.py @@ -14,12 +14,11 @@ import sys import jedi import time -from PyQt5.QtCore import QFile, QFileInfo, QIODevice, QRegExp, QTextStream, Qt, QModelIndex, pyqtSignal, QThread -from PyQt5.QtWidgets import QAction, QApplication, QFileDialog, QMainWindow, QTextEdit, QTabWidget, \ - QMessageBox, QPushButton, QMenu, QToolBar, QToolButton, QListWidget, QListWidgetItem, QWidget, QHBoxLayout, \ - QVBoxLayout, QStatusBar, QLabel -from PyQt5.QtGui import QFont, QIcon, QColor, QSyntaxHighlighter, QTextCharFormat, QTextCursor, QCursor, \ - QKeyEvent, QPixmap, QMouseEvent, QPainter +from PyQt5.QtCore import QRegExp, Qt, QModelIndex, pyqtSignal, QThread +from PyQt5.QtWidgets import QApplication, QFileDialog, QTextEdit, QTabWidget, \ + QMessageBox, QListWidget, QListWidgetItem, QWidget, QHBoxLayout, QVBoxLayout, QLabel +from PyQt5.QtGui import QFont, QColor, QSyntaxHighlighter, QTextCharFormat, QTextCursor, QCursor, \ + QKeyEvent, QMouseEvent from typing import List, Tuple from pyminer_new.extensions.extensionlib.pmext import PluginInterface from .syntaxana import getIndent @@ -260,71 +259,11 @@ class AutoCompList(QListWidget): e.ignore() -class NumberBar(QWidget): - def __init__(self, editor): - QWidget.__init__(self, editor) - self.codeEditor = editor - - # get行号值 - def getWidth(self): - digits = 1 - - blockNumber = self.codeEditor.blockCount() - - Max = max(1, blockNumber) - while (Max >= 10): - Max /= 10 - digits += 1 - - space = 30 + self.codeEditor.fontMetrics().width('9') * digits - return space - - # 更新行号栏宽度 - def updateWidth(self): - width = self.getWidth() - self.codeEditor.setViewportMargins(width, 0, 0, 0) - - # 根据 updateRequest 信号 调整行号栏 - def updateArea(self, rect, dy): - if dy: - self.scroll(0, dy) - else: - self.update(0, rect.y(), self.getWidth(), rect.height()) - - if (rect.contains(self.codeEditor.viewport().rect())): - width = self.getWidth() - self.codeEditor.setViewportMargins(width, 0, 0, 0) - - # 绘制行号栏 - def paintEvent(self, event): - painter = QPainter(self) - rect = event.rect() - - painter.fillRect(rect, QColor(243, 243, 243)) - block = self.codeEditor.firstVisibleBlock() - - blockNumber = 0 - top = int(self.codeEditor.blockBoundingGeometry(block).translated(self.codeEditor.contentOffset()).top()) - bottom = top + int(self.codeEditor.blockBoundingRect(block).height()) - while (block.isValid() and top <= rect.bottom()): - if (block.isVisible() and bottom >= rect.top()): - number = 1 # QString.number(blockNumber + 1) - painter.setPen(QColor(59, 153, 181)) - painter.drawText(0, top, self.codeEditor.lineNumberArea.width(), \ - painter.fontMetrics().height(), \ - Qt.AlignVCenter | Qt.AlignRight, number + ' ') - - block = block.next() - top = bottom - bottom = top + int(self.codeEditor.blockBoundingRect(block).height()) - blockNumber += 1 - - class PMCodeEditor(QWidget): - def __init__(self, parent=None): + def __init__(self, parent: 'PMCodeEditor' = None): super().__init__(parent=parent) - self.edit = PMCodeEdit() - self.line_number_area = QWidget() # QStatusBar()#NumberBar(self.edit) + self.edit = PMCodeEdit(self) + self.line_number_area = QWidget() self.line_number_area.setMaximumHeight(60) self.line_number_area.setMinimumHeight(20) self.status_label = QLabel() @@ -332,6 +271,9 @@ class PMCodeEditor(QWidget): line_number_area_layout.addWidget(self.status_label) line_number_area_layout.setContentsMargins(0, 0, 0, 0) self.line_number_area.setLayout(line_number_area_layout) + self.modified_status_label = QLabel() + self.modified_status_label.setText('未保存') + line_number_area_layout.addWidget(self.modified_status_label) self.edit.cursorPositionChanged.connect(self.show_cursor_pos) layout = QVBoxLayout() @@ -344,15 +286,16 @@ class PMCodeEditor(QWidget): def show_cursor_pos(self): row = self.edit.textCursor().block().blockNumber() col = self.edit.textCursor().columnNumber() - self.status_label.setText('行:{row},列:{col}'.format(row=row, col=col)) + self.status_label.setText('行:{row},列:{col}'.format(row=row + 1, col=col + 1)) class PMCodeEdit(QTextEdit): + signal_save = pyqtSignal(str) def __init__(self, parent=None): super(PMCodeEdit, self).__init__(parent) self.setLineWrapMode(QTextEdit.NoWrap) - self.doc_tab_widget = parent + self.doc_tab_widget: 'PMCodeEditor' = parent self.filename = '*' self.path = '' self.modified = True @@ -370,6 +313,12 @@ class PMCodeEdit(QTextEdit): self.autocomp_thread.start() def on_autocomp_signal_received(self, text_cursor_pos: tuple, completions: List['jedi.api.classes.Completion']): + ''' + 当收到自动补全提示信号时,执行的函数。 + :param text_cursor_pos: + :param completions: + :return: + ''' current_cursor_pos = self._get_textcursor_pos() if current_cursor_pos[0] + 1 == text_cursor_pos[0] and current_cursor_pos[1] == text_cursor_pos[1]: if len(completions) == 1: @@ -444,11 +393,14 @@ class PMCodeEdit(QTextEdit): return self.textCursor().blockNumber(), self.textCursor().columnNumber() def updateUi(self): - self.doc_tab_widget.refresh() - self.doc_tab_widget.is_all_files_saved() + if self.modified: + text = '未保存' + else: + text = '已保存' + self.doc_tab_widget.modified_status_label.setText(text) def mousePressEvent(self, a0: QMouseEvent) -> None: - PluginInterface.switch_tool_bar('code_editor_toolbar') + PluginInterface.show_tool_bar('code_editor_toolbar') if self.popup_hint_widget.isVisible(): self.popup_hint_widget.hide_autocomp() super().mousePressEvent(a0) @@ -467,13 +419,31 @@ class PMCodeEdit(QTextEdit): elif k == Qt.Key_Slash and event.modifiers() == Qt.ControlModifier: self.comment() elif k == Qt.Key_Return: - self.on_line_end() + self.on_return_pressed() + event.accept() + return + elif k == Qt.Key_Backspace: + self.on_backspace(event) event.accept() return super().keyPressEvent(event) - def on_line_end(self): + def on_backspace(self,key_backspace_event:QKeyEvent): + cursor = self.textCursor() + cursor.beginEditBlock() + text = cursor.block().text() + nearby_text = self._get_nearby_text() + print('nearby_text') + if nearby_text.isspace(): + for i in range(4): + cursor.deletePreviousChar() + + else: + super().keyPressEvent(key_backspace_event) + cursor.endEditBlock() + + def on_return_pressed(self): ''' 按回车换行的方法 :return: @@ -667,6 +637,7 @@ class PMCodeEdit(QTextEdit): f.write(self.toPlainText()) self.modified = False self.updateUi() + self.signal_save.emit(self.filename) def on_close_request(self): if self.modified == True: @@ -713,12 +684,11 @@ class PMCodeEditTabWidget(QTabWidget): self.init_toolbar() self.create_new_editor_tab() - self.is_all_files_saved() self.setTabsClosable(True) self.tabCloseRequested.connect(self.on_tab_close_request) PluginInterface.get_toolbar_widget('code_editor_toolbar', 'button_new_script').clicked.connect( - self.create_new_editor_tab) + lambda: self.create_new_editor_tab()) PluginInterface.get_toolbar_widget('code_editor_toolbar', 'button_open_script').clicked.connect(self.open_file) PluginInterface.get_toolbar_widget('code_editor_toolbar', 'button_run_script').clicked.connect(self.run) PluginInterface.get_toolbar_widget('code_editor_toolbar', 'button_indent').clicked.connect(self.do_indent) @@ -731,6 +701,7 @@ class PMCodeEditTabWidget(QTabWidget): edit = editor_widget.edit edit.path = path edit.filename = filename + edit.signal_save.connect(self.refresh_modified_status) edit.setText(text) edit.modified = modified @@ -749,162 +720,8 @@ class PMCodeEditTabWidget(QTabWidget): def on_tab_close_request(self, close_index: int): tab_to_close = self.widget(close_index) tab_to_close.deleteLater() - tab_to_close.on_close_request() + tab_to_close.edit.on_close_request() self.removeTab(close_index) - def keyPressEvent(self, a0: QKeyEvent) -> None: - return - - def is_all_files_saved(self): - for tab_id in range(self.count()): - modified = self.widget(tab_id).edit.modified - - # cursor.movePosition(QTextCursor.NextCharacter, - # QTextCursor.KeepAnchor, 1) - - def refresh(self): - for tab_id in range(self.count()): - modified = self.widget(tab_id).modified - filename = self.widget(tab_id).filename - if not modified: - self.setTabText(tab_id, filename) - else: - if filename != '*': - self.setTabText(tab_id, filename + ' *') - - -# from pyminer_new.ui.base.widgets.menu_tool_stat_bars import PMModernToolbar - - -class MainWindow(QMainWindow): - - def __init__(self, filename=None, parent=None): - super(MainWindow, self).__init__(parent) - - self.setCentralWidget(PMCodeEditTabWidget()) # PMCodeEditTabWidget()) - - def updateUi(self, arg=None): - self.fileSaveAction.setEnabled( - self.editor.document().isModified()) - enable = not self.editor.document().isEmpty() - self.fileSaveAsAction.setEnabled(enable) - self.editIndentAction.setEnabled(enable) - self.editUnindentAction.setEnabled(enable) - enable = self.editor.textCursor().hasSelection() - self.editCopyAction.setEnabled(enable) - self.editCutAction.setEnabled(enable) - self.editPasteAction.setEnabled(self.editor.canPaste()) - - def createAction(self, text, slot=None, shortcut=None, icon=None, - tip=None, checkable=False, signal="triggered()"): - action = QAction(text, self) - if icon is not None: - action.setIcon(QIcon(":/{0}.png".format(icon))) - if shortcut is not None: - action.setShortcut(shortcut) - if tip is not None: - action.setToolTip(tip) - action.setStatusTip(tip) - if slot is not None: - action.triggered.connect(slot) - if checkable: - action.setCheckable(True) - return action - - def addActions(self, target, actions): - for action in actions: - if action is None: - target.addSeparator() - else: - target.addAction(action) - - def closeEvent(self, event): - if not self.okToContinue(): - event.ignore() - - def okToContinue(self): - if self.editor.document().isModified(): - reply = QMessageBox.question(self, - "Python Editor - Unsaved Changes", - "Save unsaved changes?", - QMessageBox.Yes | QMessageBox.No | - QMessageBox.Cancel) - if reply == QMessageBox.Cancel: - return False - elif reply == QMessageBox.Yes: - return self.fileSave() - return True - - def fileNew(self): - if not self.okToContinue(): - return - document = self.editor.document() - document.clear() - document.setModified(False) - self.filename = None - self.setWindowTitle("Python Editor - Unnamed") - self.updateUi() - - def fileOpen(self): - if not self.okToContinue(): - return - dir = (os.path.dirname(self.filename) - if self.filename is not None else ".") - fname = str(QFileDialog.getOpenFileName(self, - "Python Editor - Choose File", dir, - "Python files (*.py *.pyw)")[0]) - if fname: - self.filename = fname - self.loadFile() - - def loadFile(self): - fh = None - try: - fh = QFile(self.filename) - if not fh.open(QIODevice.ReadOnly): - raise IOError(str(fh.errorString())) - stream = QTextStream(fh) - stream.setCodec("UTF-8") - self.editor.setPlainText(stream.readAll()) - self.editor.document().setModified(False) - except EnvironmentError as e: - QMessageBox.warning(self, "Python Editor -- Load Error", - "Failed to load {0}: {1}".format(self.filename, e)) - finally: - if fh is not None: - fh.close() - self.setWindowTitle("Python Editor - {0}".format( - QFileInfo(self.filename).fileName())) - - def fileSave(self): - if self.filename is None: - return self.fileSaveAs() - fh = None - try: - fh = QFile(self.filename) - if not fh.open(QIODevice.WriteOnly): - raise IOError(str(fh.errorString())) - stream = QTextStream(fh) - stream.setCodec("UTF-8") - stream << self.editor.toPlainText() - self.editor.document().setModified(False) - except EnvironmentError as e: - QMessageBox.warning(self, "Python Editor -- Save Error", - "Failed to save {0}: {1}".format(self.filename, e)) - return False - finally: - if fh is not None: - fh.close() - return True - - def fileSaveAs(self): - filename = self.filename if self.filename is not None else "." - filename, filetype = QFileDialog.getSaveFileName(self, - "Python Editor -- Save File As", filename, - "Python files (*.py *.pyw)") - if filename: - self.filename = filename - self.setWindowTitle("Python Editor - {0}".format( - QFileInfo(self.filename).fileName())) - return self.fileSave() - return False + def refresh_modified_status(self, filename: str): + self.setTabText(self.currentIndex(), filename) diff --git a/pyminer_new/extensions/packages/code_editor/package.json b/pyminer_new/extensions/packages/code_editor/package.json index b561ee482fe60ab946a633f163f04f33773bfd42..bca3f46820e23060ecffcea8f9a36cb9467af5fd 100644 --- a/pyminer_new/extensions/packages/code_editor/package.json +++ b/pyminer_new/extensions/packages/code_editor/package.json @@ -16,6 +16,7 @@ "config":{ "message":"no", "name":"codeedit", + "side": "right", "text": "编辑器" } }, diff --git a/pyminer_new/extensions/packages/test_ext/package.json b/pyminer_new/extensions/packages/test_ext/package.json index 5e71a45ad3c69eca2138a94c8bc452542fac0ace..4c44579c197317da25431cecc868097c8a80a733 100644 --- a/pyminer_new/extensions/packages/test_ext/package.json +++ b/pyminer_new/extensions/packages/test_ext/package.json @@ -16,7 +16,8 @@ "config":{ "name": "test_ext", "text": "测试用插件", - "message":"no" + "message":"no", + "side": "left" } } ], diff --git a/pyminer_new/ui/generalwidgets/window/pmmainwindow.py b/pyminer_new/ui/generalwidgets/window/pmmainwindow.py index 28e6aa82cc3e8b7c484938fa5fe3a631cbbf368a..fcae8d34538256129c1ca713b9f33efd4fd6381c 100644 --- a/pyminer_new/ui/generalwidgets/window/pmmainwindow.py +++ b/pyminer_new/ui/generalwidgets/window/pmmainwindow.py @@ -36,7 +36,7 @@ class BaseMainWindow(QMainWindow): def refresh_toolbar_appearance(self): for k in self.toolbars.keys(): - if k !=self._current_toolbar_name: + if k != self._current_toolbar_name: self.toolbars[k].hide() self.toolbars[k].tab_button.setStyleSheet( 'QPushButton{color:#444444;background-color:#ffffff;border:0px;width:100px;}') @@ -45,7 +45,7 @@ class BaseMainWindow(QMainWindow): self.toolbars[k].tab_button.setStyleSheet( 'QPushButton{color:#efefef;background-color:#1234ee;border:0px;width:100px;}') - def switch_toolbar(self, name: str): + def show_toolbar(self, name): if self.toolbars.get(name) is not None: if name == self._current_toolbar_name: return @@ -55,6 +55,17 @@ class BaseMainWindow(QMainWindow): else: raise Exception('toolbar tab \'%s\' is not defined!' % name) + def switch_toolbar(self, name: str): + if self.toolbars.get(name) is not None: + if name == self._current_toolbar_name: + current_tb = self.toolbars[self._current_toolbar_name] + current_tb.setVisible(not current_tb.isVisible()) + else: + self._current_toolbar_name = name + self.refresh_toolbar_appearance() + else: + raise Exception('toolbar tab \'%s\' is not defined!' % name) + def add_toolbar(self, name: str, toolbar: QToolBar, text: str = 'untitled toolbar'): b = self.top_toolbar_tab.add_button(text) @@ -68,7 +79,7 @@ class BaseMainWindow(QMainWindow): toolbar.setMovable(False) toolbar.setFloatable(False) - if self._current_toolbar_name !='': + if self._current_toolbar_name != '': self.refresh_toolbar_appearance() # from pyminer_new.ui.generalwidgets.buttons import PushButtonPane # toolbar.addWidget(PushButtonPane()) @@ -90,7 +101,6 @@ class BaseMainWindow(QMainWindow): self.restoreState(s) def closeEvent(self, event: QCloseEvent) -> None: - reply = QMessageBox.question(self, '注意', '确认退出吗?', QMessageBox.Ok | QMessageBox.Cancel, QMessageBox.Cancel) if reply == QMessageBox.Ok: event.accept() @@ -133,10 +143,10 @@ class BaseMainWindow(QMainWindow): home_toolbar.view_config_button.setMenu(menu) - def get_dock_widget(self,widget_name:str)->'PMDockWidget': - dw = self.dock_widgets.get(widget_name) + def get_dock_widget(self, widget_name: str) -> 'PMDockWidget': + dw = self.dock_widgets.get(widget_name) if dw is None: - raise Exception('dockwidget named \'%s\' is not defined!'%widget_name) + raise Exception('dockwidget named \'%s\' is not defined!' % widget_name) return dw def refresh_view_configs(self):