summaryrefslogtreecommitdiff
path: root/ui/qt/conversation_dialog.cpp
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2016-08-30 12:12:33 -0700
committerAnders Broman <a.broman58@gmail.com>2016-09-02 20:01:51 +0000
commit893e0e96084fe0e559310d117fb953ddf08c0d6e (patch)
treea27f387583ce012c3d2cb7eff2540260fca39e84 /ui/qt/conversation_dialog.cpp
parent2ddb46dbee7fbb06014a39bc87586b45453a7eaa (diff)
downloadwireshark-893e0e96084fe0e559310d117fb953ddf08c0d6e.tar.gz
Qt: Add a timeline indicator to conversations.
Add a timeline indicator to the Start and Duration columns in the Conversations dialog. Add tooltips to the columns that explain what's going on. Round the timeline rect corners and do the same for Prototocol Hierarchy Statistics. This should hopefully differentiate the graph bars from a text selection and IMHO it looks better. Update the PHS and Conversations images in the User's Guide. Change-Id: I61d6c25843be522cc444e01ba77cb5b1e991fa36 Reviewed-on: https://code.wireshark.org/review/17396 Reviewed-by: Gerald Combs <gerald@wireshark.org> Petri-Dish: Gerald Combs <gerald@wireshark.org> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'ui/qt/conversation_dialog.cpp')
-rw-r--r--ui/qt/conversation_dialog.cpp70
1 files changed, 67 insertions, 3 deletions
diff --git a/ui/qt/conversation_dialog.cpp b/ui/qt/conversation_dialog.cpp
index bf6dce50eb..4ace205e19 100644
--- a/ui/qt/conversation_dialog.cpp
+++ b/ui/qt/conversation_dialog.cpp
@@ -31,6 +31,7 @@
#include "wsutil/str_util.h"
#include "qt_ui_utils.h"
+#include "timeline_delegate.h"
#include "wireshark_application.h"
#include <QCheckBox>
@@ -153,6 +154,9 @@ bool ConversationDialog::addTrafficTable(register_ct_t* table)
trafficTableTabWidget()->addTab(conv_tree, table_name);
+ conv_tree->setItemDelegateForColumn(CONV_COLUMN_START, new TimelineDelegate(conv_tree));
+ conv_tree->setItemDelegateForColumn(CONV_COLUMN_DURATION, new TimelineDelegate(conv_tree));
+
connect(conv_tree, SIGNAL(titleChanged(QWidget*,QString)),
this, SLOT(setTabText(QWidget*,QString)));
connect(conv_tree, SIGNAL(filterAction(QString,FilterAction::Action,FilterAction::ActionType)),
@@ -325,14 +329,20 @@ public:
conv_array_(conv_array),
conv_idx_(conv_idx),
resolve_names_ptr_(resolve_names_ptr)
- {}
+ {
+ QString timeline_tt = QObject::tr("Bars show the relative timeline for each conversation.");
+ setToolTip(CONV_COLUMN_START, timeline_tt);
+ setToolTip(CONV_COLUMN_DURATION, timeline_tt);
+ }
conv_item_t *convItem() {
return &g_array_index(conv_array_, conv_item_t, conv_idx_);
}
virtual QVariant data(int column, int role) const {
- if (role == Qt::DisplayRole) {
+ switch (role) {
+ case Qt::DisplayRole:
+ {
// Column text cooked representation.
conv_item_t *conv_item = &g_array_index(conv_array_, conv_item_t, conv_idx_);
@@ -371,6 +381,37 @@ public:
default:
return colData(column, resolve_names).toString();
}
+ break;
+ }
+ case Qt::UserRole:
+ {
+ if (column != CONV_COLUMN_START && column != CONV_COLUMN_DURATION) break;
+
+ ConversationTreeWidget *ctw = qobject_cast<ConversationTreeWidget *>(treeWidget());
+ if (!ctw) break;
+
+ conv_item_t *conv_item = &g_array_index(conv_array_, conv_item_t, conv_idx_);
+ double start_time = nstime_to_sec(&conv_item->start_time);
+ double stop_time = nstime_to_sec(&conv_item->stop_time);
+
+ double span_s = ctw->maxRelStopTime() - ctw->minRelStartTime();
+ if (span_s <= 0) break;
+ int start_px = ctw->columnWidth(CONV_COLUMN_START);
+ int column_px = start_px + ctw->columnWidth(CONV_COLUMN_DURATION);
+
+ struct timeline_span span_px;
+ span_px.start = ((start_time - ctw->minRelStartTime()) * column_px) / span_s;
+ span_px.width = ((stop_time - start_time) * column_px) / span_s;
+
+ if (column == CONV_COLUMN_DURATION) {
+ span_px.start -= start_px;
+ }
+ return qVariantFromValue(span_px);
+
+ break;
+ }
+ default:
+ break;
}
return QTreeWidgetItem::data(column, role);
}
@@ -498,7 +539,9 @@ private:
// TrafficTableTreeWidget / QTreeWidget subclass that allows tapping
ConversationTreeWidget::ConversationTreeWidget(QWidget *parent, register_ct_t* table) :
- TrafficTableTreeWidget(parent, table)
+ TrafficTableTreeWidget(parent, table),
+ min_rel_start_time_(0),
+ max_rel_stop_time_(0)
{
setColumnCount(CONV_NUM_COLUMNS);
setUniformRowHeights(true);
@@ -609,6 +652,8 @@ void ConversationTreeWidget::tapReset(void *conv_hash_ptr)
conv_tree->clear();
reset_conversation_table_data(&conv_tree->hash_);
+ conv_tree->min_rel_start_time_ = 0;
+ conv_tree->max_rel_stop_time_ = 0;
}
void ConversationTreeWidget::tapDraw(void *conv_hash_ptr)
@@ -659,6 +704,11 @@ void ConversationTreeWidget::updateItems() {
ConversationTreeWidgetItem *ctwi = new ConversationTreeWidgetItem(hash_.conv_array, i, &resolve_names_);
new_items << ctwi;
+ if (i == 0) {
+ min_rel_start_time_ = nstime_to_sec(&(ctwi->convItem()->start_time));
+ max_rel_stop_time_ = nstime_to_sec(&(ctwi->convItem()->stop_time));
+ }
+
for (int col = 0; col < columnCount(); col++) {
switch (col) {
case CONV_COLUMN_SRC_ADDR:
@@ -672,6 +722,20 @@ void ConversationTreeWidget::updateItems() {
}
addTopLevelItems(new_items);
+ for (int i = 0; i < topLevelItemCount(); i++) {
+ ConversationTreeWidgetItem *ctwi = dynamic_cast<ConversationTreeWidgetItem *>(topLevelItem(i));
+
+ double item_rel_start = nstime_to_sec(&(ctwi->convItem()->start_time));
+ if (item_rel_start < min_rel_start_time_) {
+ min_rel_start_time_ = item_rel_start;
+ }
+
+ double item_rel_stop = nstime_to_sec(&(ctwi->convItem()->stop_time));
+ if (item_rel_stop > max_rel_stop_time_) {
+ max_rel_stop_time_ = item_rel_stop;
+ }
+ }
+
setSortingEnabled(true);
if (resize) {