From eb430bcb674133ab6f8d18086aafa190819dd641 Mon Sep 17 00:00:00 2001 From: smbaker Date: Tue, 13 Sep 2011 19:22:32 -0700 Subject: [PATCH] color coding for user screen --- sface/screens/userscreen.py | 61 +++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/sface/screens/userscreen.py b/sface/screens/userscreen.py index dd01804..1f647a1 100644 --- a/sface/screens/userscreen.py +++ b/sface/screens/userscreen.py @@ -15,11 +15,70 @@ NAME_COLUMN = 0 MEMBERSHIP_STATUS_COLUMN = 1 SERVER_MEMBERSHIP_STATUS_COLUMN = 2 +# maximum length of a name to display before clipping +NAME_MAX_LEN = 48 + user_status = { "in": "Already Selected", "out": "Not Selected", "add": "To be Added", "remove": "To be Removed"} +color_status = { "in": QColor.fromRgb(0, 250, 250), + "add": QColor.fromRgb(0, 250, 0), + "remove": QColor.fromRgb(250, 0, 0) } + + +class UserNameDelegate(QStyledItemDelegate): + def __init__(self, parent): + QStyledItemDelegate.__init__(self, parent) + + def displayText(self, value, locale): + data = str(QStyledItemDelegate.displayText(self, value, locale)) + if (len(data)>NAME_MAX_LEN): + data = data[:(NAME_MAX_LEN-3)] + "..." + return QString(data) + + def paint(self, painter, option, index): + model = index.model() + data = str(self.displayText(index.data(), QLocale())) + status_index = model.index(index.row(), MEMBERSHIP_STATUS_COLUMN, index.parent()) + status_data = status_index.data().toString() + + fm = QFontMetrics(option.font) + rect = QRect(option.rect) + + rect.setHeight(rect.height() - 2) + rect.setWidth(fm.width(QString(data)) + 6) + rect.setX(rect.x() + 5) + rect.setY(rect.y() - 1) + + textRect = QRect(option.rect) + textRect.setWidth(fm.width(QString(data)) + 6) + textRect.setX(rect.x()) + + x, y, h, w = rect.x(), rect.y(), rect.height(), rect.width() + + path = QPainterPath() + path.addRoundedRect(x - 1, y + 1, w, h, 4, 4) + + painter.save() + painter.setRenderHint(QPainter.Antialiasing) + + if option.state & QStyle.State_Selected: + painter.fillRect(option.rect, option.palette.color(QPalette.Active, QPalette.Highlight)) + + color = None + for x in user_status.keys(): + if (user_status[x] == status_data) and (x in color_status): + color = color_status[x] + + if color != None: + painter.fillPath(path, color) + painter.setPen(QColor.fromRgb(0, 0, 0)) + painter.drawText(textRect, Qt.AlignVCenter, QString(data)) + + painter.restore() + class UserView(QTableView): def __init__(self, parent=None): QTableView.__init__(self, parent) @@ -31,6 +90,8 @@ class UserView(QTableView): self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.setToolTip("Double click on a row to change its status.") + self.setItemDelegateForColumn(0, UserNameDelegate(self)) + def keyPressEvent(self, event): if (event.key() == Qt.Key_Space): self.toggleSelection() -- 2.43.0