Skip to content

Commit 52c827a

Browse files
authored
Merge pull request #501 from melix99/melix99/reply-followups
Reply addition followups
2 parents 9e92459 + ec1b6a1 commit 52c827a

5 files changed

Lines changed: 55 additions & 61 deletions

File tree

data/resources/style.css

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,7 @@ messagebubble messageindicators {
161161
opacity: 0.7;
162162
}
163163

164-
messagebubble.text > overlay,
165-
messagebubble.document > overlay {
164+
messagebubble > overlay {
166165
padding: 6px 9px;
167166
}
168167

@@ -198,19 +197,22 @@ messagebubble.document .file:active > image {
198197
messagebubble.media mediapicture {
199198
min-width: 150px;
200199
min-height: 100px;
201-
/* Message bubble border-radius (15px) - margin (1px) */
200+
/* Negate margins to achieve 1px padding with the message bubble */
201+
margin: -5px -8px;
202+
/* Message bubble border-radius (15px) - padding (1px) */
202203
border-radius: 14px;
203-
margin: 1px;
204+
}
205+
206+
messagebubble.media.with-reply mediapicture {
207+
border-top-right-radius: 0;
208+
border-top-left-radius: 0;
209+
margin-top: 3px;
204210
}
205211

206212
messagebubble.media.with-label mediapicture {
207213
border-bottom-right-radius: 0;
208214
border-bottom-left-radius: 0;
209-
margin: 1px 1px 0;
210-
}
211-
212-
messagebubble.media messagelabel {
213-
margin: 6px 9px;
215+
margin-bottom: 6px;
214216
}
215217

216218
messageindicators image {
@@ -225,7 +227,6 @@ messagesticker messageindicators,
225227
opacity: 1; /* Reset opacity from message bubble */
226228
border-radius: 9999px;
227229
padding: 2px 6px;
228-
margin: 6px;
229230
}
230231

231232
messageindicators,

src/session/content/message_row/bubble.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -199,16 +199,16 @@ impl MessageBubble {
199199

200200
// Handle MessageReply
201201
if message.reply_to_message_id() != 0 {
202-
let reply = MessageReply::new(
203-
message.chat(),
204-
message.reply_to_message_id(),
205-
message.is_outgoing(),
206-
);
202+
let reply = MessageReply::new(message);
207203

208204
// FIXME: Do not show message reply when message is being deleted
209205
imp.message_reply_bin.set_child(Some(&reply));
206+
207+
self.add_css_class("with-reply");
210208
} else {
211209
imp.message_reply_bin.set_child(gtk::Widget::NONE);
210+
211+
self.remove_css_class("with-reply");
212212
}
213213

214214
// Show sender label, if needed

src/session/content/message_row/reply.rs

Lines changed: 28 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ use gtk::subclass::prelude::*;
44
use gtk::CompositeTemplate;
55

66
use crate::strings;
7-
use crate::tdlib::{Chat, ChatType, Message, MessageSender};
7+
use crate::tdlib::{ChatType, Message, MessageSender};
88
use crate::utils::spawn;
99

1010
mod imp {
1111
use gtk::glib::{ParamSpec, Properties, Value};
1212

1313
use super::*;
14-
use std::cell::{Cell, RefCell};
14+
use std::cell::RefCell;
1515

1616
#[derive(Debug, Default, Properties, CompositeTemplate)]
1717
#[properties(wrapper_type = super::MessageReply)]
@@ -47,14 +47,9 @@ mod imp {
4747
pub(crate) struct MessageReply {
4848
pub(super) sender_color_class: RefCell<Option<String>>,
4949
pub(super) bindings: RefCell<Vec<gtk::ExpressionWatch>>,
50-
pub(super) is_loading: Cell<bool>,
5150

5251
#[property(get, set, construct_only)]
53-
pub(super) chat: RefCell<Option<Chat>>,
54-
#[property(get, set, construct_only)]
55-
pub(super) reply_id: Cell<i64>,
56-
#[property(get, set, construct_only)]
57-
pub(super) is_outgoing: Cell<bool>,
52+
pub(super) message: RefCell<Option<Message>>,
5853

5954
#[template_child]
6055
pub(super) separator: TemplateChild<gtk::Separator>,
@@ -97,10 +92,13 @@ mod imp {
9792
}
9893

9994
fn constructed(&self) {
100-
self.is_loading.set(true);
10195
self.message_label
10296
.set_label(&gettextrs::gettext("Loading ..."));
103-
self.obj().load_message();
97+
98+
let obj = self.obj();
99+
spawn(clone!(@weak obj => async move {
100+
obj.load_replied_message().await;
101+
}));
104102
}
105103

106104
fn dispose(&self) {
@@ -117,44 +115,35 @@ glib::wrapper! {
117115
}
118116

119117
impl MessageReply {
120-
pub(crate) fn new(chat: Chat, reply_id: i64, is_outgoing: bool) -> Self {
121-
glib::Object::builder()
122-
.property("chat", chat)
123-
.property("reply-id", reply_id)
124-
.property("is-outgoing", is_outgoing)
125-
.build()
118+
pub(crate) fn new(message: &Message) -> Self {
119+
glib::Object::builder().property("message", message).build()
126120
}
127121

128-
fn load_message(&self) {
122+
async fn load_replied_message(&self) {
129123
let imp = self.imp();
130124

131-
let reply_id = imp.reply_id.get();
132-
let chat = self.chat().unwrap();
125+
let message = self.message().unwrap();
126+
let reply_to_message_id = message.reply_to_message_id();
127+
let is_outgoing = message.is_outgoing();
128+
let chat = if message.reply_in_chat_id() != 0 {
129+
message.chat().session().chat(message.reply_in_chat_id())
130+
} else {
131+
message.chat()
132+
};
133133

134-
if let Some(message) = chat.message(reply_id) {
135-
self.update_from_message(&message);
134+
if let Ok(message) = chat.fetch_message(reply_to_message_id).await {
135+
self.update_from_message(&message, is_outgoing);
136136
} else {
137-
spawn(clone!(@weak self as obj => async move {
138-
let chat = obj.imp().chat.borrow().clone().unwrap();
139-
if let Ok(message) = chat.fetch_message(reply_id).await {
140-
obj.update_from_message(&message);
141-
} else {
142-
// Message doesn't exist, so we should remove "Loading..." caption
143-
// TODO: Impelent it properly using signals
144-
obj.imp().message_label.set_label("Deleted message");
145-
}
146-
}));
137+
imp.message_label.set_label("Deleted message");
147138
}
148-
149-
imp.is_loading.set(false);
150139
}
151140

152141
pub(crate) fn set_max_char_width(&self, n_chars: i32) {
153142
self.imp().message_label.set_max_width_chars(n_chars);
154143
self.imp().sender_label.set_max_width_chars(n_chars);
155144
}
156145

157-
fn update_from_message(&self, message: &Message) {
146+
fn update_from_message(&self, replied_message: &Message, is_outgoing: bool) {
158147
let imp = self.imp();
159148
let mut bindings = imp.bindings.borrow_mut();
160149
while let Some(binding) = bindings.pop() {
@@ -168,19 +157,19 @@ impl MessageReply {
168157
}
169158
// Show sender label, if needed
170159
let show_sender = !matches!(
171-
message.chat().type_(),
160+
replied_message.chat().type_(),
172161
ChatType::Supergroup(data) if data.is_channel()
173162
);
174163
if show_sender {
175-
let sender_name_expression = message.sender_name_expression();
164+
let sender_name_expression = replied_message.sender_name_expression();
176165
let sender_binding =
177166
sender_name_expression.bind(&*imp.sender_label, "label", glib::Object::NONE);
178167

179168
bindings.push(sender_binding);
180169

181-
if !imp.is_outgoing.get() {
170+
if !is_outgoing {
182171
// Color sender label
183-
if let MessageSender::User(user) = message.sender() {
172+
if let MessageSender::User(user) = replied_message.sender() {
184173
let classes = vec![
185174
"sender-text-red",
186175
"sender-text-orange",
@@ -202,9 +191,7 @@ impl MessageReply {
202191

203192
// Set content label expression
204193

205-
let caption = strings::message_content(message.clone().as_ref());
194+
let caption = strings::message_content(replied_message.clone().as_ref());
206195
imp.message_label.set_label(&caption);
207-
208-
self.imp().is_loading.set(false);
209196
}
210197
}

src/session/content/message_row/sticker.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,7 @@ impl MessageBaseExt for MessageSticker {
102102
imp.indicators.set_message(message.clone().upcast());
103103

104104
if message.reply_to_message_id() != 0 {
105-
let reply = MessageReply::new(
106-
message.chat(),
107-
message.reply_to_message_id(),
108-
message.is_outgoing(),
109-
);
105+
let reply = MessageReply::new(message);
110106
reply.set_valign(gtk::Align::Start);
111107
reply.set_max_char_width(MAX_REPLY_CHAR_WIDTH);
112108

src/tdlib/message.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ mod imp {
6868
pub(super) interaction_info: OnceCell<MessageInteractionInfo>,
6969
pub(super) chat: WeakRef<Chat>,
7070
pub(super) forward_info: OnceCell<Option<MessageForwardInfo>>,
71+
pub(super) reply_in_chat_id: Cell<i64>,
7172
pub(super) reply_to_message_id: Cell<i64>,
7273
}
7374

@@ -116,6 +117,9 @@ mod imp {
116117
glib::ParamSpecObject::builder::<MessageForwardInfo>("forward-info")
117118
.read_only()
118119
.build(),
120+
glib::ParamSpecInt64::builder("reply-in-chat-id")
121+
.read_only()
122+
.build(),
119123
glib::ParamSpecInt64::builder("reply-to-message-id")
120124
.read_only()
121125
.build(),
@@ -141,6 +145,7 @@ mod imp {
141145
"interaction-info" => obj.interaction_info().to_value(),
142146
"chat" => obj.chat().to_value(),
143147
"forward-info" => obj.forward_info().to_value(),
148+
"reply-in-chat-id" => obj.reply_in_chat_id().to_value(),
144149
"reply-to-message-id" => obj.reply_to_message_id().to_value(),
145150
_ => unimplemented!(),
146151
}
@@ -182,6 +187,7 @@ impl Message {
182187
.unwrap();
183188
imp.chat.set(Some(chat));
184189
imp.forward_info.set(forward_info).unwrap();
190+
imp.reply_in_chat_id.set(td_message.reply_in_chat_id);
185191
imp.reply_to_message_id.set(td_message.reply_to_message_id);
186192

187193
message
@@ -286,6 +292,10 @@ impl Message {
286292
self.imp().forward_info.get().unwrap().as_ref()
287293
}
288294

295+
pub(crate) fn reply_in_chat_id(&self) -> i64 {
296+
self.imp().reply_in_chat_id.get()
297+
}
298+
289299
pub(crate) fn reply_to_message_id(&self) -> i64 {
290300
self.imp().reply_to_message_id.get()
291301
}

0 commit comments

Comments
 (0)