Rewritten how status items are changed, using a data storage instead of passing colours back and forth from icons
This commit is contained in:
+54
-39
@@ -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,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>
|
||||||
|
|||||||
Reference in New Issue
Block a user