Fix multiple tools dialog issue (#1921)

This commit is contained in:
Veronica Berglyd Olsen
2024-06-11 01:02:39 +02:00
committed by GitHub
2 changed files with 81 additions and 27 deletions
+4 -2
View File
@@ -797,7 +797,8 @@ class GuiMain(QMainWindow):
def showBuildManuscriptDialog(self) -> None:
"""Open the build manuscript dialog."""
if SHARED.hasProject:
dialog = GuiManuscript(self)
if not (dialog := SHARED.findTopLevelWidget(GuiManuscript)):
dialog = GuiManuscript(self)
dialog.activateDialog()
dialog.loadContent()
return
@@ -815,7 +816,8 @@ class GuiMain(QMainWindow):
def showWritingStatsDialog(self) -> None:
"""Open the session stats dialog."""
if SHARED.hasProject:
dialog = GuiWritingStats(self)
if not (dialog := SHARED.findTopLevelWidget(GuiWritingStats)):
dialog = GuiWritingStats(self)
dialog.activateDialog()
dialog.populateGUI()
return
+77 -25
View File
@@ -22,8 +22,6 @@ from __future__ import annotations
import json
from pathlib import Path
import pytest
from PyQt5.QtWidgets import QAction, QFileDialog
@@ -43,10 +41,8 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
# Create a project to work on
buildTestProject(nwGUI, projPath)
project = SHARED.project
qtbot.wait(100)
assert nwGUI.saveProject()
sessFile: Path = projPath / "meta" / nwFiles.SESS_FILE
sessFile = projPath / "meta" / nwFiles.SESS_FILE
# Open the Writing Stats dialog
nwGUI.mainMenu.aWritingStats.activate(QAction.Trigger)
@@ -62,6 +58,16 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
assert not sessFile.is_file()
assert list(project.session.iterRecords()) == []
# Make an invalid logfile
data = (
'{"type": "initial", "offset": 123}\n'
'{"type": "record", "start": "foo", "end": "bar", "novel": 840, "notes": 376, "idle": 394}'
)
sessFile.write_text(data, encoding="utf-8")
sessLog._loadLogFile()
assert sessLog.wordOffset == 123
assert len(sessLog.logData) == 0
# Make a test log file
data = [
project.session.createInitial(123),
@@ -75,8 +81,17 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
assert sessLog.wordOffset == 123
assert len(sessLog.logData) == 4
# Test Exporting
# ==============
@pytest.mark.gui
def testToolWritingStats_Export(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
"""Test the export feature."""
monkeypatch.setattr(QFileDialog, "getSaveFileName", lambda ss, tt, pp, options: (pp, ""))
buildTestProject(nwGUI, projPath)
project = SHARED.project
assert nwGUI.saveProject()
sessFile = projPath / "meta" / nwFiles.SESS_FILE
sessLog = GuiWritingStats(nwGUI)
data = [
project.session.createInitial(1075),
@@ -95,13 +110,13 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
sessLog.populateGUI()
# Make the saving fail
monkeypatch.setattr(QFileDialog, "getSaveFileName", lambda *a, **k: ("", ""))
assert not sessLog._saveData(sessLog.FMT_CSV)
assert not sessLog._saveData(sessLog.FMT_JSON)
assert not sessLog._saveData(None) # type: ignore
with monkeypatch.context() as mp:
mp.setattr(QFileDialog, "getSaveFileName", lambda *a, **k: ("", ""))
assert not sessLog._saveData(sessLog.FMT_CSV)
assert not sessLog._saveData(sessLog.FMT_JSON)
assert not sessLog._saveData(None) # type: ignore
# Make the save succeed
monkeypatch.setattr(QFileDialog, "getSaveFileName", lambda ss, tt, pp, options: (pp, ""))
# Sort by time
sessLog.listBox.sortByColumn(sessLog.C_TIME, 0) # type: ignore
assert sessLog.novelWords.text() == "{:n}".format(600)
@@ -153,8 +168,49 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
}
]
# Test Filters
# ============
# I/O Error
with monkeypatch.context() as mp:
mp.setattr("builtins.open", causeOSError)
assert not sessLog._loadLogFile()
assert not sessLog._saveData(sessLog.FMT_CSV)
@pytest.mark.gui
def testToolWritingStats_Filters(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
"""Test the filters."""
monkeypatch.setattr(QFileDialog, "getSaveFileName", lambda ss, tt, pp, options: (pp, ""))
buildTestProject(nwGUI, projPath)
project = SHARED.project
assert nwGUI.saveProject()
sessFile = projPath / "meta" / nwFiles.SESS_FILE
sessLog = GuiWritingStats(nwGUI)
data = [
project.session.createInitial(1075),
project.session.createRecord("2021-01-31 19:00:00", "2021-01-31 19:30:00", 700, 375, 0),
project.session.createRecord("2021-02-01 19:00:00", "2021-02-01 19:30:00", 700, 375, 10),
project.session.createRecord("2021-02-01 20:00:00", "2021-02-01 20:30:00", 600, 275, 20),
project.session.createRecord("2021-02-02 19:00:00", "2021-02-02 19:30:00", 750, 425, 30),
project.session.createRecord("2021-02-02 20:00:00", "2021-02-02 20:30:00", 690, 365, 40),
project.session.createRecord("2021-02-03 19:00:00", "2021-02-03 19:30:00", 680, 355, 50),
project.session.createRecord("2021-02-04 19:00:00", "2021-02-04 19:30:00", 700, 375, 60),
project.session.createRecord("2021-02-05 19:00:00", "2021-02-05 19:30:00", 500, 175, 70),
project.session.createRecord("2021-02-06 19:00:00", "2021-02-06 19:30:00", 600, 275, 80),
project.session.createRecord("2021-02-07 19:00:00", "2021-02-07 19:30:00", 600, 275, 90),
]
sessFile.write_text("".join(data), encoding="utf-8")
sessLog.populateGUI()
sessLog.listBox.sortByColumn(sessLog.C_TIME, 0) # type: ignore
assert sessLog.listBox.topLevelItem(0).text(sessLog.C_COUNT) == "{:n}".format(1)
assert sessLog.listBox.topLevelItem(1).text(sessLog.C_COUNT) == "{:n}".format(-200)
assert sessLog.listBox.topLevelItem(2).text(sessLog.C_COUNT) == "{:n}".format(300)
assert sessLog.listBox.topLevelItem(3).text(sessLog.C_COUNT) == "{:n}".format(-120)
assert sessLog.listBox.topLevelItem(4).text(sessLog.C_COUNT) == "{:n}".format(-20)
assert sessLog.listBox.topLevelItem(5).text(sessLog.C_COUNT) == "{:n}".format(40)
assert sessLog.listBox.topLevelItem(6).text(sessLog.C_COUNT) == "{:n}".format(-400)
assert sessLog.listBox.topLevelItem(7).text(sessLog.C_COUNT) == "{:n}".format(200)
# No Novel Files
qtbot.mouseClick(sessLog.incNovel, QtMouseLeft)
@@ -252,8 +308,6 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
qtbot.mouseClick(sessLog.hideNegative, QtMouseLeft)
assert sessLog._saveData(sessLog.FMT_JSON)
# qtbot.stop()
jsonStats = tstPaths.tmpDir / "sessionStats.json"
with open(jsonStats, mode="r", encoding="utf-8") as inFile:
jsonData = json.load(inFile)
@@ -333,6 +387,11 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
}
]
# Toggle Idle Time
assert sessLog.listBox.topLevelItem(7).text(sessLog.C_IDLE) == "4 %"
qtbot.mouseClick(sessLog.showIdleTime, QtMouseLeft)
assert sessLog.listBox.topLevelItem(7).text(sessLog.C_IDLE) == "00:01:10"
# Group by Day
qtbot.mouseClick(sessLog.groupByDay, QtMouseLeft)
assert sessLog._saveData(sessLog.FMT_JSON)
@@ -378,14 +437,7 @@ def testToolWritingStats_Main(qtbot, monkeypatch, nwGUI, projPath, tstPaths):
}
]
# IOError
# =======
with monkeypatch.context() as mp:
mp.setattr("builtins.open", causeOSError)
assert not sessLog._loadLogFile()
assert not sessLog._saveData(sessLog.FMT_CSV)
# qtbot.stop()
sessLog._doClose()
assert nwGUI.closeProject() is True
nwGUI.closeProject()