Project tree status and total word count changes (#882)
* Fix some inconsistencies in source file docstrings * Remove the option to show status text in project tree * Change how total word counts are calculated and propagated * Fix tests and improve coverage * Add setting in preferences * Add missing word count timer to config file
This commit is contained in:
committed by
GitHub
parent
b9311e84ce
commit
3c8cb34b0a
@@ -1,5 +1,5 @@
|
||||
[Main]
|
||||
timestamp = 2021-08-30 21:27:27
|
||||
timestamp = 2021-09-10 00:23:50
|
||||
theme = default
|
||||
syntax = default_light
|
||||
icons = typicons_light
|
||||
@@ -26,7 +26,6 @@ fullscreen = False
|
||||
[Project]
|
||||
autosaveproject = 60
|
||||
autosavedoc = 30
|
||||
fullstatus = True
|
||||
emphlabels = True
|
||||
|
||||
[Editor]
|
||||
@@ -57,7 +56,9 @@ spellcheck = en
|
||||
showtabsnspaces = False
|
||||
showlineendings = False
|
||||
showmultispaces = True
|
||||
wordcounttimer = 5.0
|
||||
bigdoclimit = 800
|
||||
incnoteswcount = True
|
||||
showfullpath = True
|
||||
highlightquotes = True
|
||||
allowopensquote = False
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
[Main]
|
||||
timestamp = 2021-08-30 21:45:17
|
||||
timestamp = 2021-09-10 00:23:52
|
||||
theme = default
|
||||
syntax = default_light
|
||||
icons = typicons_light
|
||||
@@ -26,7 +26,6 @@ fullscreen = False
|
||||
[Project]
|
||||
autosaveproject = 40
|
||||
autosavedoc = 20
|
||||
fullstatus = True
|
||||
emphlabels = True
|
||||
|
||||
[Editor]
|
||||
@@ -57,7 +56,9 @@ spellcheck = en
|
||||
showtabsnspaces = True
|
||||
showlineendings = True
|
||||
showmultispaces = True
|
||||
wordcounttimer = 5.0
|
||||
bigdoclimit = 500
|
||||
incnoteswcount = True
|
||||
showfullpath = False
|
||||
highlightquotes = False
|
||||
allowopensquote = False
|
||||
|
||||
@@ -482,6 +482,7 @@ def testBaseCommon_NWConfigParser(fncDir):
|
||||
"boolopt4 = 0\n"
|
||||
"list1 = a, b, c\n"
|
||||
"list2 = 17, 18, 19\n"
|
||||
"float1 = 4.2\n"
|
||||
))
|
||||
|
||||
cfgParser = NWConfigParser()
|
||||
@@ -516,6 +517,14 @@ def testBaseCommon_NWConfigParser(fncDir):
|
||||
assert cfgParser.rdInt("nope", "intopt1", 13) == 13
|
||||
assert cfgParser.rdInt("main", "blabla", 13) == 13
|
||||
|
||||
# Read Float
|
||||
assert cfgParser.rdFlt("main", "intopt1", 13.0) == 42.0
|
||||
assert cfgParser.rdFlt("main", "float1", 13.0) == 4.2
|
||||
assert cfgParser.rdInt("main", "stropt", 13.0) == 13.0
|
||||
|
||||
assert cfgParser.rdInt("nope", "intopt1", 13.0) == 13.0
|
||||
assert cfgParser.rdInt("main", "blabla", 13.0) == 13.0
|
||||
|
||||
# Read String List
|
||||
assert cfgParser.rdStrList("main", "list1", []) == []
|
||||
assert cfgParser.rdStrList("main", "list1", ["x"]) == ["a"]
|
||||
|
||||
@@ -519,24 +519,24 @@ def testBaseConfig_SettersGetters(tmpConf, tmpDir, outDir, refDir):
|
||||
# Flag Setters
|
||||
# ============
|
||||
|
||||
assert not tmpConf.setShowRefPanel(False)
|
||||
assert not tmpConf.showRefPanel
|
||||
assert tmpConf.setShowRefPanel(True)
|
||||
assert tmpConf.setShowRefPanel(False) is False
|
||||
assert tmpConf.showRefPanel is False
|
||||
assert tmpConf.setShowRefPanel(True) is True
|
||||
|
||||
assert not tmpConf.setViewComments(False)
|
||||
assert not tmpConf.viewComments
|
||||
assert tmpConf.setViewComments(True)
|
||||
assert tmpConf.setViewComments(False) is False
|
||||
assert tmpConf.viewComments is False
|
||||
assert tmpConf.setViewComments(True) is True
|
||||
|
||||
assert not tmpConf.setViewSynopsis(False)
|
||||
assert not tmpConf.viewSynopsis
|
||||
assert tmpConf.setViewSynopsis(True)
|
||||
assert tmpConf.setViewSynopsis(False) is False
|
||||
assert tmpConf.viewSynopsis is False
|
||||
assert tmpConf.setViewSynopsis(True) is True
|
||||
|
||||
# Check Final File
|
||||
# ================
|
||||
|
||||
assert tmpConf.confChanged
|
||||
assert tmpConf.saveConfig()
|
||||
assert not tmpConf.confChanged
|
||||
assert tmpConf.confChanged is True
|
||||
assert tmpConf.saveConfig() is True
|
||||
assert tmpConf.confChanged is False
|
||||
|
||||
copyfile(confFile, testFile)
|
||||
assert cmpFiles(testFile, compFile, [2, 9, 10])
|
||||
|
||||
@@ -868,12 +868,9 @@ def testCoreProject_Methods(monkeypatch, nwMinimal, mockGUI, tmpDir):
|
||||
assert theProject.statusItems._theCounts == [1, 1, 1, 2, 0]
|
||||
assert theProject.importItems._theCounts == [3, 0, 0, 1, 0]
|
||||
|
||||
# Check word counts
|
||||
# Session stats
|
||||
theProject.currWCount = 200
|
||||
theProject.lastWCount = 100
|
||||
assert theProject.getSessionWordCount() == 100
|
||||
|
||||
# Session stats
|
||||
with monkeypatch.context() as mp:
|
||||
mp.setattr("os.path.isdir", lambda *a, **k: False)
|
||||
assert not theProject._appendSessionStats(idleTime=0)
|
||||
@@ -888,8 +885,8 @@ def testCoreProject_Methods(monkeypatch, nwMinimal, mockGUI, tmpDir):
|
||||
statsFile = os.path.join(theProject.projMeta, nwFiles.SESS_STATS)
|
||||
|
||||
theProject.projOpened = 1600002000
|
||||
theProject.novelWCount = 200
|
||||
theProject.notesWCount = 100
|
||||
theProject.currNovelWC = 200
|
||||
theProject.currNotesWC = 100
|
||||
|
||||
with monkeypatch.context() as mp:
|
||||
mp.setattr("novelwriter.core.project.time", lambda: 1600005600)
|
||||
|
||||
@@ -249,7 +249,7 @@ def testDlgPreferences_Main(qtbot, monkeypatch, fncDir, outDir, refDir):
|
||||
testFile = os.path.join(outDir, "guiPreferences_novelwriter.conf")
|
||||
compFile = os.path.join(refDir, "guiPreferences_novelwriter.conf")
|
||||
copyfile(projFile, testFile)
|
||||
ignoreLines = [2, 7, 9, 10, 15, 16, 17, 18, 19, 20, 21, 22, 23, 33, 34]
|
||||
ignoreLines = [2, 7, 9, 10, 15, 16, 17, 18, 19, 20, 21, 22, 23, 32, 33]
|
||||
assert cmpFiles(testFile, compFile, ignoreLines)
|
||||
|
||||
# Clean up
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
"""
|
||||
novelWriter – Main Status Bar Class Tester
|
||||
==========================================
|
||||
|
||||
This file is a part of novelWriter
|
||||
Copyright 2018–2021, Veronica Berglyd Olsen
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
import time
|
||||
import pytest
|
||||
|
||||
from PyQt5.QtWidgets import QMessageBox
|
||||
|
||||
from novelwriter.core import NWDoc
|
||||
from novelwriter.enum import nwItemClass, nwState
|
||||
|
||||
|
||||
@pytest.mark.gui
|
||||
def testGuiStatusBar_Main(qtbot, monkeypatch, nwGUI, fncProj):
|
||||
"""Test the the various features of the status bar.
|
||||
"""
|
||||
monkeypatch.setattr(QMessageBox, "question", lambda *a: QMessageBox.Yes)
|
||||
|
||||
nwGUI.theProject.projTree.setSeed(42)
|
||||
assert nwGUI.newProject({"projPath": fncProj}) is True
|
||||
cHandle = nwGUI.theProject.newFile("A Note", nwItemClass.CHARACTER, "71ee45a3c0db9")
|
||||
newDoc = NWDoc(nwGUI.theProject, cHandle)
|
||||
newDoc.writeDocument("# A Note\n\n")
|
||||
nwGUI.treeView.revealNewTreeItem(cHandle)
|
||||
nwGUI.rebuildIndex(beQuiet=True)
|
||||
|
||||
# Reference Time
|
||||
refTime = time.time()
|
||||
nwGUI.statusBar.setRefTime(refTime)
|
||||
assert nwGUI.statusBar.refTime == refTime
|
||||
|
||||
# Project Status
|
||||
nwGUI.statusBar.setProjectStatus(nwState.NONE)
|
||||
assert nwGUI.statusBar.projIcon._theCol == nwGUI.statusBar.projIcon._colNone
|
||||
nwGUI.statusBar.setProjectStatus(nwState.BAD)
|
||||
assert nwGUI.statusBar.projIcon._theCol == nwGUI.statusBar.projIcon._colBad
|
||||
nwGUI.statusBar.setProjectStatus(nwState.GOOD)
|
||||
assert nwGUI.statusBar.projIcon._theCol == nwGUI.statusBar.projIcon._colGood
|
||||
|
||||
# Document Status
|
||||
nwGUI.statusBar.setDocumentStatus(nwState.NONE)
|
||||
assert nwGUI.statusBar.docIcon._theCol == nwGUI.statusBar.docIcon._colNone
|
||||
nwGUI.statusBar.setDocumentStatus(nwState.BAD)
|
||||
assert nwGUI.statusBar.docIcon._theCol == nwGUI.statusBar.docIcon._colBad
|
||||
nwGUI.statusBar.setDocumentStatus(nwState.GOOD)
|
||||
assert nwGUI.statusBar.docIcon._theCol == nwGUI.statusBar.docIcon._colGood
|
||||
|
||||
# Idle Status
|
||||
nwGUI.statusBar.mainConf.stopWhenIdle = False
|
||||
nwGUI.statusBar.setUserIdle(True)
|
||||
nwGUI.statusBar.updateTime()
|
||||
assert nwGUI.statusBar.userIdle is False
|
||||
assert nwGUI.statusBar.timeText.text() == "00:00:00"
|
||||
|
||||
nwGUI.statusBar.mainConf.stopWhenIdle = True
|
||||
nwGUI.statusBar.setUserIdle(True)
|
||||
nwGUI.statusBar.updateTime(5)
|
||||
assert nwGUI.statusBar.userIdle is True
|
||||
assert nwGUI.statusBar.timeText.text() != "00:00:00"
|
||||
|
||||
nwGUI.statusBar.setUserIdle(False)
|
||||
nwGUI.statusBar.updateTime(5)
|
||||
assert nwGUI.statusBar.userIdle is False
|
||||
assert nwGUI.statusBar.timeText.text() != "00:00:00"
|
||||
|
||||
# Language
|
||||
nwGUI.statusBar.setLanguage("None", "None")
|
||||
assert nwGUI.statusBar.langText.text() == "None"
|
||||
nwGUI.statusBar.setLanguage("en", "None")
|
||||
assert nwGUI.statusBar.langText.text() == "American English"
|
||||
|
||||
# Project Stats
|
||||
nwGUI.statusBar.mainConf.incNotesWCount = False
|
||||
nwGUI._updateStatusWordCount()
|
||||
assert nwGUI.statusBar.statsText.text() == "Words: 6 (+6)"
|
||||
nwGUI.statusBar.mainConf.incNotesWCount = True
|
||||
nwGUI._updateStatusWordCount()
|
||||
assert nwGUI.statusBar.statsText.text() == "Words: 8 (+8)"
|
||||
|
||||
# qtbot.stopForInteraction()
|
||||
|
||||
# END Test testGuiStatusBar_Init
|
||||
Reference in New Issue
Block a user