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 override
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 if (ServerListColumns::isPictureColumn(index.column()))
60 opt.state &= ~QStyle::State_HasFocus;
63 QItemDelegate::paint(painter, opt, index);
72 if (rightAligned && (opt.state & QStyle::State_Selected))
74 QVariant decorationRole = index.data(Qt::DecorationRole);
75 if (decorationRole.isValid())
78 painter->setClipRect(opt.rect);
80 QPixmap pixmap = decoration(opt, decorationRole);
81 drawDecoration(painter, opt, opt.rect, pixmap);
89 void drawDecoration(QPainter *painter,
const QStyleOptionViewItem &option,
const QRect &rect,
const QPixmap &pixmap)
const override
91 if (pixmap.isNull() || !rect.isValid())
94 if (option.decorationAlignment == (Qt::AlignRight | Qt::AlignVCenter))
96 QPoint p = QStyle::alignedRect(option.direction, option.decorationAlignment, pixmap.size(), option.rect).topLeft();
97 painter->drawPixmap(p, pixmap);
100 QItemDelegate::drawDecoration(painter, option, rect, pixmap);
106 ServerListView::ServerListView(QWidget *parent) : QTableView(parent)
109 verticalHeader()->setDefaultSectionSize(fontMetrics().height() + 6);
110 verticalHeader()->setSectionResizeMode(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())
121 case Qt::MiddleButton:
123 emit middleMouseClicked(index, event->pos());
126 case Qt::RightButton:
128 emit rightMouseClicked(index, event->pos());
132 QTableView::mouseReleaseEvent(event);
137 void ServerListView::mouseDoubleClickEvent(QMouseEvent *event)
139 if (event->button() != Qt::LeftButton)
140 QTableView::mouseDoubleClickEvent(event);
143 QModelIndex index = indexAt(event->pos());
145 emit leftMouseDoubleClicked(index, event->pos());
149 void ServerListView::setupTableProperties()
151 setIconSize(QSize(26, 15));
153 horizontalHeader()->setSortIndicatorShown(
true);
154 horizontalHeader()->setHighlightSections(
false);
156 setMouseTracking(
true);
158 setupTableColumnWidths();
161 void ServerListView::setupTableColumnWidths()
166 for (
int colIdx = 0; colIdx < ServerListColumnId::NUM_SERVERLIST_COLUMNS; ++colIdx)
167 setColumnWidth(colIdx, columns[colIdx].width);
170 QString &headerState = gConfig.doomseeker.serverListColumnState;
171 if (!headerState.isEmpty())
172 horizontalHeader()->restoreState(QByteArray::fromBase64(headerState.toUtf8()));
175 int smallestWidth = horizontalHeader()->minimumSectionSize();
176 for (
int colIdx = 0; colIdx < ServerListColumnId::NUM_SERVERLIST_COLUMNS; ++colIdx)
178 if (!columns[colIdx].bResizable && columns[colIdx].width < smallestWidth)
180 smallestWidth = columns[colIdx].width;
181 horizontalHeader()->setMinimumSectionSize(smallestWidth);
183 QHeaderView::ResizeMode resizeMode = columns[colIdx].bResizable ?
184 QHeaderView::Interactive : QHeaderView::ResizeToContents;
185 horizontalHeader()->setSectionResizeMode(colIdx, resizeMode);
189 horizontalHeader()->setSectionsMovable(
true);