add knobs

This commit is contained in:
Tomasz Moń
2009-03-09 18:22:20 +01:00
parent 322c59032e
commit 90df427200
9 changed files with 175 additions and 58 deletions

67
gui.c
View File

@@ -19,10 +19,13 @@
#include "gui.h"
#include "effects.h"
#include "preset.h"
#include "gtkknob.h"
#include "knob.h"
extern EffectList effects[];
extern int n_effects;
static GtkKnobAnim *knob_anim = NULL;
static gboolean allow_send = FALSE;
void show_error_message(GtkWidget *parent, gchar *message)
@@ -39,7 +42,7 @@ void show_error_message(GtkWidget *parent, gchar *message)
}
typedef struct {
GtkWidget *widget;
GtkObject *widget;
gint id;
gint position;
@@ -48,13 +51,28 @@ typedef struct {
gint x; /* combo box item number */
} WidgetListElem;
void value_changed_option_cb(GtkSpinButton *spinbutton, EffectSettings *setting)
void value_changed_option_cb(GtkAdjustment *adj, EffectSettings *setting)
{
g_return_if_fail(setting != NULL);
if (allow_send) {
gint val = gtk_spin_button_get_value_as_int(spinbutton);
set_option(setting->option, setting->position, val);
gdouble val;
g_object_get(G_OBJECT(adj), "value", &val, NULL);
set_option(setting->option, setting->position, (gint)val);
}
if (setting->labels != NULL) {
GtkWidget *label;
gint x;
gdouble val = -1.0;
g_object_get(G_OBJECT(adj), "value", &val, NULL);
x = (gint)val;
if ((x >= setting->min) && (x <= setting->max)) {
label = g_object_get_data(G_OBJECT(adj), "label");
gtk_label_set_text(GTK_LABEL(label), setting->labels[x]);
}
}
}
@@ -68,7 +86,7 @@ void toggled_cb(GtkToggleButton *button, Effect *effect)
}
}
static void widget_list_add(GList **list, GtkWidget *widget, gint id, gint position, gint value, gint x)
static void widget_list_add(GList **list, GtkObject *widget, gint id, gint position, gint value, gint x)
{
WidgetListElem *el;
@@ -88,8 +106,8 @@ static void apply_widget_setting(WidgetListElem *el, SettingParam *param)
if (el->value == -1) {
if (GTK_IS_TOGGLE_BUTTON(el->widget))
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(el->widget), (param->value == 0) ? FALSE : TRUE);
else if (GTK_IS_SPIN_BUTTON(el->widget))
gtk_spin_button_set_value(GTK_SPIN_BUTTON(el->widget), param->value);
else if (GTK_IS_ADJUSTMENT(el->widget))
gtk_adjustment_set_value(GTK_ADJUSTMENT(el->widget), (gdouble)param->value);
} else { /* combo box */
if (el->value == param->value)
gtk_combo_box_set_active(GTK_COMBO_BOX(el->widget), el->x);
@@ -124,20 +142,35 @@ static void apply_current_preset(GList *list)
GtkWidget *create_table(GList **list, EffectSettings *settings, gint amt)
{
GtkWidget *table, *label, *widget;
GtkWidget *table, *label, *widget, *knob;
GtkObject *adj;
int x;
table = gtk_table_new(2, amt, FALSE);
table = gtk_table_new(3, amt, FALSE);
for (x = 0; x<amt; x++) {
label = gtk_label_new(settings[x].label);
adj = gtk_adjustment_new(0.0, settings[x].min, settings[x].max, 1.0, 1.0, 0.0);
widget = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1.0, 0);
g_signal_connect(G_OBJECT(widget), "value-changed", G_CALLBACK(value_changed_option_cb), &settings[x]);
widget_list_add(list, widget, settings[x].option, settings[x].position, -1, -1);
adj = gtk_adjustment_new(0.0, settings[x].min, settings[x].max,
1.0, /* step increment */
MAX((settings[x].max / 100), 5.0), /* page increment */
0.0);
knob = gtk_knob_new(GTK_ADJUSTMENT(adj), knob_anim);
if (settings[x].labels == NULL) {
widget = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1.0, 0);
gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(widget), TRUE);
gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(widget), GTK_UPDATE_IF_VALID);
} else {
widget = gtk_label_new(settings[x].labels[0]);
g_object_set_data(G_OBJECT(adj), "label", widget);
}
widget_list_add(list, adj, settings[x].option, settings[x].position, -1, -1);
gtk_table_attach(GTK_TABLE(table), label, 0, 1, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
gtk_table_attach(GTK_TABLE(table), widget, 1, 2, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
gtk_table_attach(GTK_TABLE(table), knob, 1, 2, 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]);
}
return table;
@@ -148,7 +181,7 @@ GtkWidget *create_on_off_button(GList **list, Effect *effect)
GtkWidget *button = gtk_toggle_button_new_with_label(effect->label);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(toggled_cb), effect);
widget_list_add(list, button, effect->option, effect->position, -1, -1);
widget_list_add(list, GTK_OBJECT(button), effect->option, effect->position, -1, -1);
return button;
}
@@ -229,7 +262,7 @@ GtkWidget *create_widget_container(GList **list, EffectGroup *group, gint amt)
settings->option = group[x].option;
settings->position = group[x].position;
settings->child = widget;
widget_list_add(list, combo_box, group[x].option, group[x].position, group[x].id, x);
widget_list_add(list, GTK_OBJECT(combo_box), group[x].option, group[x].position, group[x].id, x);
name = g_strdup_printf("SettingsGroup%d", cmbox_no);
g_object_set_data_full(G_OBJECT(combo_box), name, settings, ((GDestroyNotify)effect_settings_group_free));
@@ -640,6 +673,8 @@ void create_window()
vbox = gtk_vbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 2);
knob_anim = gtk_knob_animation_new_from_inline(knob_pixbuf);
for (x = 0; x<n_effects; x++) {
if ((x % 3) == 0) {
hbox = gtk_hbox_new(TRUE, 0);