Added item status, and added icons and flags to the main treeview
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""novelWriter GUI Document Details
|
||||
|
||||
novelWriter – GUI Document Details
|
||||
====================================
|
||||
Class holding the left side document details panel
|
||||
|
||||
File History:
|
||||
Created: 2019-04-24 [0.0.1]
|
||||
|
||||
"""
|
||||
|
||||
import logging
|
||||
import nw
|
||||
|
||||
from os import path
|
||||
from PyQt5.QtGui import QFont
|
||||
from PyQt5.QtWidgets import QFrame, QGridLayout, QLabel
|
||||
|
||||
from nw.enum import nwItemType, nwItemClass, nwItemLayout
|
||||
from nw.project.item import NWItem
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class GuiDocDetails(QFrame):
|
||||
|
||||
C_NAME = 0
|
||||
C_COUNT = 1
|
||||
C_FLAGS = 2
|
||||
C_HANDLE = 3
|
||||
|
||||
def __init__(self, theProject):
|
||||
QFrame.__init__(self)
|
||||
|
||||
logger.debug("Initialising DocDetails ...")
|
||||
self.mainConf = nw.CONFIG
|
||||
self.debugGUI = self.mainConf.debugGUI
|
||||
self.theProject = theProject
|
||||
|
||||
self.mainBox = QGridLayout(self)
|
||||
self.mainBox.setVerticalSpacing(1)
|
||||
self.mainBox.setHorizontalSpacing(15)
|
||||
self.setLayout(self.mainBox)
|
||||
|
||||
self.fntOne = QFont()
|
||||
self.fntOne.setPointSize(10)
|
||||
self.fntOne.setBold(True)
|
||||
|
||||
self.fntTwo = QFont()
|
||||
self.fntTwo.setPointSize(10)
|
||||
|
||||
colOne = ["Name","Status","Class","Layout"]
|
||||
for nRow in range(4):
|
||||
lblOne = QLabel(colOne[nRow])
|
||||
lblOne.setFont(self.fntOne)
|
||||
self.mainBox.addWidget(lblOne,nRow+1,0)
|
||||
|
||||
self.mainBox.setColumnStretch(0,0)
|
||||
self.mainBox.setColumnStretch(1,1)
|
||||
|
||||
logger.debug("DocDetails initialisation complete")
|
||||
|
||||
return
|
||||
|
||||
def buildViewBox(self, tHandle):
|
||||
|
||||
nwItem = self.theProject.getItem(tHandle)
|
||||
itemStatus = nwItem.itemStatus
|
||||
if itemStatus < 0 or itemStatus >= len(self.theProject.statusLabels):
|
||||
itemStatus = 0
|
||||
|
||||
colTwo = [
|
||||
nwItem.itemName,
|
||||
self.theProject.statusLabels[itemStatus],
|
||||
NWItem.CLASS_NAME[nwItem.itemClass],
|
||||
NWItem.LAYOUT_NAME[nwItem.itemLayout],
|
||||
]
|
||||
|
||||
for nRow in range(4):
|
||||
lblTwo = QLabel(colTwo[nRow])
|
||||
lblTwo.setFont(self.fntTwo)
|
||||
self.mainBox.addWidget(lblTwo,nRow+1,1)
|
||||
|
||||
return
|
||||
|
||||
# END Class GuiDocDetails
|
||||
+35
-10
@@ -14,8 +14,8 @@ import logging
|
||||
import nw
|
||||
|
||||
from os import path
|
||||
from PyQt5.QtGui import QIcon
|
||||
from PyQt5.QtCore import Qt, QSize
|
||||
from PyQt5.QtGui import QIcon, QFont, QColor
|
||||
from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem, QAbstractItemView, QInputDialog, QLineEdit
|
||||
|
||||
from nw.enum import nwItemType, nwItemClass
|
||||
@@ -43,10 +43,13 @@ class GuiDocTree(QTreeWidget):
|
||||
self.setExpandsOnDoubleClick(True)
|
||||
self.setIndentation(13)
|
||||
self.setColumnCount(4)
|
||||
self.setHeaderLabels(["Name","S","#","Handle"])
|
||||
self.setHeaderLabels(["Name","Count","Flags","Handle"])
|
||||
if not self.debugGUI:
|
||||
self.hideColumn(self.C_HANDLE)
|
||||
|
||||
treeHead = self.headerItem()
|
||||
treeHead.setTextAlignment(self.C_COUNT,Qt.AlignRight)
|
||||
|
||||
# Allow Move by Drag & Drop
|
||||
self.setDragEnabled(True)
|
||||
self.setDragDropMode(QAbstractItemView.InternalMove)
|
||||
@@ -54,6 +57,9 @@ class GuiDocTree(QTreeWidget):
|
||||
for colN in range(len(self.mainConf.treeColWidth)):
|
||||
self.setColumnWidth(colN,self.mainConf.treeColWidth[colN])
|
||||
|
||||
self.fontFlags = QFont("Monospace",10)
|
||||
self.fontCount = QFont("Monospace",10)
|
||||
|
||||
logger.debug("DocTree initialisation complete")
|
||||
|
||||
return
|
||||
@@ -139,34 +145,53 @@ class GuiDocTree(QTreeWidget):
|
||||
return theItem, theCount+1
|
||||
|
||||
def _addTreeItem(self, nwItem):
|
||||
|
||||
tName = nwItem.itemName
|
||||
tHandle = nwItem.itemHandle
|
||||
pHandle = nwItem.parHandle
|
||||
tStatus = 0
|
||||
tStatus = NWItem.CLASS_FLAG[nwItem.itemClass]
|
||||
if nwItem.itemType == nwItemType.FILE:
|
||||
tStatus += "."+NWItem.LAYOUT_FLAG[nwItem.itemLayout]
|
||||
nStatus = nwItem.itemStatus
|
||||
if nStatus < 0 or nStatus >= len(self.theProject.statusIcons):
|
||||
nStatus = 0
|
||||
|
||||
newItem = QTreeWidgetItem([""]*4)
|
||||
newItem.setText(self.C_NAME, tName)
|
||||
newItem.setText(self.C_FLAGS, str(tStatus))
|
||||
newItem.setText(self.C_COUNT, "0")
|
||||
|
||||
newItem.setText(self.C_NAME,tName)
|
||||
|
||||
newItem.setText(self.C_COUNT,"0")
|
||||
# newItem.setFont(self.C_COUNT,self.fontCount)
|
||||
newItem.setForeground(self.C_COUNT,QColor(0,105,135))
|
||||
newItem.setTextAlignment(self.C_COUNT,Qt.AlignRight)
|
||||
|
||||
newItem.setText(self.C_FLAGS,tStatus)
|
||||
newItem.setIcon(self.C_FLAGS,self.theProject.statusIcons[nStatus])
|
||||
newItem.setFont(self.C_FLAGS,self.fontFlags)
|
||||
|
||||
newItem.setText(self.C_HANDLE, tHandle)
|
||||
|
||||
self.theMap[tHandle] = newItem
|
||||
if pHandle is None:
|
||||
self.addTopLevelItem(newItem)
|
||||
else:
|
||||
self.theMap[pHandle].addChild(newItem)
|
||||
self.propagateCount(tHandle, nwItem.wordCount)
|
||||
newItem.setTextAlignment(self.C_COUNT,Qt.AlignRight)
|
||||
|
||||
newItem.setExpanded(nwItem.isExpanded)
|
||||
|
||||
if nwItem.itemType == nwItemType.ROOT:
|
||||
newItem.setIcon(self.C_NAME, QIcon.fromTheme("drive-harddisk"))
|
||||
elif nwItem.itemType == nwItemType.FOLDER:
|
||||
newItem.setIcon(self.C_NAME, QIcon.fromTheme("folder"))
|
||||
elif nwItem.itemType == nwItemType.FILE:
|
||||
newItem.setIcon(self.C_NAME, QIcon.fromTheme("x-office-document"))
|
||||
|
||||
return True
|
||||
|
||||
def propagateCount(self, tHandle, theCount, nDepth=0):
|
||||
tItem = self.theMap[tHandle]
|
||||
tItem.setText(self.C_COUNT,str(theCount))
|
||||
tItem.setText(self.C_COUNT,"{:n}".format(theCount))
|
||||
pItem = tItem.parent()
|
||||
if pItem is not None:
|
||||
pCount = 0
|
||||
@@ -184,7 +209,7 @@ class GuiDocTree(QTreeWidget):
|
||||
self._addTreeItem(nwItem)
|
||||
return True
|
||||
|
||||
def _getSelectedHandle(self):
|
||||
def getSelectedHandle(self):
|
||||
selItem = self.selectedItems()
|
||||
if len(selItem) == 0:
|
||||
return None
|
||||
@@ -210,7 +235,7 @@ class GuiDocTree(QTreeWidget):
|
||||
"""Overload the drop of dragged item event to check whether the drop is allowed
|
||||
or not. Disallowed drops are cancelled.
|
||||
"""
|
||||
sHandle = self._getSelectedHandle()
|
||||
sHandle = self.getSelectedHandle()
|
||||
if sHandle is None:
|
||||
return
|
||||
|
||||
|
||||
@@ -192,7 +192,7 @@ class GuiDocTreeCtx(QMenu):
|
||||
return
|
||||
|
||||
def _buildSubMenuAddRoot(self, itemClass):
|
||||
mnuSub = QAction("Add "+NWItem.CLASS_NAME[itemClass], self)
|
||||
mnuSub = QAction("Add %s Root" % NWItem.CLASS_NAME[itemClass], self)
|
||||
mnuSub.triggered.connect(lambda: self._ctxSignal(
|
||||
nwItemAction.ADD_ROOT,
|
||||
itemClass,
|
||||
|
||||
+18
-3
@@ -21,6 +21,7 @@ from PyQt5.QtGui import QIcon
|
||||
from nw.gui.doctree import GuiDocTree
|
||||
from nw.gui.doctreectx import GuiDocTreeCtx
|
||||
from nw.gui.doceditor import GuiDocEditor
|
||||
from nw.gui.docdetails import GuiDocDetails
|
||||
from nw.gui.projecteditor import GuiProjectEditor
|
||||
from nw.gui.statusbar import GuiMainStatus
|
||||
from nw.project.project import NWProject
|
||||
@@ -44,8 +45,9 @@ class GuiMain(QMainWindow):
|
||||
self.setWindowIcon(QIcon(path.join(self.mainConf.appPath,"..","novelWriter.svg")))
|
||||
|
||||
# Main GUI Elements
|
||||
self.docEditor = GuiDocEditor(self)
|
||||
self.treeView = GuiDocTree(self.theProject)
|
||||
self.docEditor = GuiDocEditor(self)
|
||||
self.docDetails = GuiDocDetails(self.theProject)
|
||||
self.treeView = GuiDocTree(self.theProject)
|
||||
|
||||
# Assemble Main Window
|
||||
self.stackPane = QStackedWidget()
|
||||
@@ -53,8 +55,14 @@ class GuiMain(QMainWindow):
|
||||
self.stackDoc = self.stackPane.addWidget(self.docEditor)
|
||||
self.stackPane.setCurrentIndex(self.stackNone)
|
||||
|
||||
self.treePane = QFrame()
|
||||
self.treeBox = QVBoxLayout()
|
||||
self.treeBox.addWidget(self.treeView)
|
||||
self.treeBox.addWidget(self.docDetails)
|
||||
self.treePane.setLayout(self.treeBox)
|
||||
|
||||
self.splitMain = QSplitter(Qt.Horizontal)
|
||||
self.splitMain.addWidget(self.treeView)
|
||||
self.splitMain.addWidget(self.treePane)
|
||||
self.splitMain.addWidget(self.stackPane)
|
||||
self.splitMain.setSizes(self.mainConf.mainPanePos)
|
||||
self.splitMain.splitterMoved.connect(self._splitMainMove)
|
||||
@@ -65,6 +73,7 @@ class GuiMain(QMainWindow):
|
||||
self._buildMenu()
|
||||
self.treeView.setContextMenuPolicy(Qt.CustomContextMenu)
|
||||
self.treeView.customContextMenuRequested.connect(self._openDocTreeContextMenu)
|
||||
self.treeView.itemSelectionChanged.connect(self._treeSingleClick)
|
||||
self.treeView.itemDoubleClicked.connect(self._treeDoubleClick)
|
||||
self.treeView.buildTree()
|
||||
|
||||
@@ -159,6 +168,12 @@ class GuiMain(QMainWindow):
|
||||
# Internal Functions
|
||||
##
|
||||
|
||||
def _treeSingleClick(self):
|
||||
sHandle = self.treeView.getSelectedHandle()
|
||||
if sHandle is not None:
|
||||
self.docDetails.buildViewBox(sHandle)
|
||||
return
|
||||
|
||||
def _treeDoubleClick(self, tItem, colNo):
|
||||
tHandle = tItem.text(3)
|
||||
logger.verbose("User double clicked tree item with handle %s" % tHandle)
|
||||
|
||||
Reference in New Issue
Block a user