X-Git-Url: https://git.0d.be/?p=empathy.git;a=blobdiff_plain;f=libempathy-gtk%2Fempathy-contact-list-view.c;h=05823435a04727f9b9d42f501b5477156e38a733;hp=c952bb8ae4a4b7395bafb4d35004ab29844b980a;hb=940d0e9778828657a6ffbcadd35a8a84d706ac70;hpb=b8657a61fe72be0da2d91325b0851dd4d7fd533c diff --git a/libempathy-gtk/empathy-contact-list-view.c b/libempathy-gtk/empathy-contact-list-view.c index c952bb8a..05823435 100644 --- a/libempathy-gtk/empathy-contact-list-view.c +++ b/libempathy-gtk/empathy-contact-list-view.c @@ -94,6 +94,7 @@ enum DndDragType { }; 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 }, @@ -101,6 +102,7 @@ static const GtkTargetEntry drag_types_dest[] = { }; 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 }, }; @@ -238,6 +240,21 @@ contact_list_view_drag_got_contact (EmpathyTpContactFactory *factory, data->old_group, data->new_group); list = empathy_contact_list_store_get_list_iface (priv->store); + + if (!tp_strdiff (data->new_group, EMPATHY_CONTACT_LIST_STORE_FAVORITE)) { + /* Mark contact as favourite */ + empathy_contact_list_add_to_favourites (list, contact); + 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); } @@ -246,6 +263,27 @@ contact_list_view_drag_got_contact (EmpathyTpContactFactory *factory, } } +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, @@ -266,23 +304,30 @@ contact_list_view_contact_drag_received (GtkWidget *view, gchar *new_group = NULL; gchar *old_group = NULL; gboolean success = TRUE; + 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); + path, NULL, &new_group_is_fake); + + if (!group_can_be_modified (new_group, new_group_is_fake, TRUE)) + return FALSE; /* Get source group information. */ if (priv->drag_row) { 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); + 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); @@ -816,41 +861,6 @@ contact_list_view_call_activated_cb ( g_object_unref (contact); } -static void -contact_list_view_favourite_toggled_cb ( - EmpathyCellRendererActivatable *cell, - const gchar *path_string, - EmpathyContactListView *view) -{ - EmpathyContactListViewPriv *priv = GET_PRIV (view); - GtkTreeModel *model; - GtkTreeIter iter; - EmpathyContact *contact; - EmpathyContactList *list; - - model = gtk_tree_view_get_model (GTK_TREE_VIEW (view)); - if (!gtk_tree_model_get_iter_from_string (model, &iter, path_string)) - return; - - gtk_tree_model_get (model, &iter, - EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, &contact, - -1); - if (contact == NULL) - return; - - list = empathy_contact_list_store_get_list_iface (priv->store); - - if (empathy_contact_list_contact_is_favourite (list, contact)) { - empathy_contact_list_remove_from_group (list, contact, - EMPATHY_GROUP_FAVOURITES); - } else { - empathy_contact_list_add_to_group (list, contact, - EMPATHY_GROUP_FAVOURITES); - } - - g_object_unref (contact); -} - static void contact_list_view_cell_set_background (EmpathyContactListView *view, GtkCellRenderer *cell, @@ -913,6 +923,46 @@ contact_list_view_pixbuf_cell_data_func (GtkTreeViewColumn *tree_column, contact_list_view_cell_set_background (view, cell, is_group, is_active); } +static void +contact_list_view_group_icon_cell_data_func (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter, + EmpathyContactListView *view) +{ + GdkPixbuf *pixbuf = NULL; + gboolean is_group; + gchar *name; + + gtk_tree_model_get (model, iter, + EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP, &is_group, + EMPATHY_CONTACT_LIST_STORE_COL_NAME, &name, + -1); + + if (!is_group) + goto out; + + 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, + "visible", pixbuf != NULL, + "pixbuf", pixbuf, + NULL); + + if (pixbuf != NULL) + g_object_unref (pixbuf); + + g_free (name); +} + static void contact_list_view_audio_call_cell_data_func ( GtkTreeViewColumn *tree_column, @@ -980,27 +1030,12 @@ contact_list_view_text_cell_data_func (GtkTreeViewColumn *tree_column, { 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); - if (is_group && !g_strcmp0 (name, EMPATHY_GROUP_FAVOURITES)) { - g_free (name); - name = g_strdup (_(EMPATHY_GROUP_FAVOURITES)); - } - - 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); } @@ -1038,39 +1073,6 @@ contact_list_view_expander_cell_data_func (GtkTreeViewColumn *column, contact_list_view_cell_set_background (view, cell, is_group, is_active); } -static void -contact_list_view_favourite_cell_data_func ( - GtkTreeViewColumn *tree_column, - GtkCellRenderer *cell, - GtkTreeModel *model, - GtkTreeIter *iter, - EmpathyContactListView *view) -{ - gboolean is_group; - gboolean is_active; - gboolean is_separator; - gboolean is_favourite; - const gchar *icon_name = NULL; - - 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_IS_SEPARATOR, &is_separator, - EMPATHY_CONTACT_LIST_STORE_COL_IS_FAVOURITE, &is_favourite, - -1); - - if (!is_separator && !is_group) - icon_name = (is_favourite? EMPATHY_IMAGE_FAVOURITE : - EMPATHY_IMAGE_UNFAVOURITE); - - g_object_set (cell, - "visible", (icon_name != NULL), - "icon-name", icon_name, - NULL); - - contact_list_view_cell_set_background (view, cell, is_group, is_active); -} - static void contact_list_view_row_expand_or_collapse_cb (EmpathyContactListView *view, GtkTreeIter *iter, @@ -1174,34 +1176,34 @@ contact_list_view_setup (EmpathyContactListView *view) col = gtk_tree_view_column_new (); - /* Favourite Icon */ - cell = empathy_cell_renderer_activatable_new (); + /* State */ + cell = gtk_cell_renderer_pixbuf_new (); gtk_tree_view_column_pack_start (col, cell, FALSE); gtk_tree_view_column_set_cell_data_func ( col, cell, - (GtkTreeCellDataFunc) contact_list_view_favourite_cell_data_func, + (GtkTreeCellDataFunc) contact_list_view_pixbuf_cell_data_func, view, NULL); g_object_set (cell, + "xpad", 5, + "ypad", 1, "visible", FALSE, NULL); - g_signal_connect (cell, "path-activated", - G_CALLBACK (contact_list_view_favourite_toggled_cb), - view); - - /* State */ + /* Group icon */ cell = gtk_cell_renderer_pixbuf_new (); gtk_tree_view_column_pack_start (col, cell, FALSE); gtk_tree_view_column_set_cell_data_func ( col, cell, - (GtkTreeCellDataFunc) contact_list_view_pixbuf_cell_data_func, + (GtkTreeCellDataFunc) contact_list_view_group_icon_cell_data_func, view, NULL); g_object_set (cell, - "xpad", 5, - "ypad", 1, + "xpad", 0, + "ypad", 0, "visible", FALSE, + "width", 16, + "height", 16, NULL); /* Name */ @@ -1214,10 +1216,16 @@ contact_list_view_setup (EmpathyContactListView *view) 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 (); @@ -1546,7 +1554,8 @@ empathy_contact_list_view_get_flags (EmpathyContactListView *view) } gchar * -empathy_contact_list_view_get_selected_group (EmpathyContactListView *view) +empathy_contact_list_view_get_selected_group (EmpathyContactListView *view, + gboolean *is_fake_group) { EmpathyContactListViewPriv *priv; GtkTreeSelection *selection; @@ -1554,6 +1563,7 @@ empathy_contact_list_view_get_selected_group (EmpathyContactListView *view) GtkTreeModel *model; gboolean is_group; gchar *name; + gboolean fake; g_return_val_if_fail (EMPATHY_IS_CONTACT_LIST_VIEW (view), NULL); @@ -1567,6 +1577,7 @@ empathy_contact_list_view_get_selected_group (EmpathyContactListView *view) gtk_tree_model_get (model, &iter, EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP, &is_group, EMPATHY_CONTACT_LIST_STORE_COL_NAME, &name, + EMPATHY_CONTACT_LIST_STORE_COL_IS_FAKE_GROUP, &fake, -1); if (!is_group) { @@ -1574,6 +1585,9 @@ empathy_contact_list_view_get_selected_group (EmpathyContactListView *view) return NULL; } + if (is_fake_group != NULL) + *is_fake_group = fake; + return name; } @@ -1610,7 +1624,7 @@ contact_list_view_group_remove_activate_cb (GtkMenuItem *menuitem, EmpathyContactListViewPriv *priv = GET_PRIV (view); gchar *group; - group = empathy_contact_list_view_get_selected_group (view); + group = empathy_contact_list_view_get_selected_group (view, NULL); if (group) { gchar *text; GtkWindow *parent; @@ -1638,6 +1652,7 @@ empathy_contact_list_view_get_group_menu (EmpathyContactListView *view) GtkWidget *menu; GtkWidget *item; GtkWidget *image; + gboolean is_fake_group; g_return_val_if_fail (EMPATHY_IS_CONTACT_LIST_VIEW (view), NULL); @@ -1646,8 +1661,9 @@ empathy_contact_list_view_get_group_menu (EmpathyContactListView *view) return NULL; } - group = empathy_contact_list_view_get_selected_group (view); - if (!group) { + group = empathy_contact_list_view_get_selected_group (view, &is_fake_group); + if (!group || is_fake_group) { + /* We can't alter fake groups */ return NULL; }