Several improvements to the status bar

This commit is contained in:
Veronica K. B. Olsen
2020-05-16 23:58:55 +02:00
parent 4dc768bdd2
commit 3b231978bf
4 changed files with 261 additions and 65 deletions
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)"
sodipodi:docname="status_stats-dark.svg"
id="svg1983"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata1989">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs1987" />
<sodipodi:namedview
inkscape:current-layer="svg1983"
inkscape:window-maximized="1"
inkscape:window-y="0"
inkscape:window-x="0"
inkscape:cy="10.95082"
inkscape:cx="12"
inkscape:zoom="38.125"
showgrid="false"
id="namedview1985"
inkscape:window-height="1344"
inkscape:window-width="2560"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#ffffff" />
<path
style="stroke-width:1.26319;fill:#aeaeae;fill-opacity:1"
inkscape:connector-curvature="0"
id="path1981"
d="m 14.526375,2.5260936 c 0,-1.3958223 -1.131816,-2.5263751 -2.526375,-2.5263751 -1.394559,0 -2.526375,1.1305528 -2.526375,2.5263751 V 17.684345 h 5.05275 z m 6.315937,5.0527501 c 0,-1.3958223 -1.131815,-2.5263751 -2.526374,-2.5263751 -1.39456,0 -2.526375,1.1305528 -2.526375,2.5263751 V 17.684345 h 5.052749 z M 8.210437,11.368407 c 0,-1.3958225 -1.1318154,-2.5263765 -2.5263744,-2.5263765 -1.394559,0 -2.5263751,1.130554 -2.5263751,2.5263765 v 6.315938 H 8.210437 Z M 20.842312,21.473906 H 3.1576875 c -0.6985427,0 -1.2631875,0.564645 -1.2631875,1.263187 0,0.698543 0.5646448,1.263188 1.2631875,1.263188 H 20.842312 c 0.698544,0 1.263188,-0.564645 1.263188,-1.263188 0,-0.698542 -0.564644,-1.263187 -1.263188,-1.263187 z" />
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+56
View File
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.0rc1 (09960d6f05, 2020-04-09)"
sodipodi:docname="status_stats.svg"
id="svg1983"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata1989">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs1987" />
<sodipodi:namedview
inkscape:current-layer="svg1983"
inkscape:window-maximized="1"
inkscape:window-y="0"
inkscape:window-x="0"
inkscape:cy="10.95082"
inkscape:cx="12"
inkscape:zoom="38.125"
showgrid="false"
id="namedview1985"
inkscape:window-height="1344"
inkscape:window-width="2560"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#ffffff" />
<path
style="stroke-width:1.26319;fill:#000000;fill-opacity:0.72000003"
inkscape:connector-curvature="0"
id="path1981"
d="m 14.526375,2.5260936 c 0,-1.3958223 -1.131816,-2.5263751 -2.526375,-2.5263751 -1.394559,0 -2.526375,1.1305528 -2.526375,2.5263751 V 17.684345 h 5.05275 z m 6.315937,5.0527501 c 0,-1.3958223 -1.131815,-2.5263751 -2.526374,-2.5263751 -1.39456,0 -2.526375,1.1305528 -2.526375,2.5263751 V 17.684345 h 5.052749 z M 8.210437,11.368407 c 0,-1.3958225 -1.1318154,-2.5263765 -2.5263744,-2.5263765 -1.394559,0 -2.5263751,1.130554 -2.5263751,2.5263765 v 6.315938 H 8.210437 Z M 20.842312,21.473906 H 3.1576875 c -0.6985427,0 -1.2631875,0.564645 -1.2631875,1.263187 0,0.698543 0.5646448,1.263188 1.2631875,1.263188 H 20.842312 c 0.698544,0 1.263188,-0.564645 1.263188,-1.263188 0,-0.698542 -0.564644,-1.263187 -1.263188,-1.263187 z" />
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+1
View File
@@ -60,6 +60,7 @@ class GuiIcons:
"proj_folder" : (QStyle.SP_DirIcon, "folder"), "proj_folder" : (QStyle.SP_DirIcon, "folder"),
"status_lang" : (None, None), "status_lang" : (None, None),
"status_time" : (None, None), "status_time" : (None, None),
"status_stats" : (None, None),
## Button Icons ## Button Icons
"folder-open" : (QStyle.SP_DirOpenIcon, "folder-open"), "folder-open" : (QStyle.SP_DirOpenIcon, "folder-open"),
"delete" : (QStyle.SP_DialogDiscardButton, "edit-delete"), "delete" : (QStyle.SP_DialogDiscardButton, "edit-delete"),
+148 -65
View File
@@ -31,10 +31,11 @@ import nw
from time import time from time import time
from PyQt5.QtCore import Qt, QTimer from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QColor, QPixmap, QFont from PyQt5.QtGui import QColor, QPixmap, QFont, QPainter
from PyQt5.QtWidgets import qApp, QStatusBar, QLabel from PyQt5.QtWidgets import qApp, QStatusBar, QLabel, QAbstractButton
from nw.core import NWSpellCheck from nw.core import NWSpellCheck
from nw.common import formatInt
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -49,59 +50,71 @@ class GuiMainStatus(QStatusBar):
self.theParent = theParent self.theParent = theParent
self.refTime = None self.refTime = None
self.iconGrey = QPixmap(16,16) self.charCount = 0
self.iconYellow = QPixmap(16,16) self.wordCount = 0
self.iconGreen = QPixmap(16,16) self.paraCount = 0
self.projWords = 0
self.sessWords = 0
self.monoFont = QFont("Monospace",10) self.monoFont = QFont("Monospace",10)
self.iconGrey.fill(QColor(*self.theParent.theTheme.statNone)) colNone = QColor(*self.theParent.theTheme.statNone)
self.iconYellow.fill(QColor(*self.theParent.theTheme.statUnsaved)) colTrue = QColor(*self.theParent.theTheme.statUnsaved)
self.iconGreen.fill(QColor(*self.theParent.theTheme.statSaved)) colFalse = QColor(*self.theParent.theTheme.statSaved)
self.boxStats = QLabel() # Permanent Widgets
self.boxStats.setToolTip("Project Word Count | Session Word Count") # =================
self.timeBox = QLabel("") ## The Spell Checker Language
self.timeBox.setToolTip("Session Time")
self.timeBox.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.timeBox.setFont(self.monoFont)
self.timeIcon = QLabel()
self.timeIcon.setPixmap(self.theParent.theTheme.getPixmap("status_time",(14,14)))
self.boxCounts = QLabel()
self.boxCounts.setToolTip("Document Character | Word | Paragraph Count")
self.projChanged = QLabel("")
self.projChanged.setFixedHeight(14)
self.projChanged.setFixedWidth(14)
self.projChanged.setToolTip("Project Changes Saved")
self.docChanged = QLabel("")
self.docChanged.setFixedHeight(14)
self.docChanged.setFixedWidth(14)
self.docChanged.setToolTip("Document Changes Saved")
self.langBox = QLabel("None")
self.langIcon = QLabel("") self.langIcon = QLabel("")
self.langText = QLabel("None")
self.langIcon.setPixmap(self.theParent.theTheme.getPixmap("status_lang",(14,14))) self.langIcon.setPixmap(self.theParent.theTheme.getPixmap("status_lang",(14,14)))
self.langIcon.setContentsMargins(0, 0, 0, 0)
# Add Them self.langText.setContentsMargins(0, 0, 8, 0)
self.addPermanentWidget(self.langIcon) self.addPermanentWidget(self.langIcon)
self.addPermanentWidget(self.langBox) self.addPermanentWidget(self.langText)
self.addPermanentWidget(QLabel(" "))
self.addPermanentWidget(self.docChanged)
self.addPermanentWidget(self.boxCounts)
self.addPermanentWidget(QLabel(" "))
self.addPermanentWidget(self.projChanged)
self.addPermanentWidget(self.boxStats)
self.addPermanentWidget(QLabel(" "))
self.addPermanentWidget(self.timeIcon)
self.addPermanentWidget(self.timeBox)
## The Editor Status
self.docIcon = StatusLED(colNone, colTrue, colFalse, 14, 14, self)
self.docText = QLabel("Editor")
self.docIcon.setContentsMargins(0, 0, 0, 0)
self.docText.setContentsMargins(0, 0, 8, 0)
self.addPermanentWidget(self.docIcon)
self.addPermanentWidget(self.docText)
## The Project Status
self.projIcon = StatusLED(colNone, colTrue, colFalse, 14, 14, self)
self.projText = QLabel("Project")
self.projIcon.setContentsMargins(0, 0, 0, 0)
self.projText.setContentsMargins(0, 0, 8, 0)
self.addPermanentWidget(self.projIcon)
self.addPermanentWidget(self.projText)
## The Project and Session Stats
self.statsIcon = QLabel()
self.statsText = QLabel("")
self.statsIcon.setPixmap(self.theParent.theTheme.getPixmap("status_stats",(14,14)))
self.statsIcon.setContentsMargins(0, 0, 0, 0)
self.statsText.setContentsMargins(0, 0, 8, 0)
self.addPermanentWidget(self.statsIcon)
self.addPermanentWidget(self.statsText)
## The Session Clock
self.timeIcon = QLabel()
self.timeText = QLabel("")
self.timeIcon.setPixmap(self.theParent.theTheme.getPixmap("status_time",(14,14)))
self.timeText.setToolTip("Session Time")
self.timeText.setAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.timeText.setFont(self.monoFont)
self.timeIcon.setContentsMargins(0, 0, 0, 0)
self.timeText.setContentsMargins(0, 0, 0, 0)
self.addPermanentWidget(self.timeIcon)
self.addPermanentWidget(self.timeText)
# Other Settings
self.setSizeGripEnabled(True) self.setSizeGripEnabled(True)
# Start the Clock
self.sessionTimer = QTimer() self.sessionTimer = QTimer()
self.sessionTimer.setInterval(1000) self.sessionTimer.setInterval(1000)
self.sessionTimer.timeout.connect(self._updateTime) self.sessionTimer.timeout.connect(self._updateTime)
@@ -141,53 +154,72 @@ class GuiMainStatus(QStatusBar):
"""Set the language code for the spell checker. """Set the language code for the spell checker.
""" """
if theLanguage is None: if theLanguage is None:
self.langBox.setText("None") self.langText.setText("None")
else: else:
self.langBox.setText(NWSpellCheck.expandLanguage(theLanguage)) self.langText.setText(NWSpellCheck.expandLanguage(theLanguage))
return return
def setProjectStatus(self, isChanged): def setProjectStatus(self, isChanged):
"""Set the project status colour icon. """Set the project status colour icon.
""" """
if isChanged is None: self.projIcon.setState(isChanged)
self.projChanged.setPixmap(self.iconGrey)
elif isChanged == True:
self.projChanged.setPixmap(self.iconYellow)
elif isChanged == False:
self.projChanged.setPixmap(self.iconGreen)
else:
self.projChanged.setPixmap(self.iconGrey)
return return
def setDocumentStatus(self, isChanged): def setDocumentStatus(self, isChanged):
"""Set the document status colour icon. """Set the document status colour icon.
""" """
if isChanged is None: self.docIcon.setState(isChanged)
self.docChanged.setPixmap(self.iconGrey)
elif isChanged == True:
self.docChanged.setPixmap(self.iconYellow)
elif isChanged == False:
self.docChanged.setPixmap(self.iconGreen)
else:
self.docChanged.setPixmap(self.iconGrey)
return return
def setStats(self, pWC, sWC): def setStats(self, pWC, sWC):
"""Set the current project statistics. """Set the current project statistics.
""" """
self.boxStats.setText("<b>Project:</b> {:d} : {:d}".format(pWC,sWC)) self.projWords = pWC
self.sessWords = sWC
self._updateStats()
return return
def setCounts(self, cC, wC, pC): def setCounts(self, cC, wC, pC):
"""Set the current document statistics. """Set the current document statistics.
""" """
self.boxCounts.setText("<b>Document:</b> {:d} : {:d} : {:d}".format(cC,wC,pC)) self.charCount = cC
self.wordCount = wC
self.paraCount = pC
self._updateStats()
return return
## ##
# Internal Functions # Internal Functions
## ##
def _updateStats(self):
"""Update statistics.
"""
self.statsText.setToolTip((
"<b>Document Stats</b><br>"
"Characters: {cC:n}<br>"
"Words: {wC:n}<br>"
"Paragraphs: {pC:n}<br>"
"<br>"
"<b>Project Stats</b><br>"
"Words Total: {pWC:n}<br>"
"This Session: {sWC:n}"
).format(
cC = self.charCount,
wC = self.wordCount,
pC = self.paraCount,
pWC = self.projWords,
sWC = self.sessWords,
))
self.statsText.setText((
"D:{wC:n} P:{pWC:n} S:{sWC:n}"
).format(
wC = self.wordCount,
pWC = self.projWords,
sWC = self.sessWords,
))
return
def _updateTime(self): def _updateTime(self):
"""Update the session clock. """Update the session clock.
""" """
@@ -201,7 +233,58 @@ class GuiMainStatus(QStatusBar):
tM = tM - tH*60 tM = tM - tH*60
tS = tS - tM*60 - tH*3600 tS = tS - tM*60 - tH*3600
theTime = "%02d:%02d:%02d" % (tH,tM,tS) theTime = "%02d:%02d:%02d" % (tH,tM,tS)
self.timeBox.setText(theTime) self.timeText.setText(theTime)
return return
# END Class GuiMainStatus # END Class GuiMainStatus
class StatusLED(QAbstractButton):
def __init__(self, colNone, colTrue, colFalse, sW, sH, parent=None):
super().__init__(parent=parent)
self.colNone = colNone
self.colTrue = colTrue
self.colFalse = colFalse
self._theCol = colNone
self.setFixedWidth(sW)
self.setFixedHeight(sH)
return
##
# Getters and Setters
##
def setState(self, theState):
"""Set the colour state.
"""
if theState is None:
self._theCol = self.colNone
elif theState == True:
self._theCol = self.colTrue
elif theState == False:
self._theCol = self.colFalse
else:
self._theCol = self.colNone
self.update()
return
##
# Events
##
def paintEvent(self, event):
"""Drawing the LED.
"""
qPalette = self.palette()
qPaint = QPainter(self)
qPaint.setRenderHint(QPainter.Antialiasing, True)
qPaint.setPen(qPalette.dark().color())
qPaint.setBrush(self._theCol)
qPaint.setOpacity(1.0)
qPaint.drawEllipse(1, 1, self.width()-2, self.height()-2)
return
# END Class StatusLED