def contextMenuEvent(self, event): if event.modifiers() & Qt.AltModifier: menu = QMenu(event.widget()) menu.setAttribute(Qt.WA_DeleteOnClose) formatmenu = menu.addMenu("Render as") group = QActionGroup(self, exclusive=True) def makeaction(text, parent, data=None, **kwargs): action = QAction(text, parent, **kwargs) if data is not None: action.setData(data) return action formatactions = [ makeaction( "Plain Text", group, checkable=True, toolTip=self.tr("Render contents as plain text"), data="text/plain", ), makeaction( "HTML", group, checkable=True, toolTip=self.tr("Render contents as HTML"), data="text/html", ), makeaction( "RST", group, checkable=True, toolTip=self.tr("Render contents as RST " "(reStructuredText)"), data="text/rst", ), makeaction( "Markdown", group, checkable=True, toolTip=self.tr("Render contents as Markdown"), data="text/markdown", ), ] for action in formatactions: action.setChecked(action.data() == self.__contentType.lower()) formatmenu.addAction(action) def ontriggered(action): mimetype = action.data() content = self.content() self.setContent(content, mimetype) self.editingFinished.emit() menu.triggered.connect(ontriggered) menu.popup(event.screenPos()) event.accept() else: event.ignore()
def contextMenuEvent(self, event): if event.modifiers() & Qt.AltModifier: menu = QMenu(event.widget()) menu.setAttribute(Qt.WA_DeleteOnClose) formatmenu = menu.addMenu("Render as") group = QActionGroup(self, exclusive=True) def makeaction(text, parent, data=None, **kwargs): action = QAction(text, parent, **kwargs) if data is not None: action.setData(data) return action formatactions = [ makeaction("Plain Text", group, checkable=True, toolTip=self.tr("Render contents as plain text"), data="text/plain"), makeaction("HTML", group, checkable=True, toolTip=self.tr("Render contents as HTML"), data="text/html"), makeaction("RST", group, checkable=True, toolTip=self.tr("Render contents as RST " "(reStructuredText)"), data="text/rst"), makeaction("Markdown", group, checkable=True, toolTip=self.tr("Render contents as Markdown"), data="text/markdown") ] for action in formatactions: action.setChecked(action.data() == self.__contentType.lower()) formatmenu.addAction(action) def ontriggered(action): mimetype = action.data() content = self.content() self.setContent(content, mimetype) self.editingFinished.emit() menu.triggered.connect(ontriggered) menu.popup(event.screenPos()) event.accept() else: event.ignore()
def _on_view_context_menu(self, pos): widget = self.scene.widget if widget is None: return assert isinstance(widget, HeatmapGridWidget) menu = QMenu(self.view.viewport()) menu.setAttribute(Qt.WA_DeleteOnClose) menu.addActions(self.view.actions()) menu.addSeparator() menu.addActions([self.__font_inc, self.__font_dec]) menu.addSeparator() a = QAction("Keep aspect ratio", menu, checkable=True) a.setChecked(self.keep_aspect) def ontoggled(state): self.keep_aspect = state self.__aspect_mode_changed() a.toggled.connect(ontoggled) menu.addAction(a) menu.popup(self.view.viewport().mapToGlobal(pos))
def createStandardContextMenu(item: QGraphicsTextItem, pos: QPointF, parent: Optional[QWidget] = None, acceptRichText=False) -> Optional[QMenu]: """ Like the private QWidgetTextControl::createStandardContextMenu """ def setActionIcon(action: QAction, name: str): icon = QIcon.fromTheme(name) if not icon.isNull(): action.setIcon(icon) def createMimeDataFromSelection( fragment: QTextDocumentFragment) -> QMimeData: mime = QMimeData() mime.setText(fragment.toPlainText()) mime.setHtml(fragment.toHtml(b"utf-8")) # missing here is odf return mime def copy(): cursor = item.textCursor() if cursor.hasSelection(): mime = createMimeDataFromSelection(QTextDocumentFragment(cursor)) QApplication.clipboard().setMimeData(mime) def cut(): copy() item.textCursor().removeSelectedText() def copyLinkLocation(): mime = QMimeData() mime.setText(link) QApplication.clipboard().setMimeData(mime) def canPaste(): mime = QApplication.clipboard().mimeData() return mime.hasFormat("text/plain") or mime.hasFormat("text/html") def paste(): mime = QApplication.clipboard().mimeData() if mime is not None: insertFromMimeData(mime) def insertFromMimeData(mime: QMimeData): fragment: Optional[QTextDocumentFragment] = None if mime.hasHtml() and acceptRichText: fragment = QTextDocumentFragment.fromHtml(mime.html()) elif mime.hasText(): fragment = QTextDocumentFragment.fromPlainText(mime.text()) if fragment is not None: item.textCursor().insertFragment(fragment) def deleteSelected(): cursor = item.textCursor() cursor.removeSelectedText() def selectAll(): cursor = item.textCursor() cursor.select(QTextCursor.Document) item.setTextCursor(cursor) def addAction(menu: QMenu, text: str, slot: Callable[[], Any], shortcut: Optional[QKeySequence.StandardKey] = None, enabled=True, objectName="", icon="") -> QAction: ac = menu.addAction(text) ac.triggered.connect(slot) ac.setEnabled(enabled) if shortcut: ac.setShortcut(shortcut) if objectName: ac.setObjectName(objectName) if icon: setActionIcon(ac, icon) return ac flags = item.textInteractionFlags() showTextSelectionActions = flags & (Qt.TextEditable | Qt.TextSelectableByKeyboard | Qt.TextSelectableByMouse) doc = item.document() cursor = item.textCursor() assert doc is not None layout = doc.documentLayout() link = layout.anchorAt(pos) if not link and not showTextSelectionActions: return None menu = QMenu(parent) menu.setAttribute(Qt.WA_DeleteOnClose) if flags & Qt.TextEditable: addAction( menu, "&Undo", doc.undo, shortcut=QKeySequence.Undo, enabled=doc.isUndoAvailable(), objectName="edit-undo", icon="edit-undo", ) addAction( menu, "&Redo", doc.redo, shortcut=QKeySequence.Redo, enabled=doc.isRedoAvailable(), objectName="edit-redo", icon="edit-redo", ) menu.addSeparator() addAction( menu, "Cu&t", cut, shortcut=QKeySequence.Cut, enabled=cursor.hasSelection(), objectName="edit-cut", icon="edit-cut", ) if showTextSelectionActions: addAction(menu, "&Copy", copy, shortcut=QKeySequence.Copy, enabled=cursor.hasSelection(), objectName="edit-copy", icon="edit-copy") if flags & (Qt.LinksAccessibleByMouse | Qt.LinksAccessibleByKeyboard): addAction( menu, "Copy &Link Location", copyLinkLocation, enabled=bool(link), objectName="link-copy", ) if flags & Qt.TextEditable: addAction( menu, "&Paste", paste, shortcut=QKeySequence.Paste, enabled=canPaste(), objectName="edit-paste", icon="edit-paste", ) addAction( menu, "Delete", deleteSelected, enabled=cursor.hasSelection(), objectName="edit-delete", icon="edit-delete", ) if showTextSelectionActions: addAction( menu, "Select All", selectAll, shortcut=QKeySequence.SelectAll, enabled=not doc.isEmpty(), objectName="select-all", ) return menu