Added a few buttons below the project tree now that the tabs make room for it

This commit is contained in:
Veronica K. B. Olsen
2021-01-14 18:31:27 +01:00
parent 3bc8006028
commit 0bfc166899
5 changed files with 125 additions and 21 deletions
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.2"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg1989">
<metadata
id="metadata1995">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs1993" />
<path
d="M 8.3268645,20.0768 8.9719703,22.448 C 9.2032354,23.3008 10.175241,24 11.131598,24 h 1.738831 c 0.956356,0 1.928363,-0.6992 2.159627,-1.552 l 0.645108,-2.3712 c 0.231264,-0.8528 1.173709,-1.3536 2.091812,-1.1104 l 2.550866,0.672 c 0.91984,0.2416 2.06573,-0.1824 2.542169,-0.9456 l 0.869415,-1.3872 c 0.476441,-0.7632 0.307773,-1.8864 -0.380803,-2.4992 l -1.909236,-1.6976 c -0.688578,-0.6128 -0.688578,-1.6128 0.0017,-2.224 L 23.346891,9.1872 C 24.035507,8.5759996 24.205912,7.4527996 23.729472,6.6895996 L 22.858272,5.3024 C 22.380094,4.5392 21.235943,4.1152 20.317842,4.3568 l -2.550866,0.672 C 16.847134,5.2704 15.906428,4.7712 15.673424,3.9184 L 15.030056,1.5504 C 14.798792,0.69919996 13.826785,0 12.870429,0 H 11.131598 C 10.175241,0 9.2032354,0.69919996 8.9719703,1.552 L 8.3286034,3.92 C 8.0955994,4.7728 7.1548921,5.2736 6.2350507,5.032 L 3.684186,4.36 C 2.7643447,4.1168 1.6184552,4.5424 1.1420155,5.304 L 0.27260019,6.6912 c -0.47643954,0.7632 -0.307773,1.8864 0.38254277,2.4991996 L 2.5609015,10.8848 c 0.6868381,0.6128 0.6868381,1.6128 0,2.2256 L 0.65166536,14.808 c -0.68683817,0.6128 -0.85898242,1.736 -0.38080407,2.4992 l 0.87115421,1.3872 c 0.4764397,0.7632 1.6223292,1.1872 2.5421705,0.9456 l 2.5508647,-0.672 c 0.9181025,-0.2448 1.8605487,0.256 2.0918138,1.1088 z M 12.001014,8.8000004 c 1.919668,0 3.477662,1.4319996 3.477662,3.1999996 0,1.7664 -1.557994,3.2 -3.477662,3.2 -1.91967,0 -3.4776615,-1.4336 -3.4776615,-3.2 0,-1.768 1.5579915,-3.1999996 3.4776615,-3.1999996 z"
id="path1987"
style="fill:#aeaeae;fill-opacity:1;stroke-width:1.66797" />
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

