Rewritten how status items are changed, using a data storage instead of passing colours back and forth from icons

This commit is contained in:
Veronica K. B. Olsen
2019-05-22 23:29:55 +02:00
parent 08c74b2541
commit 4ae32f3269
2 changed files with 55 additions and 40 deletions
+54 -39
View File
@@ -15,12 +15,13 @@ import nw
from os import path from os import path
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon, QPixmap, QColor, QBrush from PyQt5.QtGui import QIcon, QPixmap, QColor, QBrush
from PyQt5.QtSvg import QSvgWidget from PyQt5.QtSvg import QSvgWidget
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QDialog, QHBoxLayout, QVBoxLayout, QFormLayout, QLineEdit, QPlainTextEdit, QLabel, QDialog, QHBoxLayout, QVBoxLayout, QFormLayout, QLineEdit, QPlainTextEdit, QLabel,
QWidget, QTabWidget, QDialogButtonBox, QListWidget, QListWidgetItem, QPushButton, QWidget, QTabWidget, QDialogButtonBox, QListWidget, QListWidgetItem, QPushButton,
QColorDialog QColorDialog, QAbstractItemView
) )
from nw.enum import nwAlert from nw.enum import nwAlert
@@ -138,20 +139,21 @@ class GuiProjectEditStatus(QWidget):
self.theParent = theParent self.theParent = theParent
self.theStatus = theStatus self.theStatus = theStatus
self.colNames = [] self.colData = []
self.colCounts = [] self.colCounts = []
self.colChanged = False self.colChanged = False
self.selColour = None
self.mainBox = QHBoxLayout() self.mainBox = QHBoxLayout()
self.mainForm = QVBoxLayout() self.mainForm = QVBoxLayout()
self.listBox = QListWidget() self.listBox = QListWidget()
self.listBox.setDragDropMode(QAbstractItemView.InternalMove)
self.listBox.itemSelectionChanged.connect(self._selectedItem) self.listBox.itemSelectionChanged.connect(self._selectedItem)
self.listBox.model().rowsMoved.connect(self._rowsMoved)
for iName, iCol, nUse in self.theStatus: for iName, iCol, nUse in self.theStatus:
self._addItem("%s [%d]" % (iName, nUse), iCol) self._addItem(iName, iCol, iName, nUse)
self.colNames.append(iName)
self.colCounts.append(nUse)
self.editName = QLineEdit() self.editName = QLineEdit()
self.newButton = QPushButton("New") self.newButton = QPushButton("New")
@@ -188,10 +190,8 @@ class GuiProjectEditStatus(QWidget):
newList = [] newList = []
for n in range(self.listBox.count()): for n in range(self.listBox.count()):
nItem = self.listBox.item(n) nItem = self.listBox.item(n)
nName = self._cleanLabel(nItem.text()) nIdx = nItem.data(Qt.UserRole)
nImg = nItem.icon().pixmap(16,16).toImage() newList.append(self.colData[nIdx])
nCol = QColor(nImg.pixel(7,7))
newList.append((nName,nCol.red(),nCol.green(),nCol.blue(),self.colNames[n]))
return newList return newList
return None return None
@@ -201,60 +201,77 @@ class GuiProjectEditStatus(QWidget):
def _selectColour(self): def _selectColour(self):
logger.verbose("Item colour button clicked") logger.verbose("Item colour button clicked")
selImg = self.colButton.icon().pixmap(16,16).toImage() if self.selColour is not None:
selCol = QColor(selImg.pixel(7,7)) newCol = QColorDialog.getColor(self.selColour, self, "Select Colour", QColorDialog.DontUseNativeDialog)
newCol = QColorDialog.getColor(selCol, self, "Select Colour", QColorDialog.DontUseNativeDialog) if newCol:
if newCol: self.selColour = newCol
colPixmap = QPixmap(16,16) colPixmap = QPixmap(16,16)
colPixmap.fill(newCol) colPixmap.fill(newCol)
self.colButton.setIcon(QIcon(colPixmap)) self.colButton.setIcon(QIcon(colPixmap))
self.colButton.setIconSize(colPixmap.rect().size()) self.colButton.setIconSize(colPixmap.rect().size())
return return
def _newItem(self): def _newItem(self):
newItem = self._addItem("New Item [0]", (0, 0, 0)) logger.verbose("New item button clicked")
newItem = self._addItem("New Item", (0, 0, 0), None, 0)
newItem.setBackground(QBrush(QColor(0,255,0,80))) newItem.setBackground(QBrush(QColor(0,255,0,80)))
self.colNames.append(None)
self.colCounts.append(0)
self.colChanged = True self.colChanged = True
return return
def _delItem(self): def _delItem(self):
logger.verbose("Delete item button clicked")
selItem = self._getSelectedItem() selItem = self._getSelectedItem()
iRow = self.listBox.row(selItem) if selItem is not None:
if self.colCounts[iRow] == 0: iRow = self.listBox.row(selItem)
self.listBox.takeItem(iRow) selIdx = selItem.data(Qt.UserRole)
self.colChanged = True if self.colCounts[selIdx] == 0:
else: self.listBox.takeItem(iRow)
self.theParent.makeAlert("Cannot delete status item that is in use.",nwAlert.ERROR) self.colChanged = True
else:
self.theParent.makeAlert("Cannot delete status item that is in use.",nwAlert.ERROR)
return return
def _saveItem(self): def _saveItem(self):
logger.verbose("Item save button clicked") logger.verbose("Save item button clicked")
selItem = self._getSelectedItem() selItem = self._getSelectedItem()
iRow = self.listBox.row(selItem) iRow = self.listBox.row(selItem)
if selItem is not None: if selItem is not None:
selItem.setText("%s [%d]" % (self.editName.text().strip(), self.colCounts[iRow])) selIdx = selItem.data(Qt.UserRole)
self.colData[selIdx] = (
self.editName.text().strip(),
self.selColour.red(),
self.selColour.green(),
self.selColour.blue(),
self.colData[selIdx][4]
)
selItem.setText("%s [%d]" % (self.colData[selIdx][0], self.colCounts[selIdx]))
selItem.setIcon(self.colButton.icon()) selItem.setIcon(self.colButton.icon())
self.colChanged = True self.colChanged = True
return return
def _addItem(self, iName, iCol): def _addItem(self, iName, iCol, oName, nUse):
logger.verbose("New item button clicked")
newIcon = QPixmap(16,16) newIcon = QPixmap(16,16)
newIcon.fill(QColor(*iCol)) newIcon.fill(QColor(*iCol))
newItem = QListWidgetItem() newItem = QListWidgetItem()
newItem.setText(iName) newItem.setText("%s [%d]" % (iName, nUse))
newItem.setIcon(QIcon(newIcon)) newItem.setIcon(QIcon(newIcon))
newItem.setData(Qt.UserRole, len(self.colData))
self.listBox.addItem(newItem) self.listBox.addItem(newItem)
self.colData.append((iName,*iCol,oName))
self.colCounts.append(nUse)
return newItem return newItem
def _selectedItem(self): def _selectedItem(self):
logger.verbose("Item selected") logger.verbose("Item selected")
selItem = self._getSelectedItem() selItem = self._getSelectedItem()
if selItem is not None: if selItem is not None:
self.editName.setText(self._cleanLabel(selItem.text())) selIdx = selItem.data(Qt.UserRole)
self.colButton.setIcon(selItem.icon()) selVal = self.colData[selIdx]
self.selColour = QColor(selVal[1],selVal[2],selVal[3])
newIcon = QPixmap(16,16)
newIcon.fill(self.selColour)
self.editName.setText(selVal[0])
self.colButton.setIcon(QIcon(newIcon))
return return
## ##
@@ -269,11 +286,9 @@ class GuiProjectEditStatus(QWidget):
return selItem[0] return selItem[0]
return None return None
def _cleanLabel(self, theText): def _rowsMoved(self):
iPos = theText.rfind("[") logger.verbose("A drag move event occurred")
if iPos > 0: self.colChanged = True
return theText[:iPos-1] return
else:
return theText
# END Class GuiProjectEditStatus # END Class GuiProjectEditStatus
+1 -1
View File
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="0.1.3" fileVersion="1.0" timeStamp="2019-05-22 21:58:25"> <novelWriterXML appVersion="0.1.3" fileVersion="1.0" timeStamp="2019-05-22 23:27:41">
<project> <project>
<name>Sample Project</name> <name>Sample Project</name>
<title>Sample Project</title> <title>Sample Project</title>