summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland Knall <rknall@gmail.com>2017-03-03 11:53:39 +0100
committerRoland Knall <rknall@gmail.com>2017-03-03 15:13:13 +0000
commit85aa48cef2d6334a05963bf36711d47eceb3d209 (patch)
treea99443e60b1c7d8367e09e1d0a63baff8fbb7871
parent9eca0390e70bf72573189c6f4d20d352ace8b814 (diff)
downloadwireshark-85aa48cef2d6334a05963bf36711d47eceb3d209.tar.gz
pluginIf: Add/Remove single entries from selector
Allow to add and remove single items from a selector list and also fixing the selection of items in a selector list Change-Id: I0c69ea97db6ca1a6932939f0df9049c6fb720f77 Reviewed-on: https://code.wireshark.org/review/20363 Petri-Dish: Roland Knall <rknall@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Roland Knall <rknall@gmail.com>
-rw-r--r--epan/plugin_if.c12
-rw-r--r--epan/plugin_if.h36
-rw-r--r--plugins/pluginifdemo/ui/pluginifdemo_main.cpp56
-rw-r--r--plugins/pluginifdemo/ui/pluginifdemo_main.h1
-rw-r--r--plugins/pluginifdemo/ui/pluginifdemo_main.ui27
-rw-r--r--ui/qt/additional_toolbar.cpp82
6 files changed, 179 insertions, 35 deletions
diff --git a/epan/plugin_if.c b/epan/plugin_if.c
index 841d93c16f..a24587698d 100644
--- a/epan/plugin_if.c
+++ b/epan/plugin_if.c
@@ -499,6 +499,18 @@ void ext_toolbar_update_data_by_index(ext_toolbar_t * entry, gpointer data, gpoi
ext_toolbar_update_entry( EXT_TOOLBAR_UPDATE_DATABYINDEX, entry, data, idx, silent );
}
+void ext_toolbar_update_data_add_entry(ext_toolbar_t * entry, gpointer data, gpointer idx, gboolean silent)
+{
+ if ( entry->item_type == EXT_TOOLBAR_SELECTOR )
+ ext_toolbar_update_entry( EXT_TOOLBAR_UPDATE_DATA_ADD, entry, data, idx, silent );
+}
+
+void ext_toolbar_update_data_remove_entry(ext_toolbar_t * entry, gpointer data, gpointer idx, gboolean silent)
+{
+ if ( entry->item_type == EXT_TOOLBAR_SELECTOR )
+ ext_toolbar_update_entry( EXT_TOOLBAR_UPDATE_DATA_REMOVE, entry, data, idx, silent );
+}
+
/* Implementation of GUI callback methods follows.
* This is a necessity, as using modern UI systems, gui interfaces often operate
* in different threads then the calling application. Even more so, if the calling
diff --git a/epan/plugin_if.h b/epan/plugin_if.h
index 0a5879b793..34e800a370 100644
--- a/epan/plugin_if.h
+++ b/epan/plugin_if.h
@@ -138,7 +138,9 @@ typedef enum
{
EXT_TOOLBAR_UPDATE_VALUE,
EXT_TOOLBAR_UPDATE_DATA,
- EXT_TOOLBAR_UPDATE_DATABYINDEX
+ EXT_TOOLBAR_UPDATE_DATABYINDEX,
+ EXT_TOOLBAR_UPDATE_DATA_ADD,
+ EXT_TOOLBAR_UPDATE_DATA_REMOVE
} ext_toolbar_update_type_t;
typedef struct _ext_toolbar_update_t
@@ -319,16 +321,42 @@ WS_DLL_PUBLIC void ext_toolbar_update_data(ext_toolbar_t * entry, gpointer data,
* This is used to update a single entry of a selector list, by giving it's value and a new display
* entry
*
- * @param entry the entry to be updated
+ * @param entry the toolbar item to be updated
* @param data the display data for the entry
- * @param value the value for the entry to be updated
+ * @param idx the value for the entry to be updated
* @param silent the update for the entry should not trigger additional actions
*/
-WS_DLL_PUBLIC void ext_toolbar_update_data_by_index(ext_toolbar_t * entry, gpointer data, gpointer value, gboolean silent);
+WS_DLL_PUBLIC void ext_toolbar_update_data_by_index(ext_toolbar_t * entry, gpointer data, gpointer idx, gboolean silent);
+
+/* Adds the entry data by index
+ *
+ * This is used to add a single entry to a selector list, by giving it's new value and a new display
+ * entry. If the value already exists, the selector may choose to ignore the command
+ *
+ * @param entry the toolbar item to be updated
+ * @param data the display data for the entry to be added
+ * @param idx the value for the entry to be added
+ * @param silent the adding of the entry should not trigger additional actions
+ */
+WS_DLL_PUBLIC void ext_toolbar_update_data_add_entry(ext_toolbar_t * entry, gpointer data, gpointer idx, gboolean silent);
+
+/* Removes an entry data by index
+ *
+ * This is used to remove a single entry to a selector list, by giving it's value and a display
+ * entry. If the value already exists, the selector may choose to ignore the command. Both value
+ * and display must be given, as it is not established, how the entry is found in the selector list
+ *
+ * @param entry the toolbar item to be updated
+ * @param data the display data for the entry to be removed
+ * @param idx the value for the entry to be removed
+ * @param silent the removal of the entry should not trigger additional actions
+ */
+WS_DLL_PUBLIC void ext_toolbar_update_data_remove_entry(ext_toolbar_t * entry, gpointer data, gpointer idx, gboolean silent);
/* Search for and return if found an entry from the toolbar with the given label */
WS_DLL_PUBLIC ext_toolbar_t * ext_toolbar_entry_by_label(const ext_toolbar_t * toolbar, const gchar * label);
+
/*
* Structure definition for the plugin_if_get_ws_info function
*/
diff --git a/plugins/pluginifdemo/ui/pluginifdemo_main.cpp b/plugins/pluginifdemo/ui/pluginifdemo_main.cpp
index 33f88356e1..58e9542e23 100644
--- a/plugins/pluginifdemo/ui/pluginifdemo_main.cpp
+++ b/plugins/pluginifdemo/ui/pluginifdemo_main.cpp
@@ -244,6 +244,21 @@ void PluginIFDemo_Main::on_btnAddItem_clicked()
return;
listModel->appendRow(new QStandardItem(content));
+
+ if ( ui->chkAddRemoveImmediate->checkState() == Qt::Checked )
+ {
+ ext_toolbar_t * item = ext_toolbar_entry_by_label(_toolbar, ui->cmbElements->currentText().toStdString().c_str());
+ if ( ! item || item->item_type != EXT_TOOLBAR_SELECTOR )
+ return;
+
+ bool silent = ui->chkSilent->checkState() == Qt::Checked ? true : false;
+
+ gchar * value = g_strdup(ui->txtNewItemValue->text().toUtf8().constData());
+ gchar * display = g_strdup(ui->txtNewItemDisplay->text().toUtf8().constData());
+ ext_toolbar_update_data_add_entry(item, display, value, silent);
+ g_free(value);
+ g_free(display);
+ }
}
void PluginIFDemo_Main::on_btnRemoveItem_clicked()
@@ -255,7 +270,28 @@ void PluginIFDemo_Main::on_btnRemoveItem_clicked()
QModelIndexList selIndeces = selModel-> selectedIndexes();
foreach(QModelIndex idx, selIndeces)
+ {
+ if ( ui->chkAddRemoveImmediate->checkState() == Qt::Checked )
+ {
+ ext_toolbar_t * item = ext_toolbar_entry_by_label(_toolbar, ui->cmbElements->currentText().toStdString().c_str());
+ if ( ! item || item->item_type != EXT_TOOLBAR_SELECTOR )
+ return;
+
+ bool silent = ui->chkSilent->checkState() == Qt::Checked ? true : false;
+
+ QString content = listModel->data(idx).toString();
+ int pos = content.indexOf(":");
+
+ gchar * value = g_strdup(content.left(pos).toUtf8().constData() );
+ /* -2 because removal of : and space */
+ gchar * display = g_strdup(content.right(content.size() - pos - 2).toUtf8().constData());
+ ext_toolbar_update_data_remove_entry(item, display, value, silent);
+ g_free(value);
+ g_free(display);
+ }
+
listModel->removeRow(idx.row());
+ }
}
void PluginIFDemo_Main::on_btnSendList_clicked()
@@ -306,6 +342,26 @@ void PluginIFDemo_Main::on_btnSendUpdateItem_clicked()
(gpointer) displayValue.toStdString().c_str(), (gpointer) cmbIndexText.toStdString().c_str(), silent );
}
+void PluginIFDemo_Main::on_lstItems_clicked(const QModelIndex &idx)
+{
+ if ( ! _toolbar || ! idx.isValid() )
+ return;
+
+ ext_toolbar_t * item = ext_toolbar_entry_by_label(_toolbar, ui->cmbElements->currentText().toStdString().c_str());
+ if ( ! item || item->item_type != EXT_TOOLBAR_SELECTOR )
+ return;
+
+ bool silent = ui->chkSilent->checkState() == Qt::Checked ? true : false;
+
+ QString content = listModel->data(listModel->index(idx.row(), 0)).toString();
+ int pos = content.indexOf(":");
+
+ gchar * idxData = g_strdup(content.left(pos).toUtf8().constData() );
+
+ ext_toolbar_update_value(item, idxData, silent);
+ g_free(idxData);
+
+}
/*
* Editor modelines
*
diff --git a/plugins/pluginifdemo/ui/pluginifdemo_main.h b/plugins/pluginifdemo/ui/pluginifdemo_main.h
index 439712e556..2138301fd0 100644
--- a/plugins/pluginifdemo/ui/pluginifdemo_main.h
+++ b/plugins/pluginifdemo/ui/pluginifdemo_main.h
@@ -101,6 +101,7 @@ private slots:
void on_btnRemoveItem_clicked();
void on_btnSendList_clicked();
void on_cmbElements_currentTextChanged(const QString & newText);
+ void on_lstItems_clicked(const QModelIndex &idx);
void logChanged(QString message);
void closeDialog();
diff --git a/plugins/pluginifdemo/ui/pluginifdemo_main.ui b/plugins/pluginifdemo/ui/pluginifdemo_main.ui
index 0871ee8e81..ec71781e93 100644
--- a/plugins/pluginifdemo/ui/pluginifdemo_main.ui
+++ b/plugins/pluginifdemo/ui/pluginifdemo_main.ui
@@ -217,6 +217,33 @@
</layout>
</item>
<item>
+ <widget class="QCheckBox" name="chkAddRemoveImmediate">
+ <property name="text">
+ <string>Add and remove will immediately be send to interface</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="chkSendSelect">
+ <property name="text">
+ <string>Update interface with selection</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QLabel" name="label_5">
diff --git a/ui/qt/additional_toolbar.cpp b/ui/qt/additional_toolbar.cpp
index aff096a3ec..c48d5c6e1d 100644
--- a/ui/qt/additional_toolbar.cpp
+++ b/ui/qt/additional_toolbar.cpp
@@ -188,8 +188,6 @@ QWidget * AdditionalToolbarWidgetAction::createButton(ext_toolbar_t * item, QWid
if ( ! item || item->type != EXT_TOOLBAR_ITEM || item->item_type != EXT_TOOLBAR_BUTTON )
return 0;
- QString defValue = item->defvalue;
-
QPushButton * button = new QPushButton(item->name, parent);
button->setText(item->name);
connect(button, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
@@ -327,36 +325,28 @@ toolbar_selector_cb(gpointer item, gpointer item_data, gpointer user_data)
if ( update_entry->silent )
oldState = comboBox->blockSignals(true);
+ QStandardItemModel * sourceModel = (QStandardItemModel *)comboBox->model();
+
+ if ( update_entry->type != EXT_TOOLBAR_UPDATE_DATA_REMOVE && ! update_entry->user_data )
+ return;
+
if ( update_entry->type == EXT_TOOLBAR_UPDATE_VALUE )
{
QString data = QString((gchar *)update_entry->user_data);
- bool conv_ok = false;
- int dataValue = data.toInt(&conv_ok, 10);
- if ( conv_ok && dataValue >= 0 && comboBox->model()->rowCount() < dataValue )
- comboBox->setCurrentIndex(dataValue);
- else
+ for(int i = 0; i < sourceModel->rowCount(); i++)
{
-#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
- comboBox->setCurrentText(data);
-#else
- for(int i = 0; i < comboBox->model()->rowCount(); i++)
+ QStandardItem * dataValue = ((QStandardItemModel *)sourceModel)->item(i, 0);
+ ext_toolbar_value_t * tbValue = VariantPointer<ext_toolbar_value_t>::asPtr(dataValue->data(Qt::UserRole));
+ if ( tbValue && data.compare(QString(tbValue->value)) == 0 )
{
- QStandardItem * dataValue = ((QStandardItemModel *)comboBox->model())->item(i, 0);
- ext_toolbar_value_t * tbValue = VariantPointer<ext_toolbar_value_t>::asPtr(dataValue->data());
- if ( data.compare(QString(tbValue->display)) )
- {
- comboBox->setCurrentIndex(i);
- break;
- }
+ comboBox->setCurrentIndex(i);
+ break;
}
-#endif
}
}
else if ( update_entry->type == EXT_TOOLBAR_UPDATE_DATA )
{
- QStandardItemModel * sourceModel = (QStandardItemModel *)comboBox->model();
-
GList * walker = (GList *)update_entry->user_data;
if ( g_list_length(walker) == 0 )
return;
@@ -374,24 +364,54 @@ toolbar_selector_cb(gpointer item, gpointer item_data, gpointer user_data)
walker = g_list_next(walker);
}
}
- else if ( update_entry->type == EXT_TOOLBAR_UPDATE_DATABYINDEX )
+ else if ( update_entry->type == EXT_TOOLBAR_UPDATE_DATABYINDEX ||
+ update_entry->type == EXT_TOOLBAR_UPDATE_DATA_ADD ||
+ update_entry->type == EXT_TOOLBAR_UPDATE_DATA_REMOVE )
{
- QStandardItemModel * sourceModel = (QStandardItemModel *)comboBox->model();
-
- if ( ! update_entry->user_data || ! update_entry->data_index )
+ if ( ! update_entry->data_index )
return;
gchar * idx = (gchar *)update_entry->data_index;
gchar * display = (gchar *)update_entry->user_data;
- for ( int i = 0; i < sourceModel->rowCount(); i++ )
+ if ( update_entry->type == EXT_TOOLBAR_UPDATE_DATABYINDEX )
{
- QStandardItem * item = sourceModel->item(i, 0);
- ext_toolbar_value_t * entry = VariantPointer<ext_toolbar_value_t>::asPtr(item->data(Qt::UserRole));
- if ( entry && g_strcmp0( entry->value, idx) == 0 )
+ for ( int i = 0; i < sourceModel->rowCount(); i++ )
{
- item->setText(display);
- break;
+ QStandardItem * item = sourceModel->item(i, 0);
+ ext_toolbar_value_t * entry = VariantPointer<ext_toolbar_value_t>::asPtr(item->data(Qt::UserRole));
+ if ( entry && g_strcmp0( entry->value, idx) == 0 )
+ {
+ g_free(entry->display);
+ entry->display = g_strdup(display);
+ item->setData(VariantPointer<ext_toolbar_value_t>::asQVariant(entry), Qt::UserRole);
+ item->setText(display);
+ break;
+ }
+ }
+ }
+ else if ( update_entry->type == EXT_TOOLBAR_UPDATE_DATA_ADD )
+ {
+ ext_toolbar_value_t * listvalue = g_new0(ext_toolbar_value_t, 1);
+ listvalue->display = g_strdup(display);
+ listvalue->value = g_strdup(idx);
+
+ QStandardItem * si = new QStandardItem(listvalue->display);
+ si->setData(VariantPointer<ext_toolbar_value_t>::asQVariant(listvalue), Qt::UserRole);
+ sourceModel->appendRow(si);
+ }
+ else if ( update_entry->type == EXT_TOOLBAR_UPDATE_DATA_REMOVE )
+ {
+ QList<QStandardItem *> entryList = sourceModel->findItems(display);
+ /* Search for index if display did not find anything */
+ if ( entryList.size() == 0 )
+ entryList = sourceModel->findItems(idx);
+
+ foreach(QStandardItem *entry, entryList)
+ {
+ QModelIndex index = sourceModel->indexFromItem(entry);
+ if ( index.isValid() )
+ sourceModel->removeRow(index.row());
}
}
}