Several improvements to the status bar
This commit is contained in:
@@ -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 |
@@ -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 |
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user