@@ -4,14 +4,14 @@ use gtk::subclass::prelude::*;
44use gtk:: CompositeTemplate ;
55
66use crate :: strings;
7- use crate :: tdlib:: { Chat , ChatType , Message , MessageSender } ;
7+ use crate :: tdlib:: { ChatType , Message , MessageSender } ;
88use crate :: utils:: spawn;
99
1010mod 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
119117impl 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}
0 commit comments