Add functionality to build project tree in build tool
This commit is contained in:
@@ -829,8 +829,8 @@ class GuiMainMenu(QMenuBar):
|
|||||||
self.aBackupProject.triggered.connect(lambda: self.theProject.backupProject(True))
|
self.aBackupProject.triggered.connect(lambda: self.theProject.backupProject(True))
|
||||||
self.toolsMenu.addAction(self.aBackupProject)
|
self.toolsMenu.addAction(self.aBackupProject)
|
||||||
|
|
||||||
# Tools > Build Project
|
# Tools > Build Novel Project
|
||||||
self.aBuildProject = QAction(self.tr("Build Project"), self)
|
self.aBuildProject = QAction(self.tr("Build Novel Project"), self)
|
||||||
self.aBuildProject.triggered.connect(self.mainGui.showBuildProjectDialog)
|
self.aBuildProject.triggered.connect(self.mainGui.showBuildProjectDialog)
|
||||||
self.toolsMenu.addAction(self.aBuildProject)
|
self.toolsMenu.addAction(self.aBuildProject)
|
||||||
|
|
||||||
|
|||||||
@@ -1031,6 +1031,8 @@ class GuiMain(QMainWindow):
|
|||||||
dlgBuild.raise_()
|
dlgBuild.raise_()
|
||||||
qApp.processEvents()
|
qApp.processEvents()
|
||||||
|
|
||||||
|
dlgBuild.loadContent()
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def showLoremIpsumDialog(self):
|
def showLoremIpsumDialog(self):
|
||||||
|
|||||||
+117
-10
@@ -26,10 +26,11 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|||||||
import logging
|
import logging
|
||||||
import novelwriter
|
import novelwriter
|
||||||
|
|
||||||
from PyQt5.QtCore import pyqtSlot
|
from PyQt5.QtGui import QIcon
|
||||||
|
from PyQt5.QtCore import QSize, Qt, pyqtSlot
|
||||||
from PyQt5.QtWidgets import (
|
from PyQt5.QtWidgets import (
|
||||||
QAbstractItemView, QDialog, QHBoxLayout, QStackedWidget, QTreeWidget,
|
QAbstractItemView, QDialog, QHBoxLayout, QHeaderView, QStackedWidget,
|
||||||
QWidget
|
QTreeWidget, QTreeWidgetItem, QWidget
|
||||||
)
|
)
|
||||||
|
|
||||||
from novelwriter.extensions.pagedsidebar import NPagedSideBar
|
from novelwriter.extensions.pagedsidebar import NPagedSideBar
|
||||||
@@ -119,6 +120,12 @@ class GuiBuildManuscript(QDialog):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def loadContent(self):
|
||||||
|
"""Populate the tool widgets.
|
||||||
|
"""
|
||||||
|
self.optTabSelect.populateTree()
|
||||||
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
# Private Slots
|
# Private Slots
|
||||||
##
|
##
|
||||||
@@ -148,19 +155,63 @@ class GuiBuildManuscript(QDialog):
|
|||||||
|
|
||||||
class GuiBuildFilterTab(QWidget):
|
class GuiBuildFilterTab(QWidget):
|
||||||
|
|
||||||
|
C_NAME = 0
|
||||||
|
C_ACTIVE = 1
|
||||||
|
C_STATUS = 2
|
||||||
|
|
||||||
|
D_HANDLE = Qt.UserRole
|
||||||
|
|
||||||
|
F_NONE = 0
|
||||||
|
F_FILTERED = 1
|
||||||
|
F_INCLUDED = 2
|
||||||
|
F_EXCLUDED = 3
|
||||||
|
|
||||||
def __init__(self, buildMain):
|
def __init__(self, buildMain):
|
||||||
super().__init__(parent=buildMain)
|
super().__init__(parent=buildMain)
|
||||||
|
|
||||||
|
self.mainConf = novelwriter.CONFIG
|
||||||
|
self.mainGui = buildMain.mainGui
|
||||||
|
self.mainTheme = buildMain.mainGui.mainTheme
|
||||||
|
self.theProject = buildMain.mainGui.theProject
|
||||||
|
|
||||||
|
self._treeMap = {}
|
||||||
|
|
||||||
|
self._statusFlags = {
|
||||||
|
self.F_NONE: ("", QIcon()),
|
||||||
|
self.F_FILTERED: (self.tr("Filtered"), self.mainTheme.getIcon("build_filtered")),
|
||||||
|
self.F_INCLUDED: (self.tr("Included"), self.mainTheme.getIcon("build_included")),
|
||||||
|
self.F_EXCLUDED: (self.tr("Excluded"), self.mainTheme.getIcon("build_excluded")),
|
||||||
|
}
|
||||||
|
|
||||||
|
# Widgets
|
||||||
|
# =======
|
||||||
|
|
||||||
|
# Tree Settings
|
||||||
|
iPx = self.mainTheme.baseIconSize
|
||||||
|
cMg = self.mainConf.pxInt(6)
|
||||||
|
|
||||||
|
# Project Tree
|
||||||
self.optTree = QTreeWidget(self)
|
self.optTree = QTreeWidget(self)
|
||||||
self.optTree.setSelectionMode(QAbstractItemView.SingleSelection)
|
self.optTree.setIconSize(QSize(iPx, iPx))
|
||||||
self.optTree.setDragDropMode(QAbstractItemView.NoDragDrop)
|
self.optTree.setUniformRowHeights(True)
|
||||||
self.optTree.setColumnCount(2)
|
self.optTree.setAllColumnsShowFocus(True)
|
||||||
self.optTree.setHeaderLabels([
|
self.optTree.setHeaderHidden(True)
|
||||||
self.tr("Setting"),
|
self.optTree.setIndentation(iPx)
|
||||||
self.tr("Value"),
|
self.optTree.setColumnCount(3)
|
||||||
])
|
|
||||||
self.optTree.setRootIsDecorated(False)
|
self.optTree.setRootIsDecorated(False)
|
||||||
|
|
||||||
|
treeHeader = self.optTree.header()
|
||||||
|
treeHeader.setStretchLastSection(False)
|
||||||
|
treeHeader.setSectionResizeMode(self.C_NAME, QHeaderView.Stretch)
|
||||||
|
treeHeader.setSectionResizeMode(self.C_ACTIVE, QHeaderView.Fixed)
|
||||||
|
treeHeader.setSectionResizeMode(self.C_STATUS, QHeaderView.Fixed)
|
||||||
|
treeHeader.resizeSection(self.C_ACTIVE, iPx + cMg)
|
||||||
|
treeHeader.resizeSection(self.C_STATUS, iPx + cMg)
|
||||||
|
|
||||||
|
self.optTree.setSelectionMode(QAbstractItemView.ExtendedSelection)
|
||||||
|
self.optTree.setDragDropMode(QAbstractItemView.NoDragDrop)
|
||||||
|
|
||||||
|
# Assemble
|
||||||
self.outerBox = QHBoxLayout()
|
self.outerBox = QHBoxLayout()
|
||||||
self.outerBox.addWidget(self.optTree)
|
self.outerBox.addWidget(self.optTree)
|
||||||
|
|
||||||
@@ -168,6 +219,62 @@ class GuiBuildFilterTab(QWidget):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def populateTree(self):
|
||||||
|
"""Build the tree of project items.
|
||||||
|
"""
|
||||||
|
self._treeMap = {}
|
||||||
|
self.optTree.clear()
|
||||||
|
for nwItem in self.theProject.getProjectItems():
|
||||||
|
|
||||||
|
tHandle = nwItem.itemHandle
|
||||||
|
pHandle = nwItem.itemParent
|
||||||
|
|
||||||
|
if nwItem.isInactiveClass():
|
||||||
|
logger.debug("Skipping inactive class item '%s'", tHandle)
|
||||||
|
continue
|
||||||
|
|
||||||
|
hLevel = nwItem.mainHeading
|
||||||
|
itemIcon = self.mainTheme.getItemIcon(
|
||||||
|
nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, hLevel
|
||||||
|
)
|
||||||
|
|
||||||
|
if nwItem.isFileType():
|
||||||
|
iconName = "checked" if nwItem.isActive else "unchecked"
|
||||||
|
statusIcon = self._statusFlags[
|
||||||
|
self.F_FILTERED if nwItem.isActive else self.F_NONE
|
||||||
|
][1]
|
||||||
|
else:
|
||||||
|
iconName = "noncheckable"
|
||||||
|
statusIcon = self._statusFlags[self.F_NONE][1]
|
||||||
|
|
||||||
|
trItem = QTreeWidgetItem()
|
||||||
|
trItem.setIcon(self.C_NAME, itemIcon)
|
||||||
|
trItem.setText(self.C_NAME, nwItem.itemName)
|
||||||
|
trItem.setData(self.C_NAME, self.D_HANDLE, tHandle)
|
||||||
|
trItem.setIcon(self.C_ACTIVE, self.mainTheme.getIcon(iconName))
|
||||||
|
trItem.setIcon(self.C_STATUS, statusIcon)
|
||||||
|
|
||||||
|
trItem.setTextAlignment(self.C_NAME, Qt.AlignLeft)
|
||||||
|
|
||||||
|
if pHandle is None:
|
||||||
|
if nwItem.isRootType():
|
||||||
|
self.optTree.addTopLevelItem(trItem)
|
||||||
|
else:
|
||||||
|
logger.debug("Skipping item '%s'", tHandle)
|
||||||
|
continue
|
||||||
|
|
||||||
|
elif pHandle in self._treeMap:
|
||||||
|
self._treeMap[pHandle].addChild(trItem)
|
||||||
|
|
||||||
|
else:
|
||||||
|
logger.debug("Skipping item '%s'", tHandle)
|
||||||
|
continue
|
||||||
|
|
||||||
|
self._treeMap[tHandle] = trItem
|
||||||
|
trItem.setExpanded(True)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
# END Class GuiBuildFilterTab
|
# END Class GuiBuildFilterTab
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user