#include <gtk/gtk.h>
#include <glib/gi18n-lib.h>
+#include <folks/folks.h>
+#include <folks/folks-telepathy.h>
+
#include <libempathy/empathy-individual-manager.h>
#include <libempathy/empathy-utils.h>
#include "empathy-linking-dialog.h"
#include "empathy-individual-linker.h"
+#include "empathy-ui-utils.h"
/**
* SECTION:empathy-individual-widget
static GtkWidget *linking_dialog = NULL;
+/* Fairly arbitrary response ID for the "Unlink" button */
+#define RESPONSE_UNLINK 5
+
#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyLinkingDialog)
typedef struct {
EmpathyIndividualLinker *linker; /* child widget */
+ GtkWidget *link_button; /* child widget */
} EmpathyLinkingDialogPriv;
G_DEFINE_TYPE (EmpathyLinkingDialog, empathy_linking_dialog,
GTK_TYPE_DIALOG);
+static void
+linker_notify_has_changed_cb (EmpathyIndividualLinker *linker,
+ GParamSpec *pspec,
+ EmpathyLinkingDialog *self)
+{
+ EmpathyLinkingDialogPriv *priv = GET_PRIV (self);
+
+ /* Only make the "Link" button sensitive if the linked Individual has been
+ * changed. */
+ gtk_widget_set_sensitive (priv->link_button,
+ empathy_individual_linker_get_has_changed (linker));
+}
+
static void
empathy_linking_dialog_class_init (EmpathyLinkingDialogClass *klass)
{
dialog = GTK_DIALOG (self);
/* Set up dialog */
- gtk_dialog_set_has_separator (dialog, FALSE);
gtk_window_set_resizable (GTK_WINDOW (self), TRUE);
/* Translators: this is the title of the linking dialogue (reached by
* right-clicking on a contact and selecting "Link…"). "Link" in this title
gtk_window_set_title (GTK_WINDOW (self), _("Link Contacts"));
gtk_widget_set_size_request (GTK_WIDGET (self), 600, 500);
+ /* Unlink button */
+ button = gtk_button_new_with_mnemonic (
+ C_("Unlink individual (button)", "_Unlink…"));
+ gtk_widget_set_tooltip_text (button, _("Completely split the displayed "
+ "linked contacts into the separate contacts."));
+ gtk_dialog_add_action_widget (dialog, button, RESPONSE_UNLINK);
+ gtk_widget_show (button);
+
/* Cancel button */
button = gtk_button_new_with_label (GTK_STOCK_CANCEL);
gtk_button_set_use_stock (GTK_BUTTON (button), TRUE);
/* Translators: this is an action button in the linking dialogue. "Link" is
* used here as a verb meaning "to connect two contacts to form a
* meta-contact". */
- button = gtk_button_new_with_mnemonic (_("_Link"));
- gtk_dialog_add_action_widget (dialog, button, GTK_RESPONSE_OK);
- gtk_widget_show (button);
+ priv->link_button = gtk_button_new_with_mnemonic (_("_Link"));
+ gtk_dialog_add_action_widget (dialog, priv->link_button, GTK_RESPONSE_OK);
+ gtk_widget_show (priv->link_button);
/* Linker widget */
priv->linker =
EMPATHY_INDIVIDUAL_LINKER (empathy_individual_linker_new (NULL));
+ g_signal_connect (priv->linker, "notify::has-changed",
+ (GCallback) linker_notify_has_changed_cb, self);
+
gtk_container_set_border_width (GTK_CONTAINER (priv->linker), 8);
content_area = GTK_BOX (gtk_dialog_get_content_area (dialog));
gtk_box_pack_start (content_area, GTK_WIDGET (priv->linker), TRUE, TRUE, 0);
{
EmpathyLinkingDialogPriv *priv = GET_PRIV (self);
- if (response == GTK_RESPONSE_OK) {
- EmpathyIndividualManager *manager;
- GList *personas;
+ if (response == GTK_RESPONSE_OK)
+ {
+ EmpathyIndividualManager *manager;
+ GeeSet *personas;
- manager = empathy_individual_manager_dup_singleton ();
+ manager = empathy_individual_manager_dup_singleton ();
- personas = empathy_individual_linker_get_linked_personas (priv->linker);
- empathy_individual_manager_link_personas (manager, personas);
+ personas = empathy_individual_linker_get_linked_personas (priv->linker);
+ empathy_individual_manager_link_personas (manager, personas);
- g_object_unref (manager);
- }
+ g_object_unref (manager);
+ }
+ else if (response == RESPONSE_UNLINK)
+ {
+ EmpathyIndividualManager *manager;
+ FolksIndividual *individual;
+ GtkWidget *dialog;
+
+ individual =
+ empathy_individual_linker_get_start_individual (priv->linker);
+
+ /* Show a confirmation dialogue first */
+ dialog = gtk_message_dialog_new (GTK_WINDOW (self), GTK_DIALOG_MODAL,
+ GTK_MESSAGE_WARNING, GTK_BUTTONS_NONE,
+ _("Unlink linked contacts '%s'?"),
+ folks_alias_details_get_alias (FOLKS_ALIAS_DETAILS (individual)));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ _("Are you sure you want to unlink these linked contacts? This will "
+ "completely split the linked contacts into separate contacts."));
+ gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ C_("Unlink individual (button)", "_Unlink"), GTK_RESPONSE_OK,
+ NULL);
+
+ if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK)
+ {
+ gtk_widget_destroy (dialog);
+ return;
+ }
+
+ gtk_widget_destroy (dialog);
+
+ manager = empathy_individual_manager_dup_singleton ();
+ empathy_individual_manager_unlink_individual (manager, individual);
+ g_object_unref (manager);
+ }
linking_dialog = NULL;
gtk_widget_destroy (GTK_WIDGET (self));
GtkWindow *parent)
{
EmpathyLinkingDialogPriv *priv;
+ GeeSet *personas;
+ GeeIterator *iter;
+ guint num_personas = 0;
/* Create the dialogue if it doesn't exist */
if (linking_dialog == NULL)
empathy_individual_linker_set_start_individual (priv->linker, individual);
+ /* Count how many Telepathy personas we have, to see whether we can
+ * unlink */
+ personas = folks_individual_get_personas (individual);
+ iter = gee_iterable_iterator (GEE_ITERABLE (personas));
+ while (gee_iterator_next (iter))
+ {
+ FolksPersona *persona = gee_iterator_get (iter);
+ if (empathy_folks_persona_is_interesting (persona))
+ num_personas++;
+
+ g_clear_object (&persona);
+ }
+ g_clear_object (&iter);
+
+ /* Only make the "Unlink" button sensitive if we have enough personas */
+ gtk_dialog_set_response_sensitive (GTK_DIALOG (linking_dialog),
+ RESPONSE_UNLINK, (num_personas > 1) ? TRUE : FALSE);
+
gtk_window_present (GTK_WINDOW (linking_dialog));
return linking_dialog;
}
+
+EmpathyIndividualLinker *
+empathy_linking_dialog_get_individual_linker (EmpathyLinkingDialog *self)
+{
+ g_return_val_if_fail (EMPATHY_IS_LINKING_DIALOG (self), NULL);
+
+ return GET_PRIV (self)->linker;
+}