Qt: Add selection history navigation.
Add the ability to move back and forth in the packet selection history similar to GTK+. Update the documentation accordingly. Change-Id: If1fdc1e59b240c0588c292dc0f7f0a5f083c30e1 Reviewed-on: https://code.wireshark.org/review/20320 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
parent
bc56801319
commit
8e76cfbf54
|
@ -45,6 +45,7 @@ since version 2.2.0:
|
||||||
A field can now automatically append "seconds" or "ms" to its value without
|
A field can now automatically append "seconds" or "ms" to its value without
|
||||||
additional printf-style APIs.
|
additional printf-style APIs.
|
||||||
* The Default profile can now be reset to default values.
|
* The Default profile can now be reset to default values.
|
||||||
|
* You can move back and forth in the selection history in the Qt UI.
|
||||||
|
|
||||||
//=== Removed Dissectors
|
//=== Removed Dissectors
|
||||||
|
|
||||||
|
|
|
@ -95,8 +95,10 @@ a capture file. See <<ChUseTabGo>> for additional navigation keystrokes.
|
||||||
|kbd:[Up] |Move to the previous packet or detail item.
|
|kbd:[Up] |Move to the previous packet or detail item.
|
||||||
|kbd:[Ctrl+Down], kbd:[F8] |Move to the next packet, even if the packet list isn't focused.
|
|kbd:[Ctrl+Down], kbd:[F8] |Move to the next packet, even if the packet list isn't focused.
|
||||||
|kbd:[Ctrl+Up], kbd:[F7] |Move to the previous packet, even if the packet list isn't focused.
|
|kbd:[Ctrl+Up], kbd:[F7] |Move to the previous packet, even if the packet list isn't focused.
|
||||||
|kbd:[Ctrl+.] |Move to the next packet of the conversation (TCP, UDP or IP)
|
|kbd:[Ctrl+.] |Move to the next packet of the conversation (TCP, UDP or IP).
|
||||||
|kbd:[Ctrl+,] |Move to the previous packet of the conversation (TCP, UDP or IP)
|
|kbd:[Ctrl+,] |Move to the previous packet of the conversation (TCP, UDP or IP).
|
||||||
|
|kbd:[Alt+Right] or kbd:[Option+Right] (macOS) |Move to the next packet in the selection history.
|
||||||
|
|kbd:[Alt+Left] or kbd:[Option+Right] (macOS) |Move to the previous packet in the selection history.
|
||||||
|kbd:[Left] |In the packet detail, closes the selected tree item. If it's already closed, jumps to the parent node.
|
|kbd:[Left] |In the packet detail, closes the selected tree item. If it's already closed, jumps to the parent node.
|
||||||
|kbd:[Right] |In the packet detail, opens the selected tree item.
|
|kbd:[Right] |In the packet detail, opens the selected tree item.
|
||||||
|kbd:[Shift+Right] |In the packet detail, opens the selected tree item and all of its subtrees.
|
|kbd:[Shift+Right] |In the packet detail, opens the selected tree item and all of its subtrees.
|
||||||
|
@ -722,8 +724,8 @@ If you currently have a temporary capture file, the Save icon will be shown ins
|
||||||
|image:wsug_graphics/toolbar/stock_refresh_24.png[{toolbar-icon-attrs}] |button:[Reload]|menu:View[Reload]| This item allows you to reload the current capture file.
|
|image:wsug_graphics/toolbar/stock_refresh_24.png[{toolbar-icon-attrs}] |button:[Reload]|menu:View[Reload]| This item allows you to reload the current capture file.
|
||||||
|image:wsug_graphics/toolbar/stock_print_24.png[{toolbar-icon-attrs}] |button:[Print...]|menu:File[Print...]| This item allows you to print all (or some of) the packets in the capture file. It pops up the Wireshark Print dialog box (which is discussed further in <<ChIOPrintSection>>).
|
|image:wsug_graphics/toolbar/stock_print_24.png[{toolbar-icon-attrs}] |button:[Print...]|menu:File[Print...]| This item allows you to print all (or some of) the packets in the capture file. It pops up the Wireshark Print dialog box (which is discussed further in <<ChIOPrintSection>>).
|
||||||
|image:wsug_graphics/toolbar/stock_search_24.png[{toolbar-icon-attrs}] |button:[Find Packet...]|menu:Edit[Find Packet...]|This item brings up a dialog box that allows you to find a packet. There is further information on finding packets in <<ChWorkFindPacketSection>>.
|
|image:wsug_graphics/toolbar/stock_search_24.png[{toolbar-icon-attrs}] |button:[Find Packet...]|menu:Edit[Find Packet...]|This item brings up a dialog box that allows you to find a packet. There is further information on finding packets in <<ChWorkFindPacketSection>>.
|
||||||
|image:wsug_graphics/toolbar/stock_left_arrow_24.png[{toolbar-icon-attrs}] |button:[Go Back]|menu:Go[Go Back]|This item jumps back in the packet history.
|
|image:wsug_graphics/toolbar/stock_left_arrow_24.png[{toolbar-icon-attrs}] |button:[Go Back]|menu:Go[Go Back]|This item jumps back in the packet history. Hold down the Alt key (Option on macOS) to go back in the selection history.
|
||||||
|image:wsug_graphics/toolbar/stock_right_arrow_24.png[{toolbar-icon-attrs}] |button:[Go Forward]|menu:Go[Go Forward]|This item jumps forward in the packet history.
|
|image:wsug_graphics/toolbar/stock_right_arrow_24.png[{toolbar-icon-attrs}] |button:[Go Forward]|menu:Go[Go Forward]|This item jumps forward in the packet history. Hold down the Alt key (Option on macOS) to go forward in the selection history.
|
||||||
|image:wsug_graphics/toolbar/stock_jump_to_24.png[{toolbar-icon-attrs}] |button:[Go to Packet...]|menu:Go[Go to Packet...]| This item brings up a dialog box that allows you to specify a packet number to go to that packet.
|
|image:wsug_graphics/toolbar/stock_jump_to_24.png[{toolbar-icon-attrs}] |button:[Go to Packet...]|menu:Go[Go to Packet...]| This item brings up a dialog box that allows you to specify a packet number to go to that packet.
|
||||||
|image:wsug_graphics/toolbar/stock_top_24.png[{toolbar-icon-attrs}] |button:[Go To First Packet]|menu:Go[First Packet]| This item jumps to the first packet of the capture file.
|
|image:wsug_graphics/toolbar/stock_top_24.png[{toolbar-icon-attrs}] |button:[Go To First Packet]|menu:Go[First Packet]| This item jumps to the first packet of the capture file.
|
||||||
|image:wsug_graphics/toolbar/stock_bottom_24.png[{toolbar-icon-attrs}] |button:[Go To Last Packet]|menu:Go[Last Packet]| This item jumps to the last packet of the capture file.
|
|image:wsug_graphics/toolbar/stock_bottom_24.png[{toolbar-icon-attrs}] |button:[Go To Last Packet]|menu:Go[Last Packet]| This item jumps to the last packet of the capture file.
|
||||||
|
|
|
@ -652,6 +652,10 @@ MainWindow::MainWindow(QWidget *parent) :
|
||||||
packet_list_, SLOT(goFirstPacket()));
|
packet_list_, SLOT(goFirstPacket()));
|
||||||
connect(main_ui_->actionGoLastPacket, SIGNAL(triggered()),
|
connect(main_ui_->actionGoLastPacket, SIGNAL(triggered()),
|
||||||
packet_list_, SLOT(goLastPacket()));
|
packet_list_, SLOT(goLastPacket()));
|
||||||
|
connect(main_ui_->actionGoNextHistoryPacket, SIGNAL(triggered()),
|
||||||
|
packet_list_, SLOT(goNextHistoryPacket()));
|
||||||
|
connect(main_ui_->actionGoPreviousHistoryPacket, SIGNAL(triggered()),
|
||||||
|
packet_list_, SLOT(goPreviousHistoryPacket()));
|
||||||
|
|
||||||
connect(main_ui_->actionViewExpandSubtrees, SIGNAL(triggered()),
|
connect(main_ui_->actionViewExpandSubtrees, SIGNAL(triggered()),
|
||||||
proto_tree_, SLOT(expandSubtrees()));
|
proto_tree_, SLOT(expandSubtrees()));
|
||||||
|
@ -1833,6 +1837,8 @@ void MainWindow::initMainToolbarIcons()
|
||||||
main_ui_->actionGoPreviousConversationPacket->setShortcut(QKeySequence(Qt::META | Qt::Key_Comma));
|
main_ui_->actionGoPreviousConversationPacket->setShortcut(QKeySequence(Qt::META | Qt::Key_Comma));
|
||||||
main_ui_->actionGoNextConversationPacket->setShortcut(QKeySequence(Qt::META | Qt::Key_Period));
|
main_ui_->actionGoNextConversationPacket->setShortcut(QKeySequence(Qt::META | Qt::Key_Period));
|
||||||
#endif
|
#endif
|
||||||
|
main_ui_->actionGoPreviousHistoryPacket->setIcon(StockIcon("go-previous"));
|
||||||
|
main_ui_->actionGoNextHistoryPacket->setIcon(StockIcon("go-next"));
|
||||||
main_ui_->actionGoAutoScroll->setIcon(StockIcon("x-stay-last"));
|
main_ui_->actionGoAutoScroll->setIcon(StockIcon("x-stay-last"));
|
||||||
|
|
||||||
main_ui_->actionViewColorizePacketList->setIcon(StockIcon("x-colorize-packets"));
|
main_ui_->actionViewColorizePacketList->setIcon(StockIcon("x-colorize-packets"));
|
||||||
|
|
|
@ -259,6 +259,8 @@
|
||||||
<addaction name="actionGoLastPacket"/>
|
<addaction name="actionGoLastPacket"/>
|
||||||
<addaction name="actionGoNextConversationPacket"/>
|
<addaction name="actionGoNextConversationPacket"/>
|
||||||
<addaction name="actionGoPreviousConversationPacket"/>
|
<addaction name="actionGoPreviousConversationPacket"/>
|
||||||
|
<addaction name="actionGoNextHistoryPacket"/>
|
||||||
|
<addaction name="actionGoPreviousHistoryPacket"/>
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="actionGoAutoScroll"/>
|
<addaction name="actionGoAutoScroll"/>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -991,6 +993,28 @@
|
||||||
<string notr="true">Ctrl+,</string>
|
<string notr="true">Ctrl+,</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
<action name="actionGoNextHistoryPacket">
|
||||||
|
<property name="text">
|
||||||
|
<string>Next Packet In History</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Go to the next packet in your selection history</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string notr="true">Alt+Right</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionGoPreviousHistoryPacket">
|
||||||
|
<property name="text">
|
||||||
|
<string>Previous Packet In History</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Go to the previous packet in your selection history</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string notr="true">Alt+Left</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
<action name="actionGoFirstPacket">
|
<action name="actionGoFirstPacket">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>First Packet</string>
|
<string>First Packet</string>
|
||||||
|
|
|
@ -1192,6 +1192,10 @@ void MainWindow::setMenusForSelectedPacket()
|
||||||
bool have_frames = false;
|
bool have_frames = false;
|
||||||
/* A frame is selected */
|
/* A frame is selected */
|
||||||
bool frame_selected = false;
|
bool frame_selected = false;
|
||||||
|
/* A visible packet comes after this one in the selection history */
|
||||||
|
bool next_selection_history = false;
|
||||||
|
/* A visible packet comes before this one in the selection history */
|
||||||
|
bool previous_selection_history = false;
|
||||||
/* We have marked frames. (XXX - why check frame_selected?) */
|
/* We have marked frames. (XXX - why check frame_selected?) */
|
||||||
bool have_marked = false;
|
bool have_marked = false;
|
||||||
/* We have a marked frame other than the current frame (i.e.,
|
/* We have a marked frame other than the current frame (i.e.,
|
||||||
|
@ -1220,6 +1224,8 @@ void MainWindow::setMenusForSelectedPacket()
|
||||||
|
|
||||||
if (capture_file_.capFile()) {
|
if (capture_file_.capFile()) {
|
||||||
frame_selected = capture_file_.capFile()->current_frame != NULL;
|
frame_selected = capture_file_.capFile()->current_frame != NULL;
|
||||||
|
next_selection_history = packet_list_->haveNextHistory();
|
||||||
|
previous_selection_history = packet_list_->havePreviousHistory();
|
||||||
have_frames = capture_file_.capFile()->count > 0;
|
have_frames = capture_file_.capFile()->count > 0;
|
||||||
have_marked = frame_selected && capture_file_.capFile()->marked_count > 0;
|
have_marked = frame_selected && capture_file_.capFile()->marked_count > 0;
|
||||||
another_is_marked = have_marked &&
|
another_is_marked = have_marked &&
|
||||||
|
@ -1266,6 +1272,8 @@ void MainWindow::setMenusForSelectedPacket()
|
||||||
main_ui_->actionEditTimeShift->setEnabled(have_frames);
|
main_ui_->actionEditTimeShift->setEnabled(have_frames);
|
||||||
|
|
||||||
main_ui_->actionGoGoToLinkedPacket->setEnabled(false);
|
main_ui_->actionGoGoToLinkedPacket->setEnabled(false);
|
||||||
|
main_ui_->actionGoNextHistoryPacket->setEnabled(next_selection_history);
|
||||||
|
main_ui_->actionGoPreviousHistoryPacket->setEnabled(previous_selection_history);
|
||||||
|
|
||||||
main_ui_->actionAnalyzeAAFSelected->setEnabled(have_filter_expr);
|
main_ui_->actionAnalyzeAAFSelected->setEnabled(have_filter_expr);
|
||||||
main_ui_->actionAnalyzeAAFNotSelected->setEnabled(have_filter_expr);
|
main_ui_->actionAnalyzeAAFNotSelected->setEnabled(have_filter_expr);
|
||||||
|
|
|
@ -247,7 +247,9 @@ PacketList::PacketList(QWidget *parent) :
|
||||||
rows_inserted_(false),
|
rows_inserted_(false),
|
||||||
columns_changed_(false),
|
columns_changed_(false),
|
||||||
set_column_visibility_(false),
|
set_column_visibility_(false),
|
||||||
frozen_row_(-1)
|
frozen_row_(-1),
|
||||||
|
cur_history_(-1),
|
||||||
|
in_history_(false)
|
||||||
{
|
{
|
||||||
QMenu *main_menu_item, *submenu;
|
QMenu *main_menu_item, *submenu;
|
||||||
QAction *action;
|
QAction *action;
|
||||||
|
@ -494,6 +496,13 @@ void PacketList::selectionChanged (const QItemSelection & selected, const QItemS
|
||||||
cf_select_packet(cap_file_, row);
|
cf_select_packet(cap_file_, row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!in_history_ && cap_file_->current_frame) {
|
||||||
|
cur_history_++;
|
||||||
|
selection_history_.resize(cur_history_);
|
||||||
|
selection_history_.append(cap_file_->current_frame->num);
|
||||||
|
}
|
||||||
|
in_history_ = false;
|
||||||
|
|
||||||
related_packet_delegate_.clear();
|
related_packet_delegate_.clear();
|
||||||
if (proto_tree_) proto_tree_->clear();
|
if (proto_tree_) proto_tree_->clear();
|
||||||
if (byte_view_tab_) byte_view_tab_->clear();
|
if (byte_view_tab_) byte_view_tab_->clear();
|
||||||
|
@ -755,6 +764,42 @@ void PacketList::resetColumns()
|
||||||
packet_list_model_->resetColumns();
|
packet_list_model_->resetColumns();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return true if we have a visible packet further along in the history.
|
||||||
|
bool PacketList::haveNextHistory(bool update_cur)
|
||||||
|
{
|
||||||
|
if (selection_history_.size() < 1 || cur_history_ >= selection_history_.size() - 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = cur_history_ + 1; i < selection_history_.size(); i++) {
|
||||||
|
if (packet_list_model_->packetNumberToRow(selection_history_.at(i)) >= 0) {
|
||||||
|
if (update_cur) {
|
||||||
|
cur_history_ = i;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return true if we have a visible packet back in the history.
|
||||||
|
bool PacketList::havePreviousHistory(bool update_cur)
|
||||||
|
{
|
||||||
|
if (selection_history_.size() < 1 || cur_history_ < 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = cur_history_ - 1; i >= 0; i--) {
|
||||||
|
if (packet_list_model_->packetNumberToRow(selection_history_.at(i)) >= 0) {
|
||||||
|
if (update_cur) {
|
||||||
|
cur_history_ = i;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// prefs.col_list has changed.
|
// prefs.col_list has changed.
|
||||||
void PacketList::columnsChanged()
|
void PacketList::columnsChanged()
|
||||||
{
|
{
|
||||||
|
@ -916,12 +961,14 @@ void PacketList::thaw(bool restore_selection)
|
||||||
}
|
}
|
||||||
|
|
||||||
void PacketList::clear() {
|
void PacketList::clear() {
|
||||||
// packet_history_clear();
|
|
||||||
related_packet_delegate_.clear();
|
related_packet_delegate_.clear();
|
||||||
selectionModel()->clear();
|
selectionModel()->clear();
|
||||||
packet_list_model_->clear();
|
packet_list_model_->clear();
|
||||||
proto_tree_->clear();
|
proto_tree_->clear();
|
||||||
byte_view_tab_->clear();
|
byte_view_tab_->clear();
|
||||||
|
selection_history_.clear();
|
||||||
|
cur_history_ = -1;
|
||||||
|
in_history_ = false;
|
||||||
|
|
||||||
QImage overlay;
|
QImage overlay;
|
||||||
overlay_sb_->setNearOverlayImage(overlay);
|
overlay_sb_->setNearOverlayImage(overlay);
|
||||||
|
@ -1121,6 +1168,12 @@ void PacketList::setMonospaceFont(const QFont &mono_font)
|
||||||
}
|
}
|
||||||
|
|
||||||
void PacketList::goNextPacket(void) {
|
void PacketList::goNextPacket(void) {
|
||||||
|
if (QApplication::keyboardModifiers() | Qt::MetaModifier) {
|
||||||
|
// Alt+toolbar
|
||||||
|
goNextHistoryPacket();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (selectionModel()->hasSelection()) {
|
if (selectionModel()->hasSelection()) {
|
||||||
setCurrentIndex(moveCursor(MoveDown, Qt::NoModifier));
|
setCurrentIndex(moveCursor(MoveDown, Qt::NoModifier));
|
||||||
} else {
|
} else {
|
||||||
|
@ -1130,6 +1183,12 @@ void PacketList::goNextPacket(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PacketList::goPreviousPacket(void) {
|
void PacketList::goPreviousPacket(void) {
|
||||||
|
if (QApplication::keyboardModifiers() | Qt::MetaModifier) {
|
||||||
|
// Alt+toolbar
|
||||||
|
goPreviousHistoryPacket();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (selectionModel()->hasSelection()) {
|
if (selectionModel()->hasSelection()) {
|
||||||
setCurrentIndex(moveCursor(MoveUp, Qt::NoModifier));
|
setCurrentIndex(moveCursor(MoveUp, Qt::NoModifier));
|
||||||
} else {
|
} else {
|
||||||
|
@ -1170,6 +1229,24 @@ void PacketList::goToPacket(int packet, int hf_id)
|
||||||
proto_tree_->goToField(hf_id);
|
proto_tree_->goToField(hf_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PacketList::goNextHistoryPacket()
|
||||||
|
{
|
||||||
|
if (haveNextHistory(true)) {
|
||||||
|
in_history_ = true;
|
||||||
|
goToPacket(selection_history_.at(cur_history_));
|
||||||
|
in_history_ = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PacketList::goPreviousHistoryPacket()
|
||||||
|
{
|
||||||
|
if (havePreviousHistory(true)) {
|
||||||
|
in_history_ = true;
|
||||||
|
goToPacket(selection_history_.at(cur_history_));
|
||||||
|
in_history_ = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PacketList::markFrame()
|
void PacketList::markFrame()
|
||||||
{
|
{
|
||||||
if (!cap_file_ || !packet_list_model_) return;
|
if (!cap_file_ || !packet_list_model_) return;
|
||||||
|
|
|
@ -87,6 +87,8 @@ public:
|
||||||
void setCaptureInProgress(bool in_progress = false) { capture_in_progress_ = in_progress; tail_at_end_ = in_progress; }
|
void setCaptureInProgress(bool in_progress = false) { capture_in_progress_ = in_progress; tail_at_end_ = in_progress; }
|
||||||
void captureFileReadFinished();
|
void captureFileReadFinished();
|
||||||
void resetColumns();
|
void resetColumns();
|
||||||
|
bool haveNextHistory(bool update_cur = false);
|
||||||
|
bool havePreviousHistory(bool update_cur = false);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void selectionChanged(const QItemSelection & selected, const QItemSelection & deselected);
|
void selectionChanged(const QItemSelection & selected, const QItemSelection & deselected);
|
||||||
|
@ -133,6 +135,9 @@ private:
|
||||||
bool columns_changed_;
|
bool columns_changed_;
|
||||||
bool set_column_visibility_;
|
bool set_column_visibility_;
|
||||||
int frozen_row_;
|
int frozen_row_;
|
||||||
|
QVector<int> selection_history_;
|
||||||
|
int cur_history_;
|
||||||
|
bool in_history_;
|
||||||
|
|
||||||
void setFrameReftime(gboolean set, frame_data *fdata);
|
void setFrameReftime(gboolean set, frame_data *fdata);
|
||||||
void setColumnVisibility();
|
void setColumnVisibility();
|
||||||
|
@ -160,6 +165,8 @@ public slots:
|
||||||
void goLastPacket();
|
void goLastPacket();
|
||||||
void goToPacket(int packet);
|
void goToPacket(int packet);
|
||||||
void goToPacket(int packet, int hf_id);
|
void goToPacket(int packet, int hf_id);
|
||||||
|
void goNextHistoryPacket();
|
||||||
|
void goPreviousHistoryPacket();
|
||||||
void markFrame();
|
void markFrame();
|
||||||
void markAllDisplayedFrames(bool set);
|
void markAllDisplayedFrames(bool set);
|
||||||
void ignoreFrame();
|
void ignoreFrame();
|
||||||
|
|
Loading…
Reference in New Issue