Skip to content

Commit

Permalink
chat-action-bar: Update stack page when needed
Browse files Browse the repository at this point in the history
E.g. when a channel is muted/unmuted in a different device.
  • Loading branch information
melix99 committed Feb 21, 2023
1 parent ebfceec commit cf48b4b
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 10 deletions.
94 changes: 84 additions & 10 deletions src/session/content/chat_action_bar.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ use tdlib::{functions, types};

use crate::components::MessageEntry;
use crate::session::content::SendPhotoDialog;
use crate::tdlib::{BoxedDraftMessage, BoxedFormattedText, Chat, ChatType, SecretChatState};
use crate::tdlib::{
BasicGroup, BoxedDraftMessage, BoxedFormattedText, Chat, ChatType, SecretChatState, Supergroup,
};
use crate::utils::{block_on, spawn, temp_dir};
use crate::{expressions, strings};

Expand All @@ -29,6 +31,7 @@ enum ChatActionBarState {
mod imp {
use super::*;
use once_cell::sync::Lazy;
use once_cell::unsync::OnceCell;
use std::cell::{Cell, RefCell};

#[derive(Debug, Default, CompositeTemplate)]
Expand All @@ -38,6 +41,9 @@ mod imp {
pub(super) chat_action_in_cooldown: Cell<bool>,
pub(super) state: Cell<ChatActionBarState>,
pub(super) emoji_chooser: RefCell<Option<gtk::EmojiChooser>>,
pub(super) chat_signal_group: OnceCell<glib::SignalGroup>,
pub(super) basic_group_signal_group: OnceCell<glib::SignalGroup>,
pub(super) supergroup_signal_group: OnceCell<glib::SignalGroup>,
pub(super) bindings: RefCell<Vec<gtk::ExpressionWatch>>,
#[template_child]
pub(super) top_bar_revealer: TemplateChild<gtk::Revealer>,
Expand Down Expand Up @@ -117,12 +123,6 @@ mod imp {
None,
|widget, _, _| async move {
widget.toggle_mute().await;
let btn = &widget.imp().mute_button;
if widget.is_chat_muted() {
btn.set_label(&gettext("Unmute"));
} else {
btn.set_label(&gettext("Mute"));
}
},
);
klass.install_action_async(
Expand Down Expand Up @@ -221,6 +221,8 @@ mod imp {
.connect_activate(clone!(@weak obj => move |_| {
obj.activate_action("chat-action-bar.send-message", None).unwrap()
}));

obj.create_signal_groups();
}

fn dispose(&self) {
Expand Down Expand Up @@ -251,6 +253,55 @@ impl ChatActionBar {
glib::Object::new()
}

fn create_signal_groups(&self) {
let imp = self.imp();

let chat_signal_group = glib::SignalGroup::new(Chat::static_type());
chat_signal_group.connect_local(
"notify::notification-settings",
false,
clone!(@weak self as obj => @default-return None, move |_| {
obj.update_stack_page();
None
}),
);
chat_signal_group.connect_local(
"notify::is-blocked",
false,
clone!(@weak self as obj => @default-return None, move |_| {
obj.update_stack_page();
None
}),
);
imp.chat_signal_group.set(chat_signal_group).unwrap();

let basic_group_signal_group = glib::SignalGroup::new(BasicGroup::static_type());
basic_group_signal_group.connect_local(
"notify::status",
false,
clone!(@weak self as obj => @default-return None, move |_| {
obj.update_stack_page();
None
}),
);
imp.basic_group_signal_group
.set(basic_group_signal_group)
.unwrap();

let supergroup_signal_group = glib::SignalGroup::new(Supergroup::static_type());
supergroup_signal_group.connect_local(
"notify::status",
false,
clone!(@weak self as obj => @default-return None, move |_| {
obj.update_stack_page();
None
}),
);
imp.supergroup_signal_group
.set(supergroup_signal_group)
.unwrap();
}

fn cancel_action(&self) {
use ChatActionBarState::*;

Expand Down Expand Up @@ -694,10 +745,11 @@ impl ChatActionBar {
}

imp.chat.replace(chat);
self.notify("chat");

// FIXME: Update entry_stack everytime ChatMemberStatus or ChatPermissions has changed
self.update_stack_page();
self.update_signal_groups();

self.notify("chat");
}

pub(crate) fn reply_to_message_id(&self, message_id: i64) {
Expand All @@ -708,7 +760,7 @@ impl ChatActionBar {
self.set_state(ChatActionBarState::Editing(message_id));
}

pub(crate) fn update_stack_page(&self) {
fn update_stack_page(&self) {
let imp = self.imp();
if let Some(chat) = self.chat() {
match chat.type_() {
Expand Down Expand Up @@ -778,6 +830,28 @@ impl ChatActionBar {
}
}
}

fn update_signal_groups(&self) {
let imp = self.imp();

let chat = self.chat();
imp.chat_signal_group
.get()
.unwrap()
.set_target(chat.as_ref());

let basic_group = chat.as_ref().and_then(|c| c.type_().basic_group());
imp.basic_group_signal_group
.get()
.unwrap()
.set_target(basic_group);

let supergroup = chat.as_ref().and_then(|c| c.type_().supergroup());
imp.supergroup_signal_group
.get()
.unwrap()
.set_target(supergroup);
}
}

async fn save_stream_to_file(
Expand Down
14 changes: 14 additions & 0 deletions src/tdlib/chat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,20 @@ impl ChatType {
_ => return None,
})
}

pub(crate) fn basic_group(&self) -> Option<&BasicGroup> {
Some(match self {
ChatType::BasicGroup(basic_group) => basic_group,
_ => return None,
})
}

pub(crate) fn supergroup(&self) -> Option<&Supergroup> {
Some(match self {
ChatType::Supergroup(supergroup) => supergroup,
_ => return None,
})
}
}

mod imp {
Expand Down

0 comments on commit cf48b4b

Please sign in to comment.