Example #1
0
void motorway_select_cb(GtkWidget *w, gpointer *data)
{
  GHashTable *table = (GHashTable*)g_object_get_data(G_OBJECT(w), "motorwayTable");
  HildonTouchSelector *selector = HILDON_TOUCH_SELECTOR(g_object_get_data(G_OBJECT(w), "motorwaySelector"));
  gchar *selectionText = hildon_touch_selector_get_current_text(selector);
  int *selectionId = g_hash_table_lookup(table, (gpointer*)selectionText);
  
  struct prefs_found_args *args = g_new(struct prefs_found_args, 1);
  moflow_request *req = moflow_init_request();
  req->motorway_id = *selectionId;
  moflow_req_generate_url(req);
  args->table = table;
  args->request = req;
  moflow_get_async(client, req, prefs_found, (gpointer*)args);

  GtkWidget *window = gtk_widget_get_toplevel(w);
  gtk_widget_destroy(window);
}
/* 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;
}