summaryrefslogtreecommitdiff
path: root/ui/qt/main_window.cpp
diff options
context:
space:
mode:
authorRoland Knall <roland.knall@br-automation.com>2017-01-24 17:34:07 +0100
committerRoland Knall <rknall@gmail.com>2017-02-24 08:12:46 +0000
commit321386e9f49d88b64f48868c6e4079b2073547a1 (patch)
treed30943f392b322b6dd7e1245f7efc3915051ab55 /ui/qt/main_window.cpp
parentbd9afdddfe45b4c9c6e966df7264d12cdfd85f42 (diff)
downloadwireshark-321386e9f49d88b64f48868c6e4079b2073547a1.tar.gz
PluginIF: AdditionalToolbar
Creates an interface for plugins and other parts of the code, to add a new toolbar to the system and have various widget types interact with this toolbar. All toolbars added via this interface, will be added to an additional submenu called "Additional Toolbars" within Wireshark. Also a demo plugin is being provided, demonstrating various features of the toolbar, including updating the gui elements. It also demonstrates how to update toolbar items. Change-Id: I8d0351224b3d7f4b90220d58970b51695551d7e3 Reviewed-on: https://code.wireshark.org/review/19803 Petri-Dish: Roland Knall <rknall@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org> Reviewed-by: Roland Knall <rknall@gmail.com>
Diffstat (limited to 'ui/qt/main_window.cpp')
-rw-r--r--ui/qt/main_window.cpp133
1 files changed, 125 insertions, 8 deletions
diff --git a/ui/qt/main_window.cpp b/ui/qt/main_window.cpp
index 45479df68d..6573a7c6f6 100644
--- a/ui/qt/main_window.cpp
+++ b/ui/qt/main_window.cpp
@@ -69,6 +69,9 @@
#include "wireless_frame.h"
#include "wireshark_application.h"
+#include "additional_toolbar.h"
+#include "variant_pointer.h"
+
#include "qt_ui_utils.h"
#include <QAction>
@@ -193,6 +196,18 @@ static void plugin_if_mainwindow_get_ws_info(gconstpointer user_data)
#endif /* HAVE_LIBPCAP */
+static void plugin_if_mainwindow_update_toolbars(gconstpointer user_data)
+{
+ if (!gbl_cur_main_window_ || ! user_data)
+ return;
+
+ GHashTable * data_set = (GHashTable *)user_data;
+ if (g_hash_table_lookup_extended(data_set, "toolbar_name", NULL, NULL)) {
+ QString toolbarName((const char *)g_hash_table_lookup(data_set, "toolbar_name"));
+ gbl_cur_main_window_->removeAdditionalToolbar(toolbarName);
+ }
+}
+
gpointer
simple_dialog(ESD_TYPE_E type, gint btn_mask, const gchar *msg_format, ...)
{
@@ -350,7 +365,7 @@ MainWindow::MainWindow(QWidget *parent) :
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()));
+ connect(wsApp, SIGNAL(appInitialized()), this, SLOT(addPluginIFStructures()));
connect(wsApp, SIGNAL(appInitialized()), this, SLOT(initConversationMenus()));
connect(wsApp, SIGNAL(appInitialized()), this, SLOT(initExportObjectsMenus()));
@@ -722,6 +737,7 @@ MainWindow::MainWindow(QWidget *parent) :
#ifdef HAVE_LIBPCAP
plugin_if_register_gui_cb(PLUGIN_IF_GET_WS_INFO, plugin_if_mainwindow_get_ws_info);
#endif
+ plugin_if_register_gui_cb(PLUGIN_IF_REMOVE_TOOLBAR, plugin_if_mainwindow_update_toolbars);
main_ui_->mainStack->setCurrentWidget(main_welcome_);
}
@@ -742,7 +758,17 @@ QMenu *MainWindow::createPopupMenu()
menu->addAction(main_ui_->actionViewMainToolbar);
menu->addAction(main_ui_->actionViewFilterToolbar);
menu->addAction(main_ui_->actionViewWirelessToolbar);
+
+ if ( ! main_ui_->actionViewAdditionalToolbars->actions().isEmpty() )
+ {
+ QMenu * subMenu = menu->addMenu(main_ui_->actionViewAdditionalToolbars->title());
+ foreach ( QAction * action, main_ui_->actionViewAdditionalToolbars->actions() )
+ subMenu->addAction(action);
+
+ }
+
menu->addAction(main_ui_->actionViewStatusBar);
+
menu->addSeparator();
menu->addAction(main_ui_->actionViewPacketList);
menu->addAction(main_ui_->actionViewPacketDetails);
@@ -1845,6 +1871,9 @@ void MainWindow::initShowHideMainWidgets()
showHideMainWidgets(shmwa);
}
+ /* Initially hide the additional toolbars menus */
+ main_ui_->actionViewAdditionalToolbars->menuAction()->setVisible(false);
+
connect(show_hide_actions_, SIGNAL(triggered(QAction*)), this, SLOT(showHideMainWidgets(QAction*)));
}
@@ -2554,16 +2583,13 @@ QMenu * MainWindow::searchSubMenu(QString objectName)
return 0;
}
-void MainWindow::addExternalMenus()
+void MainWindow::addPluginIFStructures()
{
- QMenu * subMenu = NULL;
- GList * user_menu = NULL;
- ext_menu_t * menu = NULL;
-
- user_menu = ext_menubar_get_entries();
+ GList * user_menu = ext_menubar_get_entries();
while (user_menu && user_menu->data) {
- menu = (ext_menu_t *) user_menu->data;
+ QMenu * subMenu = NULL;
+ ext_menu_t * menu = (ext_menu_t *) user_menu->data;
/* On this level only menu items should exist. Not doing an assert here,
* as it could be an honest mistake */
@@ -2589,8 +2615,99 @@ void MainWindow::addExternalMenus()
/* Iterate Loop */
user_menu = g_list_next (user_menu);
}
+
+ int cntToolbars = 0;
+
+ QMenu * tbMenu = main_ui_->actionViewAdditionalToolbars;
+ GList * if_toolbars = ext_toolbar_get_entries();
+ while ( if_toolbars && if_toolbars->data ) {
+
+ ext_toolbar_t * toolbar = (ext_toolbar_t*) if_toolbars->data;
+
+ if ( toolbar->type != EXT_TOOLBAR_BAR) {
+ if_toolbars = g_list_next ( if_toolbars );
+ continue;
+ }
+
+ bool visible = g_list_find_custom(recent.gui_additional_toolbars, toolbar->name, (GCompareFunc) strcmp) ? true : false;
+
+ AdditionalToolBar * ifToolBar = AdditionalToolBar::create(this, toolbar);
+ ifToolBar->setVisible(visible);
+
+ if ( ifToolBar )
+ {
+
+ QAction * iftbAction = new QAction(QString(toolbar->name), this);
+ iftbAction->setToolTip(toolbar->tooltip);
+ iftbAction->setEnabled(true);
+ iftbAction->setCheckable(true);
+ iftbAction->setChecked(visible);
+ iftbAction->setToolTip(tr("Show or hide the toolbar"));
+ iftbAction->setData(VariantPointer<ext_toolbar_t>::asQVariant(toolbar));
+
+ QAction * before = 0;
+
+ foreach ( QAction * action, tbMenu->actions() )
+ {
+ /* Ensure we add the menu entries in sorted order */
+ if ( action->text().compare(toolbar->name, Qt::CaseInsensitive) > 0 )
+ {
+ before = action;
+ break;
+ }
+ }
+
+ tbMenu->insertAction(before, iftbAction);
+
+ addToolBar(Qt::TopToolBarArea, ifToolBar);
+ insertToolBarBreak(ifToolBar);
+
+ if ( show_hide_actions_ )
+ show_hide_actions_->addAction(iftbAction);
+
+ cntToolbars++;
+ }
+
+ if_toolbars = g_list_next ( if_toolbars );
+ }
+
+ if ( cntToolbars )
+ tbMenu->menuAction()->setVisible(true);
+
}
+void MainWindow::removeAdditionalToolbar(QString toolbarName)
+{
+ if ( toolbarName.length() == 0 )
+ return;
+
+ QList<QToolBar *> toolbars = findChildren<QToolBar *>();
+ foreach(QToolBar * tb, toolbars) {
+ AdditionalToolBar * ifToolBar = dynamic_cast<AdditionalToolBar *>(tb);
+
+ if ( ifToolBar && ifToolBar->menuName().compare(toolbarName) ) {
+
+ GList *entry = g_list_find_custom(recent.gui_additional_toolbars, ifToolBar->menuName().toStdString().c_str(), (GCompareFunc) strcmp);
+ if (entry) {
+ recent.gui_additional_toolbars = g_list_remove(recent.gui_additional_toolbars, entry->data);
+ }
+ QList<QAction *> actions = main_ui_->actionViewAdditionalToolbars->actions();
+ foreach(QAction * action, actions) {
+ ext_toolbar_t * item = VariantPointer<ext_toolbar_t>::asPtr(action->data());
+ if ( item && ifToolBar->menuName().compare(item->name) ) {
+ if ( show_hide_actions_ )
+ show_hide_actions_->removeAction(action);
+ main_ui_->actionViewAdditionalToolbars->removeAction(action);
+ }
+ }
+
+ break;
+ }
+ }
+
+}
+
+
/*
* Editor modelines
*