reuse widget table if possible

This commit is contained in:
Tomasz Moń
2009-05-01 16:12:58 +02:00
parent 24a1c2718b
commit ba810bf4f8

26
gui.c
View File

@@ -188,17 +188,24 @@ static void apply_current_preset()
/** /**
* \param settings effect parameters * \param settings effect parameters
* \param amt amount of effect parameters * \param amt amount of effect parameters
* \param widget_table hash table matching settings pointer with created table (may be NULL)
* *
* Creates knobs that allow user to set effect parameters. * Creates knobs that allow user to set effect parameters.
* *
* \return GtkTable containing necessary widgets to set effect parameters. * \return GtkTable containing necessary widgets to set effect parameters.
**/ **/
GtkWidget *create_table(EffectSettings *settings, gint amt) GtkWidget *create_table(EffectSettings *settings, gint amt, GHashTable *widget_table)
{ {
GtkWidget *table, *label, *widget, *knob; GtkWidget *table, *label, *widget, *knob;
GtkObject *adj; GtkObject *adj;
int x; int x;
if (widget_table != NULL) {
table = g_hash_table_lookup(widget_table, settings);
if (table != NULL)
return table;
}
table = gtk_table_new(3, amt, FALSE); table = gtk_table_new(3, amt, FALSE);
for (x = 0; x<amt; x++) { for (x = 0; x<amt; x++) {
@@ -224,6 +231,10 @@ GtkWidget *create_table(EffectSettings *settings, gint amt)
gtk_table_attach(GTK_TABLE(table), widget, 2, 3, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2); gtk_table_attach(GTK_TABLE(table), widget, 2, 3, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
g_signal_connect(G_OBJECT(adj), "value-changed", G_CALLBACK(value_changed_option_cb), &settings[x]); g_signal_connect(G_OBJECT(adj), "value-changed", G_CALLBACK(value_changed_option_cb), &settings[x]);
if (widget_table != NULL) {
g_hash_table_insert(widget_table, settings, table);
}
} }
return table; return table;
@@ -300,6 +311,10 @@ void combo_box_changed_cb(GtkComboBox *widget, gpointer data)
set_option(settings->id, settings->position, settings->type); set_option(settings->id, settings->position, settings->type);
child = g_object_get_data(G_OBJECT(widget), "active_child"); child = g_object_get_data(G_OBJECT(widget), "active_child");
if (child == settings->child) {
return;
}
if (child != NULL) { if (child != NULL) {
gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(gtk_widget_get_parent(vbox))), child); gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(gtk_widget_get_parent(vbox))), child);
} }
@@ -325,6 +340,7 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt)
GtkWidget *vbox; GtkWidget *vbox;
GtkWidget *widget; GtkWidget *widget;
GtkWidget *combo_box = NULL; GtkWidget *combo_box = NULL;
GHashTable *widget_table;
EffectSettingsGroup *settings = NULL; EffectSettingsGroup *settings = NULL;
gchar *name = NULL; gchar *name = NULL;
gint x; gint x;
@@ -332,6 +348,8 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt)
vbox = gtk_vbox_new(FALSE, 0); vbox = gtk_vbox_new(FALSE, 0);
widget_table = g_hash_table_new(g_direct_hash, g_direct_equal);
for (x = 0; x<amt; x++) { for (x = 0; x<amt; x++) {
if (group[x].label) { if (group[x].label) {
if (combo_box == NULL) { if (combo_box == NULL) {
@@ -344,7 +362,7 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt)
cmbox_no++; cmbox_no++;
if ((group[x].settings != NULL) && (group[x].settings > 0)) { if ((group[x].settings != NULL) && (group[x].settings > 0)) {
widget = create_table(group[x].settings, group[x].settings_amt); widget = create_table(group[x].settings, group[x].settings_amt, widget_table);
g_object_ref_sink(widget); g_object_ref_sink(widget);
} else } else
widget = NULL; widget = NULL;
@@ -361,11 +379,13 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt)
g_object_set_data_full(G_OBJECT(combo_box), name, settings, ((GDestroyNotify)effect_settings_group_free)); g_object_set_data_full(G_OBJECT(combo_box), name, settings, ((GDestroyNotify)effect_settings_group_free));
g_free(name); g_free(name);
} else { } else {
widget = create_table(group[x].settings, group[x].settings_amt); widget = create_table(group[x].settings, group[x].settings_amt, widget_table);
gtk_container_add(GTK_CONTAINER(vbox), widget); gtk_container_add(GTK_CONTAINER(vbox), widget);
} }
} }
g_hash_table_destroy(widget_table);
return vbox; return vbox;
} }