fix: log scrolling to bottom

This commit is contained in:
Gabriele Musco 2023-06-21 13:30:52 +02:00
commit 05ae25c539
No known key found for this signature in database
GPG key ID: 1068D795C80E51DE
2 changed files with 33 additions and 31 deletions

View file

@ -18,11 +18,11 @@ pub struct BuildWindow {
#[tracker::do_not_track] #[tracker::do_not_track]
pub textbuf: gtk::TextBuffer, pub textbuf: gtk::TextBuffer,
#[tracker::do_not_track] #[tracker::do_not_track]
pub textview: Option<gtk::TextView>,
#[tracker::do_not_track]
pub win: Option<adw::Window>, pub win: Option<adw::Window>,
#[tracker::do_not_track] #[tracker::do_not_track]
build_status_label: Option<gtk::Label>, build_status_label: Option<gtk::Label>,
#[tracker::do_not_track]
pub scrolled_win: Option<gtk::ScrolledWindow>,
} }
#[derive(Debug)] #[derive(Debug)]
@ -87,13 +87,13 @@ impl SimpleComponent for BuildWindow {
set_justify: gtk::Justification::Center, set_justify: gtk::Justification::Center,
} }
}, },
#[name(scrolled_win)]
gtk::ScrolledWindow { gtk::ScrolledWindow {
set_hexpand: true, set_hexpand: true,
set_vexpand: true, set_vexpand: true,
set_margin_all: 12, set_margin_all: 12,
add_css_class: "card", add_css_class: "card",
set_overflow: gtk::Overflow::Hidden, set_overflow: gtk::Overflow::Hidden,
#[name(textview)]
gtk::TextView { gtk::TextView {
set_hexpand: true, set_hexpand: true,
set_vexpand: true, set_vexpand: true,
@ -126,25 +126,26 @@ impl SimpleComponent for BuildWindow {
self.reset(); self.reset();
match message { match message {
BuildWindowMsg::Present => { Self::Input::Present => {
self.win.as_ref().unwrap().present(); self.win.as_ref().unwrap().present();
sender.input(BuildWindowMsg::UpdateBuildStatus(BuildStatus::Building)); sender.input(BuildWindowMsg::UpdateBuildStatus(BuildStatus::Building));
} }
BuildWindowMsg::UpdateTitle(t) => { Self::Input::UpdateTitle(t) => {
self.set_title(t); self.set_title(t);
} }
BuildWindowMsg::UpdateContent(c) => { Self::Input::UpdateContent(c) => {
if self.content != c { if self.content != c {
self.set_content(c); self.set_content(c);
self.textbuf.set_text(&self.content); self.textbuf.set_text(&self.content);
let sw = self.scrolled_win.as_ref().unwrap().clone(); let textbuf = self.textbuf.clone();
let adj = sw.vadjustment(); let textview = self.textview.as_ref().unwrap().clone();
// upper means highest value = lowest point in the sw gtk::glib::idle_add_local_once(move || {
adj.set_value(adj.upper()); let end_mark = textbuf.create_mark(None, &textbuf.end_iter(), false);
sw.set_vadjustment(Some(&adj)); textview.scroll_mark_onscreen(&end_mark);
});
} }
} }
BuildWindowMsg::UpdateBuildStatus(status) => { Self::Input::UpdateBuildStatus(status) => {
let label = self.build_status_label.as_ref().unwrap(); let label = self.build_status_label.as_ref().unwrap();
label.remove_css_class("success"); label.remove_css_class("success");
label.remove_css_class("error"); label.remove_css_class("error");
@ -155,7 +156,7 @@ impl SimpleComponent for BuildWindow {
} }
self.set_build_status(status); self.set_build_status(status);
} }
BuildWindowMsg::UpdateCanClose(val) => { Self::Input::UpdateCanClose(val) => {
self.set_can_close(val); self.set_can_close(val);
} }
}; };
@ -166,21 +167,21 @@ impl SimpleComponent for BuildWindow {
root: &Self::Root, root: &Self::Root,
sender: ComponentSender<Self>, sender: ComponentSender<Self>,
) -> ComponentParts<Self> { ) -> ComponentParts<Self> {
let mut model = BuildWindow { let mut model = Self {
tracker: 0, tracker: 0,
title: "".into(), title: "".into(),
content: "".into(), content: "".into(),
can_close: false, can_close: false,
textbuf: gtk::TextBuffer::builder().build(), textbuf: gtk::TextBuffer::builder().build(),
textview: None,
build_status: BuildStatus::Building, build_status: BuildStatus::Building,
win: None, win: None,
build_status_label: None, build_status_label: None,
scrolled_win: None,
}; };
let widgets = view_output!(); let widgets = view_output!();
model.scrolled_win = Some(widgets.scrolled_win.clone());
model.win = Some(widgets.win.clone()); model.win = Some(widgets.win.clone());
model.build_status_label = Some(widgets.build_status_label.clone()); model.build_status_label = Some(widgets.build_status_label.clone());
model.textview = Some(widgets.textview.clone());
ComponentParts { model, widgets } ComponentParts { model, widgets }
} }
} }

