pixelocr/pixelocr/gui/glyphdbedit.py
2014-09-01 18:51:03 +02:00

162 lines
4 KiB
Python

# Copyright (C) 2014 Andrey Golovizin
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import sys
from collections import defaultdict
from PyQt4.QtCore import (
Qt,
QAbstractTableModel,
QSize,
)
from PyQt4.QtGui import (
QApplication,
QTableView,
)
from ..glyphdb import GlyphDB
from ..image import Image
class Column(object):
header = None
def data(self, value):
return None
def image(self, value):
return None
def sortKey(self, value):
return self.data(value)
class TextColumn(Column):
header = 'Text'
def data(self, value):
return value.text
def image(self, value):
return value.image.qimage
class ElevationColumn(Column):
header = 'Elevation'
def data(self, value):
return str(value.elevation)
def sortKey(self, value):
return value.elevation
class GlyphDBModel(QAbstractTableModel):
COLUMNS = [
TextColumn(),
ElevationColumn(),
]
def __init__(self, glyphdb, parent=None):
super().__init__(parent)
self.glyphdb = glyphdb
self.sortKey = None
self.reverse = None
self.updateData()
def rowCount(self, parent):
return len(self.values)
def columnCount(self, parent):
return len(self.COLUMNS)
def headerData(self, section, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self.COLUMNS[section].header
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)
def removeRows(self, row, count, parent=None):
self.beginRemoveRows(parent, row, row + count - 1)
values = self.values[row: row + count]
for value in values:
self.glyphdb.remove(value)
del self.values[row]
self.endRemoveRows()
return True
def sort(self, column_index, order):
column = self.COLUMNS[column_index]
self.sortKey = column.sortKey
self.reverse = (order == Qt.DescendingOrder)
self.updateData()
def updateData(self):
self.layoutAboutToBeChanged.emit()
if self.sortKey is None:
self.values = list(self.glyphdb.values())
self.values.reverse()
else:
self.values = sorted(self.glyphdb.values(), key=self.sortKey, reverse=self.reverse)
self.layoutChanged.emit()
class GlyphTableView(QTableView):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setSortingEnabled(True)
def keyPressEvent(self, event):
if event.key() == Qt.Key_Delete:
for index in self.selectedIndexes():
self.model().removeRow(index.row())
else:
return super().keyPressEvent(event)
class GlyphDBEdit(GlyphTableView):
def __init__(self, glyphdb, *args, **kwargs):
super().__init__(*args, **kwargs)
model = GlyphDBModel(glyphdb, parent=self)
self.setModel(model)
def sizeHint(self):
return QSize(640, 480)
def updateData(self):
self.model().updateData()
def main(argv):
dirname = argv[1]
app = QApplication(argv)
glyphdb = GlyphDB(dirname)
win = GlyphDBEdit(glyphdb)
win.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main(sys.argv)