diff --git a/nw/core/project.py b/nw/core/project.py index 1b63cc0f..0c303f74 100644 --- a/nw/core/project.py +++ b/nw/core/project.py @@ -68,8 +68,8 @@ class NWProject(): self.projChanged = False # The project has unsaved changes self.projAltered = False # The project has been altered this session self.lockedBy = None # Data on which computer has the project open - self.saveCount = None # Meta data: number of saves - self.autoCount = None # Meta data: number of automatic saves + self.saveCount = 0 # Meta data: number of saves + self.autoCount = 0 # Meta data: number of automatic saves # Class Settings self.projPath = None # The full path to where the currently open project is saved @@ -167,6 +167,7 @@ class NWProject(): """Create a new project by populating the project tree with a few starter items. """ + self.projName = "New Project" hNovel = self.newRoot("Novel", nwItemClass.NOVEL) hChars = self.newRoot("Characters", nwItemClass.CHARACTER) hWorld = self.newRoot("Plot", nwItemClass.PLOT) @@ -1233,6 +1234,30 @@ class NWTree(): self._handleSeed = theSeed return + ## + # Getters + ## + + def countTypes(self): + """Count the number of files, folders and roots in the project. + """ + nRoot = 0 + nFolder = 0 + nFile = 0 + + for tHandle in self._treeOrder: + tItem = self.__getitem__(tHandle) + if tItem is None: + continue + elif tItem.itemType == nwItemType.ROOT: + nRoot += 1 + elif tItem.itemType == nwItemType.FOLDER: + nFolder += 1 + elif tItem.itemType == nwItemType.FILE: + nFile += 1 + + return nRoot, nFolder, nFile + ## # Meta Methods ## diff --git a/nw/gui/__init__.py b/nw/gui/__init__.py index c753cf94..393f501d 100644 --- a/nw/gui/__init__.py +++ b/nw/gui/__init__.py @@ -13,7 +13,7 @@ from nw.gui.dialogs.configeditor import GuiConfigEditor from nw.gui.dialogs.docmerge import GuiDocMerge from nw.gui.dialogs.docsplit import GuiDocSplit from nw.gui.dialogs.itemeditor import GuiItemEditor -from nw.gui.dialogs.projecteditor import GuiProjectSettings +from nw.gui.dialogs.projectsettings import GuiProjectSettings from nw.gui.dialogs.projectload import GuiProjectLoad from nw.gui.dialogs.sessionlog import GuiSessionLogView diff --git a/nw/gui/additions/qconfiglayout.py b/nw/gui/additions/qconfiglayout.py index ef753592..be7571b5 100644 --- a/nw/gui/additions/qconfiglayout.py +++ b/nw/gui/additions/qconfiglayout.py @@ -97,7 +97,7 @@ class QConfigLayout(QGridLayout): qLabel = None raise ValueError("theLabel must be a QLabel") - qLabel.setContentsMargins(0,4,0,4) + qLabel.setContentsMargins(0, 4, 0, 4) self.addWidget(qLabel, self._nextRow, 0, 1, 2, Qt.AlignLeft) self.setRowStretch(self._nextRow, 0) diff --git a/nw/gui/dialogs/__init__.py b/nw/gui/dialogs/__init__.py index 8150fe66..271a7a1d 100644 --- a/nw/gui/dialogs/__init__.py +++ b/nw/gui/dialogs/__init__.py @@ -5,7 +5,7 @@ from nw.gui.dialogs.configeditor import GuiConfigEditor from nw.gui.dialogs.docmerge import GuiDocMerge from nw.gui.dialogs.docsplit import GuiDocSplit from nw.gui.dialogs.itemeditor import GuiItemEditor -from nw.gui.dialogs.projecteditor import GuiProjectSettings +from nw.gui.dialogs.projectsettings import GuiProjectSettings from nw.gui.dialogs.projectload import GuiProjectLoad from nw.gui.dialogs.sessionlog import GuiSessionLogView diff --git a/nw/gui/dialogs/projectsettings.py b/nw/gui/dialogs/projectsettings.py index e5d0e7d5..8d501585 100644 --- a/nw/gui/dialogs/projectsettings.py +++ b/nw/gui/dialogs/projectsettings.py @@ -38,7 +38,7 @@ from PyQt5.QtWidgets import ( ) from nw.constants import nwAlert -from nw.gui.additions import QSwitch, PagedDialog +from nw.gui.additions import QSwitch, PagedDialog, QConfigLayout logger = logging.getLogger(__name__) @@ -57,11 +57,13 @@ class GuiProjectSettings(PagedDialog): self.setWindowTitle("Project Settings") self.tabMain = GuiProjectEditMain(self.theParent, self.theProject) - self.tabStatus = GuiProjectEditStatus(self.theParent, self.theProject.statusItems) - self.tabImport = GuiProjectEditStatus(self.theParent, self.theProject.importItems) + self.tabMeta = GuiProjectEditMeta(self.theParent, self.theProject) + self.tabStatus = GuiProjectEditStatus(self.theParent, self.theProject, True) + self.tabImport = GuiProjectEditStatus(self.theParent, self.theProject, False) self.tabReplace = GuiProjectEditReplace(self.theParent, self.theProject) self.addTab(self.tabMain, "Settings") + self.addTab(self.tabMeta, "Details") self.addTab(self.tabStatus, "Status") self.addTab(self.tabImport, "Importance") self.addTab(self.tabReplace,"Auto-Replace") @@ -117,58 +119,155 @@ class GuiProjectEditMain(QWidget): def __init__(self, theParent, theProject): QWidget.__init__(self, theParent) - self.theParent = theParent - self.theProject = theProject - self.mainForm = QGridLayout() - self.backupBox = QHBoxLayout() + self.theParent = theParent + self.theProject = theProject - self.editName = QLineEdit() + # The Form + self.mainForm = QConfigLayout() + self.mainForm.setHelpTextStyle(self.theParent.theTheme.helpText) + self.setLayout(self.mainForm) + + self.mainForm.addGroupLabel("Project Settings") + + self.editName = QLineEdit() self.editName.setMaxLength(200) + self.editName.setFixedWidth(250) self.editName.setText(self.theProject.projName) + self.mainForm.addRow( + "Working title", + self.editName, + "Should be set only once." + ) self.editTitle = QLineEdit() self.editTitle.setMaxLength(200) + self.editTitle.setFixedWidth(250) self.editTitle.setText(self.theProject.bookTitle) + self.mainForm.addRow( + "Novel title", + self.editTitle, + "Change whenever you want!" + ) self.editAuthors = QPlainTextEdit() bookAuthors = "" for bookAuthor in self.theProject.bookAuthors: bookAuthors += bookAuthor+"\n" self.editAuthors.setPlainText(bookAuthors) - self.editAuthors.setMaximumHeight(120) + self.editAuthors.setFixedHeight(100) + self.editAuthors.setFixedWidth(250) + self.mainForm.addRow( + "Author(s)", + self.editAuthors, + "One name per line." + ) self.doBackup = QSwitch(self) self.doBackup.setChecked(not self.theProject.doBackup) - self.backupBox.addStretch(1) - self.backupBox.addWidget(QLabel("Disable backup on close")) - self.backupBox.addWidget(self.doBackup) - - self.mainForm.addWidget(QLabel("Working title"), 0, 0, 1, 1, Qt.AlignTop) - self.mainForm.addWidget(self.editName, 0, 1, 1, 1, Qt.AlignTop) - self.mainForm.addWidget(QLabel("Book title"), 1, 0, 1, 1, Qt.AlignTop) - self.mainForm.addWidget(self.editTitle, 1, 1, 1, 1, Qt.AlignTop) - self.mainForm.addWidget(QLabel("Book authors"), 2, 0, 1, 1, Qt.AlignTop) - self.mainForm.addWidget(self.editAuthors, 2, 1, 1, 1, Qt.AlignTop) - self.mainForm.addLayout(self.backupBox, 3, 0, 1, 2, Qt.AlignTop) - - self.setLayout(self.mainForm) + self.mainForm.addRow( + "No backup on close", + self.doBackup, + "Overrides main preferences." + ) return # END Class GuiProjectEditMain -class GuiProjectEditStatus(QWidget): +class GuiProjectEditMeta(QWidget): - def __init__(self, theParent, theStatus): + def __init__(self, theParent, theProject): QWidget.__init__(self, theParent) self.theParent = theParent - self.theStatus = theStatus + self.theProject = theProject + + # The Form + self.mainForm = QGridLayout() + self.setLayout(self.mainForm) + + self.headLabel = QLabel("Project Details") + + self.nameLabel = QLabel("Working title:") + self.nameLabel.setIndent(8) + self.nameValue = QLabel(self.theProject.projName) + self.nameValue.setWordWrap(True) + + self.pathLabel = QLabel("Project path:") + self.pathLabel.setIndent(8) + self.pathValue = QLabel(self.theProject.projPath) + self.pathValue.setWordWrap(True) + + self.revLabel = QLabel("Revision count:") + self.revLabel.setIndent(8) + self.revValue = QLabel("{:n}".format(self.theProject.saveCount)) + + self.statsLabel = QLabel("Project Stats") + + nR, nD, nF = self.theProject.projTree.countTypes() + + self.nRootLabel = QLabel("Root folders:") + self.nRootLabel.setIndent(8) + self.nRootValue = QLabel("{:n}".format(nR)) + + self.nDirLabel = QLabel("Folders:") + self.nDirLabel.setIndent(8) + self.nDirValue = QLabel("{:n}".format(nD)) + + self.nFileLabel = QLabel("Documents:") + self.nFileLabel.setIndent(8) + self.nFileValue = QLabel("{:n}".format(nF)) + + self.wordsLabel = QLabel("Word count:") + self.wordsLabel.setIndent(8) + self.wordsValue = QLabel("{:n}".format(self.theProject.currWCount)) + + self.mainForm.addWidget(self.headLabel, 0, 0, 1, 2, Qt.AlignTop) + self.mainForm.addWidget(self.nameLabel, 1, 0, 1, 1, Qt.AlignTop) + self.mainForm.addWidget(self.nameValue, 1, 1, 1, 1, Qt.AlignTop) + self.mainForm.addWidget(self.pathLabel, 2, 0, 1, 1, Qt.AlignTop) + self.mainForm.addWidget(self.pathValue, 2, 1, 1, 1, Qt.AlignTop) + self.mainForm.addWidget(self.revLabel, 3, 0, 1, 1, Qt.AlignTop) + self.mainForm.addWidget(self.revValue, 3, 1, 1, 1, Qt.AlignTop) + + self.mainForm.addWidget(self.statsLabel, 4, 0, 1, 2, Qt.AlignTop) + self.mainForm.addWidget(self.nRootLabel, 5, 0, 1, 1, Qt.AlignTop) + self.mainForm.addWidget(self.nRootValue, 5, 1, 1, 1, Qt.AlignTop) + self.mainForm.addWidget(self.nDirLabel, 6, 0, 1, 1, Qt.AlignTop) + self.mainForm.addWidget(self.nDirValue, 6, 1, 1, 1, Qt.AlignTop) + self.mainForm.addWidget(self.nFileLabel, 7, 0, 1, 1, Qt.AlignTop) + self.mainForm.addWidget(self.nFileValue, 7, 1, 1, 1, Qt.AlignTop) + self.mainForm.addWidget(self.wordsLabel, 8, 0, 1, 1, Qt.AlignTop) + self.mainForm.addWidget(self.wordsValue, 8, 1, 1, 1, Qt.AlignTop) + + self.mainForm.setVerticalSpacing(6) + self.mainForm.setHorizontalSpacing(12) + self.mainForm.setColumnStretch(0, 0) + self.mainForm.setColumnStretch(1, 1) + self.mainForm.setRowStretch(10, 1) + + return + +# END Class GuiProjectEditMeta + +class GuiProjectEditStatus(QWidget): + + def __init__(self, theParent, theProject, isStatus): + QWidget.__init__(self, theParent) + + self.theParent = theParent + self.theProject = theProject + if isStatus: + self.theStatus = self.theProject.statusItems + else: + self.theStatus = self.theProject.importItems + self.colData = [] self.colCounts = [] self.colChanged = False self.selColour = None + self.outerBox = QVBoxLayout() self.mainBox = QHBoxLayout() self.mainForm = QVBoxLayout() @@ -208,7 +307,13 @@ class GuiProjectEditStatus(QWidget): self.mainBox.addWidget(self.listBox) self.mainBox.addLayout(self.mainForm) - self.setLayout(self.mainBox) + if isStatus: + self.outerBox.addWidget(QLabel("Novel File Status Levels")) + else: + self.outerBox.addWidget(QLabel("Note File Importance Levels")) + self.outerBox.addLayout(self.mainBox) + + self.setLayout(self.outerBox) return @@ -374,6 +479,7 @@ class GuiProjectEditReplace(QWidget): self.bottomBox.addWidget(self.addButton) self.bottomBox.addWidget(self.delButton) + self.outerBox.addWidget(QLabel("Text Replace List for Preview and Export")) self.outerBox.addWidget(self.listBox) self.outerBox.addLayout(self.bottomBox) self.setLayout(self.outerBox) diff --git a/tests/test_gui.py b/tests/test_gui.py index 0d73f3c3..424eb13b 100644 --- a/tests/test_gui.py +++ b/tests/test_gui.py @@ -8,7 +8,7 @@ from nwtools import * from os import path, unlink from PyQt5.QtCore import Qt -from nw.gui.dialogs.projecteditor import GuiProjectEditor +from nw.gui.dialogs.projecteditor import GuiProjectSettings from nw.gui.dialogs.itemeditor import GuiItemEditor from nw.constants import * @@ -262,7 +262,7 @@ def testProjectEditor(qtbot, nwTempGUI, nwRef, nwTemp): assert nwGUI.newProject(nwTempGUI, True) nwGUI.mainConf.backupPath = nwTempGUI - projEdit = GuiProjectEditor(nwGUI, nwGUI.theProject) + projEdit = GuiProjectSettings(nwGUI, nwGUI.theProject) qtbot.addWidget(projEdit) for c in "Project Name": @@ -314,7 +314,7 @@ def testProjectEditor(qtbot, nwTempGUI, nwRef, nwTemp): projEdit._doSave() # Open again, and check project settings - projEdit = GuiProjectEditor(nwGUI, nwGUI.theProject) + projEdit = GuiProjectSettings(nwGUI, nwGUI.theProject) qtbot.addWidget(projEdit) assert projEdit.tabMain.editName.text() == "Project Name" assert projEdit.tabMain.editTitle.text() == "Project Title"