Added a few buttons below the project tree now that the tabs make room for it
This commit is contained in:
@@ -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 |
@@ -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
@@ -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
@@ -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
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user