Update the design on the Project Settings dialog
This commit is contained in:
@@ -3,7 +3,8 @@ novelWriter – GUI Project Settings
|
|||||||
==================================
|
==================================
|
||||||
|
|
||||||
File History:
|
File History:
|
||||||
Created: 2018-09-29 [0.0.1] GuiProjectSettings
|
Created: 2018-09-29 [0.0.1] GuiProjectSettings
|
||||||
|
Rewritten: 2024-01-26 [2.3b1] GuiProjectSettings
|
||||||
|
|
||||||
This file is a part of novelWriter
|
This file is a part of novelWriter
|
||||||
Copyright 2018–2024, Veronica Berglyd Olsen
|
Copyright 2018–2024, Veronica Berglyd Olsen
|
||||||
@@ -25,75 +26,102 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
from PyQt5.QtGui import QCloseEvent, QColor, QIcon, QPixmap
|
||||||
|
|
||||||
from PyQt5.QtGui import QCloseEvent, QIcon, QPixmap, QColor
|
|
||||||
from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot
|
from PyQt5.QtCore import Qt, pyqtSignal, pyqtSlot
|
||||||
from PyQt5.QtWidgets import (
|
from PyQt5.QtWidgets import (
|
||||||
QColorDialog, QComboBox, QDialogButtonBox, QHBoxLayout, QLabel, QLineEdit,
|
QColorDialog, QComboBox, QDialog, QDialogButtonBox, QHBoxLayout, QLabel,
|
||||||
QPushButton, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget, qApp
|
QLineEdit, QPushButton, QStackedWidget, QTreeWidget, QTreeWidgetItem,
|
||||||
|
QVBoxLayout, QWidget, qApp
|
||||||
)
|
)
|
||||||
|
|
||||||
from novelwriter import CONFIG, SHARED
|
from novelwriter import CONFIG, SHARED
|
||||||
from novelwriter.common import simplified
|
from novelwriter.common import simplified
|
||||||
from novelwriter.extensions.switch import NSwitch
|
from novelwriter.extensions.switch import NSwitch
|
||||||
from novelwriter.extensions.pageddialog import NPagedDialog
|
from novelwriter.extensions.configlayout import NColourLabel, NScrollableForm
|
||||||
from novelwriter.extensions.configlayout import NConfigLayout
|
from novelwriter.extensions.pagedsidebar import NPagedSideBar
|
||||||
|
|
||||||
if TYPE_CHECKING: # pragma: no cover
|
|
||||||
from novelwriter.guimain import GuiMain
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class GuiProjectSettings(NPagedDialog):
|
class GuiProjectSettings(QDialog):
|
||||||
|
|
||||||
TAB_MAIN = 0
|
PAGE_SETTINGS = 0
|
||||||
TAB_STATUS = 1
|
PAGE_STATUS = 1
|
||||||
TAB_IMPORT = 2
|
PAGE_IMPORT = 2
|
||||||
TAB_REPLACE = 3
|
PAGE_REPLACE = 3
|
||||||
|
|
||||||
newProjectSettingsReady = pyqtSignal()
|
newProjectSettingsReady = pyqtSignal(bool)
|
||||||
|
|
||||||
def __init__(self, mainGui: GuiMain, focusTab: int = TAB_MAIN) -> None:
|
def __init__(self, parent: QWidget, gotoPage: int = PAGE_SETTINGS) -> None:
|
||||||
super().__init__(parent=mainGui)
|
super().__init__(parent=parent)
|
||||||
|
|
||||||
logger.debug("Create: GuiProjectSettings")
|
logger.debug("Create: GuiProjectSettings")
|
||||||
self.setObjectName("GuiProjectSettings")
|
self.setObjectName("GuiProjectSettings")
|
||||||
|
|
||||||
self.mainGui = mainGui
|
|
||||||
SHARED.project.countStatus()
|
|
||||||
self.setWindowTitle(self.tr("Project Settings"))
|
self.setWindowTitle(self.tr("Project Settings"))
|
||||||
|
|
||||||
wW = CONFIG.pxInt(570)
|
wW = CONFIG.pxInt(500)
|
||||||
wH = CONFIG.pxInt(375)
|
wH = CONFIG.pxInt(400)
|
||||||
pOptions = SHARED.project.options
|
options = SHARED.project.options
|
||||||
|
|
||||||
self.setMinimumWidth(wW)
|
self.setMinimumSize(wW, wH)
|
||||||
self.setMinimumHeight(wH)
|
|
||||||
self.resize(
|
self.resize(
|
||||||
CONFIG.pxInt(pOptions.getInt("GuiProjectSettings", "winWidth", wW)),
|
CONFIG.pxInt(options.getInt("GuiProjectSettings", "winWidth", wW)),
|
||||||
CONFIG.pxInt(pOptions.getInt("GuiProjectSettings", "winHeight", wH))
|
CONFIG.pxInt(options.getInt("GuiProjectSettings", "winHeight", wH))
|
||||||
)
|
)
|
||||||
|
|
||||||
self.tabMain = GuiProjectEditMain(self)
|
# Title
|
||||||
self.tabStatus = GuiProjectEditStatus(self, True)
|
self.titleLabel = NColourLabel(
|
||||||
self.tabImport = GuiProjectEditStatus(self, False)
|
self.tr("Project Settings"), SHARED.theme.helpText, parent=self, scale=1.25
|
||||||
self.tabReplace = GuiProjectEditReplace(self)
|
)
|
||||||
|
self.titleLabel.setIndent(CONFIG.pxInt(4))
|
||||||
|
|
||||||
self.addTab(self.tabMain, self.tr("Settings"))
|
# SideBar
|
||||||
self.addTab(self.tabStatus, self.tr("Status"))
|
self.sidebar = NPagedSideBar(self)
|
||||||
self.addTab(self.tabImport, self.tr("Importance"))
|
self.sidebar.setLabelColor(SHARED.theme.helpText)
|
||||||
self.addTab(self.tabReplace, self.tr("Auto-Replace"))
|
self.sidebar.addButton(self.tr("Settings"), self.PAGE_SETTINGS)
|
||||||
|
self.sidebar.addButton(self.tr("Status"), self.PAGE_STATUS)
|
||||||
|
self.sidebar.addButton(self.tr("Importance"), self.PAGE_IMPORT)
|
||||||
|
self.sidebar.addButton(self.tr("Auto-Replace"), self.PAGE_REPLACE)
|
||||||
|
self.sidebar.setSelected(gotoPage)
|
||||||
|
self.sidebar.buttonClicked.connect(self._sidebarClicked)
|
||||||
|
|
||||||
self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
|
# Buttons
|
||||||
|
self.buttonBox = QDialogButtonBox(
|
||||||
|
QDialogButtonBox.StandardButton.Save | QDialogButtonBox.StandardButton.Cancel
|
||||||
|
)
|
||||||
self.buttonBox.accepted.connect(self._doSave)
|
self.buttonBox.accepted.connect(self._doSave)
|
||||||
self.buttonBox.rejected.connect(self.close)
|
self.buttonBox.rejected.connect(self.close)
|
||||||
self.rejected.connect(self.close)
|
|
||||||
self.addControls(self.buttonBox)
|
|
||||||
|
|
||||||
# Focus Tab
|
# Content
|
||||||
self._focusTab(focusTab)
|
self.settingsPage = _SettingsPage(self)
|
||||||
|
self.statusPage = _StatusPage(self, True)
|
||||||
|
self.importPage = _StatusPage(self, False)
|
||||||
|
self.replacePage = _ReplacePage(self)
|
||||||
|
|
||||||
|
self.mainStack = QStackedWidget(self)
|
||||||
|
self.mainStack.addWidget(self.settingsPage)
|
||||||
|
self.mainStack.addWidget(self.statusPage)
|
||||||
|
self.mainStack.addWidget(self.importPage)
|
||||||
|
self.mainStack.addWidget(self.replacePage)
|
||||||
|
|
||||||
|
# Assemble
|
||||||
|
self.topBox = QHBoxLayout()
|
||||||
|
self.topBox.addWidget(self.titleLabel)
|
||||||
|
self.topBox.addStretch(1)
|
||||||
|
|
||||||
|
self.mainBox = QHBoxLayout()
|
||||||
|
self.mainBox.addWidget(self.sidebar)
|
||||||
|
self.mainBox.addWidget(self.mainStack)
|
||||||
|
self.mainBox.setContentsMargins(0, 0, 0, 0)
|
||||||
|
|
||||||
|
self.outerBox = QVBoxLayout()
|
||||||
|
self.outerBox.addLayout(self.topBox)
|
||||||
|
self.outerBox.addLayout(self.mainBox)
|
||||||
|
self.outerBox.addWidget(self.buttonBox)
|
||||||
|
self.outerBox.setSpacing(CONFIG.pxInt(8))
|
||||||
|
|
||||||
|
self.setLayout(self.outerBox)
|
||||||
|
self.setSizeGripEnabled(True)
|
||||||
|
|
||||||
logger.debug("Ready: GuiProjectSettings")
|
logger.debug("Ready: GuiProjectSettings")
|
||||||
|
|
||||||
@@ -103,9 +131,13 @@ class GuiProjectSettings(NPagedDialog):
|
|||||||
logger.debug("Delete: GuiProjectSettings")
|
logger.debug("Delete: GuiProjectSettings")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
##
|
||||||
|
# Events
|
||||||
|
##
|
||||||
|
|
||||||
def closeEvent(self, event: QCloseEvent) -> None:
|
def closeEvent(self, event: QCloseEvent) -> None:
|
||||||
"""Capture the close event and perform cleanup."""
|
"""Capture the user closing the window and save settings."""
|
||||||
self._saveGuiSettings()
|
self._saveSettings()
|
||||||
event.accept()
|
event.accept()
|
||||||
self.deleteLater()
|
self.deleteLater()
|
||||||
return
|
return
|
||||||
@@ -114,40 +146,52 @@ class GuiProjectSettings(NPagedDialog):
|
|||||||
# Private Slots
|
# Private Slots
|
||||||
##
|
##
|
||||||
|
|
||||||
|
@pyqtSlot(int)
|
||||||
|
def _sidebarClicked(self, pageId: int) -> None:
|
||||||
|
"""Process a user request to switch page."""
|
||||||
|
if pageId == self.PAGE_SETTINGS:
|
||||||
|
self.mainStack.setCurrentWidget(self.settingsPage)
|
||||||
|
elif pageId == self.PAGE_STATUS:
|
||||||
|
self.mainStack.setCurrentWidget(self.statusPage)
|
||||||
|
elif pageId == self.PAGE_IMPORT:
|
||||||
|
self.mainStack.setCurrentWidget(self.importPage)
|
||||||
|
elif pageId == self.PAGE_REPLACE:
|
||||||
|
self.mainStack.setCurrentWidget(self.replacePage)
|
||||||
|
return
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def _doSave(self) -> None:
|
def _doSave(self) -> None:
|
||||||
"""Save settings and close dialog."""
|
"""Save settings and close dialog."""
|
||||||
project = SHARED.project
|
project = SHARED.project
|
||||||
projName = self.tabMain.editName.text()
|
projName = self.settingsPage.projName.text()
|
||||||
bookTitle = self.tabMain.editTitle.text()
|
projAuthor = self.settingsPage.projAuthor.text()
|
||||||
bookAuthor = self.tabMain.editAuthor.text()
|
projLang = self.settingsPage.projLang.currentData()
|
||||||
projLang = self.tabMain.projLang.currentData()
|
spellLang = self.settingsPage.spellLang.currentData()
|
||||||
spellLang = self.tabMain.spellLang.currentData()
|
doBackup = not self.settingsPage.doBackup.isChecked()
|
||||||
doBackup = not self.tabMain.doBackup.isChecked()
|
|
||||||
|
|
||||||
project.data.setName(projName)
|
project.data.setName(projName)
|
||||||
project.data.setTitle(bookTitle)
|
project.data.setAuthor(projAuthor)
|
||||||
project.data.setAuthor(bookAuthor)
|
|
||||||
project.data.setDoBackup(doBackup)
|
project.data.setDoBackup(doBackup)
|
||||||
project.data.setSpellLang(spellLang)
|
project.data.setSpellLang(spellLang)
|
||||||
project.setProjectLang(projLang)
|
project.setProjectLang(projLang)
|
||||||
|
|
||||||
if self.tabStatus.colChanged:
|
rebuildTrees = False
|
||||||
newList, delList = self.tabStatus.getNewList()
|
|
||||||
|
if self.statusPage.colChanged:
|
||||||
|
newList, delList = self.statusPage.getNewList()
|
||||||
project.setStatusColours(newList, delList)
|
project.setStatusColours(newList, delList)
|
||||||
|
rebuildTrees = True
|
||||||
|
|
||||||
if self.tabImport.colChanged:
|
if self.importPage.colChanged:
|
||||||
newList, delList = self.tabImport.getNewList()
|
newList, delList = self.importPage.getNewList()
|
||||||
project.setImportColours(newList, delList)
|
project.setImportColours(newList, delList)
|
||||||
|
rebuildTrees = True
|
||||||
|
|
||||||
if self.tabStatus.colChanged or self.tabImport.colChanged:
|
if self.replacePage.arChanged:
|
||||||
self.mainGui.rebuildTrees()
|
newList = self.replacePage.getNewList()
|
||||||
|
|
||||||
if self.tabReplace.arChanged:
|
|
||||||
newList = self.tabReplace.getNewList()
|
|
||||||
project.data.setAutoReplace(newList)
|
project.data.setAutoReplace(newList)
|
||||||
|
|
||||||
self.newProjectSettingsReady.emit()
|
self.newProjectSettingsReady.emit(rebuildTrees)
|
||||||
qApp.processEvents()
|
qApp.processEvents()
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
@@ -157,134 +201,104 @@ class GuiProjectSettings(NPagedDialog):
|
|||||||
# Internal Functions
|
# Internal Functions
|
||||||
##
|
##
|
||||||
|
|
||||||
def _focusTab(self, tab: int) -> None:
|
def _saveSettings(self) -> None:
|
||||||
"""Change which is the focused tab."""
|
|
||||||
if tab == self.TAB_MAIN:
|
|
||||||
self.setCurrentWidget(self.tabMain)
|
|
||||||
elif tab == self.TAB_STATUS:
|
|
||||||
self.setCurrentWidget(self.tabStatus)
|
|
||||||
elif tab == self.TAB_IMPORT:
|
|
||||||
self.setCurrentWidget(self.tabImport)
|
|
||||||
elif tab == self.TAB_REPLACE:
|
|
||||||
self.setCurrentWidget(self.tabReplace)
|
|
||||||
return
|
|
||||||
|
|
||||||
def _saveGuiSettings(self) -> None:
|
|
||||||
"""Save GUI settings."""
|
"""Save GUI settings."""
|
||||||
winWidth = CONFIG.rpxInt(self.width())
|
winWidth = CONFIG.rpxInt(self.width())
|
||||||
winHeight = CONFIG.rpxInt(self.height())
|
winHeight = CONFIG.rpxInt(self.height())
|
||||||
replaceColW = CONFIG.rpxInt(self.tabReplace.listBox.columnWidth(0))
|
statusColW = CONFIG.rpxInt(self.statusPage.columnWidth())
|
||||||
statusColW = CONFIG.rpxInt(self.tabStatus.listBox.columnWidth(0))
|
importColW = CONFIG.rpxInt(self.importPage.columnWidth())
|
||||||
importColW = CONFIG.rpxInt(self.tabImport.listBox.columnWidth(0))
|
replaceColW = CONFIG.rpxInt(self.replacePage.columnWidth())
|
||||||
|
|
||||||
logger.debug("Saving State: GuiProjectSettings")
|
logger.debug("Saving State: GuiProjectSettings")
|
||||||
pOptions = SHARED.project.options
|
options = SHARED.project.options
|
||||||
pOptions.setValue("GuiProjectSettings", "winWidth", winWidth)
|
options.setValue("GuiProjectSettings", "winWidth", winWidth)
|
||||||
pOptions.setValue("GuiProjectSettings", "winHeight", winHeight)
|
options.setValue("GuiProjectSettings", "winHeight", winHeight)
|
||||||
pOptions.setValue("GuiProjectSettings", "replaceColW", replaceColW)
|
options.setValue("GuiProjectSettings", "statusColW", statusColW)
|
||||||
pOptions.setValue("GuiProjectSettings", "statusColW", statusColW)
|
options.setValue("GuiProjectSettings", "importColW", importColW)
|
||||||
pOptions.setValue("GuiProjectSettings", "importColW", importColW)
|
options.setValue("GuiProjectSettings", "replaceColW", replaceColW)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
# END Class GuiProjectSettings
|
# END Class GuiProjectSettings
|
||||||
|
|
||||||
|
|
||||||
class GuiProjectEditMain(QWidget):
|
class _SettingsPage(NScrollableForm):
|
||||||
|
|
||||||
def __init__(self, parent: QWidget) -> None:
|
def __init__(self, parent: QWidget) -> None:
|
||||||
super().__init__(parent=parent)
|
super().__init__(parent=parent)
|
||||||
|
|
||||||
# The Form
|
|
||||||
self.mainForm = NConfigLayout()
|
|
||||||
self.mainForm.setHelpTextStyle(SHARED.theme.helpText)
|
|
||||||
self.setLayout(self.mainForm)
|
|
||||||
|
|
||||||
self.mainForm.addGroupLabel(self.tr("Project Settings"))
|
|
||||||
|
|
||||||
xW = CONFIG.pxInt(250)
|
xW = CONFIG.pxInt(250)
|
||||||
pData = SHARED.project.data
|
data = SHARED.project.data
|
||||||
|
self.setHelpTextStyle(SHARED.theme.helpText)
|
||||||
|
self.setRowIndent(0)
|
||||||
|
|
||||||
self.editName = QLineEdit()
|
# Project Name
|
||||||
self.editName.setMaxLength(200)
|
self.projName = QLineEdit(self)
|
||||||
self.editName.setMaximumWidth(xW)
|
self.projName.setMaxLength(200)
|
||||||
self.editName.setText(pData.name)
|
self.projName.setMaximumWidth(xW)
|
||||||
self.mainForm.addRow(
|
self.projName.setText(data.name)
|
||||||
|
self.addRow(
|
||||||
self.tr("Project name"),
|
self.tr("Project name"),
|
||||||
self.editName,
|
self.projName,
|
||||||
self.tr("Should be set only once.")
|
self.tr("Changing this will affect the backup path.")
|
||||||
)
|
)
|
||||||
|
|
||||||
self.editTitle = QLineEdit()
|
# Project Author
|
||||||
self.editTitle.setMaxLength(200)
|
self.projAuthor = QLineEdit(self)
|
||||||
self.editTitle.setMaximumWidth(xW)
|
self.projAuthor.setMaxLength(200)
|
||||||
self.editTitle.setText(pData.title)
|
self.projAuthor.setMaximumWidth(xW)
|
||||||
self.mainForm.addRow(
|
self.projAuthor.setText(data.author)
|
||||||
self.tr("Novel title"),
|
self.addRow(
|
||||||
self.editTitle,
|
|
||||||
self.tr("Change whenever you want!")
|
|
||||||
)
|
|
||||||
|
|
||||||
self.editAuthor = QLineEdit()
|
|
||||||
self.editAuthor.setMaxLength(200)
|
|
||||||
self.editAuthor.setMaximumWidth(xW)
|
|
||||||
self.editAuthor.setText(pData.author)
|
|
||||||
self.mainForm.addRow(
|
|
||||||
self.tr("Author(s)"),
|
self.tr("Author(s)"),
|
||||||
self.editAuthor,
|
self.projAuthor,
|
||||||
self.tr("Change whenever you want!")
|
self.tr("Only used when building the manuscript.")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Project Language
|
||||||
self.projLang = QComboBox(self)
|
self.projLang = QComboBox(self)
|
||||||
self.projLang.setMaximumWidth(xW)
|
self.projLang.setMaximumWidth(xW)
|
||||||
for tag, language in CONFIG.listLanguages(CONFIG.LANG_PROJ):
|
for tag, language in CONFIG.listLanguages(CONFIG.LANG_PROJ):
|
||||||
self.projLang.addItem(language, tag)
|
self.projLang.addItem(language, tag)
|
||||||
self.mainForm.addRow(
|
self.addRow(
|
||||||
self.tr("Project language"),
|
self.tr("Project language"),
|
||||||
self.projLang,
|
self.projLang,
|
||||||
self.tr("Used when building the manuscript.")
|
self.tr("Only used when building the manuscript.")
|
||||||
)
|
)
|
||||||
|
if (idx := self.projLang.findData(data.language)) != -1:
|
||||||
|
self.projLang.setCurrentIndex(idx)
|
||||||
|
|
||||||
langIdx = 0
|
# Spell Check Language
|
||||||
if pData.language is not None:
|
|
||||||
langIdx = self.projLang.findData(pData.language)
|
|
||||||
if langIdx == -1:
|
|
||||||
langIdx = self.projLang.findData("en_GB")
|
|
||||||
if langIdx != -1:
|
|
||||||
self.projLang.setCurrentIndex(langIdx)
|
|
||||||
|
|
||||||
self.spellLang = QComboBox(self)
|
self.spellLang = QComboBox(self)
|
||||||
self.spellLang.setMaximumWidth(xW)
|
self.spellLang.setMaximumWidth(xW)
|
||||||
self.spellLang.addItem(self.tr("Default"), "None")
|
self.spellLang.addItem(self.tr("Default"), "None")
|
||||||
if CONFIG.hasEnchant:
|
if CONFIG.hasEnchant:
|
||||||
for tag, language in SHARED.spelling.listDictionaries():
|
for tag, language in SHARED.spelling.listDictionaries():
|
||||||
self.spellLang.addItem(language, tag)
|
self.spellLang.addItem(language, tag)
|
||||||
self.mainForm.addRow(
|
self.addRow(
|
||||||
self.tr("Spell check language"),
|
self.tr("Spell check language"),
|
||||||
self.spellLang,
|
self.spellLang,
|
||||||
self.tr("Overrides main preferences.")
|
self.tr("Overrides main preferences.")
|
||||||
)
|
)
|
||||||
|
if (idx := self.spellLang.findData(data.spellLang)) != -1:
|
||||||
|
self.spellLang.setCurrentIndex(idx)
|
||||||
|
|
||||||
langIdx = 0
|
# Backup on Close
|
||||||
if pData.spellLang is not None:
|
|
||||||
langIdx = self.spellLang.findData(pData.spellLang)
|
|
||||||
if langIdx != -1:
|
|
||||||
self.spellLang.setCurrentIndex(langIdx)
|
|
||||||
|
|
||||||
self.doBackup = NSwitch(self)
|
self.doBackup = NSwitch(self)
|
||||||
self.doBackup.setChecked(not pData.doBackup)
|
self.doBackup.setChecked(not data.doBackup)
|
||||||
self.mainForm.addRow(
|
self.addRow(
|
||||||
self.tr("No backup on close"),
|
self.tr("Disable backup on close"),
|
||||||
self.doBackup,
|
self.doBackup,
|
||||||
self.tr("Overrides main preferences.")
|
self.tr("Overrides main preferences.")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.finalise()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
# END Class GuiProjectEditMain
|
# END Class _SettingsPage
|
||||||
|
|
||||||
|
|
||||||
class GuiProjectEditStatus(QWidget):
|
class _StatusPage(QWidget):
|
||||||
|
|
||||||
COL_LABEL = 0
|
COL_LABEL = 0
|
||||||
COL_USAGE = 1
|
COL_USAGE = 1
|
||||||
@@ -318,7 +332,7 @@ class GuiProjectEditStatus(QWidget):
|
|||||||
# The List
|
# The List
|
||||||
# ========
|
# ========
|
||||||
|
|
||||||
self.listBox = QTreeWidget()
|
self.listBox = QTreeWidget(self)
|
||||||
self.listBox.setHeaderLabels([
|
self.listBox.setHeaderLabels([
|
||||||
self.tr("Label"), self.tr("Usage"),
|
self.tr("Label"), self.tr("Usage"),
|
||||||
])
|
])
|
||||||
@@ -332,16 +346,16 @@ class GuiProjectEditStatus(QWidget):
|
|||||||
# List Controls
|
# List Controls
|
||||||
# =============
|
# =============
|
||||||
|
|
||||||
self.addButton = QPushButton(SHARED.theme.getIcon("add"), "")
|
self.addButton = QPushButton(SHARED.theme.getIcon("add"), "", self)
|
||||||
self.addButton.clicked.connect(self._newItem)
|
self.addButton.clicked.connect(self._newItem)
|
||||||
|
|
||||||
self.delButton = QPushButton(SHARED.theme.getIcon("remove"), "")
|
self.delButton = QPushButton(SHARED.theme.getIcon("remove"), "", self)
|
||||||
self.delButton.clicked.connect(self._delItem)
|
self.delButton.clicked.connect(self._delItem)
|
||||||
|
|
||||||
self.upButton = QPushButton(SHARED.theme.getIcon("up"), "")
|
self.upButton = QPushButton(SHARED.theme.getIcon("up"), "", self)
|
||||||
self.upButton.clicked.connect(lambda: self._moveItem(-1))
|
self.upButton.clicked.connect(lambda: self._moveItem(-1))
|
||||||
|
|
||||||
self.dnButton = QPushButton(SHARED.theme.getIcon("down"), "")
|
self.dnButton = QPushButton(SHARED.theme.getIcon("down"), "", self)
|
||||||
self.dnButton.clicked.connect(lambda: self._moveItem(1))
|
self.dnButton.clicked.connect(lambda: self._moveItem(1))
|
||||||
|
|
||||||
# Edit Form
|
# Edit Form
|
||||||
@@ -389,6 +403,7 @@ class GuiProjectEditStatus(QWidget):
|
|||||||
self.outerBox = QVBoxLayout()
|
self.outerBox = QVBoxLayout()
|
||||||
self.outerBox.addWidget(QLabel("<b>%s</b>" % pageLabel))
|
self.outerBox.addWidget(QLabel("<b>%s</b>" % pageLabel))
|
||||||
self.outerBox.addLayout(self.innerBox)
|
self.outerBox.addLayout(self.innerBox)
|
||||||
|
self.outerBox.setContentsMargins(0, 0, 0, 0)
|
||||||
|
|
||||||
self.setLayout(self.outerBox)
|
self.setLayout(self.outerBox)
|
||||||
|
|
||||||
@@ -410,6 +425,10 @@ class GuiProjectEditStatus(QWidget):
|
|||||||
|
|
||||||
return [], []
|
return [], []
|
||||||
|
|
||||||
|
def columnWidth(self) -> int:
|
||||||
|
"""Return the size of the header column."""
|
||||||
|
return self.listBox.columnWidth(0)
|
||||||
|
|
||||||
##
|
##
|
||||||
# Private Slots
|
# Private Slots
|
||||||
##
|
##
|
||||||
@@ -553,10 +572,10 @@ class GuiProjectEditStatus(QWidget):
|
|||||||
else:
|
else:
|
||||||
return self.tr("Used by {0} items").format(nUse)
|
return self.tr("Used by {0} items").format(nUse)
|
||||||
|
|
||||||
# END Class GuiProjectEditStatus
|
# END Class _StatusPage
|
||||||
|
|
||||||
|
|
||||||
class GuiProjectEditReplace(QWidget):
|
class _ReplacePage(QWidget):
|
||||||
|
|
||||||
COL_KEY = 0
|
COL_KEY = 0
|
||||||
COL_REPL = 1
|
COL_REPL = 1
|
||||||
@@ -638,6 +657,7 @@ class GuiProjectEditReplace(QWidget):
|
|||||||
self.outerBox = QVBoxLayout()
|
self.outerBox = QVBoxLayout()
|
||||||
self.outerBox.addWidget(QLabel("<b>%s</b>" % pageLabel))
|
self.outerBox.addWidget(QLabel("<b>%s</b>" % pageLabel))
|
||||||
self.outerBox.addLayout(self.innerBox)
|
self.outerBox.addLayout(self.innerBox)
|
||||||
|
self.outerBox.setContentsMargins(0, 0, 0, 0)
|
||||||
|
|
||||||
self.setLayout(self.outerBox)
|
self.setLayout(self.outerBox)
|
||||||
|
|
||||||
@@ -655,6 +675,10 @@ class GuiProjectEditReplace(QWidget):
|
|||||||
new[aKey] = aVal
|
new[aKey] = aVal
|
||||||
return new
|
return new
|
||||||
|
|
||||||
|
def columnWidth(self) -> int:
|
||||||
|
"""Return the size of the header column."""
|
||||||
|
return self.listBox.columnWidth(0)
|
||||||
|
|
||||||
##
|
##
|
||||||
# Internal Functions
|
# Internal Functions
|
||||||
##
|
##
|
||||||
@@ -725,4 +749,4 @@ class GuiProjectEditReplace(QWidget):
|
|||||||
result += c
|
result += c
|
||||||
return result
|
return result
|
||||||
|
|
||||||
# END Class GuiProjectEditReplace
|
# END Class _ReplacePage
|
||||||
@@ -50,6 +50,7 @@ class NScrollableForm(QScrollArea):
|
|||||||
self._helpCol = QColor(0, 0, 0)
|
self._helpCol = QColor(0, 0, 0)
|
||||||
self._fontScale = FONT_SCALE
|
self._fontScale = FONT_SCALE
|
||||||
self._first = True
|
self._first = True
|
||||||
|
self._indent = CONFIG.pxInt(12)
|
||||||
|
|
||||||
self._sections: dict[int, QLabel] = {}
|
self._sections: dict[int, QLabel] = {}
|
||||||
self._editable: dict[str, NColourLabel] = {}
|
self._editable: dict[str, NColourLabel] = {}
|
||||||
@@ -92,6 +93,16 @@ class NScrollableForm(QScrollArea):
|
|||||||
qHelp.setText(text)
|
qHelp.setText(text)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def setRowIndent(self, indent: int) -> None:
|
||||||
|
"""Set the indentation of each row."""
|
||||||
|
self._indent = max(indent, 0)
|
||||||
|
return
|
||||||
|
|
||||||
|
def setLayoutMargins(self, left: int, top: int, right: int, bottom: int) -> None:
|
||||||
|
"""Set the contents margins on the layout."""
|
||||||
|
self._layout.setContentsMargins(left, top, right, bottom)
|
||||||
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
# Methods
|
# Methods
|
||||||
##
|
##
|
||||||
@@ -128,14 +139,13 @@ class NScrollableForm(QScrollArea):
|
|||||||
row = QHBoxLayout()
|
row = QHBoxLayout()
|
||||||
row.setSpacing(CONFIG.pxInt(4))
|
row.setSpacing(CONFIG.pxInt(4))
|
||||||
|
|
||||||
mPx = CONFIG.pxInt(12)
|
|
||||||
qLabel = QLabel(label, self)
|
qLabel = QLabel(label, self)
|
||||||
qLabel.setIndent(mPx)
|
qLabel.setIndent(self._indent)
|
||||||
qLabel.setBuddy(widget)
|
qLabel.setBuddy(widget)
|
||||||
|
|
||||||
if helpText:
|
if helpText:
|
||||||
qHelp = NColourLabel(str(helpText), self._helpCol, scale=self._fontScale, wrap=True)
|
qHelp = NColourLabel(str(helpText), self._helpCol, scale=self._fontScale, wrap=True)
|
||||||
qHelp.setIndent(mPx)
|
qHelp.setIndent(self._indent)
|
||||||
labelBox = QVBoxLayout()
|
labelBox = QVBoxLayout()
|
||||||
labelBox.addWidget(qLabel)
|
labelBox.addWidget(qLabel)
|
||||||
labelBox.addWidget(qHelp)
|
labelBox.addWidget(qHelp)
|
||||||
@@ -147,7 +157,7 @@ class NScrollableForm(QScrollArea):
|
|||||||
else:
|
else:
|
||||||
row.addWidget(qLabel)
|
row.addWidget(qLabel)
|
||||||
|
|
||||||
row.addSpacing(mPx)
|
row.addSpacing(CONFIG.pxInt(12))
|
||||||
row.addWidget(widget)
|
row.addWidget(widget)
|
||||||
|
|
||||||
if isinstance(unit, str):
|
if isinstance(unit, str):
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ from novelwriter.core.coretools import DocDuplicator, DocMerger, DocSplitter
|
|||||||
from novelwriter.dialogs.docmerge import GuiDocMerge
|
from novelwriter.dialogs.docmerge import GuiDocMerge
|
||||||
from novelwriter.dialogs.docsplit import GuiDocSplit
|
from novelwriter.dialogs.docsplit import GuiDocSplit
|
||||||
from novelwriter.dialogs.editlabel import GuiEditLabel
|
from novelwriter.dialogs.editlabel import GuiEditLabel
|
||||||
from novelwriter.dialogs.projsettings import GuiProjectSettings
|
from novelwriter.dialogs.projectsettings import GuiProjectSettings
|
||||||
from novelwriter.enum import (
|
from novelwriter.enum import (
|
||||||
nwDocMode, nwItemType, nwItemClass, nwItemLayout, nwWidget
|
nwDocMode, nwItemType, nwItemClass, nwItemLayout, nwWidget
|
||||||
)
|
)
|
||||||
@@ -1748,7 +1748,7 @@ class _TreeContextMenu(QMenu):
|
|||||||
menu.addSeparator()
|
menu.addSeparator()
|
||||||
action = menu.addAction(self.tr("Manage Labels ..."))
|
action = menu.addAction(self.tr("Manage Labels ..."))
|
||||||
action.triggered.connect(
|
action.triggered.connect(
|
||||||
lambda: self.projView.projectSettingsRequest.emit(GuiProjectSettings.TAB_STATUS)
|
lambda: self.projView.projectSettingsRequest.emit(GuiProjectSettings.PAGE_STATUS)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
menu = self.addMenu(self.tr("Set Importance to ..."))
|
menu = self.addMenu(self.tr("Set Importance to ..."))
|
||||||
@@ -1765,7 +1765,7 @@ class _TreeContextMenu(QMenu):
|
|||||||
menu.addSeparator()
|
menu.addSeparator()
|
||||||
action = menu.addAction(self.tr("Manage Labels ..."))
|
action = menu.addAction(self.tr("Manage Labels ..."))
|
||||||
action.triggered.connect(
|
action.triggered.connect(
|
||||||
lambda: self.projView.projectSettingsRequest.emit(GuiProjectSettings.TAB_IMPORT)
|
lambda: self.projView.projectSettingsRequest.emit(GuiProjectSettings.PAGE_IMPORT)
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ from novelwriter.dialogs.about import GuiAbout
|
|||||||
from novelwriter.dialogs.updates import GuiUpdates
|
from novelwriter.dialogs.updates import GuiUpdates
|
||||||
from novelwriter.dialogs.wordlist import GuiWordList
|
from novelwriter.dialogs.wordlist import GuiWordList
|
||||||
from novelwriter.dialogs.preferences import GuiPreferences
|
from novelwriter.dialogs.preferences import GuiPreferences
|
||||||
from novelwriter.dialogs.projsettings import GuiProjectSettings
|
from novelwriter.dialogs.projectsettings import GuiProjectSettings
|
||||||
from novelwriter.tools.welcome import GuiWelcome
|
from novelwriter.tools.welcome import GuiWelcome
|
||||||
from novelwriter.tools.manuscript import GuiManuscript
|
from novelwriter.tools.manuscript import GuiManuscript
|
||||||
from novelwriter.tools.dictionaries import GuiDictionaries
|
from novelwriter.tools.dictionaries import GuiDictionaries
|
||||||
@@ -809,10 +809,10 @@ class GuiMain(QMainWindow):
|
|||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
@pyqtSlot(int)
|
@pyqtSlot(int)
|
||||||
def showProjectSettingsDialog(self, focusTab: int = GuiProjectSettings.TAB_MAIN) -> None:
|
def showProjectSettingsDialog(self, focusTab: int = GuiProjectSettings.PAGE_SETTINGS) -> None:
|
||||||
"""Open the project settings dialog."""
|
"""Open the project settings dialog."""
|
||||||
if SHARED.hasProject:
|
if SHARED.hasProject:
|
||||||
dialog = GuiProjectSettings(self, focusTab=focusTab)
|
dialog = GuiProjectSettings(self, gotoPage=focusTab)
|
||||||
dialog.newProjectSettingsReady.connect(self._processProjectSettingsChanges)
|
dialog.newProjectSettingsReady.connect(self._processProjectSettingsChanges)
|
||||||
dialog.exec_()
|
dialog.exec_()
|
||||||
return
|
return
|
||||||
@@ -1111,13 +1111,15 @@ class GuiMain(QMainWindow):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot(bool)
|
||||||
def _processProjectSettingsChanges(self) -> None:
|
def _processProjectSettingsChanges(self, rebuildTrees: bool) -> None:
|
||||||
"""Refresh data dependent on project settings."""
|
"""Refresh data dependent on project settings."""
|
||||||
logger.debug("Applying new project settings")
|
logger.debug("Applying new project settings")
|
||||||
SHARED.updateSpellCheckLanguage()
|
SHARED.updateSpellCheckLanguage()
|
||||||
self.itemDetails.refreshDetails()
|
self.itemDetails.refreshDetails()
|
||||||
self._updateWindowTitle(SHARED.project.data.name)
|
self._updateWindowTitle(SHARED.project.data.name)
|
||||||
|
if rebuildTrees:
|
||||||
|
self.rebuildTrees()
|
||||||
return
|
return
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
|
|||||||
Reference in New Issue
Block a user