From bfa8f97e7e33d48fe1519361c6a7615c860085a7 Mon Sep 17 00:00:00 2001
From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com>
Date: Sat, 27 Feb 2021 16:49:54 +0100
Subject: [PATCH] Make the Importance and Status tabs look consistent with
Auto-Replace
---
nw/core/options.py | 2 +
nw/gui/projsettings.py | 139 ++++++++++++++++++----------
tests/test_base/test_base_common.py | 1 -
tests/tools.py | 12 ---
4 files changed, 90 insertions(+), 64 deletions(-)
diff --git a/nw/core/options.py b/nw/core/options.py
index 51fba3b6..e9de1af3 100644
--- a/nw/core/options.py
+++ b/nw/core/options.py
@@ -91,6 +91,8 @@ class OptionState():
"winWidth",
"winHeight",
"replaceColW",
+ "statusColW",
+ "importColW",
},
"GuiProjectDetails": {
"winWidth",
diff --git a/nw/gui/projsettings.py b/nw/gui/projsettings.py
index ff21309d..3755a5b8 100644
--- a/nw/gui/projsettings.py
+++ b/nw/gui/projsettings.py
@@ -31,8 +31,8 @@ from PyQt5.QtCore import Qt, QLocale
from PyQt5.QtGui import QIcon, QPixmap, QColor, QBrush
from PyQt5.QtWidgets import (
QHBoxLayout, QVBoxLayout, QLineEdit, QPlainTextEdit, QLabel, QWidget,
- QDialogButtonBox, QListWidget, QPushButton, QListWidgetItem, QColorDialog,
- QAbstractItemView, QTreeWidget, QTreeWidgetItem, QComboBox
+ QDialogButtonBox, QPushButton, QColorDialog, QTreeWidget, QTreeWidgetItem,
+ QComboBox
)
from nw.constants import nwAlert
@@ -143,10 +143,14 @@ class GuiProjectSettings(PagedDialog):
winWidth = self.mainConf.rpxInt(self.width())
winHeight = self.mainConf.rpxInt(self.height())
replaceColW = self.mainConf.rpxInt(self.tabReplace.listBox.columnWidth(0))
+ statusColW = self.mainConf.rpxInt(self.tabStatus.listBox.columnWidth(0))
+ importColW = self.mainConf.rpxInt(self.tabImport.listBox.columnWidth(0))
self.optState.setValue("GuiProjectSettings", "winWidth", winWidth)
self.optState.setValue("GuiProjectSettings", "winHeight", winHeight)
self.optState.setValue("GuiProjectSettings", "replaceColW", replaceColW)
+ self.optState.setValue("GuiProjectSettings", "statusColW", statusColW)
+ self.optState.setValue("GuiProjectSettings", "importColW", importColW)
return
@@ -243,14 +247,21 @@ class GuiProjectEditStatus(QWidget):
self.mainConf = nw.CONFIG
self.theParent = theParent
self.theProject = theProject
+ self.optState = theProject.optState
self.theTheme = theParent.theTheme
if isStatus:
self.theStatus = self.theProject.statusItems
pageLabel = self.tr("Novel File Status Levels")
+ colSetting = "statusColW"
else:
self.theStatus = self.theProject.importItems
pageLabel = self.tr("Note File Importance Levels")
+ colSetting = "importColW"
+
+ wCol0 = self.mainConf.pxInt(
+ self.optState.getInt("GuiProjectSettings", colSetting, 130)
+ )
self.colData = []
self.colCounts = []
@@ -262,23 +273,32 @@ class GuiProjectEditStatus(QWidget):
# The List
# ========
- self.listBox = QListWidget()
- self.listBox.setDragDropMode(QAbstractItemView.InternalMove)
+ self.listBox = QTreeWidget()
+ self.listBox.setHeaderLabels([
+ self.tr("Label"),
+ self.tr("Usage"),
+ ])
self.listBox.itemSelectionChanged.connect(self._selectedItem)
- self.listBox.model().rowsMoved.connect(self._rowsMoved)
+ self.listBox.setColumnWidth(0, wCol0)
+ self.listBox.setIndentation(0)
for iName, iCol, nUse in self.theStatus:
self._addItem(iName, iCol, iName, nUse)
- # The Controls
- # ============
+ # List Controls
+ # =============
- self.newButton = QPushButton(self.tr("New"))
- self.newButton.clicked.connect(self._newItem)
+ self.addButton = QPushButton(self.theTheme.getIcon("add"), "")
+ self.addButton.setToolTip(self.tr("Add new entry"))
+ self.addButton.clicked.connect(self._newItem)
- self.delButton = QPushButton(self.tr("Delete"))
+ self.delButton = QPushButton(self.theTheme.getIcon("remove"), "")
+ self.delButton.setToolTip(self.tr("Delete selected entry"))
self.delButton.clicked.connect(self._delItem)
+ # Edit Form
+ # =========
+
self.editName = QLineEdit()
self.editName.setMaxLength(40)
self.editName.setEnabled(False)
@@ -296,23 +316,27 @@ class GuiProjectEditStatus(QWidget):
# Assemble
# ========
- self.mainForm = QVBoxLayout()
- self.mainForm.addWidget(self.newButton)
- self.mainForm.addWidget(self.delButton)
- self.mainForm.addStretch(1)
- self.mainForm.addWidget(QLabel("%s" % self.tr("Name")))
- self.mainForm.addWidget(self.editName)
- self.mainForm.addWidget(self.colButton)
- self.mainForm.addStretch(1)
- self.mainForm.addWidget(self.saveButton)
+ self.listControls = QVBoxLayout()
+ self.listControls.addWidget(self.addButton)
+ self.listControls.addWidget(self.delButton)
+ self.listControls.addStretch(1)
- self.mainBox = QHBoxLayout()
+ self.editBox = QHBoxLayout()
+ self.editBox.addWidget(self.editName)
+ self.editBox.addWidget(self.colButton)
+ self.editBox.addWidget(self.saveButton)
+
+ self.mainBox = QVBoxLayout()
self.mainBox.addWidget(self.listBox)
- self.mainBox.addLayout(self.mainForm)
+ self.mainBox.addLayout(self.editBox)
+
+ self.innerBox = QHBoxLayout()
+ self.innerBox.addLayout(self.mainBox)
+ self.innerBox.addLayout(self.listControls)
self.outerBox = QVBoxLayout()
self.outerBox.addWidget(QLabel("%s" % pageLabel))
- self.outerBox.addLayout(self.mainBox)
+ self.outerBox.addLayout(self.innerBox)
self.setLayout(self.outerBox)
@@ -323,9 +347,9 @@ class GuiProjectEditStatus(QWidget):
"""
if self.colChanged:
newList = []
- for n in range(self.listBox.count()):
- nItem = self.listBox.item(n)
- nIdx = nItem.data(Qt.UserRole)
+ for n in range(self.listBox.topLevelItemCount()):
+ nItem = self.listBox.topLevelItem(n)
+ nIdx = nItem.data(0, Qt.UserRole)
newList.append(self.colData[nIdx])
return newList
@@ -354,7 +378,8 @@ class GuiProjectEditStatus(QWidget):
"""Create a new status item.
"""
newItem = self._addItem(self.tr("New Item"), (0, 0, 0), None, 0)
- newItem.setBackground(QBrush(QColor(0, 255, 0, 80)))
+ newItem.setBackground(0, QBrush(QColor(0, 255, 0, 70)))
+ newItem.setBackground(1, QBrush(QColor(0, 255, 0, 70)))
self.colChanged = True
return
@@ -363,8 +388,8 @@ class GuiProjectEditStatus(QWidget):
"""
selItem = self._getSelectedItem()
if selItem is not None:
- iRow = self.listBox.row(selItem)
- selIdx = selItem.data(Qt.UserRole)
+ iRow = self.listBox.indexFromItem(selItem)
+ selIdx = selItem.data(0, Qt.UserRole)
if self.colCounts[selIdx] == 0:
self.listBox.takeItem(iRow)
self.colChanged = True
@@ -379,7 +404,7 @@ class GuiProjectEditStatus(QWidget):
"""
selItem = self._getSelectedItem()
if selItem is not None:
- selIdx = selItem.data(Qt.UserRole)
+ selIdx = selItem.data(0, Qt.UserRole)
self.colData[selIdx] = (
self.editName.text().strip(),
self.selColour.red(),
@@ -387,12 +412,10 @@ class GuiProjectEditStatus(QWidget):
self.selColour.blue(),
self.colData[selIdx][4]
)
- selItem.setText(self.tr("{0} [{1}]").format(
- self.colData[selIdx][0], self.colCounts[selIdx])
- )
- selItem.setIcon(self.colButton.icon())
+ selItem.setText(0, self.colData[selIdx][0])
+ selItem.setText(1, self._usageString(self.colCounts[selIdx]))
+ selItem.setIcon(0, self.colButton.icon())
self.editName.setEnabled(False)
- self.editName.setText("")
self.colChanged = True
return
@@ -402,11 +425,12 @@ class GuiProjectEditStatus(QWidget):
"""
newIcon = QPixmap(self.iPx, self.iPx)
newIcon.fill(QColor(*iCol))
- newItem = QListWidgetItem()
- newItem.setText(self.tr("{0} [{1}]").format(iName, nUse))
- newItem.setIcon(QIcon(newIcon))
- newItem.setData(Qt.UserRole, len(self.colData))
- self.listBox.addItem(newItem)
+ newItem = QTreeWidgetItem()
+ newItem.setText(0, iName)
+ newItem.setText(1, self._usageString(nUse))
+ newItem.setIcon(0, QIcon(newIcon))
+ newItem.setData(0, Qt.UserRole, len(self.colData))
+ self.listBox.addTopLevelItem(newItem)
self.colData.append((iName, iCol[0], iCol[1], iCol[2], oName))
self.colCounts.append(nUse)
return newItem
@@ -417,7 +441,7 @@ class GuiProjectEditStatus(QWidget):
"""
selItem = self._getSelectedItem()
if selItem is not None:
- selIdx = selItem.data(Qt.UserRole)
+ selIdx = selItem.data(0, Qt.UserRole)
selVal = self.colData[selIdx]
self.selColour = QColor(selVal[1], selVal[2], selVal[3])
newIcon = QPixmap(self.iPx, self.iPx)
@@ -448,6 +472,16 @@ class GuiProjectEditStatus(QWidget):
self.colChanged = True
return
+ def _usageString(self, nUse):
+ """Generate usage string.
+ """
+ if nUse == 0:
+ return self.tr("Not in use")
+ elif nUse == 1:
+ return self.tr("Used once")
+ else:
+ return self.tr("Used by {0} items").format(nUse)
+
# END Class GuiProjectEditStatus
class GuiProjectEditReplace(QWidget):
@@ -463,7 +497,7 @@ class GuiProjectEditReplace(QWidget):
self.arChanged = False
wCol0 = self.mainConf.pxInt(
- self.optState.getInt("GuiProjectSettings", "replaceColW", 100)
+ self.optState.getInt("GuiProjectSettings", "replaceColW", 130)
)
pageLabel = self.tr("Text Replace List for Preview and Export")
@@ -486,8 +520,19 @@ class GuiProjectEditReplace(QWidget):
self.listBox.sortByColumn(0, Qt.AscendingOrder)
self.listBox.setSortingEnabled(True)
- # Controls
- # ========
+ # List Controls
+ # =============
+
+ self.addButton = QPushButton(self.theTheme.getIcon("add"), "")
+ self.addButton.setToolTip(self.tr("Add new entry"))
+ self.addButton.clicked.connect(self._addEntry)
+
+ self.delButton = QPushButton(self.theTheme.getIcon("remove"), "")
+ self.delButton.setToolTip(self.tr("Delete selected entry"))
+ self.delButton.clicked.connect(self._delEntry)
+
+ # Edit Form
+ # =========
self.editKey = QLineEdit()
self.editKey.setPlaceholderText(self.tr("Select item to edit"))
@@ -502,14 +547,6 @@ class GuiProjectEditReplace(QWidget):
self.saveButton.setToolTip(self.tr("Save entry"))
self.saveButton.clicked.connect(self._saveEntry)
- self.addButton = QPushButton(self.theTheme.getIcon("add"), "")
- self.addButton.setToolTip(self.tr("Add new entry"))
- self.addButton.clicked.connect(self._addEntry)
-
- self.delButton = QPushButton(self.theTheme.getIcon("remove"), "")
- self.delButton.setToolTip(self.tr("Delete selected entry"))
- self.delButton.clicked.connect(self._delEntry)
-
# Assemble
# ========
diff --git a/tests/test_base/test_base_common.py b/tests/test_base/test_base_common.py
index 695fb66a..a5698685 100644
--- a/tests/test_base/test_base_common.py
+++ b/tests/test_base/test_base_common.py
@@ -29,7 +29,6 @@ from nw.common import (
makeFileNameSafe, isHandle, isTitleTag, isItemClass, isItemType,
isItemLayout, numberToRoman
)
-from tools import cmpList
@pytest.mark.base
def testBaseCommon_CheckString():
diff --git a/tests/tools.py b/tests/tools.py
index 1b688f1e..65128cc9 100644
--- a/tests/tools.py
+++ b/tests/tools.py
@@ -72,18 +72,6 @@ def cmpFiles(fileOne, fileTwo, ignoreLines=None):
return not diffFound
-def cmpList(listOne, listTwo):
- """Compare two iterable objects.
- """
- flatOne = list(chain.from_iterable([listOne]))
- flatTwo = list(chain.from_iterable([listTwo]))
- if len(flatOne) != len(flatTwo):
- return False
- for i in range(len(flatOne)):
- if flatOne[i] != flatTwo[i]:
- return False
- return True
-
def getGuiItem(theName):
"""Returns a QtWidget based on its objectName.
"""