예제 #1
0
파일: wizard.c 프로젝트: ajf8/moflow900
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();
}
예제 #2
0
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;
}