From 61295100ee7ce87ea5212d0c3568cc45be294224 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa=20Moreno?= Date: Sun, 27 Aug 2017 17:41:34 +0200 Subject: [PATCH] Button to load more messages --- TODO | 4 +--- src/app.rs | 41 +++++++++++++++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/TODO b/TODO index 4fa0398..5cfb436 100644 --- a/TODO +++ b/TODO @@ -3,8 +3,7 @@ Fixs: * Sort rooms by last message or fav? Functionality: - * Infinite scroll is done, but we need a button at the top, because the - event is send only if the scroll exists + * Register * Room search * Room creation * Leave room @@ -12,7 +11,6 @@ Functionality: * Set room avatar * Change user display name * Change user avatar - * Register * Show media messages (images / videos) * Send media messages (images / videos) * Store last read message to show differently diff --git a/src/app.rs b/src/app.rs index d94f121..2d388a3 100644 --- a/src/app.rs +++ b/src/app.rs @@ -44,6 +44,7 @@ struct AppOp { backend: Sender, active_room: String, members: HashMap, + load_more_btn: gtk::Button, } #[derive(Debug)] @@ -269,8 +270,8 @@ impl AppOp { let messages = self.gtk_builder .get_object::("message_list") .expect("Can't find message_list in ui file."); - for ch in messages.get_children() { - messages.remove(&ch); + for ch in messages.get_children().iter().skip(1) { + messages.remove(ch); } self.members.clear(); @@ -490,7 +491,7 @@ impl AppOp { match msgpos { MsgPos::Bottom => messages.add(&msg), - MsgPos::Top => messages.prepend(&msg), + MsgPos::Top => messages.insert(&msg, 1), }; } else { @@ -536,8 +537,13 @@ impl AppOp { pub fn load_more_messages(&self) { let room = self.active_room.clone(); + self.load_more_btn.set_label("loading..."); self.backend.send(BKCommand::GetRoomMessagesTo(room)).unwrap(); } + + pub fn load_more_normal(&self) { + self.load_more_btn.set_label("load more messages"); + } } /// State for the main thread. @@ -569,6 +575,7 @@ impl App { let op = Arc::new(Mutex::new( AppOp{ gtk_builder: gtk_builder.clone(), + load_more_btn: gtk::Button::new_with_label("Load more messages"), backend: apptx, active_room: String::from(""), members: HashMap::new(), @@ -604,16 +611,21 @@ impl App { theop.lock().unwrap().set_room_avatar(avatar); }, Ok(BKResponse::RoomMessages(msgs)) => { - for msg in msgs { - theop.lock().unwrap().add_room_message(&msg, MsgPos::Bottom); + for msg in msgs.iter() { + theop.lock().unwrap().add_room_message(msg, MsgPos::Bottom); + } + + if !msgs.is_empty() { + theop.lock().unwrap().scroll_down(); } - theop.lock().unwrap().scroll_down(); + theop.lock().unwrap().set_loading(false); }, Ok(BKResponse::RoomMessagesTo(msgs)) => { for msg in msgs.iter().rev() { theop.lock().unwrap().add_room_message(msg, MsgPos::Top); } + theop.lock().unwrap().load_more_normal(); }, Ok(BKResponse::RoomMembers(members)) => { let mut ms = members; @@ -664,6 +676,8 @@ impl App { window.set_application(app); }); + self.create_load_more_btn(); + self.connect_user_button(); self.connect_login_button(); @@ -675,6 +689,21 @@ impl App { self.connect_send(); } + fn create_load_more_btn(&self) { + let messages = self.gtk_builder + .get_object::("message_list") + .expect("Can't find message_list in ui file."); + + let btn = self.op.lock().unwrap().load_more_btn.clone(); + btn.show(); + messages.add(&btn); + + let op = self.op.clone(); + btn.connect_clicked(move |_| { + op.lock().unwrap().load_more_messages(); + }); + } + fn connect_msg_scroll(&self) { let s = self.gtk_builder .get_object::("messages_scroll")