Qt: Fix packet list column resizing.

The size hint changes in g5ab8490 broke packet list column resizing. Add
back a way to force the hinting necessary for sizeHintForColumn to work
properly.

Bug: 11067
Ping-Bug: 10924
Change-Id: Icd525200f7a88f2b6d22a3039cda98ad0527239e
Reviewed-on: https://code.wireshark.org/review/8334
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Gerald Combs <gerald@wireshark.org>
This commit is contained in:
Gerald Combs 2015-03-27 18:49:39 -05:00
parent 141c923e2f
commit e55ac64077
4 changed files with 29 additions and 14 deletions

View File

@ -55,6 +55,7 @@
#include <QAction> #include <QAction>
#include <QActionGroup> #include <QActionGroup>
#include <QContextMenuEvent> #include <QContextMenuEvent>
#include <QFontMetrics>
#include <QHeaderView> #include <QHeaderView>
#include <QMessageBox> #include <QMessageBox>
#include <QScrollBar> #include <QScrollBar>
@ -591,6 +592,18 @@ void PacketList::setColumnVisibility()
} }
} }
int PacketList::sizeHintForColumn(int column) const
{
int size_hint;
// This is a bit hacky but Qt does a fine job of column sizing and
// reimplementing QTreeView::sizeHintForColumn seems worse.
packet_list_model_->setSizeHintEnabled(false);
size_hint = QTreeView::sizeHintForColumn(column);
packet_list_model_->setSizeHintEnabled(true);
return size_hint;
}
void PacketList::initHeaderContextMenu() void PacketList::initHeaderContextMenu()
{ {
header_ctx_menu_.clear(); header_ctx_menu_.clear();
@ -670,12 +683,13 @@ void PacketList::applyRecentColumnWidths()
fmt = get_column_format(i); fmt = get_column_format(i);
long_str = get_column_width_string(fmt, i); long_str = get_column_width_string(fmt, i);
if (long_str) { if (long_str) {
col_width = packet_list_model_->columnTextSize(long_str); col_width = fontMetrics().width(long_str);
} else { } else {
col_width = packet_list_model_->columnTextSize(MIN_COL_WIDTH_STR); col_width = fontMetrics().width(MIN_COL_WIDTH_STR);
} }
} }
setColumnWidth(i, col_width); col_width += QTreeView::sizeHintForColumn(i); // Decoration padding
setColumnWidth(i, col_width) ;
} }
column_state_ = header()->saveState(); column_state_ = header()->saveState();
redrawVisiblePackets(); redrawVisiblePackets();

View File

@ -104,6 +104,7 @@ private:
void setFrameIgnore(gboolean set, frame_data *fdata); void setFrameIgnore(gboolean set, frame_data *fdata);
void setFrameReftime(gboolean set, frame_data *fdata); void setFrameReftime(gboolean set, frame_data *fdata);
void setColumnVisibility(); void setColumnVisibility();
int sizeHintForColumn(int column) const;
void initHeaderContextMenu(); void initHeaderContextMenu();
signals: signals:
void packetDissectionChanged(); void packetDissectionChanged();

View File

@ -39,6 +39,7 @@
PacketListModel::PacketListModel(QObject *parent, capture_file *cf) : PacketListModel::PacketListModel(QObject *parent, capture_file *cf) :
QAbstractItemModel(parent), QAbstractItemModel(parent),
size_hint_enabled_(true),
row_height_(-1), row_height_(-1),
line_spacing_(0) line_spacing_(0)
{ {
@ -127,13 +128,6 @@ void PacketListModel::resetColorized()
endResetModel(); endResetModel();
} }
int PacketListModel::columnTextSize(const char *str)
{
QFontMetrics fm(mono_font_);
return fm.width(str);
}
void PacketListModel::setMonospaceFont(const QFont &mono_font, int row_height) void PacketListModel::setMonospaceFont(const QFont &mono_font, int row_height)
{ {
QFontMetrics fm(mono_font_); QFontMetrics fm(mono_font_);
@ -331,9 +325,14 @@ QVariant PacketListModel::data(const QModelIndex &index, int role) const
} }
case Qt::SizeHintRole: case Qt::SizeHintRole:
{ {
// We assume that inter-line spacing is 0. if (size_hint_enabled_) {
QSize size = QSize(-1, row_height_ + ((record->lineCount() - 1) * line_spacing_)); // We assume that inter-line spacing is 0.
return size; QSize size = QSize(-1, row_height_ + ((record->lineCount() - 1) * line_spacing_));
return size;
} else {
// Used by PacketList::sizeHintForColumn
return QVariant();
}
} }
default: default:
return QVariant(); return QVariant();

View File

@ -62,7 +62,7 @@ public:
int visibleIndexOf(frame_data *fdata) const; int visibleIndexOf(frame_data *fdata) const;
void resetColumns(); void resetColumns();
void resetColorized(); void resetColorized();
int columnTextSize(const char *str); void setSizeHintEnabled(bool enable) { size_hint_enabled_ = enable; }
signals: signals:
void goToPacket(int); void goToPacket(int);
@ -80,6 +80,7 @@ private:
QVector<PacketListRecord *> physical_rows_; QVector<PacketListRecord *> physical_rows_;
QMap<int, int> number_to_row_; QMap<int, int> number_to_row_;
bool size_hint_enabled_;
int row_height_; int row_height_;
int line_spacing_; int line_spacing_;