Use generic datatype-based columns in GlyphDBEdit.
This commit is contained in:
parent
215d814777
commit
90b9a5a978
1 changed files with 37 additions and 77 deletions
|
|
@ -33,82 +33,52 @@ from ..image import Image
|
|||
|
||||
|
||||
class Column(object):
|
||||
header = None
|
||||
flags = Qt.ItemIsEditable
|
||||
data_type = str
|
||||
|
||||
def data(self, glyph_data):
|
||||
return None
|
||||
def __init__(self, header, field_name, image_field_name=None):
|
||||
self.header = header
|
||||
self.field_name = field_name
|
||||
self.image_field_name=image_field_name
|
||||
|
||||
def set_data(self, glyph_data, value):
|
||||
raise NotImplementedError
|
||||
def data(self, glyph_data, role):
|
||||
if role in [Qt.DisplayRole, Qt.EditRole]:
|
||||
return self.data_type(getattr(glyph_data, self.field_name))
|
||||
elif role == Qt.DecorationRole and self.image_field_name:
|
||||
return getattr(glyph_data, self.image_field_name).qimage
|
||||
|
||||
def image(self, glyph_data):
|
||||
return None
|
||||
|
||||
def checkState(self, glyph_data):
|
||||
return None
|
||||
def setData(self, glyph_data, value, role):
|
||||
if role == Qt.EditRole:
|
||||
setattr(glyph_data, self.field_name, self.data_type(value))
|
||||
|
||||
def sortKey(self, glyph_data):
|
||||
return self.data(glyph_data)
|
||||
return getattr(glyph_data, self.field_name)
|
||||
|
||||
|
||||
class TextColumn(Column):
|
||||
header = 'Text'
|
||||
|
||||
def data(self, glyph_data):
|
||||
return glyph_data.text
|
||||
|
||||
def setData(self, glyph_data, value):
|
||||
glyph_data.text = value
|
||||
|
||||
def image(self, glyph_data):
|
||||
return glyph_data.image.qimage
|
||||
class IntColumn(Column):
|
||||
data_type = int
|
||||
|
||||
|
||||
class ElevationColumn(Column):
|
||||
header = 'Elevation'
|
||||
class CheckBoxColumn(Column):
|
||||
flags = Qt.ItemIsUserCheckable
|
||||
data_type = bool
|
||||
|
||||
def data(self, glyph_data):
|
||||
return str(glyph_data.elevation)
|
||||
def data(self, glyph_data, role):
|
||||
if role == Qt.CheckStateRole:
|
||||
value = getattr(glyph_data, self.field_name)
|
||||
return Qt.Checked if value else Qt.Unchecked
|
||||
|
||||
def sortKey(self, glyph_data):
|
||||
return glyph_data.elevation
|
||||
|
||||
def setData(self, glyph_data, value):
|
||||
glyph_data.elevation = value
|
||||
|
||||
|
||||
class BoldColumn(Column):
|
||||
header = 'Bold'
|
||||
|
||||
def sortKey(self, glyph_data):
|
||||
return glyph_data.bold
|
||||
|
||||
def checkState(self, glyph_data):
|
||||
return Qt.Checked if glyph_data.bold else Qt.Unchecked
|
||||
|
||||
def setData(self, glyph_data, value):
|
||||
glyph_data.bold = value
|
||||
|
||||
|
||||
class ItalicColumn(Column):
|
||||
header = 'Italic'
|
||||
|
||||
def sortKey(self, glyph_data):
|
||||
return glyph_data.italic
|
||||
|
||||
def checkState(self, glyph_data):
|
||||
return Qt.Checked if glyph_data.italic else Qt.Unchecked
|
||||
|
||||
def setData(self, glyph_data, value):
|
||||
glyph_data.italic = value
|
||||
def setData(self, glyph_data, value, role):
|
||||
if role == Qt.CheckStateRole:
|
||||
setattr(glyph_data, self.field_name, value == Qt.Checked)
|
||||
|
||||
|
||||
class GlyphDBModel(QAbstractTableModel):
|
||||
COLUMNS = [
|
||||
TextColumn(),
|
||||
ElevationColumn(),
|
||||
BoldColumn(),
|
||||
ItalicColumn(),
|
||||
Column('Text', 'text', 'image'),
|
||||
IntColumn('Elevation', 'elevation'),
|
||||
CheckBoxColumn('Bold', 'bold'),
|
||||
CheckBoxColumn('Italic', 'italic'),
|
||||
]
|
||||
|
||||
def __init__(self, glyphdb, parent=None):
|
||||
|
|
@ -119,7 +89,8 @@ class GlyphDBModel(QAbstractTableModel):
|
|||
self.updateData()
|
||||
|
||||
def flags(self, index):
|
||||
return super().flags(index) | Qt.ItemIsEditable | Qt.ItemIsUserCheckable
|
||||
column = self.COLUMNS[index.column()]
|
||||
return super().flags(index) | column.flags
|
||||
|
||||
def rowCount(self, parent):
|
||||
return len(self.values)
|
||||
|
|
@ -133,24 +104,13 @@ class GlyphDBModel(QAbstractTableModel):
|
|||
|
||||
def data(self, index, role):
|
||||
column = self.COLUMNS[index.column()]
|
||||
data = self.values[index.row()]
|
||||
if role == Qt.DisplayRole:
|
||||
return column.data(data)
|
||||
elif role == Qt.DecorationRole:
|
||||
return column.image(data)
|
||||
elif role == Qt.EditRole:
|
||||
return column.data(data)
|
||||
elif role == Qt.CheckStateRole:
|
||||
return column.checkState(data)
|
||||
glyph_data = self.values[index.row()]
|
||||
return column.data(glyph_data, role)
|
||||
|
||||
def setData(self, index, value, role):
|
||||
glyph_data = self.values[index.row()]
|
||||
column = self.COLUMNS[index.column()]
|
||||
if role == Qt.EditRole:
|
||||
column.setData(glyph_data, value)
|
||||
if role == Qt.CheckStateRole:
|
||||
column.setData(glyph_data, value == Qt.Checked)
|
||||
self.dataChanged.emit(index, index)
|
||||
glyph_data = self.values[index.row()]
|
||||
column.setData(glyph_data, value, role)
|
||||
return True
|
||||
|
||||
def removeRows(self, row, count, parent=None):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue