From 6622a7e8e02232d4ebbd93941f2f11eafd73d4eb Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 24 Jan 2024 19:26:48 +0100 Subject: [PATCH] Begin to add content to the novel details overview page --- novelwriter/core/options.py | 5 +- novelwriter/guimain.py | 2 +- novelwriter/tools/noveldetails.py | 126 +++++++++++++++++++++++++++++- 3 files changed, 128 insertions(+), 5 deletions(-) diff --git a/novelwriter/core/options.py b/novelwriter/core/options.py index 8e50c30e..93ec4d8c 100644 --- a/novelwriter/core/options.py +++ b/novelwriter/core/options.py @@ -71,7 +71,10 @@ VALID_MAP: dict[str, set[str]] = { }, "GuiDocViewerPanel": { "colWidths", "hideInactive", - } + }, + "GuiNovelDetails": { + "winWidth", "winHeight", + }, } diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index 8f4c3e4d..143d9c65 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -846,7 +846,7 @@ class GuiMain(QMainWindow): dialog.show() dialog.raise_() qApp.processEvents() - # dialog.updateValues() + dialog.updateValues() return @pyqtSlot() diff --git a/novelwriter/tools/noveldetails.py b/novelwriter/tools/noveldetails.py index 66eec029..fdced6b9 100644 --- a/novelwriter/tools/noveldetails.py +++ b/novelwriter/tools/noveldetails.py @@ -24,14 +24,16 @@ along with this program. If not, see . from __future__ import annotations import logging +from PyQt5.QtCore import pyqtSlot from PyQt5.QtGui import QCloseEvent from PyQt5.QtWidgets import ( - QDialog, QDialogButtonBox, QHBoxLayout, QStackedWidget, QVBoxLayout, + QDialog, QDialogButtonBox, QFormLayout, QHBoxLayout, QLabel, QStackedWidget, QVBoxLayout, QWidget ) from novelwriter import CONFIG, SHARED +from novelwriter.common import formatTime from novelwriter.extensions.configlayout import NColourLabel from novelwriter.extensions.novelselector import NovelSelector from novelwriter.extensions.pagedsidebar import NPagedSideBar @@ -41,13 +43,25 @@ logger = logging.getLogger(__name__) class GuiNovelDetails(QDialog): + PAGE_OVERVIEW = 1 + PAGE_CONTENTS = 2 + def __init__(self, parent: QWidget) -> None: super().__init__(parent=parent) logger.debug("Create: GuiNovelDetails") self.setObjectName("GuiNovelDetails") self.setWindowTitle(self.tr("Novel Details")) - self.setMinimumSize(CONFIG.pxInt(600), CONFIG.pxInt(500)) + + wW = CONFIG.pxInt(500) + wH = CONFIG.pxInt(400) + options = SHARED.project.options + + self.setMinimumSize(wW, wH) + self.resize( + CONFIG.pxInt(options.getInt("GuiNovelDetails", "winWidth", wW)), + CONFIG.pxInt(options.getInt("GuiNovelDetails", "winHeight", wH)) + ) # Title self.titleLabel = NColourLabel( @@ -62,10 +76,16 @@ class GuiNovelDetails(QDialog): # SideBar self.sidebar = NPagedSideBar(self) self.sidebar.setLabelColor(SHARED.theme.helpText) - # self.sidebar.buttonClicked.connect(self._sidebarClicked) + self.sidebar.addButton(self.tr("Overview"), self.PAGE_OVERVIEW) + self.sidebar.addButton(self.tr("Contents"), self.PAGE_CONTENTS) + self.sidebar.setSelected(self.PAGE_OVERVIEW) + self.sidebar.buttonClicked.connect(self._sidebarClicked) # Content + self.overviewPage = _OverviewPage(self) + self.mainStack = QStackedWidget(self) + self.mainStack.addWidget(self.overviewPage) # Buttons self.buttonBox = QDialogButtonBox(QDialogButtonBox.StandardButton.Close) @@ -99,6 +119,15 @@ class GuiNovelDetails(QDialog): logger.debug("Delete: GuiNovelDetails") return + ## + # Methods + ## + + def updateValues(self) -> None: + """Load the dialogs initial values.""" + self.overviewPage.updateProjectData() + return + ## # Events ## @@ -110,13 +139,104 @@ class GuiNovelDetails(QDialog): self.deleteLater() return + ## + # Private Slots + ## + + @pyqtSlot(int) + def _sidebarClicked(self, pageId: int) -> None: + """Process a user request to switch page.""" + if pageId == self.PAGE_OVERVIEW: + self.mainStack.setCurrentWidget(self.overviewPage) + return + ## # Internal Functions ## def _saveSettings(self) -> None: """Save the user GUI settings.""" + winWidth = CONFIG.rpxInt(self.width()) + winHeight = CONFIG.rpxInt(self.height()) + logger.debug("Saving State: GuiNovelDetails") + options = SHARED.project.options + options.setValue("GuiNovelDetails", "winWidth", winWidth) + options.setValue("GuiNovelDetails", "winHeight", winHeight) return # END Class GuiNovelDetails + + +class _OverviewPage(QWidget): + + def __init__(self, parent: QWidget) -> None: + super().__init__(parent=parent) + + mPx = CONFIG.pxInt(8) + sPx = CONFIG.pxInt(16) + hPx = CONFIG.pxInt(24) + vPx = CONFIG.pxInt(4) + + # Project Info + self.projLabel = NColourLabel(self.tr("Project"), SHARED.theme.helpText, self, 1.5) + + self.projName = QLabel("", self) + self.projWords = QLabel("", self) + self.projRevisions = QLabel("", self) + self.projEditTime = QLabel("", self) + + self.projForm = QFormLayout() + self.projForm.addRow("%s" % self.tr("Name"), self.projName) + self.projForm.addRow("%s" % self.tr("Word Count"), self.projWords) + self.projForm.addRow("%s" % self.tr("Revisions"), self.projRevisions) + self.projForm.addRow("%s" % self.tr("Editing Time"), self.projEditTime) + self.projForm.setContentsMargins(mPx, 0, 0, 0) + self.projForm.setHorizontalSpacing(hPx) + self.projForm.setVerticalSpacing(vPx) + + # Novel Info + self.novelLabel = NColourLabel(self.tr("Novel"), SHARED.theme.helpText, self, 1.5) + + self.novelName = QLabel("", self) + self.novelWords = QLabel("", self) + self.novelChapters = QLabel("", self) + self.novelScenes = QLabel("", self) + + self.novelForm = QFormLayout() + self.novelForm.addRow("%s" % self.tr("Name"), self.novelName) + self.novelForm.addRow("%s" % self.tr("Word Count"), self.novelWords) + self.novelForm.addRow("%s" % self.tr("Chapters"), self.novelChapters) + self.novelForm.addRow("%s" % self.tr("Scenes"), self.novelScenes) + self.novelForm.setContentsMargins(mPx, 0, 0, 0) + self.novelForm.setHorizontalSpacing(hPx) + self.novelForm.setVerticalSpacing(vPx) + + # Assemble + self.outerBox = QVBoxLayout() + self.outerBox.addWidget(self.projLabel) + self.outerBox.addLayout(self.projForm) + self.outerBox.addWidget(self.novelLabel) + self.outerBox.addLayout(self.novelForm) + self.outerBox.setContentsMargins(0, 0, 0, 0) + self.outerBox.setSpacing(sPx) + self.outerBox.addStretch(1) + + self.setLayout(self.outerBox) + + return + + ## + # Methods + ## + + def updateProjectData(self) -> None: + """Load information about the project.""" + project = SHARED.project + self.projName.setText(project.data.name) + self.projWords.setText(f"{project.index.getNovelWordCount():n}") + self.projRevisions.setText(f"{project.data.saveCount:n}") + self.projEditTime.setText(formatTime(project.currentEditTime)) + return + +# END Class _OverviewPage