From 576c13d04500e430c4d33d83e5d450bdd396c89a Mon Sep 17 00:00:00 2001
From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
Date: Tue, 20 Feb 2024 23:10:08 +0100
Subject: [PATCH] Redesign button row on welcome dialog
---
.../assets/icons/typicons_dark/icons.conf | 2 +
.../icons/typicons_dark/typ_th-list.svg | 9 ++
.../assets/icons/typicons_light/icons.conf | 2 +
.../icons/typicons_light/typ_th-list.svg | 9 ++
novelwriter/gui/theme.py | 6 +-
novelwriter/tools/welcome.py | 87 +++++++++++--------
6 files changed, 78 insertions(+), 37 deletions(-)
create mode 100644 novelwriter/assets/icons/typicons_dark/typ_th-list.svg
create mode 100644 novelwriter/assets/icons/typicons_light/typ_th-list.svg
diff --git a/novelwriter/assets/icons/typicons_dark/icons.conf b/novelwriter/assets/icons/typicons_dark/icons.conf
index 44504e57..442f0d82 100644
--- a/novelwriter/assets/icons/typicons_dark/icons.conf
+++ b/novelwriter/assets/icons/typicons_dark/icons.conf
@@ -60,11 +60,13 @@ fmt_superscript = nw_tb-superscript.svg
fmt_underline = nw_tb-underline.svg
forward = typ_chevron-right.svg
import = mixed_import.svg
+list = typ_th-list.svg
maximise = typ_arrow-maximise.svg
menu = typ_th-dot-menu.svg
minimise = typ_arrow-minimise.svg
more = typ_th-dot-more.svg
noncheckable = mixed_input-none.svg
+open = typ_folder.svg
panel = nw_panel.svg
proj_chapter = mixed_document-chapter.svg
proj_details = typ_th-list-grey.svg
diff --git a/novelwriter/assets/icons/typicons_dark/typ_th-list.svg b/novelwriter/assets/icons/typicons_dark/typ_th-list.svg
new file mode 100644
index 00000000..85a79c58
--- /dev/null
+++ b/novelwriter/assets/icons/typicons_dark/typ_th-list.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/novelwriter/assets/icons/typicons_light/icons.conf b/novelwriter/assets/icons/typicons_light/icons.conf
index 9af4e5f2..4c6d1890 100644
--- a/novelwriter/assets/icons/typicons_light/icons.conf
+++ b/novelwriter/assets/icons/typicons_light/icons.conf
@@ -60,11 +60,13 @@ fmt_superscript = nw_tb-superscript.svg
fmt_underline = nw_tb-underline.svg
forward = typ_chevron-right.svg
import = mixed_import.svg
+list = typ_th-list.svg
maximise = typ_arrow-maximise.svg
menu = typ_th-dot-menu.svg
minimise = typ_arrow-minimise.svg
more = typ_th-dot-more.svg
noncheckable = mixed_input-none.svg
+open = typ_folder.svg
panel = nw_panel.svg
proj_chapter = mixed_document-chapter.svg
proj_details = typ_th-list-grey.svg
diff --git a/novelwriter/assets/icons/typicons_light/typ_th-list.svg b/novelwriter/assets/icons/typicons_light/typ_th-list.svg
new file mode 100644
index 00000000..d569d85f
--- /dev/null
+++ b/novelwriter/assets/icons/typicons_light/typ_th-list.svg
@@ -0,0 +1,9 @@
+
+
diff --git a/novelwriter/gui/theme.py b/novelwriter/gui/theme.py
index 5c38ca33..412a5363 100644
--- a/novelwriter/gui/theme.py
+++ b/novelwriter/gui/theme.py
@@ -453,9 +453,9 @@ class GuiIcons:
# General Button Icons
"add", "add_document", "backward", "bookmark", "browse", "checked", "close", "cross",
- "document", "down", "edit", "export", "forward", "import", "maximise", "menu", "minimise",
- "more", "noncheckable", "panel", "refresh", "remove", "revert", "search_replace", "search",
- "settings", "star", "unchecked", "up", "view",
+ "document", "down", "edit", "export", "forward", "import", "list", "maximise", "menu",
+ "minimise", "more", "noncheckable", "open", "panel", "refresh", "remove", "revert",
+ "search_replace", "search", "settings", "star", "unchecked", "up", "view",
# Switches
"sticky-on", "sticky-off",
diff --git a/novelwriter/tools/welcome.py b/novelwriter/tools/welcome.py
index e9589f66..b4b18729 100644
--- a/novelwriter/tools/welcome.py
+++ b/novelwriter/tools/welcome.py
@@ -34,10 +34,10 @@ from PyQt5.QtCore import (
pyqtSignal, pyqtSlot
)
from PyQt5.QtWidgets import (
- QAction, QDialog, QDialogButtonBox, QFileDialog, QFormLayout, QHBoxLayout,
- QLabel, QLineEdit, QListView, QMenu, QPushButton, QScrollArea, QShortcut,
- QStackedWidget, QStyle, QStyleOptionViewItem, QStyledItemDelegate,
- QToolButton, QVBoxLayout, QWidget, qApp
+ QAction, QDialog, QFileDialog, QFormLayout, QHBoxLayout, QLabel, QLineEdit,
+ QListView, QMenu, QPushButton, QScrollArea, QShortcut, QStackedWidget,
+ QStyle, QStyleOptionViewItem, QStyledItemDelegate, QToolButton,
+ QVBoxLayout, QWidget, qApp
)
from novelwriter import CONFIG, SHARED
@@ -98,7 +98,6 @@ class GuiWelcome(QDialog):
self.tabOpen.openProjectRequest.connect(self._openProjectPath)
self.tabNew = _NewProjectPage(self)
- self.tabNew.cancelNewProject.connect(self._showOpenProjectPage)
self.tabNew.openProjectRequest.connect(self._openProjectPath)
self.mainStack = QStackedWidget(self)
@@ -108,17 +107,39 @@ class GuiWelcome(QDialog):
# Buttons
# =======
- self.btnBox = QDialogButtonBox(QDialogButtonBox.Open | QDialogButtonBox.Cancel, self)
- self.btnBox.accepted.connect(self._openSelectedItem)
- self.btnBox.rejected.connect(self.close)
+ self.btnList = QPushButton(self.tr("List Projects"), self)
+ self.btnList.setIcon(SHARED.theme.getIcon("list"))
+ self.btnList.clicked.connect(self._showOpenProjectPage)
- 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.btnNew = QPushButton(self.tr("New Project"), self)
+ self.btnNew.setIcon(SHARED.theme.getIcon("add"))
+ self.btnNew.clicked.connect(self._showNewProjectPage)
- self.browseButton = self.btnBox.addButton(self.tr("Browse"), QDialogButtonBox.ActionRole)
- self.browseButton.setIcon(SHARED.theme.getIcon("browse"))
- self.browseButton.clicked.connect(self._browseForProject)
+ self.btnBrowse = QPushButton(self.tr("Browse"), self)
+ self.btnBrowse.setIcon(SHARED.theme.getIcon("browse"))
+ self.btnBrowse.clicked.connect(self._browseForProject)
+
+ self.btnCancel = QPushButton(self.tr("Cancel"), self)
+ self.btnCancel.setIcon(SHARED.theme.getIcon("cross"))
+ self.btnCancel.clicked.connect(self.close)
+
+ self.btnCreate = QPushButton(self.tr("Create"), self)
+ self.btnCreate.setIcon(SHARED.theme.getIcon("star"))
+ self.btnCreate.clicked.connect(self.tabNew.createNewProject)
+
+ self.btnOpen = QPushButton(self.tr("Open"), self)
+ self.btnOpen.setIcon(SHARED.theme.getIcon("open"))
+ self.btnOpen.clicked.connect(self._openSelectedItem)
+
+ self.btnBox = QHBoxLayout()
+ self.btnBox.addStretch(1)
+ self.btnBox.addWidget(self.btnList)
+ self.btnBox.addWidget(self.btnNew)
+ self.btnBox.addWidget(self.btnBrowse)
+ self.btnBox.addWidget(self.btnCancel)
+ self.btnBox.addWidget(self.btnCreate)
+ self.btnBox.addWidget(self.btnOpen)
+ self._setButtonVisibility()
# Assemble
# ========
@@ -130,7 +151,7 @@ class GuiWelcome(QDialog):
self.innerBox.addSpacing(hA)
self.innerBox.addWidget(self.mainStack)
self.innerBox.addSpacing(hB)
- self.innerBox.addWidget(self.btnBox)
+ self.innerBox.addLayout(self.btnBox)
topRight = Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignRight
@@ -180,12 +201,14 @@ class GuiWelcome(QDialog):
def _showNewProjectPage(self) -> None:
"""Show the create new project page."""
self.mainStack.setCurrentWidget(self.tabNew)
+ self._setButtonVisibility()
return
@pyqtSlot()
def _showOpenProjectPage(self) -> None:
"""Show the open exiting project page."""
self.mainStack.setCurrentWidget(self.tabOpen)
+ self._setButtonVisibility()
return
@pyqtSlot()
@@ -224,6 +247,20 @@ class GuiWelcome(QDialog):
CONFIG.setWelcomeWinSize(self.width(), self.height())
return
+ def _setButtonVisibility(self) -> None:
+ """Change the visibility of the dialog buttons."""
+ listMode = self.mainStack.currentWidget() == self.tabOpen
+ self.btnList.setVisible(not listMode)
+ self.btnNew.setVisible(listMode)
+ self.btnBrowse.setVisible(listMode)
+ self.btnCreate.setVisible(not listMode)
+ self.btnOpen.setVisible(listMode)
+ if listMode:
+ self.btnOpen.setFocus()
+ else:
+ self.btnCreate.setFocus()
+ return
+
# END Class GuiWelcome
@@ -453,7 +490,6 @@ class _ProjectListModel(QAbstractListModel):
class _NewProjectPage(QWidget):
- cancelNewProject = pyqtSignal()
openProjectRequest = pyqtSignal(Path)
def __init__(self, parent: QWidget) -> None:
@@ -470,28 +506,11 @@ class _NewProjectPage(QWidget):
self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)
self.scrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)
- # Controls
- # ========
-
- self.cancelButton = QPushButton(self.tr("Go Back"), self)
- self.cancelButton.setIcon(SHARED.theme.getIcon("backward"))
- self.cancelButton.clicked.connect(lambda: self.cancelNewProject.emit())
-
- self.createButton = QPushButton(self.tr("Create Project"), self)
- self.createButton.setIcon(SHARED.theme.getIcon("star"))
- self.createButton.clicked.connect(self._createNewProject)
-
- 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.scrollArea)
- self.outerBox.addLayout(self.buttonBox)
self.outerBox.setContentsMargins(0, 0, 0, 0)
self.setLayout(self.outerBox)
@@ -512,7 +531,7 @@ class _NewProjectPage(QWidget):
##
@pyqtSlot()
- def _createNewProject(self) -> None:
+ def createNewProject(self) -> None:
"""Create a new project from the data in the form."""
data = self.projectForm.getProjectData()
if not data.get("name"):