--- trunk/src/misc.c 2009/12/14 20:07:54 243 +++ trunk/src/misc.c 2009/12/15 19:54:04 244 @@ -2161,4 +2161,97 @@ #endif } +static int number_editor_get(GtkWidget *widget) { + GtkWidget *entry = g_object_get_data(G_OBJECT(widget), "entry"); + g_assert(entry); + const char *str = gtk_entry_get_text(GTK_ENTRY(entry)); + if(!str) return 0; + return atoi(str); +} + +static void number_editor_set(GtkWidget *widget, int num) { + int min = (int)g_object_get_data(G_OBJECT(widget), "min"); + int max = (int)g_object_get_data(G_OBJECT(widget), "max"); + + if(num < min) num = min; + if(num > max) num = max; + + GtkWidget *btn_inc = + (GtkWidget*)g_object_get_data(G_OBJECT(widget), "btn_inc"); + gtk_widget_set_sensitive(btn_inc, num < max); + + GtkWidget *btn_dec = + (GtkWidget*)g_object_get_data(G_OBJECT(widget), "btn_dec"); + gtk_widget_set_sensitive(btn_dec, num > min); + + GtkWidget *entry = g_object_get_data(G_OBJECT(widget), "entry"); + g_assert(entry); + char *str = g_strdup_printf("%d", num); + gtk_entry_set_text(GTK_ENTRY(entry), str); + g_free(str); +} + +static void on_number_decrease(GtkWidget *widget, gpointer data) { + number_editor_set(GTK_WIDGET(data), + number_editor_get(GTK_WIDGET(data)) - 1); +} +static void on_number_increase(GtkWidget *widget, gpointer data) { + number_editor_set(GTK_WIDGET(data), + number_editor_get(GTK_WIDGET(data)) + 1); +} + +static void on_number_changed(GtkWidget *widget, gpointer data) { + number_editor_set(GTK_WIDGET(data), + number_editor_get(GTK_WIDGET(data))); +} + +GtkWidget *number_editor_new(int current, int min, int max) { +#ifndef USE_MAEMO + GtkObject *adj = gtk_adjustment_new(current, min, max, 1, 10, 10); + return gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0); +#elif MAEMO_VERSION_MAJOR < 5 + GtkWidget *widget = hildon_number_editor_new(min, max); + hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(widget), current); + return widget; +#else + GtkWidget *hbox = gtk_hbox_new(FALSE, 0); + g_object_set_data(G_OBJECT(hbox), "min", (gpointer)min); + g_object_set_data(G_OBJECT(hbox), "max", (gpointer)max); + + GtkWidget *btn_dec = button_new_with_label(" - "); + g_object_set_data(G_OBJECT(hbox), "btn_dec", btn_dec); + gtk_signal_connect(GTK_OBJECT(btn_dec), "clicked", + (GtkSignalFunc)on_number_decrease, hbox); + gtk_box_pack_start(GTK_BOX(hbox), btn_dec, FALSE, FALSE, 0); + + GtkWidget *entry = hildon_entry_new(HILDON_SIZE_AUTO); + g_object_set_data(G_OBJECT(hbox), "entry", entry); + g_signal_connect(G_OBJECT(entry), "changed", + G_CALLBACK(on_number_changed), hbox); + gtk_entry_set_width_chars(GTK_ENTRY(entry), 2); + hildon_gtk_entry_set_input_mode(GTK_ENTRY(entry), + HILDON_GTK_INPUT_MODE_NUMERIC); + gtk_box_pack_start_defaults(GTK_BOX(hbox), entry); + + GtkWidget *btn_inc = button_new_with_label(" + "); + g_object_set_data(G_OBJECT(hbox), "btn_inc", btn_inc); + gtk_signal_connect(GTK_OBJECT(btn_inc), "clicked", + (GtkSignalFunc)on_number_increase, hbox); + gtk_box_pack_start(GTK_BOX(hbox), btn_inc, FALSE, FALSE, 0); + + number_editor_set(hbox, current); + + return hbox; +#endif +} + +int number_editor_get_value(GtkWidget *widget) { +#ifndef USE_MAEMO + return gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)); +#elif MAEMO_VERSION_MAJOR < 5 + return hildon_number_editor_get_value(HILDON_NUMBER_EDITOR(widget)); +#else + return number_editor_get(widget); +#endif +}