From a64d867ed42750948ff58f643be4ca846f13e631 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Thu, 18 Jun 2020 19:30:02 +0200 Subject: [PATCH] Added a quote symbol selection dialog --- nw/constants/constants.py | 45 +++++++++-------- nw/gui/custom.py | 104 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 124 insertions(+), 25 deletions(-) diff --git a/nw/constants/constants.py b/nw/constants/constants.py index 9bd47110..b05f8e6d 100644 --- a/nw/constants/constants.py +++ b/nw/constants/constants.py @@ -169,27 +169,30 @@ class nwQuotes(): Source: https://en.wikipedia.org/wiki/Quotation_mark """ - SYMBOLS = [ - "\u0022", # Quotation mark - "\u0027", # Apostrophe - "\u00ab", # Left-pointing double angle quotation mark - "\u00bb", # Right-pointing double angle quotation mark - "\u2018", # Left single quotation mark - "\u2019", # Right single quotation mark - "\u201a", # Single low-9 quotation mark - "\u201b", # Single high-reversed-9 quotation mark - "\u201c", # Left double quotation mark - "\u201d", # Right double quotation mark - "\u201e", # Double low-9 quotation mark - "\u201f", # Double high-reversed-9 quotation mark - "\u2039", # Single left-pointing angle quotation mark - "\u203a", # Single right-pointing angle quotation mark - "\u2e42", # Double low-reversed-9 quotation mark - "\u300c", # Left corner bracket - "\u300d", # Right corner bracket - "\u300e", # Left white corner bracket - "\u300f", # Right white corner bracket - ] + SYMBOLS = { + "\u0027" : "Straight single quotation mark", + "\u0022" : "Straight double quotation mark", + + "\u2018" : "Left single quotation mark", + "\u2019" : "Right single quotation mark", + "\u201a" : "Single low-9 quotation mark", + "\u201b" : "Single high-reversed-9 quotation mark", + "\u201c" : "Left double quotation mark", + "\u201d" : "Right double quotation mark", + "\u201e" : "Double low-9 quotation mark", + "\u201f" : "Double high-reversed-9 quotation mark", + "\u2e42" : "Double low-reversed-9 quotation mark", + + "\u2039" : "Single left-pointing angle quotation mark", + "\u203a" : "Single right-pointing angle quotation mark", + "\u00ab" : "Left-pointing double angle quotation mark", + "\u00bb" : "Right-pointing double angle quotation mark", + + "\u300c" : "Left corner bracket", + "\u300d" : "Right corner bracket", + "\u300e" : "Left white corner bracket", + "\u300f" : "Right white corner bracket", + } # END Class nwQuotes diff --git a/nw/gui/custom.py b/nw/gui/custom.py index 5c3dfbd6..051fa1f3 100644 --- a/nw/gui/custom.py +++ b/nw/gui/custom.py @@ -30,17 +30,17 @@ import logging import nw -from PyQt5.QtGui import QColor, QPalette, QPainter +from PyQt5.QtGui import QColor, QPalette, QPainter, QFontMetrics from PyQt5.QtCore import ( Qt, QRect, QPoint, QSize, QRectF, QPropertyAnimation, pyqtProperty ) from PyQt5.QtWidgets import ( QGridLayout, QLabel, QWidget, QVBoxLayout, QHBoxLayout, QSizePolicy, - QAbstractButton, QDialog, QTabWidget, QTabBar, QStyle, - QStylePainter, QStyleOptionTab + QAbstractButton, QDialog, QTabWidget, QTabBar, QStyle, QDialogButtonBox, + QStylePainter, QStyleOptionTab, QListWidget, QListWidgetItem, QFrame ) -from nw.constants import nwUnicode +from nw.constants import nwUnicode, nwQuotes logger = logging.getLogger(__name__) @@ -436,3 +436,99 @@ class VerticalTabBar(QTabBar): return # END Class VerticalTabBar + +# =============================================================================================== # +# Quotes Dialog +# =============================================================================================== # + +class QuotesDialog(QDialog): + + def __init__(self, theParent=None, currentQuote="\""): + QDialog.__init__(self, parent=theParent) + + self.mainConf = nw.CONFIG + + self.outerBox = QVBoxLayout() + self.innerBox = QHBoxLayout() + self.labelBox = QVBoxLayout() + + self.selectedQuote = currentQuote + + qMetrics = QFontMetrics(self.font()) + pxW = 7*qMetrics.boundingRectChar("M").width() + pxH = 7*qMetrics.boundingRectChar("M").height() + pxH = 7*qMetrics.boundingRectChar("M").height() + + lblFont = self.font() + lblFont.setPointSizeF(4*lblFont.pointSizeF()) + + # Preview Label + self.previewLabel = QLabel(currentQuote) + self.previewLabel.setFont(lblFont) + self.previewLabel.setFixedSize(QSize(pxW, pxH)) + self.previewLabel.setAlignment(Qt.AlignCenter) + self.previewLabel.setFrameStyle(QFrame.Box | QFrame.Plain) + + # Quote Symbols + self.listBox = QListWidget() + self.listBox.itemSelectionChanged.connect(self._selectedSymbol) + + minSize = 100 + for sKey, sLabel in nwQuotes.SYMBOLS.items(): + theText = "[ %s ] %s" % (sKey, sLabel) + minSize = max(minSize, qMetrics.boundingRect(theText).width()) + qtItem = QListWidgetItem(theText) + qtItem.setData(Qt.UserRole, sKey) + self.listBox.addItem(qtItem) + if sKey == currentQuote: + self.listBox.setCurrentItem(qtItem) + + self.listBox.setMinimumWidth(minSize + self.mainConf.pxInt(40)) + self.listBox.setMinimumHeight(self.mainConf.pxInt(150)) + + # Buttons + self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + self.buttonBox.accepted.connect(self._doAccept) + self.buttonBox.rejected.connect(self._doReject) + + # Assemble + self.labelBox.addWidget(self.previewLabel, 0, Qt.AlignTop) + self.labelBox.addStretch(1) + + self.innerBox.addLayout(self.labelBox) + self.innerBox.addWidget(self.listBox) + + self.outerBox.addLayout(self.innerBox) + self.outerBox.addWidget(self.buttonBox) + + self.setLayout(self.outerBox) + + return + + ## + # Slots + ## + + def _selectedSymbol(self): + """Update the preview label and the selected quote style. + """ + selItems = self.listBox.selectedItems() + if selItems: + theSymbol = selItems[0].data(Qt.UserRole) + self.previewLabel.setText(theSymbol) + self.selectedQuote = theSymbol + return + + def _doAccept(self): + """Ok button clicked. + """ + self.accept() + return + + def _doReject(self): + """Cancel button clicked. + """ + self.reject() + return + +# END Class QuotesDialog