def focusInEvent(self, event): # check for file changes try: if self.filename and self.file_info: if self.file_info.lastModified() != QFileInfo( self.filename).lastModified(): self.file_info = QFileInfo(self.filename) result = MessageBox.question(self, "File changed", "File was changed, reload?", buttons=MessageBox.Yes | MessageBox.No) if result == MessageBox.Yes: f = QFile(self.filename) if f.open(QIODevice.ReadOnly | QIODevice.Text): self.setText(unicode(f.readAll(), "utf-8")) self.document().setModified(False) self.textChanged.emit() else: MessageBox.critical( self, "Error", "Cannot open launch file%s" % self.filename) except: pass QTextEdit.focusInEvent(self, event)
def __init__(self, filename, parent=None): self.parent = parent QTextEdit.__init__(self, parent) self.setObjectName(' - '.join(['Editor', filename])) self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.show_custom_context_menu) # self.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) self.setAcceptRichText(False) font = QFont() font.setFamily("Fixed".decode("utf-8")) font.setPointSize(12) self.setFont(font) self.setLineWrapMode(QTextEdit.NoWrap) self.setTabStopWidth(25) self.setAcceptRichText(False) self.setCursorWidth(2) self.setFontFamily("courier new") self.setProperty("backgroundVisible", True) self.regexp_list = [ QRegExp("\\binclude\\b"), QRegExp("\\btextfile\\b"), QRegExp("\\bfile\\b"), QRegExp("\\bvalue=.*pkg:\/\/\\b"), QRegExp("\\bvalue=.*package:\/\/\\b"), QRegExp("\\bvalue=.*\$\(find\\b"), QRegExp("\\bargs=.*\$\(find\\b"), QRegExp("\\bdefault=.*\$\(find\\b") ] self.filename = filename self.file_info = None if self.filename: f = QFile(filename) if f.open(QIODevice.ReadOnly | QIODevice.Text): self.file_info = QFileInfo(filename) self.setText(unicode(f.readAll(), "utf-8")) self.path = '.' # enables drop events self.setAcceptDrops(True) if filename.endswith('.launch'): self.hl = XmlHighlighter(self.document()) self.cursorPositionChanged.connect(self._document_position_changed) else: self.hl = YamlHighlighter(self.document()) # variables for threaded search self._search_thread = None self._stop = False
def on_editor_modificationChanged(self, value=None): ''' If the content was changed, a '*' will be shown in the tab name. ''' tab_name = self.__getTabName(self.tabWidget.currentWidget().filename) if (self.tabWidget.currentWidget().document().isModified()) or not QFileInfo(self.tabWidget.currentWidget().filename).exists(): tab_name = ''.join(['*', tab_name]) self.tabWidget.setTabText(self.tabWidget.currentIndex(), tab_name)
def _handle_load_clicked(self): filenames = QFileDialog.getOpenFileNames( self, self.tr('Load from Files'), self.last_open_dir, self.tr('Bag files {.bag} (*.bag)')) if filenames and filenames[0]: self.last_open_dir = QFileInfo( filenames[0][0]).absoluteDir().absolutePath() for filename in filenames[0]: self.load_bag(filename)
def save(self, force=False): ''' Saves changes to the file. :return: saved, errors, msg :rtype: bool, bool, str ''' if force or self.document().isModified() or not QFileInfo( self.filename).exists(): f = QFile(self.filename) if f.open(QIODevice.WriteOnly | QIODevice.Text): f.write(self.toPlainText().encode('utf-8')) self.document().setModified(False) self.file_info = QFileInfo(self.filename) ext = os.path.splitext(self.filename) # validate the xml structure of the launch files if ext[1] in self.CONTEXT_FILE_EXT: imported = False try: from lxml import etree imported = True parser = etree.XMLParser() etree.fromstring(self.toPlainText().encode('utf-8'), parser) except Exception as e: if imported: self.markLine(e.position[0]) return True, True, "%s" % e # validate the yaml structure of yaml files elif ext[1] in self.YAML_VALIDATION_FILES: try: import yaml yaml.load(self.toPlainText().encode('utf-8')) except yaml.MarkedYAMLError as e: return True, True, "%s" % e return True, False, '' else: return False, True, "Cannot write XML file" return False, False, ''
def _handle_load_clicked(self): filenames = QFileDialog.getOpenFileNames( self, self.tr('Load from Files'), self.last_open_dir, self.tr('Bag files {.bag} (*.bag)')) if filenames and filenames[0]: self.last_open_dir = QFileInfo(filenames[0][0]).absoluteDir().absolutePath() for filename in filenames[0]: self.load_bag(filename) # After loading bag(s), force a resize event on the bag widget so that # it can take the new height of the timeline into account (and show # the scroll bar if necessary) self._timeline._timeline_frame._layout() self._resizeEvent(QResizeEvent(self.size(), self.size()))
def focusInEvent(self, event): # check for file changes try: if self.filename and self.file_info: if self.file_info.lastModified() != QFileInfo(self.filename).lastModified(): self.file_info = QFileInfo(self.filename) result = MessageBox.question(self, "File changed", "File was changed, reload?", buttons=MessageBox.Yes | MessageBox.No) if result == MessageBox.Yes: f = QFile(self.filename) if f.open(QIODevice.ReadOnly | QIODevice.Text): self.setText(unicode(f.readAll(), "utf-8")) self.document().setModified(False) self.textChanged.emit() else: MessageBox.critical(self, "Error", "Cannot open launch file%s" % self.filename) except: pass QTextEdit.focusInEvent(self, event)
def __init__(self, filename, parent=None): self.parent = parent QTextEdit.__init__(self, parent) self.setObjectName(' - '.join(['Editor', filename])) self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.show_custom_context_menu) # self.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) self.setAcceptRichText(False) font = QFont() font.setFamily("Fixed".decode("utf-8")) font.setPointSize(12) self.setFont(font) self.setLineWrapMode(QTextEdit.NoWrap) self.setTabStopWidth(25) self.setAcceptRichText(False) self.setCursorWidth(2) self.setFontFamily("courier new") self.setProperty("backgroundVisible", True) self.regexp_list = [QRegExp("\\binclude\\b"), QRegExp("\\btextfile\\b"), QRegExp("\\bfile\\b"), QRegExp("\\bvalue=.*pkg:\/\/\\b"), QRegExp("\\bvalue=.*package:\/\/\\b"), QRegExp("\\bvalue=.*\$\(find\\b"), QRegExp("\\bargs=.*\$\(find\\b"), QRegExp("\\bdefault=.*\$\(find\\b")] self.filename = filename self.file_info = None if self.filename: f = QFile(filename) if f.open(QIODevice.ReadOnly | QIODevice.Text): self.file_info = QFileInfo(filename) self.setText(unicode(f.readAll(), "utf-8")) self.path = '.' # enables drop events self.setAcceptDrops(True) if filename.endswith('.launch'): self.hl = XmlHighlighter(self.document()) self.cursorPositionChanged.connect(self._document_position_changed) else: self.hl = YamlHighlighter(self.document()) # variables for threaded search self._search_thread = None self._stop = False
def save(self, force=False): ''' Saves changes to the file. :return: saved, errors, msg :rtype: bool, bool, str ''' if force or self.document().isModified() or not QFileInfo(self.filename).exists(): f = QFile(self.filename) if f.open(QIODevice.WriteOnly | QIODevice.Text): f.write(self.toPlainText().encode('utf-8')) self.document().setModified(False) self.file_info = QFileInfo(self.filename) ext = os.path.splitext(self.filename) # validate the xml structure of the launch files if ext[1] in self.CONTEXT_FILE_EXT: imported = False try: from lxml import etree imported = True parser = etree.XMLParser() etree.fromstring(self.toPlainText().encode('utf-8'), parser) except Exception as e: if imported: self.markLine(e.position[0]) return True, True, "%s" % e # validate the yaml structure of yaml files elif ext[1] in self.YAML_VALIDATION_FILES: try: import yaml yaml.load(self.toPlainText().encode('utf-8')) except yaml.MarkedYAMLError as e: return True, True, "%s" % e return True, False, '' else: return False, True, "Cannot write XML file" return False, False, ''
class TextEdit(QTextEdit): ''' The XML editor to handle the included files. If an included file in the opened launch file is detected, this can be open by STRG+(mouse click) in a new editor. ''' load_request_signal = Signal(str) ''' @ivar: A signal for request to open a configuration file''' search_result_signal = Signal(str, bool, str, int) ''' @ivar: A signal emitted after search_threaded was started. (search text, found or not, file, position in text) for each result a signal will be emitted. ''' SUBSTITUTION_ARGS = ['env', 'optenv', 'find', 'anon', 'arg'] CONTEXT_FILE_EXT = ['.launch', '.test', '.xml'] YAML_VALIDATION_FILES = ['.yaml', '.iface', '.sync'] def __init__(self, filename, parent=None): self.parent = parent QTextEdit.__init__(self, parent) self.setObjectName(' - '.join(['Editor', filename])) self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.show_custom_context_menu) # self.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) self.setAcceptRichText(False) font = QFont() font.setFamily("Fixed".decode("utf-8")) font.setPointSize(12) self.setFont(font) self.setLineWrapMode(QTextEdit.NoWrap) self.setTabStopWidth(25) self.setAcceptRichText(False) self.setCursorWidth(2) self.setFontFamily("courier new") self.setProperty("backgroundVisible", True) self.regexp_list = [QRegExp("\\binclude\\b"), QRegExp("\\btextfile\\b"), QRegExp("\\bfile\\b"), QRegExp("\\bvalue=.*pkg:\/\/\\b"), QRegExp("\\bvalue=.*package:\/\/\\b"), QRegExp("\\bvalue=.*\$\(find\\b"), QRegExp("\\bargs=.*\$\(find\\b"), QRegExp("\\bdefault=.*\$\(find\\b")] self.filename = filename self.file_info = None if self.filename: f = QFile(filename) if f.open(QIODevice.ReadOnly | QIODevice.Text): self.file_info = QFileInfo(filename) self.setText(unicode(f.readAll(), "utf-8")) self.path = '.' # enables drop events self.setAcceptDrops(True) if filename.endswith('.launch'): self.hl = XmlHighlighter(self.document()) self.cursorPositionChanged.connect(self._document_position_changed) else: self.hl = YamlHighlighter(self.document()) # variables for threaded search self._search_thread = None self._stop = False def _document_position_changed(self): if isinstance(self.hl, XmlHighlighter) and nm.settings().highlight_xml_blocks: # import time # start_time = time.time() self.hl.mark_block(self.textCursor().block(), self.textCursor().positionInBlock()) # print("--- mark_tag_block %.6f seconds ---" % (time.time() - start_time)) def save(self, force=False): ''' Saves changes to the file. :return: saved, errors, msg :rtype: bool, bool, str ''' if force or self.document().isModified() or not QFileInfo(self.filename).exists(): f = QFile(self.filename) if f.open(QIODevice.WriteOnly | QIODevice.Text): f.write(self.toPlainText().encode('utf-8')) self.document().setModified(False) self.file_info = QFileInfo(self.filename) ext = os.path.splitext(self.filename) # validate the xml structure of the launch files if ext[1] in self.CONTEXT_FILE_EXT: imported = False try: from lxml import etree imported = True parser = etree.XMLParser() etree.fromstring(self.toPlainText().encode('utf-8'), parser) except Exception as e: if imported: self.markLine(e.position[0]) return True, True, "%s" % e # validate the yaml structure of yaml files elif ext[1] in self.YAML_VALIDATION_FILES: try: import yaml yaml.load(self.toPlainText().encode('utf-8')) except yaml.MarkedYAMLError as e: return True, True, "%s" % e return True, False, '' else: return False, True, "Cannot write XML file" return False, False, '' def markLine(self, no): try: cursor = self.textCursor() cursor.setPosition(0, QTextCursor.MoveAnchor) while (cursor.block().blockNumber() + 1 < no): cursor.movePosition(QTextCursor.NextBlock, QTextCursor.MoveAnchor) cursor.movePosition(QTextCursor.EndOfBlock, QTextCursor.KeepAnchor) self.setTextCursor(cursor) except: pass def setCurrentPath(self, path): ''' Sets the current working path. This path is to open the included files, which contains the relative path. @param path: the path of the current opened file (without the file) @type path: C{str} ''' self.path = path def index(self, text): ''' Searches in the given text for key indicates the including of a file and return their index. @param text: text to find @type text: C{str} @return: the index of the including key or -1 @rtype: C{int} ''' for pattern in self.regexp_list: index = pattern.indexIn(text) if index > -1: return index return -1 def includedFiles(self): ''' Returns all included files in the document. ''' result = [] b = self.document().begin() while b != self.document().end(): text = b.text() index = self.index(text) if index > -1: startIndex = text.find('"', index) if startIndex > -1: endIndex = text.find('"', startIndex + 1) fileName = text[startIndex + 1:endIndex] if len(fileName) > 0: try: path = interpret_path(fileName) f = QFile(path) ext = os.path.splitext(path) if f.exists() and ext[1] in nm.settings().SEARCH_IN_EXT: result.append(path) except: import traceback print traceback.format_exc(1) b = b.next() return result def focusInEvent(self, event): # check for file changes try: if self.filename and self.file_info: if self.file_info.lastModified() != QFileInfo(self.filename).lastModified(): self.file_info = QFileInfo(self.filename) result = MessageBox.question(self, "File changed", "File was changed, reload?", buttons=MessageBox.Yes | MessageBox.No) if result == MessageBox.Yes: f = QFile(self.filename) if f.open(QIODevice.ReadOnly | QIODevice.Text): self.setText(unicode(f.readAll(), "utf-8")) self.document().setModified(False) self.textChanged.emit() else: MessageBox.critical(self, "Error", "Cannot open launch file%s" % self.filename) except: pass QTextEdit.focusInEvent(self, event) def mouseReleaseEvent(self, event): ''' Opens the new editor, if the user clicked on the included file and sets the default cursor. ''' if event.modifiers() == Qt.ControlModifier or event.modifiers() == Qt.ShiftModifier: cursor = self.cursorForPosition(event.pos()) inc_files = LaunchConfig.included_files(cursor.block().text(), recursive=False) if inc_files: try: qf = QFile(inc_files[0]) if not qf.exists(): # create a new file, if it does not exists result = MessageBox.question(self, "File not found", '\n\n'.join(["Create a new file?", qf.fileName()]), buttons=MessageBox.Yes | MessageBox.No) if result == MessageBox.Yes: d = os.path.dirname(qf.fileName()) if not os.path.exists(d): os.makedirs(d) with open(qf.fileName(), 'w') as f: if qf.fileName().endswith('.launch'): f.write('<launch>\n\n</launch>') event.setAccepted(True) self.load_request_signal.emit(qf.fileName()) else: event.setAccepted(True) self.load_request_signal.emit(qf.fileName()) except Exception, e: MessageBox.critical(self, "Error", "File not found %s" % inc_files[0], detailed_text=utf8(e)) QTextEdit.mouseReleaseEvent(self, event)
class TextEdit(QTextEdit): ''' The XML editor to handle the included files. If an included file in the opened launch file is detected, this can be open by STRG+(mouse click) in a new editor. ''' load_request_signal = Signal(str) ''' @ivar: A signal for request to open a configuration file''' search_result_signal = Signal(str, bool, str, int) ''' @ivar: A signal emitted after search_threaded was started. (search text, found or not, file, position in text) for each result a signal will be emitted. ''' SUBSTITUTION_ARGS = ['env', 'optenv', 'find', 'anon', 'arg'] CONTEXT_FILE_EXT = ['.launch', '.test', '.xml'] YAML_VALIDATION_FILES = ['.yaml', '.iface', '.sync'] def __init__(self, filename, parent=None): self.parent = parent QTextEdit.__init__(self, parent) self.setObjectName(' - '.join(['Editor', filename])) self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.show_custom_context_menu) # self.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken) self.setAcceptRichText(False) font = QFont() font.setFamily("Fixed".decode("utf-8")) font.setPointSize(12) self.setFont(font) self.setLineWrapMode(QTextEdit.NoWrap) self.setTabStopWidth(25) self.setAcceptRichText(False) self.setCursorWidth(2) self.setFontFamily("courier new") self.setProperty("backgroundVisible", True) self.regexp_list = [ QRegExp("\\binclude\\b"), QRegExp("\\btextfile\\b"), QRegExp("\\bfile\\b"), QRegExp("\\bvalue=.*pkg:\/\/\\b"), QRegExp("\\bvalue=.*package:\/\/\\b"), QRegExp("\\bvalue=.*\$\(find\\b"), QRegExp("\\bargs=.*\$\(find\\b"), QRegExp("\\bdefault=.*\$\(find\\b") ] self.filename = filename self.file_info = None if self.filename: f = QFile(filename) if f.open(QIODevice.ReadOnly | QIODevice.Text): self.file_info = QFileInfo(filename) self.setText(unicode(f.readAll(), "utf-8")) self.path = '.' # enables drop events self.setAcceptDrops(True) if filename.endswith('.launch'): self.hl = XmlHighlighter(self.document()) self.cursorPositionChanged.connect(self._document_position_changed) else: self.hl = YamlHighlighter(self.document()) # variables for threaded search self._search_thread = None self._stop = False def _document_position_changed(self): if isinstance(self.hl, XmlHighlighter) and nm.settings().highlight_xml_blocks: # import time # start_time = time.time() self.hl.mark_block(self.textCursor().block(), self.textCursor().positionInBlock()) # print("--- mark_tag_block %.6f seconds ---" % (time.time() - start_time)) def save(self, force=False): ''' Saves changes to the file. :return: saved, errors, msg :rtype: bool, bool, str ''' if force or self.document().isModified() or not QFileInfo( self.filename).exists(): f = QFile(self.filename) if f.open(QIODevice.WriteOnly | QIODevice.Text): f.write(self.toPlainText().encode('utf-8')) self.document().setModified(False) self.file_info = QFileInfo(self.filename) ext = os.path.splitext(self.filename) # validate the xml structure of the launch files if ext[1] in self.CONTEXT_FILE_EXT: imported = False try: from lxml import etree imported = True parser = etree.XMLParser() etree.fromstring(self.toPlainText().encode('utf-8'), parser) except Exception as e: if imported: self.markLine(e.position[0]) return True, True, "%s" % e # validate the yaml structure of yaml files elif ext[1] in self.YAML_VALIDATION_FILES: try: import yaml yaml.load(self.toPlainText().encode('utf-8')) except yaml.MarkedYAMLError as e: return True, True, "%s" % e return True, False, '' else: return False, True, "Cannot write XML file" return False, False, '' def markLine(self, no): try: cursor = self.textCursor() cursor.setPosition(0, QTextCursor.MoveAnchor) while (cursor.block().blockNumber() + 1 < no): cursor.movePosition(QTextCursor.NextBlock, QTextCursor.MoveAnchor) cursor.movePosition(QTextCursor.EndOfBlock, QTextCursor.KeepAnchor) self.setTextCursor(cursor) except: pass def setCurrentPath(self, path): ''' Sets the current working path. This path is to open the included files, which contains the relative path. @param path: the path of the current opened file (without the file) @type path: C{str} ''' self.path = path def index(self, text): ''' Searches in the given text for key indicates the including of a file and return their index. @param text: text to find @type text: C{str} @return: the index of the including key or -1 @rtype: C{int} ''' for pattern in self.regexp_list: index = pattern.indexIn(text) if index > -1: return index return -1 def includedFiles(self): ''' Returns all included files in the document. ''' result = [] b = self.document().begin() while b != self.document().end(): text = b.text() index = self.index(text) if index > -1: startIndex = text.find('"', index) if startIndex > -1: endIndex = text.find('"', startIndex + 1) fileName = text[startIndex + 1:endIndex] if len(fileName) > 0: try: path = interpret_path(fileName) f = QFile(path) ext = os.path.splitext(path) if f.exists() and ext[1] in nm.settings( ).SEARCH_IN_EXT: result.append(path) except: import traceback print traceback.format_exc(1) b = b.next() return result def focusInEvent(self, event): # check for file changes try: if self.filename and self.file_info: if self.file_info.lastModified() != QFileInfo( self.filename).lastModified(): self.file_info = QFileInfo(self.filename) result = QMessageBox.question( self, "File changed", "File was changed, reload?", QMessageBox.Yes | QMessageBox.No) if result == QMessageBox.Yes: f = QFile(self.filename) if f.open(QIODevice.ReadOnly | QIODevice.Text): self.setText(unicode(f.readAll(), "utf-8")) self.document().setModified(False) self.textChanged.emit() else: QMessageBox.critical( self, "Error", "Cannot open launch file%s" % self.filename) except: pass QTextEdit.focusInEvent(self, event) def mouseReleaseEvent(self, event): ''' Opens the new editor, if the user clicked on the included file and sets the default cursor. ''' if event.modifiers() == Qt.ControlModifier or event.modifiers( ) == Qt.ShiftModifier: cursor = self.cursorForPosition(event.pos()) inc_files = LaunchConfig.included_files(cursor.block().text(), recursive=False) if inc_files: try: qf = QFile(inc_files[0]) if not qf.exists(): # create a new file, if it does not exists result = QMessageBox.question( self, "File not found", '\n\n'.join(["Create a new file?", qf.fileName()]), QMessageBox.Yes | QMessageBox.No) if result == QMessageBox.Yes: d = os.path.dirname(qf.fileName()) if not os.path.exists(d): os.makedirs(d) with open(qf.fileName(), 'w') as f: if qf.fileName().endswith('.launch'): f.write('<launch>\n\n</launch>') event.setAccepted(True) self.load_request_signal.emit(qf.fileName()) else: event.setAccepted(True) self.load_request_signal.emit(qf.fileName()) except Exception, e: WarningMessageBox(QMessageBox.Warning, "File not found %s" % inc_files[0], str(e)).exec_() QTextEdit.mouseReleaseEvent(self, event)