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"):