diff options
author | fiaxh <git@lightrise.org> | 2023-01-11 19:54:02 +0100 |
---|---|---|
committer | fiaxh <git@lightrise.org> | 2023-01-11 19:54:02 +0100 |
commit | 75500dc767f2cf657c0fbb5d2a4d4557183ed2e9 (patch) | |
tree | 87f67a933f0459f966932531b427944bb9f67a1f /main | |
parent | cb3b19b01deb8460627578b885339e7528411f6f (diff) | |
download | dino-75500dc767f2cf657c0fbb5d2a4d4557183ed2e9.tar.gz dino-75500dc767f2cf657c0fbb5d2a4d4557183ed2e9.zip |
Support pinning of conversations (locally)
fixes #290
fixes #1330
Diffstat (limited to 'main')
4 files changed, 47 insertions, 13 deletions
diff --git a/main/data/conversation_row.ui b/main/data/conversation_row.ui index fcfd22f0..7be699ba 100644 --- a/main/data/conversation_row.ui +++ b/main/data/conversation_row.ui @@ -88,20 +88,33 @@ </object> </child> <child> - <object class="GtkRevealer" id="unread_count_revealer"> + <object class="GtkRevealer" id="top_row_revealer"> <property name="transition-type">slide-right</property> <property name="transition-duration">50</property> <property name="reveal-child">True</property> + <property name="margin-start">15</property> <child> - <object class="GtkLabel" id="unread_count_label"> - <property name="vexpand">False</property> - <property name="visible">False</property> - <property name="margin-start">15</property> - <property name="xalign">0.5</property> - <attributes> - <attribute name="scale" value="0.6"/> - <attribute name="weight" value="PANGO_WEIGHT_BOLD"/> - </attributes> + <object class="GtkBox"> + <property name="orientation">horizontal</property> + <property name="spacing">6</property> + <child> + <object class="GtkLabel" id="unread_count_label"> + <property name="vexpand">False</property> + <property name="visible">False</property> + <property name="xalign">0.5</property> + <attributes> + <attribute name="scale" value="0.6"/> + <attribute name="weight" value="PANGO_WEIGHT_BOLD"/> + </attributes> + </object> + </child> + <child> + <object class="GtkImage" id="pinned_image"> + <property name="icon-name">view-pin-symbolic</property> + <property name="pixel-size">12</property> + <property name="visible">False</property> + </object> + </child> </object> </child> </object> diff --git a/main/src/ui/contact_details/settings_provider.vala b/main/src/ui/contact_details/settings_provider.vala index 140ebcab..6c43dbfd 100644 --- a/main/src/ui/contact_details/settings_provider.vala +++ b/main/src/ui/contact_details/settings_provider.vala @@ -49,6 +49,12 @@ public class SettingsProvider : Plugins.ContactDetailsProvider, Object { combobox.active_id = get_notify_setting_id(conversation.notify_setting); combobox.changed.connect(() => { conversation.notify_setting = get_notify_setting(combobox.active_id); } ); } + + Switch pinned_switch = new Switch(); + string category = conversation.type_ == Conversation.Type.GROUPCHAT ? DETAILS_HEADLINE_ROOM : DETAILS_HEADLINE_CHAT; + contact_details.add(category, _("Pin conversation"), _("Pins the conversation to the top of the conversation list"), pinned_switch); + pinned_switch.state = conversation.pinned != 0; + pinned_switch.state_set.connect((state) => { conversation.pinned = state ? 1 : 0; return false; }); } private Conversation.Setting get_setting(string id) { diff --git a/main/src/ui/conversation_selector/conversation_selector.vala b/main/src/ui/conversation_selector/conversation_selector.vala index 609e1be1..8a4506f3 100644 --- a/main/src/ui/conversation_selector/conversation_selector.vala +++ b/main/src/ui/conversation_selector/conversation_selector.vala @@ -75,6 +75,8 @@ public class ConversationSelector : Widget { private void add_conversation(Conversation conversation) { ConversationSelectorRow row; if (!rows.has_key(conversation)) { + conversation.notify["pinned"].connect(list_box.invalidate_sort); + row = new ConversationSelectorRow(stream_interactor, conversation); rows[conversation] = row; list_box.append(row); @@ -119,6 +121,8 @@ public class ConversationSelector : Widget { private async void remove_conversation(Conversation conversation) { select_fallback_conversation(conversation); if (rows.has_key(conversation)) { + conversation.notify["pinned"].disconnect(list_box.invalidate_sort); + yield rows[conversation].colapse(); list_box.remove(rows[conversation]); rows.unset(conversation); @@ -149,6 +153,10 @@ public class ConversationSelector : Widget { if (cr1 != null && cr2 != null) { Conversation c1 = cr1.conversation; Conversation c2 = cr2.conversation; + + int pin_comp = c2.pinned - c1.pinned; + if (pin_comp != 0) return pin_comp; + if (c1.last_active == null) return -1; if (c2.last_active == null) return 1; int comp = c2.last_active.compare(c1.last_active); diff --git a/main/src/ui/conversation_selector/conversation_selector_row.vala b/main/src/ui/conversation_selector/conversation_selector_row.vala index bd2b0747..8355b104 100644 --- a/main/src/ui/conversation_selector/conversation_selector_row.vala +++ b/main/src/ui/conversation_selector/conversation_selector_row.vala @@ -21,7 +21,8 @@ public class ConversationSelectorRow : ListBoxRow { [GtkChild] protected unowned Button x_button; [GtkChild] protected unowned Revealer time_revealer; [GtkChild] protected unowned Revealer xbutton_revealer; - [GtkChild] protected unowned Revealer unread_count_revealer; + [GtkChild] protected unowned Revealer top_row_revealer; + [GtkChild] protected unowned Image pinned_image; [GtkChild] public unowned Revealer main_revealer; public Conversation conversation { get; private set; } @@ -102,8 +103,10 @@ public class ConversationSelectorRow : ListBoxRow { }); image.set_conversation(stream_interactor, conversation); conversation.notify["read-up-to-item"].connect(() => update_read()); + conversation.notify["pinned"].connect(() => { update_pinned_icon(); }); update_name_label(); + update_pinned_icon(); content_item_received(); } @@ -135,6 +138,10 @@ public class ConversationSelectorRow : ListBoxRow { name_label.label = Util.get_conversation_display_name(stream_interactor, conversation); } + private void update_pinned_icon() { + pinned_image.visible = conversation.pinned != 0; + } + protected void update_time_label(DateTime? new_time = null) { if (last_content_item != null) { time_label.visible = true; @@ -252,11 +259,11 @@ public class ConversationSelectorRow : ListBoxRow { StateFlags curr_flags = get_state_flags(); if ((curr_flags & StateFlags.PRELIGHT) != 0) { time_revealer.set_reveal_child(false); - unread_count_revealer.set_reveal_child(false); + top_row_revealer.set_reveal_child(false); xbutton_revealer.set_reveal_child(true); } else { time_revealer.set_reveal_child(true); - unread_count_revealer.set_reveal_child(true); + top_row_revealer.set_reveal_child(true); xbutton_revealer.set_reveal_child(false); } } |