From 3b231978bf691dd34652343dd27b02e304945674 Mon Sep 17 00:00:00 2001
From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com>
Date: Sat, 16 May 2020 23:58:55 +0200
Subject: [PATCH] Several improvements to the status bar
---
.../icons/fallback/status_stats-dark.svg | 56 +++++
nw/assets/icons/fallback/status_stats.svg | 56 +++++
nw/gui/icons.py | 1 +
nw/gui/statusbar.py | 213 ++++++++++++------
4 files changed, 261 insertions(+), 65 deletions(-)
create mode 100644 nw/assets/icons/fallback/status_stats-dark.svg
create mode 100644 nw/assets/icons/fallback/status_stats.svg
diff --git a/nw/assets/icons/fallback/status_stats-dark.svg b/nw/assets/icons/fallback/status_stats-dark.svg
new file mode 100644
index 00000000..81fd5b96
--- /dev/null
+++ b/nw/assets/icons/fallback/status_stats-dark.svg
@@ -0,0 +1,56 @@
+
+
diff --git a/nw/assets/icons/fallback/status_stats.svg b/nw/assets/icons/fallback/status_stats.svg
new file mode 100644
index 00000000..a6727601
--- /dev/null
+++ b/nw/assets/icons/fallback/status_stats.svg
@@ -0,0 +1,56 @@
+
+
diff --git a/nw/gui/icons.py b/nw/gui/icons.py
index 35bc8122..c1a791d1 100644
--- a/nw/gui/icons.py
+++ b/nw/gui/icons.py
@@ -60,6 +60,7 @@ class GuiIcons:
"proj_folder" : (QStyle.SP_DirIcon, "folder"),
"status_lang" : (None, None),
"status_time" : (None, None),
+ "status_stats" : (None, None),
## Button Icons
"folder-open" : (QStyle.SP_DirOpenIcon, "folder-open"),
"delete" : (QStyle.SP_DialogDiscardButton, "edit-delete"),
diff --git a/nw/gui/statusbar.py b/nw/gui/statusbar.py
index 70aa0b90..6d104357 100644
--- a/nw/gui/statusbar.py
+++ b/nw/gui/statusbar.py
@@ -31,10 +31,11 @@ import nw
from time import time
from PyQt5.QtCore import Qt, QTimer
-from PyQt5.QtGui import QColor, QPixmap, QFont
-from PyQt5.QtWidgets import qApp, QStatusBar, QLabel
+from PyQt5.QtGui import QColor, QPixmap, QFont, QPainter
+from PyQt5.QtWidgets import qApp, QStatusBar, QLabel, QAbstractButton
from nw.core import NWSpellCheck
+from nw.common import formatInt
logger = logging.getLogger(__name__)
@@ -49,59 +50,71 @@ class GuiMainStatus(QStatusBar):
self.theParent = theParent
self.refTime = None
- self.iconGrey = QPixmap(16,16)
- self.iconYellow = QPixmap(16,16)
- self.iconGreen = QPixmap(16,16)
+ self.charCount = 0
+ self.wordCount = 0
+ self.paraCount = 0
+ self.projWords = 0
+ self.sessWords = 0
self.monoFont = QFont("Monospace",10)
- self.iconGrey.fill(QColor(*self.theParent.theTheme.statNone))
- self.iconYellow.fill(QColor(*self.theParent.theTheme.statUnsaved))
- self.iconGreen.fill(QColor(*self.theParent.theTheme.statSaved))
+ colNone = QColor(*self.theParent.theTheme.statNone)
+ colTrue = QColor(*self.theParent.theTheme.statUnsaved)
+ colFalse = QColor(*self.theParent.theTheme.statSaved)
- self.boxStats = QLabel()
- self.boxStats.setToolTip("Project Word Count | Session Word Count")
+ # Permanent Widgets
+ # =================
- self.timeBox = QLabel("")
- 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")
+ ## The Spell Checker Language
self.langIcon = QLabel("")
+ self.langText = QLabel("None")
self.langIcon.setPixmap(self.theParent.theTheme.getPixmap("status_lang",(14,14)))
-
- # Add Them
+ self.langIcon.setContentsMargins(0, 0, 0, 0)
+ self.langText.setContentsMargins(0, 0, 8, 0)
self.addPermanentWidget(self.langIcon)
- self.addPermanentWidget(self.langBox)
- 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)
+ self.addPermanentWidget(self.langText)
+ ## 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)
+ # Start the Clock
self.sessionTimer = QTimer()
self.sessionTimer.setInterval(1000)
self.sessionTimer.timeout.connect(self._updateTime)
@@ -141,53 +154,72 @@ class GuiMainStatus(QStatusBar):
"""Set the language code for the spell checker.
"""
if theLanguage is None:
- self.langBox.setText("None")
+ self.langText.setText("None")
else:
- self.langBox.setText(NWSpellCheck.expandLanguage(theLanguage))
+ self.langText.setText(NWSpellCheck.expandLanguage(theLanguage))
return
def setProjectStatus(self, isChanged):
"""Set the project status colour icon.
"""
- if isChanged is None:
- 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)
+ self.projIcon.setState(isChanged)
return
def setDocumentStatus(self, isChanged):
"""Set the document status colour icon.
"""
- if isChanged is None:
- 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)
+ self.docIcon.setState(isChanged)
return
def setStats(self, pWC, sWC):
"""Set the current project statistics.
"""
- self.boxStats.setText("Project: {:d} : {:d}".format(pWC,sWC))
+ self.projWords = pWC
+ self.sessWords = sWC
+ self._updateStats()
return
def setCounts(self, cC, wC, pC):
"""Set the current document statistics.
"""
- self.boxCounts.setText("Document: {:d} : {:d} : {:d}".format(cC,wC,pC))
+ self.charCount = cC
+ self.wordCount = wC
+ self.paraCount = pC
+ self._updateStats()
return
##
# Internal Functions
##
+ def _updateStats(self):
+ """Update statistics.
+ """
+ self.statsText.setToolTip((
+ "Document Stats
"
+ "Characters: {cC:n}
"
+ "Words: {wC:n}
"
+ "Paragraphs: {pC:n}
"
+ "
"
+ "Project Stats
"
+ "Words Total: {pWC:n}
"
+ "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):
"""Update the session clock.
"""
@@ -201,7 +233,58 @@ class GuiMainStatus(QStatusBar):
tM = tM - tH*60
tS = tS - tM*60 - tH*3600
theTime = "%02d:%02d:%02d" % (tH,tM,tS)
- self.timeBox.setText(theTime)
+ self.timeText.setText(theTime)
return
# 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