24 #include "gui/widgets/serverlistview.h" 26 #include "configuration/doomseekerconfig.h" 27 #include "gui/models/serverlistcolumn.h" 28 #include "refresher/refresher.h" 30 #include <QHeaderView> 31 #include <QItemDelegate> 32 #include <QMouseEvent> 34 #include <QSortFilterProxyModel> 35 #include <QTextDocument> 41 class CustomItemDelegate :
public QItemDelegate
44 void paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index)
const 48 bool rightAligned =
false;
49 QStyleOptionViewItem opt = option;
51 QVariant userRole = index.data(Qt::UserRole);
52 if(userRole.isValid() && userRole.type() == QVariant::Int && userRole.toInt() == USERROLE_RIGHTALIGNDECORATION)
54 opt.decorationAlignment = Qt::AlignRight|Qt::AlignVCenter;
59 QItemDelegate::paint(painter, opt, index);
68 if(rightAligned && (opt.state & QStyle::State_Selected))
70 QVariant decorationRole = index.data(Qt::DecorationRole);
71 if(decorationRole.isValid())
74 painter->setClipRect(opt.rect);
76 QPixmap pixmap = decoration(opt, decorationRole);
77 drawDecoration(painter, opt, opt.rect, pixmap);
85 void drawDecoration(QPainter *painter,
const QStyleOptionViewItem &option,
const QRect &rect,
const QPixmap &pixmap)
const 87 if(pixmap.isNull() || !rect.isValid())
90 if(option.decorationAlignment == (Qt::AlignRight|Qt::AlignVCenter))
92 QPoint p = QStyle::alignedRect(option.direction, option.decorationAlignment, pixmap.size(), option.rect).topLeft();
93 painter->drawPixmap(p, pixmap);
96 QItemDelegate::drawDecoration(painter, option, rect, pixmap);
102 ServerListView::ServerListView(QWidget* parent) : QTableView(parent)
105 verticalHeader()->setDefaultSectionSize(fontMetrics().height() + 6);
106 #if QT_VERSION >= 0x050000 107 verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
109 verticalHeader()->setResizeMode(QHeaderView::Fixed);
111 setShowGrid(gConfig.doomseeker.bDrawGridInServerTable);
113 setItemDelegate(
new CustomItemDelegate());
116 void ServerListView::mouseReleaseEvent(QMouseEvent* event)
118 QModelIndex index = indexAt(event->pos());
119 switch (event->button())
124 emit middleMouseClicked(index, event->pos());
128 case Qt::RightButton:
131 emit rightMouseClicked(index, event->pos());
136 QTableView::mouseReleaseEvent(event);
141 void ServerListView::mouseDoubleClickEvent(QMouseEvent* event)
143 if (event->button() != Qt::LeftButton)
145 QTableView::mouseDoubleClickEvent(event);
149 QModelIndex index = indexAt(event->pos());
152 emit leftMouseDoubleClicked(index, event->pos());
157 void ServerListView::setupTableProperties()
159 setIconSize(QSize(26, 15));
161 horizontalHeader()->setSortIndicatorShown(
true);
162 horizontalHeader()->setHighlightSections(
false);
164 setMouseTracking(
true);
166 setupTableColumnWidths();
169 void ServerListView::setupTableColumnWidths()
174 for (
int colIdx = 0; colIdx < ServerListColumnId::NUM_SERVERLIST_COLUMNS; ++colIdx)
176 setColumnWidth(colIdx, columns[colIdx].width);
180 QString &headerState = gConfig.doomseeker.serverListColumnState;
181 if (!headerState.isEmpty())
183 horizontalHeader()->restoreState(QByteArray::fromBase64(headerState.toUtf8()));
187 for (
int colIdx = 0; colIdx < ServerListColumnId::NUM_SERVERLIST_COLUMNS; ++colIdx)
189 setColumnHidden(colIdx, columns[colIdx].bHidden);
190 QHeaderView::ResizeMode resizeMode = columns[colIdx].bResizable ?
191 QHeaderView::Interactive : QHeaderView::Fixed;
192 #if QT_VERSION >= 0x050000 193 horizontalHeader()->setSectionResizeMode(colIdx, resizeMode);
195 horizontalHeader()->setResizeMode(colIdx, resizeMode);
200 #if QT_VERSION >= 0x050000 201 horizontalHeader()->setSectionsMovable(
true);
203 horizontalHeader()->setMovable(
true);