forked from osmocom/wireshark
Qt: Add Colorize Conversation menu items.
Add the "View→Colorize Conversation" menu similar to the GTK+ UI. Add the "Reset" item under the "Colorize Conversation" menu instead of the top-level "View" menu. Make sure the "Reset" shortcut is Ctrl+Space even on OS X. Normally Qt would convert it to Cmd+Space, but that's used by Spotlight. Add StockIcon::colorIcon and use it to create filled square icons. Change-Id: I2af9e26d025cdaf97482422bbb9440e28e18d1ac Reviewed-on: https://code.wireshark.org/review/9595 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:
parent
44408ed5d9
commit
d564ea9bea
|
@ -149,7 +149,7 @@ color_filters_set_tmp(guint8 filt_nr, const gchar *filter, gboolean disabled)
|
|||
gchar *err_msg;
|
||||
guint8 i;
|
||||
|
||||
/* Go through the tomporary filters and look for the same filter string.
|
||||
/* Go through the temporary filters and look for the same filter string.
|
||||
* If found, clear it so that a filter can be "moved" up and down the list
|
||||
*/
|
||||
for ( i=1 ; i<=10 ; i++ ) {
|
||||
|
@ -194,6 +194,22 @@ color_filters_set_tmp(guint8 filt_nr, const gchar *filter, gboolean disabled)
|
|||
return;
|
||||
}
|
||||
|
||||
const color_filter_t *
|
||||
color_filters_tmp_color(guint8 filter_num) {
|
||||
gchar *name;
|
||||
color_filter_t *colorf = NULL;
|
||||
GSList *cfl;
|
||||
|
||||
name = g_strdup_printf("%s%02d", CONVERSATION_COLOR_PREFIX, filter_num);
|
||||
cfl = g_slist_find_custom(color_filter_list, name, color_filters_find_by_name_cb);
|
||||
if (cfl) {
|
||||
colorf = (color_filter_t *)cfl->data;
|
||||
}
|
||||
g_free(name);
|
||||
|
||||
return colorf;
|
||||
}
|
||||
|
||||
/* Reset the temporary colorfilters */
|
||||
void
|
||||
color_filters_reset_tmp(void)
|
||||
|
|
|
@ -87,6 +87,14 @@ color_filters_enable(gboolean enable);
|
|||
void
|
||||
color_filters_set_tmp(guint8 filt_nr, const gchar *filter, gboolean disabled);
|
||||
|
||||
/** Get a temporary color filter.
|
||||
*
|
||||
* @param filter_num A number from 1 to 10 specifying the color to fetch.
|
||||
* @return The corresponding color or NULL.
|
||||
*/
|
||||
const color_filter_t *
|
||||
color_filters_tmp_color(guint8 filter_num);
|
||||
|
||||
/** Reset the temporary color filters
|
||||
*
|
||||
*/
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include "tango_colors.h"
|
||||
|
||||
#include "qcustomplot.h"
|
||||
#include "stock_icon.h"
|
||||
#include "syntax_line_edit.h"
|
||||
#include "wireshark_application.h"
|
||||
|
||||
|
@ -618,10 +619,7 @@ void IOGraphDialog::panAxes(int x_pixels, int y_pixels)
|
|||
|
||||
QIcon IOGraphDialog::graphColorIcon(int color_idx)
|
||||
{
|
||||
int h = fontMetrics().height() * 3 / 4;
|
||||
QPixmap pm(h * 2, h);
|
||||
pm.fill(colors_[color_idx % colors_.size()]);
|
||||
return QIcon(pm);
|
||||
return StockIcon::colorIcon(colors_[color_idx % colors_.size()], QColor(QPalette::Mid).rgb());
|
||||
}
|
||||
|
||||
void IOGraphDialog::toggleTracerStyle(bool force_default)
|
||||
|
|
|
@ -239,6 +239,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||
setFeaturesEnabled(false);
|
||||
connect(wsApp, SIGNAL(appInitialized()), this, SLOT(setFeaturesEnabled()));
|
||||
connect(wsApp, SIGNAL(appInitialized()), this, SLOT(zoomText()));
|
||||
connect(wsApp, SIGNAL(appInitialized()), this, SLOT(initViewColorizeMenu()));
|
||||
connect(wsApp, SIGNAL(appInitialized()), this, SLOT(addStatsPluginsToMenu()));
|
||||
connect(wsApp, SIGNAL(appInitialized()), this, SLOT(addDynamicMenus()));
|
||||
connect(wsApp, SIGNAL(appInitialized()), this, SLOT(addExternalMenus()));
|
||||
|
|
|
@ -240,6 +240,8 @@ public slots:
|
|||
private slots:
|
||||
// Manually connected slots (no "on_<object>_<signal>").
|
||||
|
||||
void initViewColorizeMenu();
|
||||
|
||||
// in main_window_slots.cpp
|
||||
void startCapture();
|
||||
void pipeTimeout();
|
||||
|
@ -374,6 +376,9 @@ private slots:
|
|||
void on_actionViewNormalSize_triggered();
|
||||
void on_actionViewColorizePacketList_triggered(bool checked);
|
||||
void on_actionViewColoringRules_triggered();
|
||||
void colorizeConversation(bool create_rule = false);
|
||||
void on_actionViewColorizeResetColorization_triggered();
|
||||
void on_actionViewColorizeNewConversationRule_triggered();
|
||||
void on_actionViewResizeColumns_triggered();
|
||||
|
||||
void openPacketDialog(bool from_reference = false);
|
||||
|
|
|
@ -279,6 +279,24 @@
|
|||
<addaction name="actionViewNameResolutionNetwork"/>
|
||||
<addaction name="actionViewNameResolutionTransport"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuColorize_Conversation">
|
||||
<property name="title">
|
||||
<string>Colorize Conversation</string>
|
||||
</property>
|
||||
<addaction name="actionViewColorizeConversation1"/>
|
||||
<addaction name="actionViewColorizeConversation2"/>
|
||||
<addaction name="actionViewColorizeConversation3"/>
|
||||
<addaction name="actionViewColorizeConversation4"/>
|
||||
<addaction name="actionViewColorizeConversation5"/>
|
||||
<addaction name="actionViewColorizeConversation6"/>
|
||||
<addaction name="actionViewColorizeConversation7"/>
|
||||
<addaction name="actionViewColorizeConversation8"/>
|
||||
<addaction name="actionViewColorizeConversation9"/>
|
||||
<addaction name="actionViewColorizeConversation10"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionViewColorizeResetColorization"/>
|
||||
<addaction name="actionViewColorizeNewConversationRule"/>
|
||||
</widget>
|
||||
<addaction name="actionViewMainToolbar"/>
|
||||
<addaction name="actionViewFilterToolbar"/>
|
||||
<addaction name="actionViewWirelessToolbar"/>
|
||||
|
@ -299,6 +317,7 @@
|
|||
<addaction name="separator"/>
|
||||
<addaction name="actionViewColorizePacketList"/>
|
||||
<addaction name="actionViewColoringRules"/>
|
||||
<addaction name="menuColorize_Conversation"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionViewResizeColumns"/>
|
||||
<addaction name="separator"/>
|
||||
|
@ -2417,6 +2436,105 @@
|
|||
<string>Show each table of resolved addresses as copyable text.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionViewColorizeConversation1">
|
||||
<property name="text">
|
||||
<string>Color &1</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Mark the current coversation with its own color.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionViewColorizeConversation2">
|
||||
<property name="text">
|
||||
<string>Color &2</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Mark the current coversation with its own color.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionViewColorizeConversation3">
|
||||
<property name="text">
|
||||
<string>Color &3</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Mark the current coversation with its own color.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionViewColorizeConversation4">
|
||||
<property name="text">
|
||||
<string>Color &4</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Mark the current coversation with its own color.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionViewColorizeConversation5">
|
||||
<property name="text">
|
||||
<string>Color &5</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Mark the current coversation with its own color.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionViewColorizeConversation6">
|
||||
<property name="text">
|
||||
<string>Color &6</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Mark the current coversation with its own color.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionViewColorizeConversation7">
|
||||
<property name="text">
|
||||
<string>Color &7</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Mark the current coversation with its own color.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionViewColorizeConversation8">
|
||||
<property name="text">
|
||||
<string>Color &8</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Mark the current coversation with its own color.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionViewColorizeConversation9">
|
||||
<property name="text">
|
||||
<string>Color &9</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Mark the current coversation with its own color.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionViewColorizeConversation10">
|
||||
<property name="text">
|
||||
<string>Color 1&0</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Mark the current coversation with its own color.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionViewColorizeNewConversationRule">
|
||||
<property name="text">
|
||||
<string>New Conversation Rule...</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Create a new coloring rule based on this conversation.</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionViewColorizeResetColorization">
|
||||
<property name="text">
|
||||
<string>Reset Colorization</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Reset colorized conversations.</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+Space</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<customwidgets>
|
||||
|
|
|
@ -78,6 +78,7 @@
|
|||
#include "bluetooth_devices_dialog.h"
|
||||
#include "capture_file_dialog.h"
|
||||
#include "capture_file_properties_dialog.h"
|
||||
#include "color_utils.h"
|
||||
#include "coloring_rules_dialog.h"
|
||||
#include "conversation_dialog.h"
|
||||
#include "decode_as_dialog.h"
|
||||
|
@ -111,6 +112,7 @@
|
|||
#include "sctp_graph_dialog.h"
|
||||
#include "sequence_dialog.h"
|
||||
#include "stats_tree_dialog.h"
|
||||
#include "stock_icon.h"
|
||||
#include "tap_parameter_dialog.h"
|
||||
#include "tcp_stream_dialog.h"
|
||||
#include "time_shift_dialog.h"
|
||||
|
@ -1052,18 +1054,21 @@ void MainWindow::setMenusForSelectedPacket()
|
|||
main_ui_->actionEditPreviousTimeReference->setEnabled(another_is_time_ref);
|
||||
main_ui_->actionEditTimeShift->setEnabled(have_frames);
|
||||
|
||||
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ResizeAllColumns",
|
||||
// frame_selected);
|
||||
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/CollapseAll",
|
||||
// frame_selected);
|
||||
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/CollapseAll",
|
||||
// frame_selected);
|
||||
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ExpandAll",
|
||||
// frame_selected);
|
||||
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ExpandAll",
|
||||
// frame_selected);
|
||||
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ColorizeConversation",
|
||||
// frame_selected);
|
||||
main_ui_->actionViewColorizeConversation1->setEnabled(frame_selected);
|
||||
main_ui_->actionViewColorizeConversation2->setEnabled(frame_selected);
|
||||
main_ui_->actionViewColorizeConversation3->setEnabled(frame_selected);
|
||||
main_ui_->actionViewColorizeConversation4->setEnabled(frame_selected);
|
||||
main_ui_->actionViewColorizeConversation5->setEnabled(frame_selected);
|
||||
main_ui_->actionViewColorizeConversation6->setEnabled(frame_selected);
|
||||
main_ui_->actionViewColorizeConversation7->setEnabled(frame_selected);
|
||||
main_ui_->actionViewColorizeConversation8->setEnabled(frame_selected);
|
||||
main_ui_->actionViewColorizeConversation9->setEnabled(frame_selected);
|
||||
main_ui_->actionViewColorizeConversation10->setEnabled(frame_selected);
|
||||
main_ui_->actionViewColorizeNewConversationRule->setEnabled(frame_selected);
|
||||
|
||||
main_ui_->actionViewColorizeResetColorization->setEnabled(tmp_color_filters_used());
|
||||
|
||||
main_ui_->actionViewColorizeNewConversationRule->setEnabled(frame_selected);
|
||||
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ResetColoring1-10",
|
||||
// tmp_color_filters_used());
|
||||
|
||||
|
@ -1422,6 +1427,36 @@ void MainWindow::showPreferenceEditor()
|
|||
showAccordionFrame(main_ui_->preferenceEditorFrame);
|
||||
}
|
||||
|
||||
void MainWindow::initViewColorizeMenu()
|
||||
{
|
||||
QList<QAction *> cc_actions = QList<QAction *>()
|
||||
<< main_ui_->actionViewColorizeConversation1 << main_ui_->actionViewColorizeConversation2
|
||||
<< main_ui_->actionViewColorizeConversation3 << main_ui_->actionViewColorizeConversation4
|
||||
<< main_ui_->actionViewColorizeConversation5 << main_ui_->actionViewColorizeConversation6
|
||||
<< main_ui_->actionViewColorizeConversation7 << main_ui_->actionViewColorizeConversation8
|
||||
<< main_ui_->actionViewColorizeConversation9 << main_ui_->actionViewColorizeConversation10;
|
||||
|
||||
guint8 color_num = 1;
|
||||
|
||||
foreach (QAction *cc_action, cc_actions) {
|
||||
cc_action->setData(color_num);
|
||||
connect(cc_action, SIGNAL(triggered()), this, SLOT(colorizeConversation()));
|
||||
|
||||
const color_filter_t *colorf = color_filters_tmp_color(color_num);
|
||||
if (colorf) {
|
||||
QColor bg = ColorUtils::fromColorT(colorf->bg_color);
|
||||
QColor fg = ColorUtils::fromColorT(colorf->fg_color);
|
||||
cc_action->setIcon(StockIcon::colorIcon(bg.rgb(), fg.rgb(), QString::number(color_num)));
|
||||
}
|
||||
color_num++;
|
||||
}
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
// Spotlight uses Cmd+Space
|
||||
main_ui_->actionViewColorizeResetColorization->setShortcut(QKeySequence("Meta+Space"));
|
||||
#endif
|
||||
}
|
||||
|
||||
void MainWindow::addStatsPluginsToMenu() {
|
||||
GList *cfg_list = stats_tree_get_cfg_list();
|
||||
GList *iter = g_list_first(cfg_list);
|
||||
|
@ -2200,6 +2235,67 @@ void MainWindow::on_actionViewColoringRules_triggered()
|
|||
coloring_rules_dialog.exec();
|
||||
}
|
||||
|
||||
// actionViewColorizeConversation1 - 10
|
||||
void MainWindow::colorizeConversation(bool create_rule)
|
||||
{
|
||||
QAction *cc_action = qobject_cast<QAction *>(sender());
|
||||
if (!cc_action) return;
|
||||
|
||||
if (capture_file_.capFile() && capture_file_.capFile()->current_frame) {
|
||||
packet_info *pi = &capture_file_.capFile()->edt->pi;
|
||||
guint8 cc_num = cc_action->data().toUInt();
|
||||
gchar *filter = NULL;
|
||||
|
||||
const color_conversation_filter_t *color_filter = find_color_conversation_filter("tcp");
|
||||
if ((color_filter != NULL) && (color_filter->is_filter_valid(pi)))
|
||||
filter = color_filter->build_filter_string(pi);
|
||||
if (filter == NULL) {
|
||||
color_filter = find_color_conversation_filter("udp");
|
||||
if ((color_filter != NULL) && (color_filter->is_filter_valid(pi)))
|
||||
filter = color_filter->build_filter_string(pi);
|
||||
}
|
||||
if (filter == NULL) {
|
||||
color_filter = find_color_conversation_filter("ip");
|
||||
if ((color_filter != NULL) && (color_filter->is_filter_valid(pi)))
|
||||
filter = color_filter->build_filter_string(pi);
|
||||
}
|
||||
if (filter == NULL) {
|
||||
color_filter = find_color_conversation_filter("ipv6");
|
||||
if ((color_filter != NULL) && (color_filter->is_filter_valid(pi)))
|
||||
filter = color_filter->build_filter_string(pi);
|
||||
}
|
||||
if (filter == NULL) {
|
||||
color_filter = find_color_conversation_filter("eth");
|
||||
if ((color_filter != NULL) && (color_filter->is_filter_valid(pi)))
|
||||
filter = color_filter->build_filter_string(pi);
|
||||
}
|
||||
if( filter == NULL ) {
|
||||
main_ui_->statusBar->pushTemporaryStatus(tr("Unable to build conversation filter."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (create_rule) {
|
||||
ColoringRulesDialog coloring_rules_dialog(this, filter);
|
||||
coloring_rules_dialog.exec();
|
||||
} else {
|
||||
color_filters_set_tmp(cc_num, filter, FALSE);
|
||||
packet_list_->recolorPackets();
|
||||
main_ui_->actionViewColorizeResetColorization->setEnabled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_actionViewColorizeResetColorization_triggered()
|
||||
{
|
||||
color_filters_reset_tmp();
|
||||
packet_list_->recolorPackets();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionViewColorizeNewConversationRule_triggered()
|
||||
{
|
||||
colorizeConversation(true);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionViewResizeColumns_triggered()
|
||||
{
|
||||
for (int col = 0; col < packet_list_->packetListModel()->columnCount(); col++) {
|
||||
|
|
|
@ -53,6 +53,8 @@
|
|||
#include "wireshark_application.h"
|
||||
|
||||
#include <QFile>
|
||||
#include <QFontMetrics>
|
||||
#include <QPainter>
|
||||
#include <QStyle>
|
||||
|
||||
QString path_pfx_ = ":/icons/toolbar/";
|
||||
|
@ -92,6 +94,32 @@ StockIcon::StockIcon(const char *icon_name) :
|
|||
}
|
||||
}
|
||||
|
||||
// Create a square icon filled with the specified color.
|
||||
QIcon StockIcon::colorIcon(const QRgb bg_color, const QRgb fg_color, const QString glyph)
|
||||
{
|
||||
QList<int> sizes = QList<int>() << 12 << 16 << 24 << 32 << 48;
|
||||
QIcon color_icon;
|
||||
|
||||
foreach (int size, sizes) {
|
||||
QPixmap pm(size, size);
|
||||
QPainter painter(&pm);
|
||||
QRect border(0, 0, size - 1, size - 1);
|
||||
painter.setPen(fg_color);
|
||||
painter.setBrush(QColor(bg_color));
|
||||
painter.drawRect(border);
|
||||
|
||||
if (!glyph.isEmpty()) {
|
||||
QFont font(wsApp->font());
|
||||
font.setPointSizeF(size * 2.0 / 3.0);
|
||||
QRectF bounding = painter.boundingRect(pm.rect(), glyph, Qt::AlignHCenter | Qt::AlignVCenter);
|
||||
painter.drawText(bounding, glyph);
|
||||
}
|
||||
|
||||
color_icon.addPixmap(pm);
|
||||
}
|
||||
return color_icon;
|
||||
}
|
||||
|
||||
/*
|
||||
* Editor modelines
|
||||
*
|
||||
|
|
|
@ -40,6 +40,7 @@ class StockIcon : public QIcon
|
|||
public:
|
||||
explicit StockIcon(const char *icon_name);
|
||||
|
||||
static QIcon colorIcon(const QRgb bg_color, const QRgb fg_color, const QString glyph = QString());
|
||||
};
|
||||
|
||||
#endif // STOCK_ICON_H
|
||||
|
|
Loading…
Reference in New Issue