Fix encryption button update and reduce its required GTK version

MenuButton.activate only exists since 4.4
This commit is contained in:
fiaxh 2022-08-21 00:10:59 +02:00
parent d6afa6e8ff
commit 054d3fec16
6 changed files with 39 additions and 46 deletions

View File

@ -3,7 +3,7 @@ using Gee;
namespace Dino.Plugins {
public class Registry {
internal ArrayList<EncryptionListEntry> encryption_list_entries = new ArrayList<EncryptionListEntry>();
internal HashMap<Entities.Encryption, EncryptionListEntry> encryption_list_entries = new HashMap<Entities.Encryption, EncryptionListEntry>();
internal HashMap<string, CallEncryptionEntry> call_encryption_entries = new HashMap<string, CallEncryptionEntry>();
internal ArrayList<AccountSettingsEntry> account_settings_entries = new ArrayList<AccountSettingsEntry>();
internal ArrayList<ContactDetailsProvider> contact_details_entries = new ArrayList<ContactDetailsProvider>();
@ -17,11 +17,9 @@ public class Registry {
public bool register_encryption_list_entry(EncryptionListEntry entry) {
lock(encryption_list_entries) {
foreach(var e in encryption_list_entries) {
if (e.encryption == entry.encryption) return false;
}
encryption_list_entries.add(entry);
encryption_list_entries.sort((a,b) => b.name.collate(a.name));
if (encryption_list_entries.has_key(entry.encryption)) return false;
encryption_list_entries[entry.encryption] = entry;
return true;
}
}

View File

@ -242,7 +242,7 @@ box.dino-input-warning label {
/*Chat input error*/
box.dino-input-error frame border {
box.dino-input-error frame {
border-color: @error_color;
}
@ -251,19 +251,20 @@ box.dino-input-error frame separator {
border: none;
}
box.dino-input-error label {
box.dino-input-error .chat-input-status {
color: @error_color;
}
@keyframes input-error-highlight {
0% { color: mix(@error_color, @theme_fg_color, 0.3);}
30% { color: @error_color; text-shadow: 0px 0px 2px alpha(@error_color, 0.4); }
100% { color: mix(@error_color, @theme_fg_color, 0.3); }
0% { transform: translate(0,0); }
25% { transform: translate(-10px,0); }
75% { transform: translate(10px,0); }
100% { transform: translate(0,0); }
}
box.dino-input-error label.input-status-highlight-once {
animation-duration: 1s;
animation-timing-function: linear;
box.dino-input-error .chat-input-status.input-status-highlight-once {
animation-duration: 0.5s;
animation-timing-function: ease-in-out;
animation-iteration-count: 1;
animation-name: input-error-highlight;
}

View File

@ -77,11 +77,13 @@ public class ChatInputController : Object {
chat_input.set_file_upload_active(active);
}
private void on_encryption_changed(Plugins.EncryptionListEntry? encryption_entry) {
private void on_encryption_changed(Encryption encryption) {
reset_input_field_status();
if (encryption_entry == null) return;
if (encryption == Encryption.NONE) return;
Application app = GLib.Application.get_default() as Application;
var encryption_entry = app.plugin_registry.encryption_list_entries[encryption];
encryption_entry.encryption_activated(conversation, set_input_field_status);
}

View File

@ -7,15 +7,15 @@ namespace Dino.Ui {
public class EncryptionButton {
public signal void encryption_changed(Plugins.EncryptionListEntry? encryption_entry);
public signal void encryption_changed(Encryption encryption);
private MenuButton menu_button;
private Conversation? conversation;
private CheckButton? button_unencrypted;
private Map<CheckButton, Plugins.EncryptionListEntry> encryption_radios = new HashMap<CheckButton, Plugins.EncryptionListEntry>();
private string? current_icon;
private StreamInteractor stream_interactor;
private SimpleAction action;
ulong conversation_encryption_handler_id = -1;
public EncryptionButton(StreamInteractor stream_interactor, MenuButton menu_button) {
this.stream_interactor = stream_interactor;
@ -28,8 +28,11 @@ public class EncryptionButton {
unencrypted_item.set_action_and_target_value("enc.encryption", new Variant.int32(Encryption.NONE));
menu_model.append_item(unencrypted_item);
var encryption_entries = new ArrayList<Plugins.EncryptionListEntry>();
Application app = GLib.Application.get_default() as Application;
foreach (var e in app.plugin_registry.encryption_list_entries) {
encryption_entries.add_all(app.plugin_registry.encryption_list_entries.values);
encryption_entries.sort((a,b) => b.name.collate(a.name));
foreach (var e in encryption_entries) {
MenuItem item = new MenuItem(e.name, "enc.encryption");
item.set_action_and_target_value("enc.encryption", new Variant.int32(e.encryption));
menu_model.append_item(item);
@ -40,7 +43,8 @@ public class EncryptionButton {
action = new SimpleAction.stateful("encryption", VariantType.INT32, new Variant.int32(Encryption.NONE));
action.activate.connect((parameter) => {
action.set_state(parameter);
this.conversation.encryption = (Encryption) parameter.get_int32();
conversation.encryption = (Encryption) parameter.get_int32();
encryption_changed(conversation.encryption);
});
action_group.insert(action);
menu_button.insert_action_group("enc", action_group);
@ -54,24 +58,6 @@ public class EncryptionButton {
update_visibility();
}
});
menu_button.activate.connect(update_encryption_menu_state);
}
private void encryption_button_toggled() {
foreach (CheckButton e in encryption_radios.keys) {
if (e.get_active()) {
conversation.encryption = encryption_radios[e].encryption;
encryption_changed(encryption_radios[e]);
update_encryption_menu_icon();
return;
}
}
// Selected unencrypted
conversation.encryption = Encryption.NONE;
update_encryption_menu_icon();
encryption_changed(null);
}
private void update_encryption_menu_state() {
@ -109,10 +95,20 @@ public class EncryptionButton {
}
public void set_conversation(Conversation conversation) {
if (conversation_encryption_handler_id != -1 && this.conversation != null) {
this.conversation.disconnect(conversation_encryption_handler_id);
}
this.conversation = conversation;
update_encryption_menu_state();
update_encryption_menu_icon();
update_visibility();
encryption_changed(this.conversation.encryption);
conversation_encryption_handler_id = conversation.notify["encryption"].connect(() => {
update_encryption_menu_state();
update_encryption_menu_icon();
});
}
}

View File

@ -88,7 +88,7 @@ public class View : Box {
public void highlight_state_description() {
chat_input_status.add_css_class("input-status-highlight-once");
Timeout.add_seconds(1, () => {
Timeout.add(500, () => {
chat_input_status.remove_css_class("input-status-highlight-once");
return false;
});

View File

@ -132,19 +132,15 @@ public class ConversationItemSkeleton : Plugins.ConversationItemWidgetInterface,
ContentMetaItem ci = item as ContentMetaItem;
if (item.encryption != Encryption.NONE && item.encryption != Encryption.UNKNOWN && ci != null) {
string? icon_name = null;
foreach(var e in app.plugin_registry.encryption_list_entries) {
if (e.encryption == item.encryption) {
icon_name = e.get_encryption_icon_name(conversation, ci.content_item);
break;
}
}
var encryption_entry = app.plugin_registry.encryption_list_entries[item.encryption];
icon_name = encryption_entry.get_encryption_icon_name(conversation, ci.content_item);
encryption_image.icon_name = icon_name ?? "changes-prevent-symbolic";
encryption_image.visible = true;
}
if (item.encryption == Encryption.NONE) {
if (conversation.encryption != Encryption.NONE) {
encryption_image.icon_name = "dino-changes-allowed-symbolic";
encryption_image.icon_name = "changes-allow-symbolic";
encryption_image.tooltip_text = Util.string_if_tooltips_active(_("Unencrypted"));
Util.force_error_color(encryption_image);
encryption_image.visible = true;