X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Fmoonshot-identity-dialog.vala;h=0ae737a2d49c3d6e30060f52e353968057e9690b;hb=9e70ca46454122515d5af2daf10d7577732ed9b2;hp=9734c82f86138f00fff28b5051ee648bd157029b;hpb=307d47fb838909d7c5b61b3361fd6696bdf2ca6b;p=moonshot-ui.git diff --git a/src/moonshot-identity-dialog.vala b/src/moonshot-identity-dialog.vala index 9734c82..0ae737a 100644 --- a/src/moonshot-identity-dialog.vala +++ b/src/moonshot-identity-dialog.vala @@ -42,18 +42,32 @@ static const string CANCEL = STOCK_CANCEL; class IdentityDialog : Dialog { + private static Gdk.Color white = make_color(65535, 65535, 65535); + private static Gdk.Color selected_color = make_color(0xd9 << 8, 0xf7 << 8, 65535); + private static Gdk.Color alt_color = make_color(0xf2 << 8, 0xf2 << 8, 0xf2 << 8); + + private static Gdk.Color make_color(uint16 red, uint16 green, uint16 blue) + { + Gdk.Color color = Gdk.Color(); + color.red = red; + color.green = green; + color.blue = blue; + + return color; + } + private static MoonshotLogger logger = get_logger("IdentityDialog"); static const string displayname_labeltext = _("Display Name"); - static const string issuer_labeltext = _("Issuer"); + static const string realm_labeltext = _("Realm"); static const string username_labeltext = _("Username"); static const string password_labeltext = _("Password"); private IdentityManagerView parent; private Entry displayname_entry; private Label displayname_label; - private Entry issuer_entry; - private Label issuer_label; + private Entry realm_entry; + private Label realm_label; private Entry username_entry; private Label username_label; private Entry password_entry; @@ -61,13 +75,16 @@ class IdentityDialog : Dialog private CheckButton remember_checkbutton; private Label message_label; public bool complete; - + private IdCard card; + + private Label selected_item = null; + public string display_name { get { return displayname_entry.get_text(); } } public string issuer { - get { return issuer_entry.get_text(); } + get { return realm_entry.get_text(); } } public string username { @@ -82,6 +99,11 @@ class IdentityDialog : Dialog get { return remember_checkbutton.active; } } + internal string[] get_services() + { + return card.services; + } + public IdentityDialog(IdentityManagerView parent) { this.with_idcard(null, _("Add ID Card"), parent); @@ -95,94 +117,97 @@ class IdentityDialog : Dialog is_new_card = true; } - IdCard card = a_card ?? new IdCard(); + card = a_card ?? new IdCard(); this.set_title(title); this.set_modal(true); this.set_transient_for(parent); this.parent = parent; this.add_buttons(_("OK"), ResponseType.OK, CANCEL, ResponseType.CANCEL); - var content_area = this.get_content_area(); - ((Box) content_area).set_spacing(12); - + Box content_area = (Box) this.get_content_area(); + displayname_label = new Label(@"$displayname_labeltext:"); - displayname_label.set_alignment(1,(float) 0.5); + displayname_label.set_alignment(0, (float) 0.5); displayname_entry = new Entry(); displayname_entry.set_text(card.display_name); + displayname_entry.set_width_chars(40); - issuer_label = new Label(@"$issuer_labeltext:"); - issuer_label.set_alignment(1,(float) 0.5); - this.issuer_entry = new Entry(); - this.issuer_entry.set_text(card.issuer); + realm_label = new Label(@"$realm_labeltext:"); + realm_label.set_alignment(0, (float) 0.5); + realm_entry = new Entry(); + realm_entry.set_text(card.issuer); + realm_entry.set_width_chars(60); username_label = new Label(@"$username_labeltext:"); - username_label.set_alignment(1,(float) 0.5); - this.username_entry = new Entry(); - this.username_entry.set_text(card.username); + username_label.set_alignment(0, (float) 0.5); + username_entry = new Entry(); + username_entry.set_text(card.username); + username_entry.set_width_chars(40); password_label = new Label(@"$password_labeltext:"); - password_label.set_alignment(1,(float) 0.5); - this.password_entry = new Entry(); + password_label.set_alignment(0, (float) 0.5); + password_entry = new Entry(); password_entry.set_invisible_char('*'); password_entry.set_visibility(false); password_entry.set_text(card.password); + password_entry.set_width_chars(40); - this.remember_checkbutton = new CheckButton.with_label(_("Remember password")); - this.message_label = new Label(""); + remember_checkbutton = new CheckButton.with_label(_("Remember password")); + message_label = new Label(""); message_label.set_visible(false); set_atk_relation(displayname_label, displayname_entry, Atk.RelationType.LABEL_FOR); - set_atk_relation(issuer_label, issuer_entry, Atk.RelationType.LABEL_FOR); + set_atk_relation(realm_label, realm_entry, Atk.RelationType.LABEL_FOR); set_atk_relation(username_label, username_entry, Atk.RelationType.LABEL_FOR); set_atk_relation(password_entry, password_entry, Atk.RelationType.LABEL_FOR); - var table = new Table(6, 2, false); - table.set_col_spacings(10); - table.set_row_spacings(10); - - table.attach_defaults(message_label, 0, 2, 0, 1); - table.attach_defaults(displayname_label, 0, 1, 1, 2); - table.attach_defaults(displayname_entry, 1, 2, 1, 2); - table.attach_defaults(issuer_label, 0, 1, 2, 3); - table.attach_defaults(issuer_entry, 1, 2, 2, 3); - table.attach_defaults(username_label, 0, 1, 3, 4); - table.attach_defaults(username_entry, 1, 2, 3, 4); - table.attach_defaults(password_label, 0, 1, 4, 5); - table.attach_defaults(password_entry, 1, 2, 4, 5); - table.attach_defaults(remember_checkbutton, 1, 2, 5, 6); + content_area.pack_start(message_label, false, false, 6); + add_as_vbox(content_area, displayname_label, displayname_entry); + add_as_vbox(content_area, username_label, username_entry); + add_as_vbox(content_area, realm_label, realm_entry); + add_as_vbox(content_area, password_label, password_entry); + + // var entries = new VBox(false, 6); + // add_as_vbox(entries, displayname_label, displayname_entry); + // add_as_vbox(entries, realm_label, realm_entry); + // add_as_vbox(entries, username_label, username_entry); + // add_as_vbox(entries, password_label, password_entry); + // content_area.pack_start(entries, false, false, 0); + + var remember_hbox = new HBox(false, 40); + remember_hbox.pack_start(new HBox(false, 0), false, false, 0); + remember_hbox.pack_start(remember_checkbutton, false, false, 0); + content_area.pack_start(remember_hbox, false, false, 2); + // content_area.pack_start(remember_checkbutton, false, false, 2); this.response.connect(on_response); - var vbox = new VBox(false, 0); - vbox.set_border_width(6); - vbox.pack_start(table, false, false, 0); - - - var services_vbox_title = new Label(_("Services:")); - label_make_bold(services_vbox_title); - services_vbox_title.set_alignment(0, (float) 0.5); - - var services_internal_vbox = new VBox(true, 6); - - var services_vbox_alignment = new Alignment(0, 0, 0, 1); - services_vbox_alignment.set_padding(6, 6, 6, 6); - services_vbox_alignment.add(services_internal_vbox); - var services_vscroll = new ScrolledWindow(null, null); - services_vscroll.set_policy(PolicyType.NEVER, PolicyType.AUTOMATIC); - services_vscroll.set_shadow_type(ShadowType.IN); - services_vscroll.add_with_viewport(services_vbox_alignment); + content_area.set_border_width(6); - var services_vbox = new VBox(false, 6); - services_vbox.pack_start(services_vbox_title, false, false, 0); - services_vbox.pack_start(services_vscroll, true, true, 0); - - - ((Container) content_area).add(vbox); + if (!is_new_card) + { + var services_vbox = make_services_vbox(); + content_area.pack_start(services_vbox); + } this.set_border_width(6); this.set_resizable(false); + this.modify_bg(StateType.NORMAL, white); this.show_all(); } + private static void add_as_vbox(Box content_area, Label label, Entry entry) + { + VBox vbox = new VBox(false, 2); + + vbox.pack_start(label, false, false, 0); + vbox.pack_start(entry, false, false, 0); + + // Hack to prevent the text entries from stretching horizontally + HBox hbox = new HBox(false, 0); + hbox.pack_start(vbox, false, false, 0); + content_area.pack_start(hbox, false, false, 6); + } + private static string update_preamble(string preamble) { if (preamble == "") @@ -217,8 +242,8 @@ class IdentityDialog : Dialog string message = ""; string password_test = store_password ? password : "not required"; check_field(display_name, displayname_label, displayname_labeltext, ref preamble, ref message); - check_field(issuer, issuer_label, issuer_labeltext, ref preamble, ref message); check_field(username, username_label, username_labeltext, ref preamble, ref message); + check_field(issuer, realm_label, realm_labeltext, ref preamble, ref message); check_field(password_test, password_label, password_labeltext, ref preamble, ref message); if (message != "") { message_label.set_visible(true); @@ -262,74 +287,133 @@ class IdentityDialog : Dialog label.modify_font(font_desc); } - private void fill_services_vbox(IdCard id_card, VBox services_internal_vbox) + private VBox make_services_vbox() { - logger.trace("fill_services_vbox"); + logger.trace("make_services_vbox"); - // var children = services_internal_vbox.get_children(); - // foreach (var widget in children) { - // services_internal_vbox.remove(widget); - // } + var services_vbox_alignment = new Alignment(0, 0, 0, 1); + var services_vscroll = new ScrolledWindow(null, null); + services_vscroll.set_policy(PolicyType.NEVER, PolicyType.AUTOMATIC); + services_vscroll.set_shadow_type(ShadowType.IN); + services_vscroll.set_size_request(0, 60); + services_vscroll.add_with_viewport(services_vbox_alignment); - int i = 0; - var n_rows = id_card.services.length; - - var services_table = new Table(n_rows, 2, false); - services_table.set_col_spacings(10); - services_table.set_row_spacings(10); - services_internal_vbox.pack_start(services_table, true, false, 0); - - foreach (string service in id_card.services) - { - var label = new Label(service); - label.set_alignment(0, (float) 0.5); #if VALA_0_12 - var remove_button = new Button.from_stock(Stock.REMOVE); + var remove_button = new Button.from_stock(Stock.REMOVE); #else - var remove_button = new Button.from_stock(STOCK_REMOVE); + var remove_button = new Button.from_stock(STOCK_REMOVE); #endif + remove_button.set_sensitive(false); + + + var services_table = new Table(card.services.length, 1, false); + services_table.set_row_spacings(1); + services_table.set_col_spacings(0); + services_table.modify_bg(StateType.NORMAL, white); + + var table_button_hbox = new HBox(false, 6); + table_button_hbox.pack_start(services_vscroll, true, true, 6); + + // Hack to prevent the button from growing vertically + VBox fixed_height = new VBox(false, 0); + fixed_height.pack_start(remove_button, false, false, 0); + table_button_hbox.pack_start(fixed_height, false, false, 6); + + // A table doesn't have a background color, so put it in an EventBox, and + // set the EventBox's background color instead. + EventBox table_bg = new EventBox(); + table_bg.modify_bg(StateType.NORMAL, white); + table_bg.add(services_table); + services_vbox_alignment.add(table_bg); - remove_button.clicked.connect((remove_button) => + var services_vbox_title = new Label(_("Services:")); + label_make_bold(services_vbox_title); + services_vbox_title.set_alignment(0, (float) 0.5); + + var services_vbox = new VBox(false, 6); + services_vbox.pack_start(services_vbox_title, false, false, 6); + services_vbox.pack_start(table_button_hbox, true, true, 6); + + int i = 0; + foreach (string service in card.services) + { + var label = new Label(service); + label.set_alignment((float) 0, (float) 0); + + EventBox event_box = new EventBox(); + event_box.modify_bg(StateType.NORMAL, white); + event_box.add(label); + event_box.button_press_event.connect(() => { - 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?"), - id_card.display_name, - service); - var ret = dialog.run(); - dialog.hide(); - - if (ret == Gtk.ResponseType.YES) + var state = label.get_state(); + logger.trace("button_press_callback: Label state=" + state.to_string() + " setting bg to " + white.to_string()); + + if (selected_item == label) { - if (id_card != null) { - SList services = new SList(); - - foreach (string srv in id_card.services) - { - //if (srv == candidate) //!!TODO: If srv is the service to be removed - // continue; - services.append(srv); - } - - id_card.services = new string[services.length()]; - for (int j = 0; j < id_card.services.length; j++) - { - id_card.services[j] = services.nth_data(j); - } - - parent.identities_manager.update_card(id_card); + // Deselect + selected_item.parent.modify_bg(state, white); + selected_item = null; + remove_button.set_sensitive(false); + } + else + { + if (selected_item != null) + { + // Deselect + selected_item.parent.modify_bg(state, white); + selected_item = null; } + + // Select + selected_item = label; + selected_item.parent.modify_bg(state, selected_color); + remove_button.set_sensitive(true); } - + return false; }); - services_table.attach_defaults(label, 0, 1, i, i+1); - services_table.attach_defaults(remove_button, 1, 2, i, i+1); + + AttachOptions opts = AttachOptions.EXPAND | AttachOptions.FILL; + services_table.attach(event_box, 0, 1, i, i+1, opts, opts, 3, 0); i++; } - // services_vbox.show_all(); + remove_button.clicked.connect((remove_button) => + { + var dialog = new Gtk.MessageDialog(this, + Gtk.DialogFlags.DESTROY_WITH_PARENT, + Gtk.MessageType.QUESTION, + Gtk.ButtonsType.YES_NO, + _("You are about to remove the service '%s'. Are you sure you want to do this?"), + selected_item.label); + var ret = dialog.run(); + dialog.destroy(); + + if (ret == Gtk.ResponseType.YES) + { + if (card != null) { + SList services = new SList(); + + foreach (string srv in card.services) + { + if (srv != selected_item.label) + services.append(srv); + } + + card.services = new string[services.length()]; + for (int j = 0; j < card.services.length; j++) + { + card.services[j] = services.nth_data(j); + } + + services_table.remove(selected_item.parent); + selected_item = null; + remove_button.set_sensitive(false); + } + } + + }); + + return services_vbox; }