X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Fmoonshot-identity-management-view.vala;h=c52a0ce7f86db90a3ce4edda62c5adf65b9bc022;hb=da22d2a66bcec6c6965e0b15076683276679178f;hp=40114f35208c022ccda3b92d42ab7f8eda461f8a;hpb=c784f4d5da7f554a2125b5242e36d3e164bc8d33;p=moonshot-ui.git diff --git a/src/moonshot-identity-management-view.vala b/src/moonshot-identity-management-view.vala index 40114f3..c52a0ce 100644 --- a/src/moonshot-identity-management-view.vala +++ b/src/moonshot-identity-management-view.vala @@ -4,6 +4,7 @@ using Gtk; public class IdentityManagerView : Window { private const int WINDOW_WIDTH = 400; private const int WINDOW_HEIGHT = 500; + private const int RIGHT_PANE_WIDTH = 275; protected IdentityManagerApp parent_app; #if OS_MACOS public OSXApplication osxApp; @@ -11,11 +12,16 @@ public class IdentityManagerView : Window { private UIManager ui_manager = new UIManager(); private Entry search_entry; private VBox vbox_right; + private VBox login_vbox; + private VBox services_vbox; private CustomVBox custom_vbox; private VBox services_internal_vbox; private Entry username_entry; private Entry password_entry; + private Label prompting_service; + private Label no_identity_title; + private CheckButton remember_checkbutton; private ListStore* listmodel; private TreeModelFilter filter; @@ -184,6 +190,11 @@ public class IdentityManagerView : Window { } private void load_id_cards () { + string current_idcard_nai = null; + if (this.custom_vbox.current_idcard != null) { + current_idcard_nai = custom_vbox.current_idcard.id_card.nai; + custom_vbox.current_idcard = null; + } var children = this.custom_vbox.get_children (); foreach (var id_card_widget in children) { remove_id_card_widget((IdCardWidget)id_card_widget); @@ -196,21 +207,38 @@ public class IdentityManagerView : Window { foreach (IdCard id_card in card_list) { add_id_card_data (id_card); - add_id_card_widget (id_card); + IdCardWidget id_card_widget = add_id_card_widget (id_card); + if (id_card_widget.id_card.nai == current_idcard_nai) { + fill_details(id_card_widget); + id_card_widget.expand(); + } } + if (custom_vbox.current_idcard == null) + fill_details(null); } - private void fill_details (IdCardWidget id_card_widget) + private void fill_details (IdCardWidget? id_card_widget) { - var id_card = id_card_widget.id_card; - this.username_entry.set_text (id_card.username); - this.password_entry.set_text (id_card.password ?? ""); + var vr_children = this.vbox_right.get_children(); + foreach (var vr_child in vr_children) + this.vbox_right.remove(vr_child); + if (id_card_widget != null) { + var id_card = id_card_widget.id_card; + if (id_card.display_name == IdCard.NO_IDENTITY) { + this.vbox_right.pack_start(no_identity_title, false, true, 0); + } else { + this.username_entry.set_text (id_card.username); + this.password_entry.set_text (id_card.password ?? ""); + this.vbox_right.pack_start(login_vbox, false, true, 0); + this.remember_checkbutton.active = id_card.store_password; + } + this.vbox_right.pack_start (services_vbox, false, true, 0); - var children = this.services_internal_vbox.get_children (); - foreach (var hbox in children) - services_internal_vbox.remove(hbox); - fill_services_vbox (id_card_widget.id_card); -// identities_manager.store_id_cards(); + var children = this.services_internal_vbox.get_children (); + foreach (var hbox in children) + services_internal_vbox.remove(hbox); + fill_services_vbox (id_card_widget.id_card); + } } private void show_details (IdCard id_card) @@ -239,8 +267,8 @@ public class IdentityManagerView : Window { id_card.issuer = "Issuer"; id_card.username = dialog.username; id_card.password = dialog.password; + id_card.store_password = dialog.store_password; id_card.services = {}; - id_card.set_data("pixbuf", find_icon ("avatar-default", 48)); return id_card; } @@ -250,7 +278,7 @@ public class IdentityManagerView : Window { TreeIter iter; Gdk.Pixbuf pixbuf; this.listmodel->append (out iter); - pixbuf = id_card.get_data("pixbuf"); + pixbuf = get_pixbuf(id_card); listmodel->set (iter, Columns.IDCARD_COL, id_card, Columns.LOGO_COL, pixbuf, @@ -281,7 +309,7 @@ public class IdentityManagerView : Window { } } - private void add_id_card_widget (IdCard id_card) + private IdCardWidget add_id_card_widget (IdCard id_card) { var id_card_widget = new IdCardWidget (id_card); this.custom_vbox.add_id_card_widget (id_card_widget); @@ -290,48 +318,10 @@ public class IdentityManagerView : Window { id_card_widget.send_id.connect ((w) => send_identity_cb (w.id_card)); id_card_widget.expanded.connect (this.custom_vbox.receive_expanded_event); id_card_widget.expanded.connect (fill_details); + return id_card_widget; } - /* This method finds a valid display name */ - public bool display_name_is_valid (string name, - out string? candidate) - { - foreach (IdCard id_card in identities_manager.get_card_list()) - { - if (id_card.display_name == name) - { - if (&candidate != null) - { - for (int i=0; i<1000; i++) - { - string tmp = "%s %d".printf (name, i); - if (display_name_is_valid (tmp, null)) - { - candidate = tmp; - break; - } - } - } - return false; - } - } - - return true; - } - - public void insert_id_card (IdCard id_card) - { - string candidate; - - if (!display_name_is_valid (id_card.display_name, out candidate)) - { - id_card.display_name = candidate; - } - - this.identities_manager.add_card(id_card); - } - - public bool add_identity (IdCard id_card) + public bool add_identity (IdCard id_card, bool force_flat_file_store) { #if OS_MACOS /* @@ -353,8 +343,7 @@ public class IdentityManagerView : Window { #endif if (ret == Gtk.ResponseType.YES) { - id_card.set_data ("pixbuf", find_icon ("avatar-default", 48)); - this.insert_id_card (id_card); + this.identities_manager.add_card (id_card, force_flat_file_store); return true; } @@ -368,7 +357,7 @@ public class IdentityManagerView : Window { switch (result) { case ResponseType.OK: - insert_id_card (get_id_card_data (dialog)); + this.identities_manager.add_card (get_id_card_data (dialog), false); break; default: break; @@ -430,6 +419,11 @@ public class IdentityManagerView : Window { dialog.destroy (); } + public void set_prompting_service(string service) + { + prompting_service.set_label( _("Identity requested for service: %s").printf(service) ); + } + public void queue_identity_request(IdentityRequest request) { if (this.request_queue.is_empty()) @@ -437,28 +431,24 @@ public class IdentityManagerView : Window { candidates = request.candidates; filter.refilter(); redraw_id_card_widgets (); + set_prompting_service(request.service); show (); } this.request_queue.push_tail (request); } - public void send_identity_cb (IdCard identity) + public void check_add_password(IdCard identity, IdentityRequest request, IdentityManagerModel model) { - return_if_fail (request_queue.length > 0); - - candidates = null; - var request = this.request_queue.pop_head (); - bool reset_password = false; - - if (identity.password == null) + if ((identity.password == "") && !identity.IsNoIdentity()) { - var dialog = new AddPasswordDialog (); + var dialog = new AddPasswordDialog (identity, request); var result = dialog.run (); switch (result) { case ResponseType.OK: identity.password = dialog.password; - reset_password = ! dialog.remember; + identity.store_password = dialog.remember; + model.update_card(identity); break; default: identity = null; @@ -467,10 +457,19 @@ public class IdentityManagerView : Window { dialog.destroy (); } + } + + public void send_identity_cb (IdCard identity) + { + return_if_fail (request_queue.length > 0); + candidates = null; + var request = this.request_queue.pop_head (); + check_add_password(identity, request, identities_manager); if (this.request_queue.is_empty()) { candidates = null; + prompting_service.set_label(_("")); if (!parent_app.explicitly_launched) { // The following occasionally causes the app to exit without sending the dbus // reply, so for now we just don't exit @@ -479,7 +478,9 @@ public class IdentityManagerView : Window { this.hide(); } } else { - candidates = this.request_queue.peek_head().candidates; + IdentityRequest next = this.request_queue.peek_head(); + candidates = next.candidates; + set_prompting_service(next.service); } filter.refilter(); redraw_id_card_widgets (); @@ -488,10 +489,6 @@ public class IdentityManagerView : Window { parent_app.default_id_card = identity; request.return_identity (identity); - - if (reset_password) - identity.password = null; - } private void label_make_bold (Label label) @@ -535,43 +532,40 @@ public class IdentityManagerView : Window { remove_button.clicked.connect ((remove_button) => { + var candidate = service_button_map.lookup (remove_button); + if (candidate == null) + return; var dialog = new Gtk.MessageDialog (this, Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, _("Are you sure you want to stop '%s' ID Card from being used with %s?"), custom_vbox.current_idcard.id_card.display_name, - _("this service")); + candidate); var ret = dialog.run(); dialog.hide(); if (ret == Gtk.ResponseType.YES) { IdCard idcard = custom_vbox.current_idcard.id_card; - var candidate = service_button_map.lookup (remove_button); - - SList services = new SList(); - - foreach (string srv in idcard.services) - { - if (srv == candidate) - continue; - services.append (srv); - } + if (idcard != null) { + SList services = new SList(); - idcard.services = new string[services.length()]; - for (int j=0; j