};
static const GtkTargetEntry drag_types_dest[] = {
+ { "text/path-list", 0, DND_DRAG_TYPE_URI_LIST },
{ "text/uri-list", 0, DND_DRAG_TYPE_URI_LIST },
{ "text/contact-id", 0, DND_DRAG_TYPE_CONTACT_ID },
{ "text/plain", 0, DND_DRAG_TYPE_STRING },
};
static const GtkTargetEntry drag_types_dest_file[] = {
+ { "text/path-list", 0, DND_DRAG_TYPE_URI_LIST },
{ "text/uri-list", 0, DND_DRAG_TYPE_URI_LIST },
};
return;
}
+ if (!tp_strdiff (data->old_group, EMPATHY_CONTACT_LIST_STORE_FAVORITE)) {
+ /* Remove contact as favourite */
+ empathy_contact_list_remove_from_favourites (list, contact);
+ /* Don't try to remove it */
+ g_free (data->old_group);
+ data->old_group = NULL;
+ }
+
if (data->new_group) {
empathy_contact_list_add_to_group (list, contact, data->new_group);
}
}
}
+static gboolean
+group_can_be_modified (const gchar *name,
+ gboolean is_fake_group,
+ gboolean adding)
+{
+ /* Real groups can always be modified */
+ if (!is_fake_group)
+ return TRUE;
+
+ /* The favorite fake group can be modified so users can
+ * add/remove favorites using DnD */
+ if (!tp_strdiff (name, EMPATHY_CONTACT_LIST_STORE_FAVORITE))
+ return TRUE;
+
+ /* We can remove contacts from the 'ungrouped' fake group */
+ if (!adding && !tp_strdiff (name, EMPATHY_CONTACT_LIST_STORE_UNGROUPED))
+ return TRUE;
+
+ return FALSE;
+}
+
static gboolean
contact_list_view_contact_drag_received (GtkWidget *view,
GdkDragContext *context,
gchar *new_group = NULL;
gchar *old_group = NULL;
gboolean success = TRUE;
- gboolean is_fake_group;
+ gboolean new_group_is_fake, old_group_is_fake = TRUE;
priv = GET_PRIV (view);
sel_data = (const gchar *) gtk_selection_data_get_data (selection);
new_group = empathy_contact_list_store_get_parent_group (model,
- path, NULL, &is_fake_group);
+ path, NULL, &new_group_is_fake);
- if (is_fake_group &&
- tp_strdiff (new_group, EMPATHY_CONTACT_LIST_STORE_FAVORITE))
- /* Fake groups can't be modified. We allow to drag to the favorite fake
- * group tough so user can mark contact as favorite using DnD */
+ if (!group_can_be_modified (new_group, new_group_is_fake, TRUE))
return FALSE;
/* Get source group information. */
source_path = gtk_tree_row_reference_get_path (priv->drag_row);
if (source_path) {
old_group = empathy_contact_list_store_get_parent_group (
- model, source_path, NULL, NULL);
+ model, source_path, NULL, &old_group_is_fake);
gtk_tree_path_free (source_path);
}
}
+ if (!group_can_be_modified (old_group, old_group_is_fake, FALSE))
+ return FALSE;
+
if (!tp_strdiff (old_group, new_group)) {
g_free (new_group);
g_free (old_group);
if (!is_group)
goto out;
- if (tp_strdiff (name, EMPATHY_CONTACT_LIST_STORE_FAVORITE))
- goto out;
-
- pixbuf = empathy_pixbuf_from_icon_name ("emblem-favorite",
- GTK_ICON_SIZE_MENU);
+ if (!tp_strdiff (name, EMPATHY_CONTACT_LIST_STORE_FAVORITE)) {
+ pixbuf = empathy_pixbuf_from_icon_name ("emblem-favorite",
+ GTK_ICON_SIZE_MENU);
+ }
+ else if (!tp_strdiff (name, EMPATHY_CONTACT_LIST_STORE_PEOPLE_NEARBY)) {
+ pixbuf = empathy_pixbuf_from_icon_name ("im-local-xmpp",
+ GTK_ICON_SIZE_MENU);
+ }
out:
g_object_set (cell,
{
gboolean is_group;
gboolean is_active;
- gboolean show_status;
- gchar *name;
gtk_tree_model_get (model, iter,
EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP, &is_group,
EMPATHY_CONTACT_LIST_STORE_COL_IS_ACTIVE, &is_active,
- EMPATHY_CONTACT_LIST_STORE_COL_STATUS_VISIBLE, &show_status,
- EMPATHY_CONTACT_LIST_STORE_COL_NAME, &name,
-1);
- g_object_set (cell,
- "show-status", show_status,
- "text", name,
- NULL);
- g_free (name);
-
contact_list_view_cell_set_background (view, cell, is_group, is_active);
}
gtk_tree_view_column_add_attribute (col, cell,
"name", EMPATHY_CONTACT_LIST_STORE_COL_NAME);
+ gtk_tree_view_column_add_attribute (col, cell,
+ "text", EMPATHY_CONTACT_LIST_STORE_COL_NAME);
+ gtk_tree_view_column_add_attribute (col, cell,
+ "presence-type", EMPATHY_CONTACT_LIST_STORE_COL_PRESENCE_TYPE);
gtk_tree_view_column_add_attribute (col, cell,
"status", EMPATHY_CONTACT_LIST_STORE_COL_STATUS);
gtk_tree_view_column_add_attribute (col, cell,
"is_group", EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP);
+ gtk_tree_view_column_add_attribute (col, cell,
+ "compact", EMPATHY_CONTACT_LIST_STORE_COL_COMPACT);
/* Audio Call Icon */
cell = empathy_cell_renderer_activatable_new ();