From 90b9a5a978ec8a9a0657654fe3ab281d4de811ce Mon Sep 17 00:00:00 2001 From: Andrey Golovizin Date: Mon, 1 Sep 2014 23:56:51 +0200 Subject: [PATCH] Use generic datatype-based columns in GlyphDBEdit. --- pixelocr/gui/glyphdbedit.py | 114 ++++++++++++------------------------ 1 file changed, 37 insertions(+), 77 deletions(-) diff --git a/pixelocr/gui/glyphdbedit.py b/pixelocr/gui/glyphdbedit.py index 0bb0de7..ead4d37 100644 --- a/pixelocr/gui/glyphdbedit.py +++ b/pixelocr/gui/glyphdbedit.py @@ -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):