Use generic datatype-based columns in GlyphDBEdit.

This commit is contained in:
Andrey Golovizin 2014-09-01 23:56:51 +02:00
parent 215d814777
commit 90b9a5a978

View file

@ -33,82 +33,52 @@ from ..image import Image
class Column(object): class Column(object):
header = None flags = Qt.ItemIsEditable
data_type = str
def data(self, glyph_data): def __init__(self, header, field_name, image_field_name=None):
return None self.header = header
self.field_name = field_name
self.image_field_name=image_field_name
def set_data(self, glyph_data, value): def data(self, glyph_data, role):
raise NotImplementedError 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): def setData(self, glyph_data, value, role):
return None if role == Qt.EditRole:
setattr(glyph_data, self.field_name, self.data_type(value))
def checkState(self, glyph_data):
return None
def sortKey(self, glyph_data): def sortKey(self, glyph_data):
return self.data(glyph_data) return getattr(glyph_data, self.field_name)
class TextColumn(Column): class IntColumn(Column):
header = 'Text' data_type = int
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 ElevationColumn(Column): class CheckBoxColumn(Column):
header = 'Elevation' flags = Qt.ItemIsUserCheckable
data_type = bool
def data(self, glyph_data): def data(self, glyph_data, role):
return str(glyph_data.elevation) if role == Qt.CheckStateRole:
value = getattr(glyph_data, self.field_name)
return Qt.Checked if value else Qt.Unchecked
def sortKey(self, glyph_data): def setData(self, glyph_data, value, role):
return glyph_data.elevation if role == Qt.CheckStateRole:
setattr(glyph_data, self.field_name, value == Qt.Checked)
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
class GlyphDBModel(QAbstractTableModel): class GlyphDBModel(QAbstractTableModel):
COLUMNS = [ COLUMNS = [
TextColumn(), Column('Text', 'text', 'image'),
ElevationColumn(), IntColumn('Elevation', 'elevation'),
BoldColumn(), CheckBoxColumn('Bold', 'bold'),
ItalicColumn(), CheckBoxColumn('Italic', 'italic'),
] ]
def __init__(self, glyphdb, parent=None): def __init__(self, glyphdb, parent=None):
@ -119,7 +89,8 @@ class GlyphDBModel(QAbstractTableModel):
self.updateData() self.updateData()
def flags(self, index): 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): def rowCount(self, parent):
return len(self.values) return len(self.values)
@ -133,24 +104,13 @@ class GlyphDBModel(QAbstractTableModel):
def data(self, index, role): def data(self, index, role):
column = self.COLUMNS[index.column()] column = self.COLUMNS[index.column()]
data = self.values[index.row()] glyph_data = self.values[index.row()]
if role == Qt.DisplayRole: return column.data(glyph_data, role)
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)
def setData(self, index, value, role): def setData(self, index, value, role):
glyph_data = self.values[index.row()]
column = self.COLUMNS[index.column()] column = self.COLUMNS[index.column()]
if role == Qt.EditRole: glyph_data = self.values[index.row()]
column.setData(glyph_data, value) column.setData(glyph_data, value, role)
if role == Qt.CheckStateRole:
column.setData(glyph_data, value == Qt.Checked)
self.dataChanged.emit(index, index)
return True return True
def removeRows(self, row, count, parent=None): def removeRows(self, row, count, parent=None):