def actionTriggered(self, name): # convert arpeggio_normal to arpeggioNormal, etc. name = _arpeggioTypes[name] cursor = self.mainwindow().textCursor() # which arpeggio type is last used? lastused = '\\arpeggioNormal' types = set(_arpeggioTypes.values()) block = cursor.block() while block.isValid(): s = types.intersection(tokeniter.tokens(block)) if s: lastused = s.pop() break block = block.previous() # where to insert source = tokeniter.Source.from_cursor(cursor, True, -1) with cursortools.compress_undo(cursor): for p in music.music_items(source, tokens=source.tokens): c = source.cursor(p[-1], start=len(p[-1])) c.insertText('\\arpeggio') if name != lastused: cursortools.strip_indent(c) import indent indent.insert_text(c, name + '\n') # just pick the first place return
def edit(self, cursor): """Edit the block at the specified QTextCursor.""" if self._document: self._document.closed.disconnect(self.reject) self._document = cursor.document() self._document.closed.connect(self.reject) # don't change the cursor c = self._range = QTextCursor(cursor) cursorpos = c.position() - c.block().position() cursortools.strip_indent(c) indentpos = c.position() - c.block().position() c.movePosition(QTextCursor.EndOfBlock, QTextCursor.KeepAnchor) self.view.setPlainText(c.selection().toPlainText()) self.highlighter.setInitialState(tokeniter.state(cursortools.block(cursor))) self.highlighter.setHighlighting(metainfo.info(cursor.document()).highlighting) self.highlighter.rehighlight() # let autocomplete query the real document as if we're at the start # of the current block self.completer.document_cursor = QTextCursor(cursor.block()) self.completer.autoComplete = QSettings().value("autocomplete", True, bool) cursor = self.view.textCursor() cursor.setPosition(max(0, cursorpos-indentpos)) self.view.setTextCursor(cursor) self.updateMessage()
def actionTriggered(self, name): # convert arpeggio_normal to arpeggioNormal, etc. name = _arpeggioTypes[name] cursor = self.mainwindow().textCursor() # which arpeggio type is last used? lastused = '\\arpeggioNormal' types = set(_arpeggioTypes.values()) block = cursor.block() while block.isValid(): s = types.intersection(tokeniter.tokens(block)) if s: lastused = s.pop() break block = block.previous() # where to insert c = lydocument.cursor(cursor) c.select_end_of_block() with cursortools.compress_undo(cursor): for item in ly.rhythm.music_items(c, partial=ly.document.OUTSIDE): c = QTextCursor(cursor.document()) c.setPosition(item.end) c.insertText('\\arpeggio') if name != lastused: cursortools.strip_indent(c) indent = c.block().text()[:c.position() - c.block().position()] c.insertText(name + '\n' + indent) # just pick the first place return
def edit(self, cursor): """Edit the block at the specified QTextCursor.""" if self._document: self._document.closed.disconnect(self.reject) self._document = cursor.document() self._document.closed.connect(self.reject) # don't change the cursor c = self._range = QTextCursor(cursor) cursorpos = c.position() - c.block().position() cursortools.strip_indent(c) indentpos = c.position() - c.block().position() c.movePosition(QTextCursor.EndOfBlock, QTextCursor.KeepAnchor) self.view.setPlainText(c.selection().toPlainText()) self.highlighter.setInitialState( tokeniter.state(cursortools.block(cursor))) self.highlighter.setHighlighting( metainfo.info(cursor.document()).highlighting) self.highlighter.rehighlight() # let autocomplete query the real document as if we're at the start # of the current block self.completer.document_cursor = QTextCursor(cursor.block()) self.completer.autoComplete = QSettings().value("autocomplete", True) not in ('false', False) cursor = self.view.textCursor() cursor.setPosition(max(0, cursorpos - indentpos)) self.view.setTextCursor(cursor) self.updateMessage()
def actionTriggered(self, name): # convert arpeggio_normal to arpeggioNormal, etc. name = _arpeggioTypes[name] cursor = self.mainwindow().textCursor() # which arpeggio type is last used? lastused = '\\arpeggioNormal' types = set(_arpeggioTypes.values()) block = cursor.block() while block.isValid(): s = types.intersection(tokeniter.tokens(block)) if s: lastused = s.pop() break block = block.previous() # where to insert c = lydocument.cursor(cursor) c.select_end_of_block() source = lydocument.Source(c, True, ly.document.OUTSIDE, True) with cursortools.compress_undo(cursor): for p in ly.rhythm.music_tokens(source): c = source.cursor(p[-1], start=len(p[-1])) c.insertText('\\arpeggio') if name != lastused: cursortools.strip_indent(c) indent = c.block().text()[:c.position()-c.block().position()] c.insertText(name + '\n' + indent) # just pick the first place return
def event(self, ev): """General event handler. This is reimplemented to: - prevent inserting the hard line separator, which makes no sense in plain text - prevent handling Undo and Redo, they work better via the menu actions - handle Tab and Backtab to change the indent """ if ev in ( # avoid the line separator, makes no sense in plain text QKeySequence.InsertLineSeparator, # those can better be called via the menu actions, then they # work better QKeySequence.Undo, QKeySequence.Redo, ): return False # handle Tab and Backtab if ev.type() == QEvent.KeyPress: cursor = self.textCursor() if ev.key() == Qt.Key_Tab and ev.modifiers() == Qt.NoModifier: # tab pressed, insert a tab when no selection and in text, # else increase the indent if not cursor.hasSelection(): block = cursor.block() text = block.text()[:cursor.position() - block.position()] if text and not text.isspace(): if variables.get(self.document(), 'document-tabs', True): cursor.insertText('\t') else: tabwidth = variables.get(self.document(), 'tab-width', 8) spaces = tabwidth - len( text.expandtabs(tabwidth)) % tabwidth cursor.insertText(' ' * spaces) self.setTextCursor(cursor) return True import indent indent.increase_indent(cursor) if not cursor.hasSelection(): cursortools.strip_indent(cursor) self.setTextCursor(cursor) return True elif ev.key() == Qt.Key_Backtab and ev.modifiers( ) == Qt.ShiftModifier: # shift-tab pressed, decrease the indent import indent indent.decrease_indent(cursor) if not cursor.hasSelection(): cursortools.strip_indent(cursor) self.setTextCursor(cursor) return True return super(View, self).event(ev)
def event(self, ev): """General event handler. This is reimplemented to: - prevent inserting the hard line separator, which makes no sense in plain text - prevent handling Undo and Redo, they work better via the menu actions - handle Tab and Backtab to change the indent """ if ev in ( # avoid the line separator, makes no sense in plain text QKeySequence.InsertLineSeparator, # those can better be called via the menu actions, then they # work better QKeySequence.Undo, QKeySequence.Redo, ): return False # handle Tab and Backtab if ev.type() == QEvent.KeyPress: cursor = self.textCursor() if ev.key() == Qt.Key_Tab and ev.modifiers() == Qt.NoModifier: # tab pressed, insert a tab when no selection and in text, # else increase the indent if not cursor.hasSelection(): block = cursor.block() text = block.text()[:cursor.position() - block.position()] if text and not text.isspace(): if variables.get(self.document(), 'document-tabs', True): cursor.insertText('\t') else: tabwidth = variables.get(self.document(), 'tab-width', 8) spaces = tabwidth - len(text.expandtabs(tabwidth)) % tabwidth cursor.insertText(' ' * spaces) self.setTextCursor(cursor) return True import indent indent.increase_indent(cursor) if not cursor.hasSelection(): cursortools.strip_indent(cursor) self.setTextCursor(cursor) return True elif ev.key() == Qt.Key_Backtab and ev.modifiers() == Qt.ShiftModifier: # shift-tab pressed, decrease the indent import indent indent.decrease_indent(cursor) if not cursor.hasSelection(): cursortools.strip_indent(cursor) self.setTextCursor(cursor) return True return super(View, self).event(ev)