diff options
-rw-r--r-- | ui/qt/packet_list.cpp | 2 | ||||
-rw-r--r-- | ui/qt/proto_tree.cpp | 40 | ||||
-rw-r--r-- | ui/qt/proto_tree.h | 3 |
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 &); |