aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ui/qt/packet_list.cpp2
-rw-r--r--ui/qt/proto_tree.cpp40
-rw-r--r--ui/qt/proto_tree.h3
3 files changed, 45 insertions, 0 deletions
diff --git a/ui/qt/packet_list.cpp b/ui/qt/packet_list.cpp
index 80331d7c06..8007cecda0 100644
--- a/ui/qt/packet_list.cpp
+++ b/ui/qt/packet_list.cpp
@@ -503,6 +503,8 @@ void PacketList::selectionChanged (const QItemSelection & selected, const QItemS
if (fi && proto_tree_) {
proto_tree_->selectField(fi);
}
+ } else if (!cap_file_->search_in_progress) {
+ proto_tree_->restoreSelectedField();
}
}
diff --git a/ui/qt/proto_tree.cpp b/ui/qt/proto_tree.cpp
index 3d8d671a6e..f2bca27db0 100644
--- a/ui/qt/proto_tree.cpp
+++ b/ui/qt/proto_tree.cpp
@@ -433,6 +433,8 @@ void ProtoTree::updateSelectionStatus(QTreeWidgetItem* item)
item_info.append(QString(tr(", %1 bytes")).arg(finfo_length));
}
+ saveSelectedField(item);
+
emit protoItemSelected("");
emit protoItemSelected(NULL);
emit protoItemSelected(item_info);
@@ -602,6 +604,44 @@ void ProtoTree::selectField(field_info *fi)
}
}
+// Remember the currently focussed field based on:
+// - current hf_id (obviously)
+// - parent items (to avoid selecting a text item in a different tree)
+// - position within a tree if there are multiple items (wishlist)
+static QList<int> serializeAsPath(QTreeWidgetItem *item)
+{
+ QList<int> path;
+ do {
+ field_info *fi = item->data(0, Qt::UserRole).value<field_info *>();
+ path.prepend(fi->hfinfo->id);
+ } while ((item = item->parent()));
+ return path;
+}
+void ProtoTree::saveSelectedField(QTreeWidgetItem *item)
+{
+ selected_field_path_ = serializeAsPath(item);
+}
+
+// Try to focus a tree item which was previously also visible
+void ProtoTree::restoreSelectedField()
+{
+ if (selected_field_path_.isEmpty()) {
+ return;
+ }
+ int last_hf_id = selected_field_path_.last();
+ QTreeWidgetItemIterator iter(this);
+ while (*iter) {
+ field_info *fi = (*iter)->data(0, Qt::UserRole).value<field_info *>();
+ if (last_hf_id == fi->hfinfo->id &&
+ serializeAsPath(*iter) == selected_field_path_) {
+ setCurrentItem(*iter);
+ scrollToItem(*iter);
+ break;
+ }
+ iter++;
+ }
+}
+
/*
* Editor modelines
*
diff --git a/ui/qt/proto_tree.h b/ui/qt/proto_tree.h
index 56815cc85d..ff2992ea8b 100644
--- a/ui/qt/proto_tree.h
+++ b/ui/qt/proto_tree.h
@@ -45,6 +45,8 @@ public:
void selectField(field_info *fi);
void closeContextMenu();
void clear();
+ void saveSelectedField(QTreeWidgetItem *);
+ void restoreSelectedField();
protected:
virtual void contextMenuEvent(QContextMenuEvent *event);
@@ -60,6 +62,7 @@ private:
QList<QAction *> copy_actions_;
QFont mono_font_;
int column_resize_timer_;
+ QList<int> selected_field_path_;
signals:
void protoItemSelected(const QString &);