/* -*- Mode: vala; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 8 -*- */ /* * Copyright (C) 2011 Alexander Larsson * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ using Gtk; using Folks; public class Contacts.LinkedAccountsDialog : Dialog { Contact contact; ListBox linked_accounts_view; public bool any_unlinked; public LinkedAccountsDialog (Contact contact) { Object (use_header_bar: 1); this.contact = contact; any_unlinked = false; var headerbar = get_header_bar () as Gtk.HeaderBar; headerbar.set_title (_("%s").printf (contact.display_name)); headerbar.set_subtitle (_("Linked Accounts")); set_transient_for (App.app.window); set_modal (true); set_default_size (600, 400); var grid = new Grid (); grid.set_orientation (Orientation.VERTICAL); grid.set_row_spacing (12); grid.set_border_width (8); var scrolled = new Gtk.ScrolledWindow (null, null); scrolled.set_policy (PolicyType.NEVER, PolicyType.AUTOMATIC); scrolled.set_hexpand (true); scrolled.set_vexpand (true); scrolled.set_shadow_type (ShadowType.IN); linked_accounts_view = new ListBox (); linked_accounts_view.set_selection_mode (SelectionMode.NONE); linked_accounts_view.set_header_func (add_separator); scrolled.add (linked_accounts_view); grid.add (scrolled); var label = new Label (_("You can link contacts by selecting them from the contacts list")); label.set_halign (Align.CENTER); grid.add (label); grid.show_all (); (get_content_area () as Container).add (grid); /* loading personas for display */ var personas = contact.get_personas_for_display (); /* Cause personas are sorted properly I can do this */ bool is_first = true; foreach (var p in personas) { if (is_first) { is_first = false; continue; } var row_grid = new Grid (); var image_frame = new ContactFrame (Contact.SMALL_AVATAR_SIZE); image_frame.set_hexpand (false); image_frame.margin = 6; image_frame.margin_end = 12; contact.keep_widget_uptodate (image_frame, (w) => { (w as ContactFrame).set_image (contact.individual, contact); }); row_grid.attach (image_frame, 0, 0, 1, 2); var display_name = new Label (""); display_name.set_halign (Align.START); display_name.set_valign (Align.END); display_name.set_hexpand (true); display_name.set_markup (Markup.printf_escaped ("%s", p.display_id)); row_grid.attach (display_name, 1, 0, 1, 1); var store_name = new Label (Contact.format_persona_store_name_for_contact (p)); store_name.set_halign (Align.START); store_name.set_valign (Align.START); store_name.set_hexpand (true); store_name.get_style_context ().add_class ("dim-label"); row_grid.attach (store_name, 1, 1, 1, 1); var button = new Button.with_label (_("Unlink")); button.margin_end = 6; button.set_valign (Align.CENTER); button.get_child ().margin = 1; row_grid.attach (button, 2, 0, 1, 2); /* signal */ button.clicked.connect (() => { unlink_persona.begin (contact, p, (obj, result) => { unlink_persona.end (result); row_grid.destroy (); any_unlinked = true; /* TODO: Support undo */ /* TODO: Ensure we don't get suggestion for this linkage again */ }); }); row_grid.show_all (); linked_accounts_view.add (row_grid); } } }