+31
View File
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.2"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg1989">
<metadata
id="metadata1995">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs1993" />
<path
d="M 8.3268645,20.0768 8.9719703,22.448 C 9.2032354,23.3008 10.175241,24 11.131598,24 h 1.738831 c 0.956356,0 1.928363,-0.6992 2.159627,-1.552 l 0.645108,-2.3712 c 0.231264,-0.8528 1.173709,-1.3536 2.091812,-1.1104 l 2.550866,0.672 c 0.91984,0.2416 2.06573,-0.1824 2.542169,-0.9456 l 0.869415,-1.3872 c 0.476441,-0.7632 0.307773,-1.8864 -0.380803,-2.4992 l -1.909236,-1.6976 c -0.688578,-0.6128 -0.688578,-1.6128 0.0017,-2.224 L 23.346891,9.1872 C 24.035507,8.5759996 24.205912,7.4527996 23.729472,6.6895996 L 22.858272,5.3024 C 22.380094,4.5392 21.235943,4.1152 20.317842,4.3568 l -2.550866,0.672 C 16.847134,5.2704 15.906428,4.7712 15.673424,3.9184 L 15.030056,1.5504 C 14.798792,0.69919996 13.826785,0 12.870429,0 H 11.131598 C 10.175241,0 9.2032354,0.69919996 8.9719703,1.552 L 8.3286034,3.92 C 8.0955994,4.7728 7.1548921,5.2736 6.2350507,5.032 L 3.684186,4.36 C 2.7643447,4.1168 1.6184552,4.5424 1.1420155,5.304 L 0.27260019,6.6912 c -0.47643954,0.7632 -0.307773,1.8864 0.38254277,2.4991996 L 2.5609015,10.8848 c 0.6868381,0.6128 0.6868381,1.6128 0,2.2256 L 0.65166536,14.808 c -0.68683817,0.6128 -0.85898242,1.736 -0.38080407,2.4992 l 0.87115421,1.3872 c 0.4764397,0.7632 1.6223292,1.1872 2.5421705,0.9456 l 2.5508647,-0.672 c 0.9181025,-0.2448 1.8605487,0.256 2.0918138,1.1088 z M 12.001014,8.8000004 c 1.919668,0 3.477662,1.4319996 3.477662,3.1999996 0,1.7664 -1.557994,3.2 -3.477662,3.2 -1.91967,0 -3.4776615,-1.4336 -3.4776615,-3.2 0,-1.768 1.5579915,-3.1999996 3.4776615,-3.1999996 z"
id="path1987"
style="fill:#000000;fill-opacity:0.721569;stroke-width:1.66797" />
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+17 -11
View File
@@ -190,6 +190,22 @@ class GuiItemDetails(QWidget):
# Class Methods # Class Methods
## ##
def clearDetails(self):
"""Clear all the data values.
"""
self.labelFlag.setPixmap(QPixmap(1, 1))
self.labelData.setText("")
self.statusFlag.setPixmap(QPixmap(1, 1))
self.statusData.setText("")
self.classFlag.setText("")
self.classData.setText("")
self.layoutFlag.setText("")
self.layoutData.setText("")
self.cCountData.setText("")
self.wCountData.setText("")
self.pCountData.setText("")
return
def updateCounts(self, tHandle, cC, wC, pC): def updateCounts(self, tHandle, cC, wC, pC):
"""Just update the counts if the handle is the same as the one """Just update the counts if the handle is the same as the one
we're already showing. we're already showing.
@@ -207,17 +223,7 @@ class GuiItemDetails(QWidget):
nwItem = self.theProject.projTree[tHandle] nwItem = self.theProject.projTree[tHandle]
if nwItem is None: if nwItem is None:
self.labelFlag.setText("") self.clearDetails()
self.labelData.setText("")
self.statusFlag.setText("")
self.statusData.setText("")
self.classFlag.setText("")
self.classData.setText("")
self.layoutFlag.setText("")
self.layoutData.setText("")
self.cCountData.setText("")
self.wCountData.setText("")
self.pCountData.setText("")
else: else:
theLabel = nwItem.itemName theLabel = nwItem.itemName
+12 -7
View File
@@ -473,6 +473,9 @@ class GuiTheme:
return return
def _parseLine(self, confParser, cnfSec, cnfName, cnfDefault): def _parseLine(self, confParser, cnfSec, cnfName, cnfDefault):
"""Simple wrapper for the config parser to check that the entry
exists before attempting to load it.
"""
if confParser.has_section(cnfSec): if confParser.has_section(cnfSec):
if confParser.has_option(cnfSec, cnfName): if confParser.has_option(cnfSec, cnfName):
return confParser.get(cnfSec, cnfName) return confParser.get(cnfSec, cnfName)
@@ -500,12 +503,13 @@ class GuiIcons:
the ICON_MAP data tuple[0]. This will let Qt pull the closest the ICON_MAP data tuple[0]. This will let Qt pull the closest
system icon. system icon.
* Third action is to look up the freedesktop icon theme name using * Third action is to look up the freedesktop icon theme name using
the fromTheme Qt call. This generally produces the same results the fromTheme Qt call. This generally produces the same result
as the step above, but has more icons available in other cases. as the step above, but has more icons available in other cases.
* Fourth, and finally, the icon is looked up in the fallback * Fourth, and finally, the icon is looked up in the fallback
folder. Files in this folder must have the same file name as the folder. Files in this folder must have the same file name as the
novelWriter internal icon key, with '-dark' appended to it for novelWriter internal icon key, with '-dark' appended to them for
the dark background version of the icon. the dark background version of the icon. If no dark icon exists,
the non-dark version will be returned.
""" """
ICON_MAP = { ICON_MAP = {
@@ -563,6 +567,7 @@ class GuiIcons:
"reference" : (None, None), "reference" : (None, None),
"backward" : (None, None), "backward" : (None, None),
"forward" : (None, None), "forward" : (None, None),
"settings" : (None, None),
## Switches ## Switches
"sticky-on" : (None, None), "sticky-on" : (None, None),
@@ -611,7 +616,6 @@ class GuiIcons:
the GUI icons cannot really be replaced without writing specific the GUI icons cannot really be replaced without writing specific
update functions for the classes where they're used. update functions for the classes where they're used.
""" """
logger.debug("Loading icon theme files") logger.debug("Loading icon theme files")
self.themeMap = {} self.themeMap = {}
@@ -748,7 +752,7 @@ class GuiIcons:
## ##
def _loadIcon(self, iconKey): def _loadIcon(self, iconKey):
"""Load an icon from the assets or theme folder, with a """Load an icon from the assets or themes folder, with a
preference for dark/light icons depending on theme type, if such preference for dark/light icons depending on theme type, if such
an icon exists. Prefer svg files over png files. Always returns an icon exists. Prefer svg files over png files. Always returns
a QIcon. a QIcon.
@@ -786,6 +790,7 @@ class GuiIcons:
if os.path.isfile(fbackIcon): if os.path.isfile(fbackIcon):
logger.verbose("Loading icon '%s' from fallback theme (dark mode)" % iconKey) logger.verbose("Loading icon '%s' from fallback theme (dark mode)" % iconKey)
return QIcon(fbackIcon) return QIcon(fbackIcon)
fbackIcon = os.path.join(self.mainConf.iconPath, self.fbackName, "%s.svg" % iconKey) fbackIcon = os.path.join(self.mainConf.iconPath, self.fbackName, "%s.svg" % iconKey)
if os.path.isfile(fbackIcon): if os.path.isfile(fbackIcon):
logger.verbose("Loading icon '%s' from fallback theme (light mode)" % iconKey) logger.verbose("Loading icon '%s' from fallback theme (light mode)" % iconKey)
@@ -797,8 +802,8 @@ class GuiIcons:
return QIcon() return QIcon()
def _parseLine(self, confParser, cnfSec, cnfName, cnfDefault): def _parseLine(self, confParser, cnfSec, cnfName, cnfDefault):
"""Simple wrapper for the config parser check for entry existing """Simple wrapper for the config parser to check that the entry
before arrempting to load. exists before attempting to load it.
""" """
if confParser.has_section(cnfSec): if confParser.has_section(cnfSec):
if confParser.has_option(cnfSec, cnfName): if confParser.has_option(cnfSec, cnfName):
+34 -3
View File
@@ -32,11 +32,11 @@ import os
from datetime import datetime from datetime import datetime
from time import time from time import time
from PyQt5.QtCore import Qt, QTimer, QThreadPool, pyqtSlot from PyQt5.QtCore import Qt, QTimer, QSize, QThreadPool, pyqtSlot
from PyQt5.QtGui import QIcon, QPixmap, QColor, QKeySequence, QCursor from PyQt5.QtGui import QIcon, QPixmap, QColor, QKeySequence, QCursor
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
qApp, QMainWindow, QVBoxLayout, QWidget, QSplitter, QFileDialog, QShortcut, qApp, QMainWindow, QVBoxLayout, QWidget, QSplitter, QFileDialog, QShortcut,
QMessageBox, QDialog, QTabWidget QMessageBox, QDialog, QTabWidget, QToolBar, QAction
) )
from nw.gui import ( from nw.gui import (
@@ -112,7 +112,7 @@ class GuiMain(QMainWindow):
self.statusIcons = [] self.statusIcons = []
self.importIcons = [] self.importIcons = []
# Project Tabs : Project / Novel # Project Tree Tabs
self.projTabs = QTabWidget() self.projTabs = QTabWidget()
self.projTabs.setTabPosition(QTabWidget.South) self.projTabs.setTabPosition(QTabWidget.South)
self.projTabs.setStyleSheet("QTabWidget::pane {border: 0;};") self.projTabs.setStyleSheet("QTabWidget::pane {border: 0;};")
@@ -124,6 +124,30 @@ class GuiMain(QMainWindow):
tabFont.setPointSize(round(0.9*self.theTheme.fontPointSize)) tabFont.setPointSize(round(0.9*self.theTheme.fontPointSize))
self.projTabs.tabBar().setFont(tabFont) self.projTabs.tabBar().setFont(tabFont)
# Project Tree Action Buttons
btnSize = round(0.7*self.theTheme.fontPixelSize)
self.treeButtons = QToolBar()
self.treeButtons.setToolButtonStyle(Qt.ToolButtonIconOnly)
self.treeButtons.setIconSize(QSize(btnSize, btnSize))
self.treeButtons.setContentsMargins(0, 0, 0, 0)
self.treeButtons.setStyleSheet(r"QToolBar {padding: 0;}")
self.projTabs.setCornerWidget(self.treeButtons, Qt.BottomRightCorner)
self.projDetailsBtn = QAction("Project Details")
self.projDetailsBtn.setIcon(self.theTheme.getIcon("status_lines"))
self.projDetailsBtn.triggered.connect(lambda: self.showProjectDetailsDialog())
self.treeButtons.addAction(self.projDetailsBtn)
self.projStatsBtn = QAction("Project Statistics")
self.projStatsBtn.setIcon(self.theTheme.getIcon("status_stats"))
self.projStatsBtn.triggered.connect(lambda: self.showWritingStatsDialog())
self.treeButtons.addAction(self.projStatsBtn)
self.projSettingsBtn = QAction("Project Settings")
self.projSettingsBtn.setIcon(self.theTheme.getIcon("settings"))
self.projSettingsBtn.triggered.connect(lambda: self.showProjectSettingsDialog())
self.treeButtons.addAction(self.projSettingsBtn)
# Project Tree View # Project Tree View
self.treePane = QWidget() self.treePane = QWidget()
self.treeBox = QVBoxLayout() self.treeBox = QVBoxLayout()
@@ -269,11 +293,18 @@ class GuiMain(QMainWindow):
def clearGUI(self): def clearGUI(self):
"""Wrapper function to clear all sub-elements of the main GUI. """Wrapper function to clear all sub-elements of the main GUI.
""" """
# Project Area
self.treeView.clearTree() self.treeView.clearTree()
self.novelView.clearTree() self.novelView.clearTree()
self.treeMeta.clearDetails()
# Work Area
self.docEditor.clearEditor() self.docEditor.clearEditor()
self.closeDocViewer() self.closeDocViewer()
# General
self.statusBar.clearStatus() self.statusBar.clearStatus()
return True return True
def initMain(self): def initMain(self):