static void aw_captcha_dialog_selector_changed_cb (AwCaptchaDialog *dialog) { HildonTouchSelector *selector; GtkTreeModel *model; GtkTreeIter iter; GString *text; char *number; int i; if (dialog->priv->changing) return; selector = HILDON_TOUCH_SELECTOR (dialog->priv->selector); model = hildon_touch_selector_get_model (selector, 1); text = g_string_new (NULL); dialog->priv->changing = TRUE; for (i = 1; i <= 5; ++i) { if (hildon_touch_selector_get_selected (selector, i, &iter)) { gtk_tree_model_get (model, &iter, 0, &number, -1); g_string_append (text, number); g_free (number); } else g_string_append (text, "0"); } aw_captcha_dialog_set_response (dialog, text->str); dialog->priv->changing = FALSE; g_string_free (text, TRUE); }
/* FIXME: This is actually a very ugly way to retrieve the text. Ideally, we would have API to retrieve it from the base clase (HildonTouchSelector). In the meantime, leaving it here. */ static gchar * hildon_touch_selector_entry_get_text_from_model (HildonTouchSelectorEntry * selector) { GtkTreeModel *model; GtkTreeIter iter; GtkTreePath *path; GList *selected_rows; gchar *text; gint text_column = -1; model = hildon_touch_selector_get_model (HILDON_TOUCH_SELECTOR (selector), 0); text_column = hildon_touch_selector_entry_get_text_column (selector); selected_rows = hildon_touch_selector_get_selected_rows (HILDON_TOUCH_SELECTOR (selector), 0); if (text_column == -1 || selected_rows == NULL) { return NULL; } /* We are in single selection mode */ g_assert (selected_rows->next == NULL); path = (GtkTreePath *)selected_rows->data; gtk_tree_model_get_iter (model, &iter, path); gtk_tree_model_get (model, &iter, text_column, &text, -1); gtk_tree_path_free (path); g_list_free (selected_rows); return text; }
static gchar * hildon_touch_selector_entry_print_func (HildonTouchSelector * selector, gpointer user_data) { HildonTouchSelectorEntryPrivate *priv; GtkTreeModel *model; GtkTreeIter iter; gint column; gchar *text = NULL; priv = HILDON_TOUCH_SELECTOR_ENTRY_GET_PRIVATE (selector); if (*(gtk_entry_get_text (GTK_ENTRY (priv->entry))) != '\0') { text = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->entry))); } else { model = hildon_touch_selector_get_model (selector, 0); if (hildon_touch_selector_get_selected (selector, 0, &iter)) { column = hildon_touch_selector_entry_get_text_column (HILDON_TOUCH_SELECTOR_ENTRY (selector)); gtk_tree_model_get (model, &iter, column, &text, -1); } } return text; }
static void aw_captcha_dialog_entry_changed_cb (AwCaptchaDialog *dialog) { HildonTouchSelector *selector; GtkTreeModel *model; GtkTreeIter iter; const char *text; int i; if (dialog->priv->changing) return; selector = HILDON_TOUCH_SELECTOR (dialog->priv->selector); model = hildon_touch_selector_get_model (selector, 1); dialog->priv->changing = TRUE; text = aw_captcha_dialog_get_response (dialog); for (i = 1; i <= 5 && *text; ++i, ++text) { int value; if (*text >= '0' && *text <= '9') value = *text - '0'; else if (*text >= 'A' && *text <= 'F') value = *text - 'A' + 10; else if (*text >= 'a' && *text <= 'f') value = *text - 'a' + 10; else value = -1; if (value >= 0 && gtk_tree_model_iter_nth_child (model, &iter, NULL, value)) hildon_touch_selector_select_iter (selector, i, &iter, TRUE); } dialog->priv->changing = FALSE; }
static void entry_on_text_changed (GtkEditable * editable, gpointer userdata) { HildonTouchSelector *selector; HildonTouchSelectorEntryPrivate *priv; GtkTreeModel *model; GtkTreeIter iter; GtkTreeIter iter_suggested; GtkEntry *entry; const gchar *prefix; gchar *text; gboolean found = FALSE; gint text_column = -1; gchar *ascii_prefix; gint prefix_len; gboolean found_suggestion = FALSE; entry = GTK_ENTRY (editable); selector = HILDON_TOUCH_SELECTOR (userdata); priv = HILDON_TOUCH_SELECTOR_ENTRY_GET_PRIVATE (selector); text_column = hildon_touch_selector_entry_get_text_column (HILDON_TOUCH_SELECTOR_ENTRY (selector)); prefix = gtk_entry_get_text (entry); if (prefix[0] == '\0') { return; } model = hildon_touch_selector_get_model (selector, 0); if (!gtk_tree_model_get_iter_first (model, &iter)) { return; } if (priv->smart_match) { ascii_prefix = g_convert_with_iconv (prefix, -1, priv->converter, NULL, NULL, NULL); prefix_len = strlen (ascii_prefix); } do { gtk_tree_model_get (model, &iter, text_column, &text, -1); found = g_str_has_prefix (text, prefix); if (!found && !found_suggestion && priv->smart_match) { gchar *ascii_text = g_convert_with_iconv (text, -1, priv->converter, NULL, NULL, NULL); found_suggestion = !g_ascii_strncasecmp (ascii_text, ascii_prefix, prefix_len); if (found_suggestion) { iter_suggested = iter; } g_free (ascii_text); } g_free (text); } while (found != TRUE && gtk_tree_model_iter_next (model, &iter)); g_signal_handler_block (selector, priv->signal_id); { /* We emit the HildonTouchSelector::changed signal because a change in the GtkEntry represents a change in current selection, and therefore, users should be notified. */ if (found) { hildon_touch_selector_select_iter (selector, 0, &iter, TRUE); } else if (found_suggestion) { hildon_touch_selector_select_iter (selector, 0, &iter_suggested, TRUE); } g_signal_emit_by_name (selector, "changed", 0); } g_signal_handler_unblock (selector, priv->signal_id); if (priv->smart_match) { g_free (ascii_prefix); } }
void DictMngr::CreateDictMngrDialog() { GtkWidget *dialog, *selector; GtkCellRenderer *renderer; HildonTouchSelectorColumn *column; GtkTreeModel *tree_model; GtkTreeIter iter; gboolean iter_valid = TRUE; std::list < std::string > all_dict_list; std::list < std::string > selected_dict_list; GtkListStore *dict_list = NULL; const gint RESPONSE_REORDER = 1; gint response; dict_list = gtk_list_store_new(N_DICT_INFO_COLUMNS, G_TYPE_STRING, /* bookname */ G_TYPE_STRING); /* filename */ /* create dialog */ dialog = gtk_dialog_new(); gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); gtk_window_set_title(GTK_WINDOW(dialog), _("Dictionaries")); gtk_dialog_add_button(GTK_DIALOG(dialog), _("Reorder"), RESPONSE_REORDER); gtk_dialog_add_button(GTK_DIALOG(dialog), "OK", GTK_RESPONSE_ACCEPT); gtk_window_set_default_size(GTK_WINDOW(dialog), -1, 400); /* dictionary selector */ selector = hildon_touch_selector_new(); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), selector); renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "xpad", 10, "ellipsize", PANGO_ELLIPSIZE_END, "ellipsize-set", TRUE, NULL); column = hildon_touch_selector_append_column(HILDON_TOUCH_SELECTOR (selector), GTK_TREE_MODEL(dict_list), renderer, "text", BOOKNAME_DICT_INFO_COLUMN, NULL); hildon_touch_selector_column_set_text_column(column, 0); /* fill list with all available dictionaries */ GetAllDictionaryList(all_dict_list); for (std::list < std::string >::iterator i = all_dict_list.begin(); i != all_dict_list.end(); ++i) { DictInfo dictinfo; dictinfo.load_from_ifo_file(i->c_str(), 0); gtk_list_store_append(dict_list, &iter); gtk_list_store_set(dict_list, &iter, BOOKNAME_DICT_INFO_COLUMN, dictinfo.bookname.c_str(), FILENAME_DICT_INFO_COLUMN, i->c_str(), -1); } g_object_unref(dict_list); /* set selector mode to multiple */ hildon_touch_selector_set_column_selection_mode(HILDON_TOUCH_SELECTOR (selector), HILDON_TOUCH_SELECTOR_SELECTION_MODE_MULTIPLE); hildon_touch_selector_unselect_all(HILDON_TOUCH_SELECTOR(selector), BOOKNAME_DICT_INFO_COLUMN); /* select all load dictionaries */ tree_model = hildon_touch_selector_get_model(HILDON_TOUCH_SELECTOR(selector), BOOKNAME_DICT_INFO_COLUMN); for (iter_valid = gtk_tree_model_get_iter_first(tree_model, &iter); iter_valid; iter_valid = gtk_tree_model_iter_next(tree_model, &iter)) { const gchar *bookname; gtk_tree_model_get(tree_model, &iter, BOOKNAME_DICT_INFO_COLUMN, &bookname, -1); for (size_t iLib = 0; iLib < oStarDict->oLibs->query_dictmask.size(); iLib++) { if (!strcmp(oStarDict->oLibs->dict_name(iLib).c_str(), bookname)) { hildon_touch_selector_select_iter(HILDON_TOUCH_SELECTOR (selector), BOOKNAME_DICT_INFO_COLUMN, &iter, FALSE); break; } } } /* show dialog */ gtk_widget_show_all(GTK_WIDGET(dialog)); /* run the dialog */ response = gtk_dialog_run(GTK_DIALOG(dialog)); if (response == GTK_RESPONSE_ACCEPT || response == RESPONSE_REORDER) { GList *selected_dicts = NULL; selected_dicts = hildon_touch_selector_get_selected_rows(HILDON_TOUCH_SELECTOR (selector), BOOKNAME_DICT_INFO_COLUMN); if (selected_dicts) { GList *dict = selected_dicts; const gchar *filename; while (dict) { gtk_tree_model_get_iter(GTK_TREE_MODEL(tree_model), &iter, (GtkTreePath *) (dict->data)); gtk_tree_model_get(GTK_TREE_MODEL(tree_model), &iter, FILENAME_DICT_INFO_COLUMN, &filename, -1); selected_dict_list.push_back(std::string(filename)); dict = dict->next; } g_list_foreach(selected_dicts, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected_dicts); } if (oStarDict->oConf->SetStringList("/apps/maemo/mstardict/dict_list", selected_dict_list)) { /* reload dictionaries */ ReLoadDictionaries(selected_dict_list); } } gtk_widget_destroy(GTK_WIDGET(dialog)); if (response == RESPONSE_REORDER) { CreateReorderDialog(); } }
void DictMngr::CreateReorderDialog() { GtkWidget *dialog, *selector; GtkCellRenderer *renderer; HildonTouchSelectorColumn *column; GtkTreeModel *tree_model; GtkTreeIter iter, iter2; GtkTreePath *path; gboolean iter_valid = TRUE; std::list < std::string > selected_dict_list; GtkListStore *dict_list = NULL; const gint RESPONSE_FIRST = 1; const gint RESPONSE_UP = 2; const gint RESPONSE_DOWN = 3; const gint RESPONSE_LAST = 4; gint response; dict_list = gtk_list_store_new(N_DICT_INFO_COLUMNS, G_TYPE_STRING, /* bookname */ G_TYPE_STRING); /* filename */ /* create dialog */ dialog = gtk_dialog_new(); gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); gtk_window_set_title(GTK_WINDOW(dialog), _("Reorder")); gtk_dialog_add_button(GTK_DIALOG(dialog), _("First"), RESPONSE_FIRST); gtk_dialog_add_button(GTK_DIALOG(dialog), _("Up"), RESPONSE_UP); gtk_dialog_add_button(GTK_DIALOG(dialog), _("Down"), RESPONSE_DOWN); gtk_dialog_add_button(GTK_DIALOG(dialog), _("Last"), RESPONSE_LAST); gtk_dialog_add_button(GTK_DIALOG(dialog), "OK", GTK_RESPONSE_ACCEPT); gtk_window_set_default_size(GTK_WINDOW(dialog), -1, 400); /* dictionary selector */ selector = hildon_touch_selector_new(); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), selector); renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "xpad", 10, "ellipsize", PANGO_ELLIPSIZE_END, "ellipsize-set", TRUE, NULL); column = hildon_touch_selector_append_column(HILDON_TOUCH_SELECTOR (selector), GTK_TREE_MODEL(dict_list), renderer, "text", BOOKNAME_DICT_INFO_COLUMN, NULL); hildon_touch_selector_column_set_text_column(column, 0); /* fill list with selected dictionaries */ oStarDict->oConf->GetStringList("/apps/maemo/mstardict/dict_list", selected_dict_list); for (std::list < std::string >::iterator i = selected_dict_list.begin(); i != selected_dict_list.end(); ++i) { DictInfo dictinfo; dictinfo.load_from_ifo_file(i->c_str(), 0); gtk_list_store_append(dict_list, &iter); gtk_list_store_set(dict_list, &iter, BOOKNAME_DICT_INFO_COLUMN, dictinfo.bookname.c_str(), FILENAME_DICT_INFO_COLUMN, i->c_str(), -1); } g_object_unref(dict_list); /* show dialog */ gtk_widget_show_all(GTK_WIDGET(dialog)); /* run the dialog */ while (TRUE) { response = gtk_dialog_run(GTK_DIALOG(dialog)); switch(response) { case RESPONSE_FIRST: tree_model = hildon_touch_selector_get_model(HILDON_TOUCH_SELECTOR(selector), BOOKNAME_DICT_INFO_COLUMN); if (hildon_touch_selector_get_selected(HILDON_TOUCH_SELECTOR(selector), BOOKNAME_DICT_INFO_COLUMN, &iter)) { gtk_list_store_move_after(GTK_LIST_STORE(tree_model), &iter, NULL); hildon_touch_selector_center_on_selected(HILDON_TOUCH_SELECTOR(selector)); } break; case RESPONSE_UP: tree_model = hildon_touch_selector_get_model(HILDON_TOUCH_SELECTOR(selector), BOOKNAME_DICT_INFO_COLUMN); if (hildon_touch_selector_get_selected(HILDON_TOUCH_SELECTOR(selector), BOOKNAME_DICT_INFO_COLUMN, &iter)) { path = gtk_tree_model_get_path(tree_model, &iter); gtk_tree_path_prev(path); if (gtk_tree_model_get_iter(tree_model, &iter2, path)) { gtk_list_store_swap(GTK_LIST_STORE(tree_model), &iter, &iter2); } gtk_tree_path_free(path); hildon_touch_selector_center_on_selected(HILDON_TOUCH_SELECTOR(selector)); } break; case RESPONSE_DOWN: tree_model = hildon_touch_selector_get_model(HILDON_TOUCH_SELECTOR(selector), BOOKNAME_DICT_INFO_COLUMN); if (hildon_touch_selector_get_selected(HILDON_TOUCH_SELECTOR(selector), BOOKNAME_DICT_INFO_COLUMN, &iter)) { path = gtk_tree_model_get_path(tree_model, &iter); gtk_tree_path_next(path); if (gtk_tree_model_get_iter(tree_model, &iter2, path)) { gtk_list_store_swap(GTK_LIST_STORE(tree_model), &iter, &iter2); } gtk_tree_path_free(path); hildon_touch_selector_center_on_selected(HILDON_TOUCH_SELECTOR(selector)); } break; case RESPONSE_LAST: tree_model = hildon_touch_selector_get_model(HILDON_TOUCH_SELECTOR(selector), BOOKNAME_DICT_INFO_COLUMN); if (hildon_touch_selector_get_selected(HILDON_TOUCH_SELECTOR(selector), BOOKNAME_DICT_INFO_COLUMN, &iter)) { gtk_list_store_move_before(GTK_LIST_STORE(tree_model), &iter, NULL); hildon_touch_selector_center_on_selected(HILDON_TOUCH_SELECTOR(selector)); } break; case GTK_RESPONSE_ACCEPT: tree_model = hildon_touch_selector_get_model(HILDON_TOUCH_SELECTOR(selector), BOOKNAME_DICT_INFO_COLUMN); iter_valid = gtk_tree_model_get_iter_first(tree_model, &iter); selected_dict_list.clear(); while (iter_valid) { const gchar *filename; gtk_tree_model_get(GTK_TREE_MODEL(tree_model), &iter, FILENAME_DICT_INFO_COLUMN, &filename, -1); selected_dict_list.push_back(std::string(filename)); iter_valid = gtk_tree_model_iter_next(tree_model, &iter); } if (oStarDict->oConf->SetStringList("/apps/maemo/mstardict/dict_list", selected_dict_list)) { /* reload dictionaries */ ReLoadDictionaries(selected_dict_list); } gtk_widget_destroy(GTK_WIDGET(dialog)); return; default: gtk_widget_destroy(GTK_WIDGET(dialog)); return; } } }