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(); } }