lua: dialog with prefilled values

new_dialog() lua api gets extended to enable that dialog fields can be
prefilled by lua scripts instead of always starting empty.
This commit is contained in:
Developer Alexander 2021-06-27 13:05:52 +02:00 committed by Wireshark GitLab Utility
parent 054868cb0e
commit 69fb2a17e4
4 changed files with 80 additions and 33 deletions

View File

@ -60,10 +60,11 @@ typedef struct _funnel_ops_t {
void (*add_button)(funnel_text_window_t* win, funnel_bt_t* cb, const char* label);
void (*new_dialog)(const gchar* title,
const gchar** fieldnames,
funnel_dlg_cb_t dlg_cb,
void* data,
funnel_dlg_cb_data_free_t dlg_cb_data_free);
const gchar** field_names,
const gchar** field_values,
funnel_dlg_cb_t dlg_cb,
void* data,
funnel_dlg_cb_data_free_t dlg_cb_data_free);
void (*close_dialogs)(void);

View File

@ -246,12 +246,14 @@ WSLUA_FUNCTION wslua_new_dialog(lua_State* L) { /*
*/
#define WSLUA_ARG_new_dialog_TITLE 1 /* The title of the dialog. */
#define WSLUA_ARG_new_dialog_ACTION 2 /* Action to be performed when the user presses btn:[OK]. */
/* WSLUA_MOREARGS new_dialog Strings to be used a labels of the dialog's fields. Each string creates a new labeled field. The first field is required. */
/* WSLUA_MOREARGS new_dialog Strings to be used a labels of the dialog's fields. Each string creates a new labeled field. The first field is required.
Instead of a strings it is possible to provide tables with fields 'name' and 'value' of type string. Then the created dialog's field will labeld with the content of name and prefilled with the content of value.*/
const gchar* title;
int top = lua_gettop(L);
int i;
GPtrArray* labels;
GPtrArray* field_names;
GPtrArray* field_values;
struct _dlg_cb_data* dcbd;
if (! ops) {
@ -286,26 +288,63 @@ WSLUA_FUNCTION wslua_new_dialog(lua_State* L) { /*
dcbd->func_ref = luaL_ref(L, LUA_REGISTRYINDEX);
lua_remove(L,1);
labels = g_ptr_array_new_with_free_func(g_free);
field_names = g_ptr_array_new_with_free_func(g_free);
field_values = g_ptr_array_new_with_free_func(g_free);
top -= 2;
for (i = 1; i <= top; i++) {
if (! lua_isstring(L,i)) {
g_ptr_array_free(labels,TRUE);
g_free (dcbd);
WSLUA_ERROR(new_dialog,"All fields must be strings");
for (i = 1; i <= top; i++)
{
if (lua_isstring(L, i))
{
gchar* field_name = g_strdup(luaL_checkstring(L, i));
gchar* field_value = g_strdup("");
g_ptr_array_add(field_names, (gpointer)field_name);
g_ptr_array_add(field_values, (gpointer)field_value);
}
else if (lua_istable(L, i))
{
lua_getfield(L, i, "name");
lua_getfield(L, i, "value");
if (!lua_isstring(L, -2))
{
lua_pop(L, 2);
g_ptr_array_free(field_names, TRUE);
g_ptr_array_free(field_values, TRUE);
g_free(dcbd);
WSLUA_ERROR(new_dialog, "All fields must be strings or a table with a string field 'name'.");
return 0;
}
gchar* field_name = g_strdup(luaL_checkstring(L, -2));
gchar* field_value = lua_isstring(L, -1) ?
g_strdup(luaL_checkstring(L, -1)) :
g_strdup("");
g_ptr_array_add(field_names, (gpointer)field_name);
g_ptr_array_add(field_values, (gpointer)field_value);
lua_pop(L, 2);
}
else
{
g_ptr_array_free(field_names, TRUE);
g_ptr_array_free(field_values, TRUE);
g_free(dcbd);
WSLUA_ERROR(new_dialog, "All fields must be strings or a table with a string field 'name'.");
return 0;
}
g_ptr_array_add(labels,(gpointer)g_strdup(luaL_checkstring(L,i)));
}
g_ptr_array_add(labels,NULL);
g_ptr_array_add(field_names, NULL);
g_ptr_array_add(field_values, NULL);
ops->new_dialog(title, (const gchar**)(labels->pdata), lua_dialog_cb, dcbd, g_free);
ops->new_dialog(title, (const gchar**)(field_names->pdata), (const gchar**)(field_values->pdata), lua_dialog_cb, dcbd, g_free);
g_ptr_array_free(labels,TRUE);
g_ptr_array_free(field_names, TRUE);
g_ptr_array_free(field_values, TRUE);
WSLUA_RETURN(0);
}

View File

@ -20,8 +20,7 @@
static FunnelStringDialogHelper dialogHelper;
const int min_edit_width_ = 20; // em widths
FunnelStringDialog::FunnelStringDialog(const QString title, const QStringList field_name_list, funnel_dlg_cb_t dialog_cb, void *dialog_cb_data,
funnel_dlg_cb_data_free_t dialog_data_free_cb) :
FunnelStringDialog::FunnelStringDialog(const QString title, const QList<QPair<QString, QString>> field_list, funnel_dlg_cb_t dialog_cb, void* dialog_cb_data, funnel_dlg_cb_data_free_t dialog_data_free_cb) :
QDialog(NULL),
ui(new Ui::FunnelStringDialog),
dialog_cb_(dialog_cb),
@ -33,10 +32,12 @@ FunnelStringDialog::FunnelStringDialog(const QString title, const QStringList fi
int one_em = fontMetrics().height();
int row = 0;
foreach (QString field_name, field_name_list) {
QLabel *field_label = new QLabel(field_name, this);
QPair<QString, QString> field;
foreach(field, field_list) {
QLabel* field_label = new QLabel(field.first, this);
ui->stringGridLayout->addWidget(field_label, row, 0);
QLineEdit *field_edit = new QLineEdit(this);
QLineEdit* field_edit = new QLineEdit(this);
field_edit->setText(field.second);
field_edit->setMinimumWidth(one_em * min_edit_width_);
field_edits_ << field_edit;
ui->stringGridLayout->addWidget(field_edit, row, 1);
@ -84,9 +85,9 @@ void FunnelStringDialog::on_buttonBox_accepted()
dialog_cb_(user_input, dialog_cb_data_);
}
void FunnelStringDialog::stringDialogNew(const QString title, const QStringList field_name_list, funnel_dlg_cb_t dialog_cb, void *dialog_cb_data, funnel_dlg_cb_data_free_t dialog_cb_data_free)
void FunnelStringDialog::stringDialogNew(const QString title, QList<QPair<QString, QString>> field_list, funnel_dlg_cb_t dialog_cb, void* dialog_cb_data, funnel_dlg_cb_data_free_t dialog_cb_data_free)
{
FunnelStringDialog *fsd = new FunnelStringDialog(title, field_name_list, dialog_cb, dialog_cb_data, dialog_cb_data_free);
FunnelStringDialog* fsd = new FunnelStringDialog(title, field_list, dialog_cb, dialog_cb_data, dialog_cb_data_free);
connect(&dialogHelper, SIGNAL(closeDialogs()), fsd, SLOT(close()));
fsd->show();
}
@ -96,13 +97,19 @@ void FunnelStringDialogHelper::emitCloseDialogs()
emit closeDialogs();
}
void string_dialog_new(const gchar *title, const gchar **fieldnames, funnel_dlg_cb_t dialog_cb, void *dialog_cb_data, funnel_dlg_cb_data_free_t dialog_cb_data_free)
void string_dialog_new(const gchar* title, const gchar** field_names, const gchar** field_values, funnel_dlg_cb_t dialog_cb, void* dialog_cb_data, funnel_dlg_cb_data_free_t dialog_cb_data_free)
{
QStringList field_name_list;
for (int i = 0; fieldnames[i]; i++) {
field_name_list << fieldnames[i];
QList<QPair<QString, QString>> field_list;
for (int i = 0; field_names[i]; i++) {
QPair<QString, QString> field = QPair<QString, QString>(QString(field_names[i]), QString(""));
if (field_values != NULL && field_values[i])
{
field.second = QString(field_values[i]);
}
field_list << field;
}
FunnelStringDialog::stringDialogNew(title, field_name_list, dialog_cb, dialog_cb_data, dialog_cb_data_free);
FunnelStringDialog::stringDialogNew(title, field_list, dialog_cb, dialog_cb_data, dialog_cb_data_free);
}
void string_dialogs_close(void)

View File

@ -28,11 +28,11 @@ class FunnelStringDialog : public QDialog
Q_OBJECT
public:
explicit FunnelStringDialog(const QString title, const QStringList field_name_list, funnel_dlg_cb_t dialog_cb, void *dialog_cb_data, funnel_dlg_cb_data_free_t dialog_cb_data_free);
explicit FunnelStringDialog(const QString title, const QList<QPair<QString, QString>> field_list, funnel_dlg_cb_t dialog_cb, void* dialog_cb_data, funnel_dlg_cb_data_free_t dialog_data_free_cb);
~FunnelStringDialog();
// Funnel ops
static void stringDialogNew(const QString title, const QStringList field_name_list, funnel_dlg_cb_t dialog_cb, void* dialog_cb_data, funnel_dlg_cb_data_free_t dialog_cb_data_free);
static void stringDialogNew(const QString title, const QList<QPair<QString, QString>> field_list, funnel_dlg_cb_t dialog_cb, void* dialog_cb_data, funnel_dlg_cb_data_free_t dialog_cb_data_free);
void accept();
void reject();
@ -60,8 +60,8 @@ signals:
};
extern "C" {
void string_dialog_new(const gchar* title, const gchar** fieldnames, funnel_dlg_cb_t dialog_cb, void* dialog_cb_data, funnel_dlg_cb_data_free_t dialog_cb_data_free);
void string_dialogs_close(void);
void string_dialog_new(const gchar* title, const gchar** field_names, const gchar** field_values, funnel_dlg_cb_t dialog_cb, void* dialog_cb_data, funnel_dlg_cb_data_free_t dialog_cb_data_free);
void string_dialogs_close(void);
}
#endif // FUNNEL_STRING_DIALOG_H