View file

@ -44,7 +44,7 @@ pub struct DebugView {
#[tracker::do_not_track] #[tracker::do_not_track]
pub textbuf: gtk::TextBuffer, pub textbuf: gtk::TextBuffer,
#[tracker::do_not_track] #[tracker::do_not_track]
pub scrolled_win: Option<gtk::ScrolledWindow>, pub textview: Option<gtk::TextView>,
#[tracker::do_not_track] #[tracker::do_not_track]
pub searchbar: Option<gtk::SearchBar>, pub searchbar: Option<gtk::SearchBar>,
#[tracker::do_not_track] #[tracker::do_not_track]
@ -98,10 +98,10 @@ impl SimpleComponent for DebugView {
}, },
connect_entry: &search_entry, connect_entry: &search_entry,
}, },
#[name(scrolled_win)]
gtk::ScrolledWindow { gtk::ScrolledWindow {
set_hexpand: true, set_hexpand: true,
set_vexpand: true, set_vexpand: true,
#[name(textview)]
gtk::TextView { gtk::TextView {
set_hexpand: true, set_hexpand: true,
set_vexpand: true, set_vexpand: true,
@ -113,13 +113,13 @@ impl SimpleComponent for DebugView {
} }
} }
fn update(&mut self, message: Self::Input, _sender: ComponentSender<Self>) { fn update(&mut self, message: Self::Input, sender: ComponentSender<Self>) {
self.reset(); self.reset();
match message { match message {
DebugViewMsg::DebugLevelChanged(level) => {} Self::Input::DebugLevelChanged(level) => {}
DebugViewMsg::SearchTermChanged(term) => {} Self::Input::SearchTermChanged(term) => {}
DebugViewMsg::LogUpdated(n_log) => { Self::Input::LogUpdated(n_log) => {
let searchbar = self.searchbar.as_ref().unwrap().clone(); let searchbar = self.searchbar.as_ref().unwrap().clone();
let search_entry = self.search_entry.as_ref().unwrap().clone(); let search_entry = self.search_entry.as_ref().unwrap().clone();
let mut search_text: String = search_entry.text().into(); let mut search_text: String = search_entry.text().into();
@ -135,13 +135,14 @@ impl SimpleComponent for DebugView {
self.log = n_log.concat(); self.log = n_log.concat();
} }
self.textbuf.set_text(&self.log); self.textbuf.set_text(&self.log);
let sw = self.scrolled_win.as_ref().unwrap().clone(); let textbuf = self.textbuf.clone();
let adj = sw.vadjustment(); let textview = self.textview.as_ref().unwrap().clone();
// upper means highest value = lowest point in the sw gtk::glib::idle_add_local_once(move || {
adj.set_value(adj.upper()); let end_mark = textbuf.create_mark(None, &textbuf.end_iter(), false);
sw.set_vadjustment(Some(&adj)); textview.scroll_mark_onscreen(&end_mark);
});
} }
DebugViewMsg::EnableDebugViewChanged(val) => self.set_enable_debug_view(val), Self::Input::EnableDebugViewChanged(val) => self.set_enable_debug_view(val),
} }
} }
@ -150,22 +151,22 @@ impl SimpleComponent for DebugView {
root: &Self::Root, root: &Self::Root,
sender: ComponentSender<Self>, sender: ComponentSender<Self>,
) -> ComponentParts<Self> { ) -> ComponentParts<Self> {
let mut model = DebugView { let mut model = Self {
tracker: 0, tracker: 0,
debug_level: DebugLevel::Debug, debug_level: DebugLevel::Debug,
search_term: "".into(), search_term: "".into(),
log: "".into(), log: "".into(),
textbuf: gtk::TextBuffer::builder().build(), textbuf: gtk::TextBuffer::builder().build(),
textview: None,
enable_debug_view: init.enable_debug_view, enable_debug_view: init.enable_debug_view,
scrolled_win: None,
searchbar: None, searchbar: None,
search_entry: None, search_entry: None,
}; };
let widgets = view_output!(); let widgets = view_output!();
model.scrolled_win = Some(widgets.scrolled_win.clone());
model.searchbar = Some(widgets.searchbar.clone()); model.searchbar = Some(widgets.searchbar.clone());
model.search_entry = Some(widgets.search_entry.clone()); model.search_entry = Some(widgets.search_entry.clone());
model.textview = Some(widgets.textview.clone());
ComponentParts { model, widgets } ComponentParts { model, widgets }
} }