implementing DND in the layouts list, b.g.o#351936
svn path=/trunk/; revision=7870
This commit is contained in:
parent
88b4dcb0e3
commit
b9f4021a46
2 changed files with 130 additions and 41 deletions
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue