implementing DND in the layouts list, b.g.o#351936

svn path=/trunk/; revision=7870
This commit is contained in:
Sergey V. Udaltsov 2007-07-23 23:23:42 +00:00
parent 88b4dcb0e3
commit b9f4021a46
2 changed files with 130 additions and 41 deletions

View file

@ -1,3 +1,8 @@
2007-07-23 Sergey Udaltsov <svu@gnome.org>
* gnome-keyboard-properties-xkblt.c: Implementing DND in the selected
layouts list. http://bugzilla.gnome.org/show_bug.cgi?id=351936
2007-07-11 Sergey Udaltsov <svu@gnome.org> 2007-07-11 Sergey Udaltsov <svu@gnome.org>
* gnome-keyboard-properties-xkb.h, gnome-keyboard-properties-xkbpv.c, * gnome-keyboard-properties-xkb.h, gnome-keyboard-properties-xkbpv.c,

View file

@ -59,6 +59,32 @@ clear_xkb_elements_list (GSList * list)
} }
} }
static gint
find_selected_layout_idx (GladeXML * dialog)
{
GtkTreeSelection *selection =
gtk_tree_view_get_selection (GTK_TREE_VIEW
(WID ("xkb_layouts_selected")));
GtkTreeIter selected_iter;
GtkTreeModel *model;
GtkTreePath *path;
gint *indices;
gint rv;
if (!gtk_tree_selection_get_selected
(selection, &model, &selected_iter))
return -1;
path = gtk_tree_model_get_path (model, &selected_iter);
if (path == NULL)
return -1;
indices = gtk_tree_path_get_indices (path);
rv = indices[0];
gtk_tree_path_free (path);
return rv;
}
GSList * GSList *
xkb_layouts_get_selected_list (void) xkb_layouts_get_selected_list (void)
{ {
@ -213,6 +239,62 @@ xkb_layouts_enable_disable_default (GladeXML * dialog, gboolean enable)
gtk_widget_draw (tree_view, NULL); gtk_widget_draw (tree_view, NULL);
} }
static void
xkb_layouts_dnd_data_get (GtkWidget * widget, GdkDragContext * dc,
GtkSelectionData * selection_data, guint info,
guint t, GladeXML * dialog)
{
/* Storing the value into selection -
* while it is actually not used
*/
gint idx = find_selected_layout_idx (dialog);
gtk_selection_data_set (selection_data,
GDK_SELECTION_TYPE_INTEGER, 32,
(guchar *) & idx, sizeof (idx));
}
static void
xkb_layouts_dnd_data_received (GtkWidget * widget, GdkDragContext * dc,
gint x, gint y,
GtkSelectionData * selection_data,
guint info, guint t, GladeXML * dialog)
{
gint sidx = find_selected_layout_idx (dialog);
GtkWidget *tree_view = WID ("xkb_layouts_selected");
GtkTreePath *path = NULL;
GtkTreeViewDropPosition pos;
gint didx;
gchar *id;
GSList *layouts_list = xkb_layouts_get_selected_list ();
GSList *node2Remove = g_slist_nth (layouts_list, sidx);
layouts_list = g_slist_remove_link (layouts_list, node2Remove);
id = (gchar *) node2Remove->data;
g_slist_free_1 (node2Remove);
if (!gtk_tree_view_get_dest_row_at_pos
(GTK_TREE_VIEW (tree_view), x, y, &path, &pos)) {
/* Move to the very end */
layouts_list =
g_slist_append (layouts_list, g_strdup (id));
xkb_layouts_set_selected_list (layouts_list);
} else if (path != NULL) {
gint *indices = gtk_tree_path_get_indices (path);
didx = indices[0];
gtk_tree_path_free (path);
/* Move to the new position */
if (sidx != didx) {
layouts_list =
g_slist_insert (layouts_list, g_strdup (id),
didx);
xkb_layouts_set_selected_list (layouts_list);
}
}
g_free (id);
clear_xkb_elements_list (layouts_list);
}
void void
xkb_layouts_prepare_selected_tree (GladeXML * dialog, xkb_layouts_prepare_selected_tree (GladeXML * dialog,
GConfChangeSet * changeset) GConfChangeSet * changeset)
@ -223,6 +305,8 @@ xkb_layouts_prepare_selected_tree (GladeXML * dialog,
GtkWidget *tree_view = WID ("xkb_layouts_selected"); GtkWidget *tree_view = WID ("xkb_layouts_selected");
GtkTreeViewColumn *desc_column, *def_column; GtkTreeViewColumn *desc_column, *def_column;
GtkTreeSelection *selection; GtkTreeSelection *selection;
GtkTargetEntry self_drag_target =
{ "xkb_layouts_selected", GTK_TARGET_SAME_WIDGET, 0 };
text_renderer = GTK_CELL_RENDERER (gtk_cell_renderer_text_new ()); text_renderer = GTK_CELL_RENDERER (gtk_cell_renderer_text_new ());
toggle_renderer = toggle_renderer =
@ -273,6 +357,20 @@ xkb_layouts_prepare_selected_tree (GladeXML * dialog,
NULL); NULL);
g_signal_connect (G_OBJECT (toggle_renderer), "toggled", g_signal_connect (G_OBJECT (toggle_renderer), "toggled",
G_CALLBACK (def_group_in_ui_changed), dialog); G_CALLBACK (def_group_in_ui_changed), dialog);
/* Setting up DnD */
gtk_drag_source_set (tree_view, GDK_BUTTON1_MASK,
&self_drag_target, 1, GDK_ACTION_MOVE);
gtk_drag_source_set_icon_name (tree_view, "input-keyboard");
gtk_drag_dest_set (tree_view, GTK_DEST_DEFAULT_ALL,
&self_drag_target, 1, GDK_ACTION_MOVE);
gtk_signal_connect (GTK_OBJECT (tree_view), "drag_data_get",
GTK_SIGNAL_FUNC (xkb_layouts_dnd_data_get),
dialog);
gtk_signal_connect (GTK_OBJECT (tree_view), "drag_data_received",
GTK_SIGNAL_FUNC
(xkb_layouts_dnd_data_received), dialog);
} }
void void
@ -358,26 +456,15 @@ add_selected_layout (GtkWidget * button, GladeXML * dialog)
static void static void
move_selected_layout (GladeXML * dialog, int offset) move_selected_layout (GladeXML * dialog, int offset)
{ {
GtkTreeSelection *selection = gint idx = find_selected_layout_idx (dialog);
gtk_tree_view_get_selection (GTK_TREE_VIEW
(WID ("xkb_layouts_selected"))); if (idx != -1) {
GtkTreeIter selected_iter;
GtkTreeModel *model;
if (gtk_tree_selection_get_selected
(selection, &model, &selected_iter)) {
GSList *layouts_list = xkb_layouts_get_selected_list (); GSList *layouts_list = xkb_layouts_get_selected_list ();
GtkTreePath *path = gtk_tree_model_get_path (model,
&selected_iter);
if (path != NULL) {
int *indices = gtk_tree_path_get_indices (path);
int idx = indices[0];
char *id = NULL; char *id = NULL;
GSList *node2Remove = GSList *node2Remove = g_slist_nth (layouts_list, idx);
g_slist_nth (layouts_list, idx);
layouts_list = layouts_list =
g_slist_remove_link (layouts_list, g_slist_remove_link (layouts_list, node2Remove);
node2Remove);
id = (char *) node2Remove->data; id = (char *) node2Remove->data;
g_slist_free_1 (node2Remove); g_slist_free_1 (node2Remove);
@ -385,8 +472,7 @@ move_selected_layout (GladeXML * dialog, int offset)
if (offset == 0) { if (offset == 0) {
g_free (id); g_free (id);
if (default_group > idx) if (default_group > idx)
save_default_group (default_group - save_default_group (default_group - 1);
1);
else if (default_group == idx) else if (default_group == idx)
save_default_group (-1); save_default_group (-1);
} else { } else {
@ -401,8 +487,6 @@ move_selected_layout (GladeXML * dialog, int offset)
} }
xkb_layouts_set_selected_list (layouts_list); xkb_layouts_set_selected_list (layouts_list);
gtk_tree_path_free (path);
}
clear_xkb_elements_list (layouts_list); clear_xkb_elements_list (layouts_list);
} }
} }