/* 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;
}
Пример #2
0
static void
aw_captcha_dialog_init (AwCaptchaDialog *dialog)
{
  GtkWidget    *table, *widget, *content;
  GtkTreeModel *model;

  dialog->priv = G_TYPE_INSTANCE_GET_PRIVATE (dialog, AW_TYPE_CAPTCHA_DIALOG,
                                              AwCaptchaDialogPrivate);

  content = gtk_dialog_get_content_area (GTK_DIALOG (dialog));

  gtk_dialog_add_button (GTK_DIALOG (dialog), _("Submit"), GTK_RESPONSE_OK);

  table = gtk_table_new (2, 2, FALSE);
  gtk_table_set_col_spacings (GTK_TABLE (table), HILDON_MARGIN_DOUBLE);
  gtk_container_add (GTK_CONTAINER (content), table);

  widget = gtk_image_new ();
  gtk_widget_set_size_request (widget, AW_CAPTCHA_WIDTH, AW_CAPTCHA_HEIGHT);
  gtk_table_attach (GTK_TABLE (table), widget, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
  dialog->priv->challenge = widget;

  widget = hildon_entry_new (HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT);
  gtk_entry_set_overwrite_mode (GTK_ENTRY (widget), TRUE);
  gtk_entry_set_max_length (GTK_ENTRY (widget), 5);
  gtk_table_attach (GTK_TABLE (table), widget, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0);
  dialog->priv->response = widget;

  g_signal_connect_swapped (widget, "changed",
                            G_CALLBACK (aw_captcha_dialog_entry_changed_cb),
                            dialog);

  widget = hildon_touch_selector_new_text ();
  gtk_widget_set_size_request (widget, -1, 4 * 70);
  gtk_table_attach_defaults (GTK_TABLE (table), widget, 0, 2, 1, 2);
  dialog->priv->selector = widget;

  model = aw_captcha_dialog_create_model ();

  hildon_touch_selector_append_text_column
    (HILDON_TOUCH_SELECTOR (widget), model, TRUE);
  hildon_touch_selector_append_text_column
    (HILDON_TOUCH_SELECTOR (widget), model, TRUE);
  hildon_touch_selector_append_text_column
    (HILDON_TOUCH_SELECTOR (widget), model, TRUE);
  hildon_touch_selector_append_text_column
    (HILDON_TOUCH_SELECTOR (widget), model, TRUE);
  hildon_touch_selector_append_text_column
    (HILDON_TOUCH_SELECTOR (widget), model, TRUE);

  g_signal_connect_swapped
    (widget, "changed",
     G_CALLBACK (aw_captcha_dialog_selector_changed_cb), dialog);

  g_object_unref (model);

  gtk_widget_show_all (table);
}
/**
 * hildon_touch_selector_entry_new_text:
 *
 * Creates a #HildonTouchSelectorEntry with a single text column that
 * can be populated conveniently through hildon_touch_selector_append_text(),
 * hildon_touch_selector_prepend_text(), hildon_touch_selector_insert_text().
 *
 * Returns: A new #HildonTouchSelectorEntry
 *
 * Since: 2.2
 **/
GtkWidget *
hildon_touch_selector_entry_new_text (void)
{
  GtkListStore *model;
  GtkWidget *selector;
  GtkEntryCompletion *completion;
  HildonTouchSelectorEntryPrivate *priv;
  HildonTouchSelectorColumn *column = NULL;

  selector = hildon_touch_selector_entry_new ();

  priv = HILDON_TOUCH_SELECTOR_ENTRY_GET_PRIVATE (selector);

  model = gtk_list_store_new (1, G_TYPE_STRING);
  completion = gtk_entry_get_completion (GTK_ENTRY (priv->entry));
  gtk_entry_completion_set_model (completion, GTK_TREE_MODEL (model));
  column = hildon_touch_selector_append_text_column (HILDON_TOUCH_SELECTOR (selector),
                                                     GTK_TREE_MODEL (model), FALSE);
  g_object_unref (model);

  g_signal_connect (column, "notify::text-column", G_CALLBACK (_text_column_modified),
                    selector);
  hildon_touch_selector_entry_set_text_column (HILDON_TOUCH_SELECTOR_ENTRY (selector), 0);

  return selector;
}
Пример #4
0
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);
}
/**
 * hildon_touch_selector_entry_set_text_column:
 * @selector: A #HildonTouchSelectorEntry
 * @text_column: A column in model to get the strings from
 *
 * Sets the model column which touch selector box should use to get strings
 * from to be @text_column.
 *
 * Since: 2.2
 **/
