From 8944029128e3d0f9e32b61e00e880d92fceabb31 Mon Sep 17 00:00:00 2001 From: fiaxh Date: Tue, 5 Sep 2017 23:53:18 +0200 Subject: Move encryption menu into ChatInput, PGP support for MUCs --- main/src/ui/application.vala | 4 +- main/src/ui/chat_input/encryption_button.vala | 74 +++++++++++++++++++ main/src/ui/chat_input/view.vala | 5 ++ .../conversation_item_skeleton.vala | 2 +- .../ui/conversation_summary/conversation_view.vala | 2 +- .../ui/conversation_titlebar/encryption_entry.vala | 86 ---------------------- main/src/ui/conversation_titlebar/view.vala | 2 +- main/src/ui/notifications.vala | 1 + main/src/ui/unified_window.vala | 1 + 9 files changed, 86 insertions(+), 91 deletions(-) create mode 100644 main/src/ui/chat_input/encryption_button.vala delete mode 100644 main/src/ui/conversation_titlebar/encryption_entry.vala (limited to 'main/src') diff --git a/main/src/ui/application.vala b/main/src/ui/application.vala index 708c63b0..65bb8743 100644 --- a/main/src/ui/application.vala +++ b/main/src/ui/application.vala @@ -21,8 +21,8 @@ public class Dino.Ui.Application : Gtk.Application, Dino.Application { Window.set_default_icon_name("dino"); CssProvider provider = new CssProvider(); - provider.load_from_resource("/im/dino/pre_theme.css"); - StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), provider, STYLE_PROVIDER_PRIORITY_THEME - 1); + provider.load_from_resource("/im/dino/theme.css"); + StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), provider, STYLE_PROVIDER_PRIORITY_APPLICATION); activate.connect(() => { if (window == null) { diff --git a/main/src/ui/chat_input/encryption_button.vala b/main/src/ui/chat_input/encryption_button.vala new file mode 100644 index 00000000..6ae3e8af --- /dev/null +++ b/main/src/ui/chat_input/encryption_button.vala @@ -0,0 +1,74 @@ +using Gtk; +using Gee; + +using Dino.Entities; + +namespace Dino.Ui { + +public class EncryptionButton : MenuButton { + + private Conversation? conversation; + private RadioButton? button_unencrypted; + private Map encryption_radios = new HashMap(); + + public EncryptionButton() { + relief = ReliefStyle.NONE; + use_popover = true; + image = new Image.from_icon_name("changes-allow-symbolic", IconSize.BUTTON); + get_style_context().add_class("flat"); + + Builder builder = new Builder.from_resource("/im/dino/menu_encryption.ui"); + popover = builder.get_object("menu_encryption") as PopoverMenu; + Box encryption_box = builder.get_object("encryption_box") as Box; + button_unencrypted = builder.get_object("button_unencrypted") as RadioButton; + button_unencrypted.toggled.connect(encryption_changed); + + Application app = GLib.Application.get_default() as Application; + foreach (var e in app.plugin_registry.encryption_list_entries) { + RadioButton btn = new RadioButton.with_label(button_unencrypted.get_group(), e.name); + encryption_radios[btn] = e; + btn.toggled.connect(encryption_changed); + btn.visible = true; + encryption_box.pack_end(btn, false); + } + clicked.connect(update_encryption_menu_state); + } + + private void encryption_changed() { + foreach (RadioButton e in encryption_radios.keys) { + if (e.get_active()) { + conversation.encryption = encryption_radios[e].encryption; + update_encryption_menu_icon(); + return; + } + } + conversation.encryption = Encryption.NONE; + update_encryption_menu_icon(); + } + + private void update_encryption_menu_state() { + foreach (RadioButton e in encryption_radios.keys) { + e.set_sensitive(encryption_radios[e].can_encrypt(conversation)); + if (conversation.encryption == encryption_radios[e].encryption) e.set_active(true); + } + if (conversation.encryption == Encryption.NONE) { + button_unencrypted.set_active(true); + } + } + + private void update_encryption_menu_icon() { + if (conversation.encryption == Encryption.NONE) { + set_image(new Image.from_icon_name("changes-allow-symbolic", IconSize.BUTTON)); + } else { + set_image(new Image.from_icon_name("changes-prevent-symbolic", IconSize.BUTTON)); + } + } + + public new void set_conversation(Conversation conversation) { + this.conversation = conversation; + update_encryption_menu_state(); + update_encryption_menu_icon(); + } +} + +} diff --git a/main/src/ui/chat_input/view.vala b/main/src/ui/chat_input/view.vala index 06e59e54..ef749505 100644 --- a/main/src/ui/chat_input/view.vala +++ b/main/src/ui/chat_input/view.vala @@ -12,6 +12,7 @@ public class View : Box { [GtkChild] private ScrolledWindow scrolled; [GtkChild] private TextView text_input; + [GtkChild] private Box box; public string text { owned get { return text_input.buffer.text; } @@ -25,6 +26,7 @@ public class View : Box { private OccupantsTabCompletor occupants_tab_completor; private SmileyConverter smiley_converter; private EditHistory edit_history; + private EncryptionButton encryption_widget = new EncryptionButton() { yalign=0, visible=true }; public View(StreamInteractor stream_interactor) { this.stream_interactor = stream_interactor; @@ -32,6 +34,8 @@ public class View : Box { smiley_converter = new SmileyConverter(stream_interactor, text_input); edit_history = new EditHistory(text_input, GLib.Application.get_default()); + box.add(encryption_widget); + encryption_widget.get_style_context().add_class("dino-chatinput-button"); scrolled.get_vscrollbar().get_preferred_height(out vscrollbar_min_height, null); scrolled.vadjustment.notify["upper"].connect_after(on_upper_notify); text_input.key_press_event.connect(on_text_input_key_press); @@ -41,6 +45,7 @@ public class View : Box { public void initialize_for_conversation(Conversation conversation) { occupants_tab_completor.initialize_for_conversation(conversation); edit_history.initialize_for_conversation(conversation); + encryption_widget.set_conversation(conversation); if (this.conversation != null) entry_cache[this.conversation] = text_input.buffer.text; this.conversation = conversation; diff --git a/main/src/ui/conversation_summary/conversation_item_skeleton.vala b/main/src/ui/conversation_summary/conversation_item_skeleton.vala index 1eb76840..03114227 100644 --- a/main/src/ui/conversation_summary/conversation_item_skeleton.vala +++ b/main/src/ui/conversation_summary/conversation_item_skeleton.vala @@ -39,7 +39,7 @@ public class ConversationItemSkeleton : Grid { } else { set_title_widget(widget); } - item.notify["mark"].connect_after(update_received); + item.notify["mark"].connect_after(() => { Idle.add(() => { update_received(); return false; }); }); update_received(); } diff --git a/main/src/ui/conversation_summary/conversation_view.vala b/main/src/ui/conversation_summary/conversation_view.vala index 3f5a85b6..dcd24652 100644 --- a/main/src/ui/conversation_summary/conversation_view.vala +++ b/main/src/ui/conversation_summary/conversation_view.vala @@ -98,7 +98,7 @@ public class ConversationView : Box, Plugins.ConversationItemCollection { item.display_time.difference(lower_start_item.display_time) < TimeSpan.MINUTE && lower_start_item.jid.equals(item.jid) && lower_start_item.encryption == item.encryption && - item.mark != Message.Marked.WONTSEND) { + (item.mark == Message.Marked.WONTSEND) == (lower_start_item.mark == Message.Marked.WONTSEND)) { lower_skeleton.add_meta_item(item); force_alloc_width(lower_skeleton, main.get_allocated_width()); item_item_skeletons[item] = lower_skeleton; diff --git a/main/src/ui/conversation_titlebar/encryption_entry.vala b/main/src/ui/conversation_titlebar/encryption_entry.vala deleted file mode 100644 index 16cc5fdd..00000000 --- a/main/src/ui/conversation_titlebar/encryption_entry.vala +++ /dev/null @@ -1,86 +0,0 @@ -using Gtk; -using Gee; - -using Dino.Entities; - -namespace Dino.Ui { - -class EncryptionEntry : Plugins.ConversationTitlebarEntry, Object { - public string id { get { return "encryption"; } } - - public double order { get { return 2; } } - public Plugins.ConversationTitlebarWidget get_widget(Plugins.WidgetType type) { - if (type == Plugins.WidgetType.GTK) { - return new EncryptionWidget() { visible=true }; - } - return null; - } -} - -class EncryptionWidget : MenuButton, Plugins.ConversationTitlebarWidget { - - private Conversation? conversation; - private RadioButton? button_unencrypted; - private Map encryption_radios = new HashMap(); - - public EncryptionWidget() { - Builder builder = new Builder.from_resource("/im/dino/menu_encryption.ui"); - PopoverMenu menu = builder.get_object("menu_encryption") as PopoverMenu; - Box encryption_box = builder.get_object("encryption_box") as Box; - button_unencrypted = builder.get_object("button_unencrypted") as RadioButton; - button_unencrypted.toggled.connect(encryption_changed); - Application app = GLib.Application.get_default() as Application; - foreach(var e in app.plugin_registry.encryption_list_entries) { - RadioButton btn = new RadioButton.with_label(button_unencrypted.get_group(), e.name); - encryption_radios[btn] = e; - btn.toggled.connect(encryption_changed); - btn.visible = true; - encryption_box.pack_end(btn, false); - } - clicked.connect(update_encryption_menu_state); - set_use_popover(true); - set_popover(menu); - set_image(new Image.from_icon_name("changes-allow-symbolic", IconSize.BUTTON)); - } - - private void encryption_changed() { - foreach (RadioButton e in encryption_radios.keys) { - if (e.get_active()) { - conversation.encryption = encryption_radios[e].encryption; - update_encryption_menu_icon(); - return; - } - } - conversation.encryption = Encryption.NONE; - update_encryption_menu_icon(); - } - - private void update_encryption_menu_state() { - foreach (RadioButton e in encryption_radios.keys) { - e.set_sensitive(encryption_radios[e].can_encrypt(conversation)); - if (conversation.encryption == encryption_radios[e].encryption) e.set_active(true); - } - if (conversation.encryption == Encryption.NONE) { - button_unencrypted.set_active(true); - } - } - - private void update_encryption_menu_icon() { - visible = (conversation.type_ == Conversation.Type.CHAT); - if (conversation.type_ == Conversation.Type.CHAT) { - if (conversation.encryption == Encryption.NONE) { - set_image(new Image.from_icon_name("changes-allow-symbolic", IconSize.BUTTON)); - } else { - set_image(new Image.from_icon_name("changes-prevent-symbolic", IconSize.BUTTON)); - } - } - } - - public new void set_conversation(Conversation conversation) { - this.conversation = conversation; - update_encryption_menu_state(); - update_encryption_menu_icon(); - } -} - -} diff --git a/main/src/ui/conversation_titlebar/view.vala b/main/src/ui/conversation_titlebar/view.vala index 9949f4fc..32d829fb 100644 --- a/main/src/ui/conversation_titlebar/view.vala +++ b/main/src/ui/conversation_titlebar/view.vala @@ -22,7 +22,6 @@ public class ConversationTitlebar : Gtk.HeaderBar { Application app = GLib.Application.get_default() as Application; app.plugin_registry.register_contact_titlebar_entry(new MenuEntry(stream_interactor)); - app.plugin_registry.register_contact_titlebar_entry(new EncryptionEntry()); app.plugin_registry.register_contact_titlebar_entry(new OccupantsEntry(stream_interactor, window)); foreach(var e in app.plugin_registry.conversation_titlebar_entries) { @@ -33,6 +32,7 @@ public class ConversationTitlebar : Gtk.HeaderBar { } } + stream_interactor.get_module(MucManager.IDENTITY).subject_set.connect((account, jid, subject) => { Idle.add(() => { if (conversation != null && conversation.counterpart.equals_bare(jid) && conversation.account.equals(account)) { diff --git a/main/src/ui/notifications.vala b/main/src/ui/notifications.vala index 02f0b1de..470f9d6d 100644 --- a/main/src/ui/notifications.vala +++ b/main/src/ui/notifications.vala @@ -63,6 +63,7 @@ public class Notifications : Object { try { notifications[conversation].show(); } catch (Error error) { } + window.urgency_hint = true; } } diff --git a/main/src/ui/unified_window.vala b/main/src/ui/unified_window.vala index b3c02189..69b530d7 100644 --- a/main/src/ui/unified_window.vala +++ b/main/src/ui/unified_window.vala @@ -126,6 +126,7 @@ public class UnifiedWindow : Window { private bool on_focus_in_event() { stream_interactor.get_module(ChatInteraction.IDENTITY).on_window_focus_in(conversation); + urgency_hint = false; return false; } -- cgit v1.2.3-70-g09d2