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 <QActionGroup>
#include <QContextMenuEvent>
#include <QFontMetrics>
#include <QHeaderView>
#include <QMessageBox>
#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()
{
header_ctx_menu_.clear();
@ -670,12 +683,13 @@ void PacketList::applyRecentColumnWidths()
fmt = get_column_format(i);
long_str = get_column_width_string(fmt, i);
if (long_str) {
col_width = packet_list_model_->columnTextSize(long_str);
col_width = fontMetrics().width(long_str);
} 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();
redrawVisiblePackets();

View File

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

View File

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

View File

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