void
hildon_touch_selector_entry_set_text_column (HildonTouchSelectorEntry *selector,
                                             gint text_column)
{
  HildonTouchSelectorColumn *column = NULL;

  g_return_if_fail (HILDON_IS_TOUCH_SELECTOR_ENTRY (selector));
  g_return_if_fail (text_column >= -1);

  column = hildon_touch_selector_get_column (HILDON_TOUCH_SELECTOR (selector), 0);

  hildon_touch_selector_column_set_text_column (column, text_column);
}
/**
 * hildon_touch_selector_entry_get_text_column:
 * @selector: A #HildonTouchSelectorEntry
 *
 * Gets the text column that @selector is using as a text column.
 *
 * Returns: the number of the column used as a text column.
 *
 * Since: 2.2
 **/
gint
hildon_touch_selector_entry_get_text_column (HildonTouchSelectorEntry *selector)
{
  HildonTouchSelectorColumn *column = NULL;
  gint text_column = -1;

  g_return_val_if_fail (HILDON_IS_TOUCH_SELECTOR_ENTRY (selector), -1);

  column = hildon_touch_selector_get_column (HILDON_TOUCH_SELECTOR (selector),
                                             0);

  text_column = hildon_touch_selector_column_get_text_column (column);

  return text_column;
}
Пример #7
0
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();
}
Пример #8
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);
}
Пример #9
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;
  
}
static void
hildon_touch_selector_entry_init (HildonTouchSelectorEntry *self)
{
  HildonTouchSelectorEntryPrivate *priv;
  GtkEntryCompletion *completion;
  HildonGtkInputMode input_mode;

  priv = HILDON_TOUCH_SELECTOR_ENTRY_GET_PRIVATE (self);

  priv->converter = g_iconv_open ("ascii//translit", "utf-8");

  priv->entry = hildon_entry_new (HILDON_SIZE_FINGER_HEIGHT);
  gtk_entry_set_activates_default (GTK_ENTRY (priv->entry), TRUE);
  input_mode = hildon_gtk_entry_get_input_mode (GTK_ENTRY (priv->entry));

  /* Disable unsupported input modes. */
  input_mode &= ~HILDON_GTK_INPUT_MODE_MULTILINE;
  input_mode &= ~HILDON_GTK_INPUT_MODE_INVISIBLE;
  input_mode &= ~HILDON_GTK_INPUT_MODE_DICTIONARY;

  hildon_gtk_entry_set_input_mode (GTK_ENTRY (priv->entry), input_mode);

  completion = gtk_entry_completion_new ();
  gtk_entry_completion_set_inline_completion (completion, TRUE);
  gtk_entry_completion_set_popup_completion (completion, FALSE);
  gtk_entry_set_completion (GTK_ENTRY (priv->entry), completion);
  g_object_unref (completion);

  gtk_widget_show (priv->entry);
  g_signal_connect (G_OBJECT (priv->entry), "changed",
                    G_CALLBACK (entry_on_text_changed), self);
  priv->signal_id = g_signal_connect (G_OBJECT (self), "changed",
                                      G_CALLBACK (hildon_touch_selector_entry_changed), NULL);

  hildon_touch_selector_set_print_func (HILDON_TOUCH_SELECTOR (self), hildon_touch_selector_entry_print_func);
  gtk_box_pack_start (GTK_BOX (self), priv->entry, FALSE, FALSE, 0);
}
Пример #11
0
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);
  }
}
Пример #13
0
/* 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;
}
Пример #14
0
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();
    }
}
Пример #15
0
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;
        }
    }
}