Add new project page to welcome dialog

This commit is contained in:
Veronica Berglyd Olsen
2023-12-19 17:30:11 +01:00
parent 8a61d57ce4
commit f26b405f42
4 changed files with 150 additions and 12 deletions
@@ -83,6 +83,7 @@ search_regex = nw_search-regex.svg
search_replace = mixed_search-replace.svg
search_word = nw_search-word.svg
settings = typ_cog.svg
star = typ_star.svg
status_idle = typ_media-pause-grey.svg
status_lang = typ_globe-grey.svg
status_lines = typ_th-list-grey.svg
@@ -83,6 +83,7 @@ search_regex = nw_search-regex.svg
search_replace = mixed_search-replace.svg
search_word = nw_search-word.svg
settings = typ_cog.svg
star = typ_star.svg
status_idle = typ_media-pause-grey.svg
status_lang = typ_globe-grey.svg
status_lines = typ_th-list-grey.svg
+2 -1
View File
@@ -468,7 +468,8 @@ class GuiIcons:
# General Button Icons
"add", "backward", "bookmark", "browse", "checked", "close", "cross", "down", "edit",
"export", "forward", "maximise", "menu", "minimise", "noncheckable", "panel", "refresh",
"remove", "revert", "search_replace", "search", "settings", "unchecked", "up", "view",
"remove", "revert", "search_replace", "search", "settings", "star", "unchecked", "up",
"view",
# Switches
"sticky-on", "sticky-off",
+146 -11
View File
@@ -26,16 +26,19 @@ from __future__ import annotations
import logging
from typing import TYPE_CHECKING
from pathlib import Path
from datetime import datetime
from PyQt5.QtGui import QCloseEvent, QPaintEvent, QPainter
from PyQt5.QtCore import Qt
from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot
from PyQt5.QtWidgets import (
QDialog, QDialogButtonBox, QHBoxLayout, QLabel, QStackedWidget,
QComboBox, QDialog, QDialogButtonBox, QFileDialog, QFormLayout,
QHBoxLayout, QLabel, QLineEdit, QPushButton, QScrollArea, QStackedWidget,
QTreeWidget, QVBoxLayout, QWidget
)
from novelwriter import CONFIG, SHARED, __version__, __date__
from novelwriter.common import makeFileNameSafe
from novelwriter.constants import nwUnicode
if TYPE_CHECKING: # pragma: no cover
@@ -77,8 +80,13 @@ class GuiWelcome(QDialog):
__version__, nwUnicode.U_ENDASH, datetime.strptime(__date__, "%Y-%m-%d").strftime("%x")
))
self.tabOpen = _OpenProjectPage(self)
self.tabNew = _NewProjectPage(self)
self.tabNew.cancelNewProject.connect(self._showOpenProjectPage)
self.mainStack = QStackedWidget()
self.mainStack.addWidget(_ProjectsPage(self))
self.mainStack.addWidget(self.tabOpen)
self.mainStack.addWidget(self.tabNew)
# Buttons
# =======
@@ -88,6 +96,7 @@ class GuiWelcome(QDialog):
self.newButton = self.btnBox.addButton(self.tr("New Project"), QDialogButtonBox.ActionRole)
self.newButton.setIcon(SHARED.theme.getIcon("add"))
self.newButton.clicked.connect(self._showNewProjectPage)
self.browseButton = self.btnBox.addButton(self.tr("Browse"), QDialogButtonBox.ActionRole)
self.browseButton.setIcon(SHARED.theme.getIcon("browse"))
@@ -141,6 +150,22 @@ class GuiWelcome(QDialog):
self.deleteLater()
return
##
# Private Slots
##
@pyqtSlot()
def _showNewProjectPage(self) -> None:
"""Show the create new project page."""
self.mainStack.setCurrentWidget(self.tabNew)
return
@pyqtSlot()
def _showOpenProjectPage(self) -> None:
"""Show the open exiting project page."""
self.mainStack.setCurrentWidget(self.tabOpen)
return
##
# Internal Functions
##
@@ -154,13 +179,19 @@ class GuiWelcome(QDialog):
# END Class GuiWelcome
class _ProjectsPage(QWidget):
class _OpenProjectPage(QWidget):
def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent)
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 = QTreeWidget(self)
self.listWidget.setHeaderHidden(True)
self.listWidget.setStyleSheet(listStyle)
self.outerBox = QVBoxLayout()
self.outerBox.addWidget(self.listWidget)
@@ -168,17 +199,121 @@ class _ProjectsPage(QWidget):
self.setLayout(self.outerBox)
self.updateTheme()
return
def updateTheme(self) -> None:
""""""
# END Class _OpenProjectPage
class _NewProjectPage(QWidget):
cancelNewProject = pyqtSignal()
def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent)
baseCol = self.palette().base().color()
listStyle = (
"QTreeWidget {{border: none; background: rgba({0},{1},{2},0.5);}}"
"QScrollArea {{border: none; background: rgba({0},{1},{2},0.5);}}"
).format(baseCol.red(), baseCol.green(), baseCol.blue())
self.listWidget.setStyleSheet(listStyle)
self.centralScroll = QScrollArea(self)
self.centralScroll.setStyleSheet(listStyle)
# Controls
# ========
self.createButton = QPushButton(self.tr("Create Project"), self)
self.createButton.setIcon(SHARED.theme.getIcon("star"))
self.cancelButton = QPushButton(self.tr("Go Back"), self)
self.cancelButton.setIcon(SHARED.theme.getIcon("backward"))
self.cancelButton.clicked.connect(lambda: self.cancelNewProject.emit())
self.buttonBox = QHBoxLayout()
self.buttonBox.addStretch(1)
self.buttonBox.addWidget(self.cancelButton, 0)
self.buttonBox.addWidget(self.createButton, 0)
# Assemble
# ========
self.outerBox = QVBoxLayout()
self.outerBox.addWidget(self.centralScroll)
self.outerBox.addLayout(self.buttonBox)
self.outerBox.setContentsMargins(0, 0, 0, 0)
self.setLayout(self.outerBox)
self._buildNewProjectForm()
return
# END Class _ProjectsPage
def _buildNewProjectForm(self) -> None:
"""Generate the new project form."""
self.projName = QLineEdit()
self.projName.setMaxLength(200)
self.projName.setPlaceholderText(self.tr("Required"))
self.projAuthor = QLineEdit()
self.projAuthor.setMaxLength(200)
self.projAuthor.setPlaceholderText(self.tr("Optional"))
self.projLang = QComboBox(self)
for tag, language in CONFIG.listLanguages(CONFIG.LANG_PROJ):
self.projLang.addItem(language, tag)
langIdx = self.projLang.findData(CONFIG.guiLocale)
if langIdx == -1:
langIdx = self.projLang.findData("en_GB")
if langIdx != -1:
self.projLang.setCurrentIndex(langIdx)
self.projPath = QLineEdit("")
self.projPath.setPlaceholderText(self.tr("Required"))
self.browsePath = QPushButton(self)
self.browsePath.setIcon(SHARED.theme.getIcon("browse"))
self.browsePath.clicked.connect(self._doBrowse)
self.pathBox = QHBoxLayout()
self.pathBox.addWidget(self.projPath)
self.pathBox.addWidget(self.browsePath)
self.projectForm = QFormLayout()
self.projectForm.addRow(self.tr("Project Name"), self.projName)
self.projectForm.addRow(self.tr("Author(s)"), self.projAuthor)
self.projectForm.addRow(self.tr("Language"), self.projLang)
self.projectForm.addRow(self.tr("Project Path"), self.pathBox)
# self.projectForm.setVerticalSpacing(fS)
# Assemble
# ========
self.newForm = QVBoxLayout()
self.newForm.addLayout(self.projectForm)
self.centralScroll.setLayout(self.newForm)
return
##
# Private Slots
##
@pyqtSlot()
def _doBrowse(self) -> None:
"""Select a project folder."""
lastPath = CONFIG.lastPath()
projDir = Path(QFileDialog.getExistingDirectory(
self, self.tr("Select Project Folder"), str(lastPath), options=QFileDialog.ShowDirsOnly
))
if projDir and (projName := makeFileNameSafe(self.projName.text())):
self.projPath.setText(str(projDir / projName))
elif projDir:
self.projPath.setText(str(projDir))
else:
self.projPath.setText("")
return
# END Class _NewProjectPage