diff --git a/novelwriter/assets/images/welcome.jpg b/novelwriter/assets/images/welcome.jpg new file mode 100644 index 00000000..7e1e569c Binary files /dev/null and b/novelwriter/assets/images/welcome.jpg differ diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index c9b10dec..7be6ced6 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -51,11 +51,12 @@ from novelwriter.gui.itemdetails import GuiItemDetails from novelwriter.gui.docviewerpanel import GuiDocViewerPanel from novelwriter.dialogs.about import GuiAbout from novelwriter.dialogs.updates import GuiUpdates -from novelwriter.dialogs.projload import GuiProjectLoad +# from novelwriter.dialogs.projload import GuiProjectLoad from novelwriter.dialogs.wordlist import GuiWordList from novelwriter.dialogs.preferences import GuiPreferences from novelwriter.dialogs.projdetails import GuiProjectDetails from novelwriter.dialogs.projsettings import GuiProjectSettings +from novelwriter.tools.welcome import GuiWelcome from novelwriter.tools.manuscript import GuiManuscript from novelwriter.tools.projwizard import GuiProjectWizard from novelwriter.tools.dictionaries import GuiDictionaries @@ -843,14 +844,17 @@ class GuiMain(QMainWindow): browse button for projects not yet cached. Selecting to create a new project is forwarded to the new project wizard. """ - dlgProj = GuiProjectLoad(self) - dlgProj.exec_() + # dlgProj = GuiProjectLoad(self) + # dlgProj.exec_() - if dlgProj.result() == QDialog.Accepted: - if dlgProj.openState == GuiProjectLoad.OPEN_STATE: - self.openProject(dlgProj.openPath) - elif dlgProj.openState == GuiProjectLoad.NEW_STATE: - self.newProject() + # if dlgProj.result() == QDialog.Accepted: + # if dlgProj.openState == GuiProjectLoad.OPEN_STATE: + # self.openProject(dlgProj.openPath) + # elif dlgProj.openState == GuiProjectLoad.NEW_STATE: + # self.newProject() + + dialog = GuiWelcome(self) + dialog.exec_() return diff --git a/novelwriter/tools/welcome.py b/novelwriter/tools/welcome.py new file mode 100644 index 00000000..3e2328c2 --- /dev/null +++ b/novelwriter/tools/welcome.py @@ -0,0 +1,152 @@ +""" +novelWriter – GUI Welcome Dialog +================================ + +File History: +Created: 2023-12-14 [2.3b1] GuiWelcome + +This file is a part of novelWriter +Copyright 2018–2023, 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 . +""" +from __future__ import annotations + +import logging + +from typing import TYPE_CHECKING +from datetime import datetime + +from PyQt5.QtGui import QPaintEvent, QPainter, QPixmap +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import ( + QDialog, QDialogButtonBox, QHBoxLayout, QLabel, QStackedWidget, + QTreeWidget, QVBoxLayout, QWidget +) + +from novelwriter import CONFIG, SHARED, __version__, __date__ + +if TYPE_CHECKING: # pragma: no cover + from novelwriter.guimain import GuiMain + +logger = logging.getLogger(__name__) + + +class GuiWelcome(QDialog): + + def __init__(self, mainGui: GuiMain) -> None: + super().__init__(parent=mainGui) + + logger.debug("Create: GuiWelcome") + + self.bgImage = QPixmap(str(CONFIG.assetPath("images") / "welcome.jpg")) + + self.nwLogo = QLabel() + self.nwLogo.setPixmap(SHARED.theme.getPixmap("novelwriter", (96, 96))) + + font = self.font() + font.setPointSize(48) + + self.nwLabel = QLabel("novelWriter") + self.nwLabel.setFont(font) + + self.nwInfo = QLabel(self.tr("Version {0}, Released on {1}").format( + __version__, datetime.strptime(__date__, "%Y-%m-%d").strftime("%x") + )) + + self.mainStack = QStackedWidget() + self.mainStack.addWidget(_ProjectsPage(self)) + + # Buttons + # ======= + self.btnBox = QDialogButtonBox(QDialogButtonBox.Open | QDialogButtonBox.Cancel, self) + + self.newButton = self.btnBox.addButton(self.tr("New Project"), QDialogButtonBox.ActionRole) + self.newButton.setIcon(SHARED.theme.getIcon("add")) + + self.browseButton = self.btnBox.addButton(self.tr("Browse"), QDialogButtonBox.ActionRole) + self.browseButton.setIcon(SHARED.theme.getIcon("browse")) + + # Assemble + # ======== + self.innerBox = QVBoxLayout() + self.innerBox.addWidget(self.nwLabel) + self.innerBox.addWidget(self.nwInfo) + self.innerBox.addWidget(self.mainStack) + self.innerBox.addWidget(self.btnBox) + + topRight = Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignRight + + self.outerBox = QHBoxLayout() + self.outerBox.addWidget(self.nwLogo, 3, topRight) + self.outerBox.addLayout(self.innerBox, 7) + self.outerBox.setContentsMargins(24, 24, 24, 96) + + self.setLayout(self.outerBox) + + self.setMinimumSize(900, 500) + + logger.debug("Ready: GuiWelcome") + + return + + def __del__(self) -> None: # pragma: no cover + logger.debug("Delete: GuiWelcome") + return + + ## + # Events + ## + + def paintEvent(self, event: QPaintEvent) -> None: + """Overload the paint event to draw the background image.""" + hWin = self.height() + hPix = min(hWin, 700) + tMode = Qt.TransformationMode.SmoothTransformation + qPaint = QPainter(self) + qPaint.drawPixmap(0, hWin - hPix, self.bgImage.scaledToHeight(hPix, tMode)) + super().paintEvent(event) + return + +# END Class GuiWelcome + + +class _ProjectsPage(QWidget): + + def __init__(self, parent: QWidget) -> None: + super().__init__(parent=parent) + + self.listWidget = QTreeWidget(self) + self.listWidget.setHeaderHidden(True) + + self.outerBox = QVBoxLayout() + self.outerBox.addWidget(self.listWidget) + self.outerBox.setContentsMargins(0, 0, 0, 0) + + self.setLayout(self.outerBox) + + self.updateTheme() + + return + + def updateTheme(self) -> None: + """""" + baseCol = self.palette().base().color() + listStyle = ( + "QTreeWidget {{border: none; background: rgba({0},{1},{2},0.5);}}" + ).format(baseCol.red(), baseCol.green(), baseCol.blue()) + self.listWidget.setStyleSheet(listStyle) + return + +# END Class _ProjectsPage