void motorway_list_handler(GHashTable *table, int *res, gpointer *data) { if (*res != NO_ASYNC) gdk_threads_enter(); GtkWidget *window = GTK_WIDGET( hildon_window_new() ); gtk_signal_connect(GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (wizard_delete_event), NULL); gtk_window_set_title(GTK_WINDOW(window), "Pick a motorway"); if (table == NULL) { moflow_error_dialog(*res, NULL, GTK_BUTTONS_OK); main_exit(1); } GtkWidget *hbox = gtk_hbox_new(FALSE, 2); GtkWidget *vbox = gtk_vbox_new(FALSE, 2); GtkWidget *selector = hildon_touch_selector_new_text(); GList *sortedList = g_list_sort(g_hash_table_get_keys(table), (GCompareFunc)motorwaycmp); for (GList *li = sortedList; li != NULL; li = g_list_next(li)) { gchar *key = (gchar*)li->data; hildon_touch_selector_append_text(HILDON_TOUCH_SELECTOR(selector), key); } g_list_free(sortedList); gtk_box_pack_start(GTK_BOX(vbox), selector, TRUE, TRUE, 2); GtkWidget *button = hildon_button_new_with_text(HILDON_SIZE_AUTO_WIDTH, HILDON_BUTTON_ARRANGEMENT_VERTICAL, "Go!", NULL); gtk_widget_set_sensitive(button, FALSE); g_signal_connect(G_OBJECT(selector), "changed", G_CALLBACK(selection_changed), button); g_object_set_data(G_OBJECT(button), "motorwayTable", table); g_object_set_data(G_OBJECT(button), "motorwaySelector", selector); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(motorway_select_cb), NULL); gtk_widget_set_size_request(button, -1, 70); gtk_box_pack_end(GTK_BOX(vbox), button, FALSE, FALSE, 2); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 2); GtkWidget *logo = gtk_image_new_from_file("/usr/share/pixmaps/moflow/motorway.png"); gtk_box_pack_end(GTK_BOX(hbox), logo, FALSE, FALSE, 20); gtk_container_add(GTK_CONTAINER(window), hbox); gtk_widget_show_all(window); if (*res != NO_ASYNC) gdk_threads_leave(); }
static GtkWidget* integer_selector_new ( guint min, guint max ) { GtkWidget *button; HildonTouchSelector *selector; guint i; gchar label[3]; button =hildon_picker_button_new ( HILDON_SIZE_FINGER_HEIGHT, HILDON_BUTTON_ARRANGEMENT_HORIZONTAL); selector = HILDON_TOUCH_SELECTOR ( hildon_touch_selector_new_text () ); for ( i=min; i<=max; ++i ){ g_snprintf ( label , 3 , "%d", i ); hildon_touch_selector_append_text ( selector, label ); } hildon_picker_button_set_selector ( HILDON_PICKER_BUTTON(button), selector ); return button; }
/* Shows a dialog asking user to select a preset. If allow_new is TRUE, then * user can specify a new preset. In this case, allow_new will become TRUE if * user selects a new preset, or FALSE if she is selecting an already * existent */ static xmlDoc *dialog_choose_preset(gpointer parent, gboolean *allow_new) { GList *presets; GList *node; GtkWidget *selector; GtkWidget *dialog; xmlDoc *preset; xmlDoc *preset_selected = NULL; gchar *preset_name_selected; gint response; presets = presets_preload_all(); if (!presets && !allow_new) { hildon_banner_show_information(GTK_WIDGET(parent), NULL, "No available presets"); return NULL; } /* Check if user can specify a new preset */ if (allow_new && *allow_new) { selector = hildon_touch_selector_entry_new_text(); } else { selector = hildon_touch_selector_new_text(); } node = presets; while (node) { preset = (xmlDoc *) node->data; hildon_touch_selector_append_text( HILDON_TOUCH_SELECTOR(selector), preset->name); node = g_list_next(node); } dialog = hildon_picker_dialog_new(parent); hildon_picker_dialog_set_selector(HILDON_PICKER_DIALOG(dialog), HILDON_TOUCH_SELECTOR(selector)); response = gtk_dialog_run(GTK_DIALOG(dialog)); if (response != GTK_RESPONSE_DELETE_EVENT) { preset_name_selected = hildon_touch_selector_get_current_text( HILDON_TOUCH_SELECTOR(selector)); } else { preset_name_selected = NULL; } /* NOTE: There is a bug in hildon that prevent using gtk_widget_destroy when a hildon_touch_selector_entry is usedcd, as it segs fault. The bad part is that using hide_all makes a leak. */ if (allow_new && *allow_new) { gtk_widget_hide_all(dialog); } else { gtk_widget_destroy(dialog); } /* Check the selected xmlDoc, freeing remaining */ node = presets; while (node) { preset = (xmlDoc *) node->data; if (preset_name_selected && g_utf8_collate(preset->name, preset_name_selected) == 0) { preset_selected = preset; } else { xmlFreeDoc(preset); } node = g_list_next(node); } g_list_free(presets); if (preset_name_selected) { /* User asks for new presets */ if (allow_new && *allow_new) { if (preset_selected) { *allow_new = FALSE; g_free(preset_name_selected); } else { preset_selected = xmlNewDoc(BAD_CAST "1.0"); preset_selected->name = preset_name_selected; *allow_new = TRUE; } } else { g_free(preset_name_selected); } } return preset_selected; }