From ece5f632e3ee29f467feb52e5beb5650f5479add Mon Sep 17 00:00:00 2001 From: Dan Breslau Date: Wed, 27 Jul 2016 21:30:32 -0400 Subject: [PATCH] Add/Edit cards is now functionally complete (still needs aesthetic cleanup) --- src/moonshot-custom-vbox.vala | 1 - src/moonshot-idcard-widget.vala | 1 - src/moonshot-identity-dialog.vala | 197 ++++++++++++++++++----------- src/moonshot-identity-management-view.vala | 2 +- src/moonshot-logger.vala | 11 ++ 5 files changed, 138 insertions(+), 74 deletions(-) diff --git a/src/moonshot-custom-vbox.vala b/src/moonshot-custom-vbox.vala index 55208f9..e263479 100644 --- a/src/moonshot-custom-vbox.vala +++ b/src/moonshot-custom-vbox.vala @@ -64,7 +64,6 @@ class CustomVBox : VBox { pack_start(id_card_widget, false, false); id_card_widget.position = next_pos++; - logger.trace("add_id_card_widget: Added idcard at position " + id_card_widget.position.to_string()); } public void remove_id_card_widget(IdCardWidget id_card_widget) diff --git a/src/moonshot-idcard-widget.vala b/src/moonshot-idcard-widget.vala index 2e50bdf..e6e69b0 100644 --- a/src/moonshot-idcard-widget.vala +++ b/src/moonshot-idcard-widget.vala @@ -114,7 +114,6 @@ class IdCardWidget : Box color.blue = 65535; } else { - logger.trace("set_idcard_color: position=" + position.to_string()); if (position % 2 == 0) { color.red = color.green = color.blue = 0xf2 << 8; diff --git a/src/moonshot-identity-dialog.vala b/src/moonshot-identity-dialog.vala index 9734c82..55dc3d1 100644 --- a/src/moonshot-identity-dialog.vala +++ b/src/moonshot-identity-dialog.vala @@ -61,7 +61,10 @@ 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(); } } @@ -82,6 +85,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,7 +103,7 @@ 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); @@ -156,25 +164,11 @@ class IdentityDialog : Dialog 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); - - 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); - + if (!is_new_card) + { + var services_vbox = make_services_vbox(); + vbox.pack_start(services_vbox); + } ((Container) content_area).add(vbox); @@ -262,74 +256,135 @@ 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_internal_vbox = new VBox(true, 6); - int i = 0; - var n_rows = id_card.services.length; + 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.set_size_request(0, 60); + services_vscroll.add_with_viewport(services_vbox_alignment); - 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(5); + + var table_button_hbox = new HBox(false, 6); + table_button_hbox.pack_start(services_vscroll, true, true, 6); + table_button_hbox.pack_start(remove_button, false, false, 6); + // services_internal_vbox.pack_start(table_button_hbox, true, false, 0); + services_vbox_alignment.add(services_table); - 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); + + + var selected_color = Gdk.Color(); + selected_color.red = 0xd9 << 8; + selected_color.green = 0xf7 << 8; + selected_color.blue = 65535; + + var unselected_color = Gdk.Color(); + unselected_color.red = 65535; + unselected_color.green = 65535; + unselected_color.blue = 65535; + + int i = 0; + foreach (string service in card.services) + { + var label = new Label(service); + label.set_alignment(0, (float) 0); + + EventBox event_box = new EventBox(); + 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(); + if (selected_item == label) + { + // Deselect + selected_item.modify_bg(state, unselected_color); + selected_item = null; + remove_button.set_sensitive(false); + } + else { - if (id_card != null) { - SList services = new SList(); + if (selected_item != null) + { + // Deselect + selected_item.modify_bg(state, unselected_color); + selected_item = null; + } + + // Select + selected_item = label; + selected_item.modify_bg(state, selected_color); + remove_button.set_sensitive(true); + } + return false; + }); + + services_table.attach_defaults(event_box, 0, 1, i, i+1); + i++; + } + + 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 id_card.services) - { - //if (srv == candidate) //!!TODO: If srv is the service to be removed - // continue; + foreach (string srv in card.services) + { + if (srv != selected_item.label) 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); + 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); + + // parent.identities_manager.update_card(id_card); } + } - }); - services_table.attach_defaults(label, 0, 1, i, i+1); - services_table.attach_defaults(remove_button, 1, 2, i, i+1); - i++; - } + }); - // services_vbox.show_all(); + return services_vbox; } diff --git a/src/moonshot-identity-management-view.vala b/src/moonshot-identity-management-view.vala index 369f455..adbd5de 100644 --- a/src/moonshot-identity-management-view.vala +++ b/src/moonshot-identity-management-view.vala @@ -314,7 +314,7 @@ public class IdentityManagerView : Window { id_card.username = dialog.username; id_card.password = dialog.password; id_card.store_password = dialog.store_password; - id_card.services = {}; + id_card.services = dialog.get_services(); return id_card; } diff --git a/src/moonshot-logger.vala b/src/moonshot-logger.vala index d815210..a559412 100644 --- a/src/moonshot-logger.vala +++ b/src/moonshot-logger.vala @@ -38,6 +38,15 @@ public MoonshotLogger get_logger(string name) { #if USE_LOG4VALA +// To use this, uncomment the line below that calls Log.set_default_handler. (It's often better +// to let Glib log messages be printed on stderr; but this way, they can be synchronized with +// our log messages in a single stream.) +static void glib_default_log_handler(string? log_domain, LogLevelFlags log_level, string message) +{ + Log4Vala.Logger logger = Log4Vala.Logger.get_logger(log_domain ?? "Glib"); + logger.error("Glib error level: " + log_level.to_string() + " : " + message); +} + /** Logger class that wraps the Log4Vala logger */ public class MoonshotLogger : Object { static bool logger_is_initialized = false; @@ -46,6 +55,8 @@ public class MoonshotLogger : Object { public MoonshotLogger(string name) { if (!logger_is_initialized) { + // Log.set_default_handler(glib_default_log_handler); + //!! TODO: Don't hard-code the pathname. Log4Vala.init("/home/dbreslau/log4vala.conf"); logger_is_initialized = true; -- 2.1.4