diff --git a/src/ui/build_window.rs b/src/ui/build_window.rs index 2e8d4fb..dd95b52 100644 --- a/src/ui/build_window.rs +++ b/src/ui/build_window.rs @@ -18,11 +18,11 @@ pub struct BuildWindow { #[tracker::do_not_track] pub textbuf: gtk::TextBuffer, #[tracker::do_not_track] + pub textview: Option, + #[tracker::do_not_track] pub win: Option, #[tracker::do_not_track] build_status_label: Option, - #[tracker::do_not_track] - pub scrolled_win: Option, } #[derive(Debug)] @@ -87,13 +87,13 @@ impl SimpleComponent for BuildWindow { set_justify: gtk::Justification::Center, } }, - #[name(scrolled_win)] gtk::ScrolledWindow { set_hexpand: true, set_vexpand: true, set_margin_all: 12, add_css_class: "card", set_overflow: gtk::Overflow::Hidden, + #[name(textview)] gtk::TextView { set_hexpand: true, set_vexpand: true, @@ -126,25 +126,26 @@ impl SimpleComponent for BuildWindow { self.reset(); match message { - BuildWindowMsg::Present => { + Self::Input::Present => { self.win.as_ref().unwrap().present(); sender.input(BuildWindowMsg::UpdateBuildStatus(BuildStatus::Building)); } - BuildWindowMsg::UpdateTitle(t) => { + Self::Input::UpdateTitle(t) => { self.set_title(t); } - BuildWindowMsg::UpdateContent(c) => { + Self::Input::UpdateContent(c) => { if self.content != c { self.set_content(c); self.textbuf.set_text(&self.content); - let sw = self.scrolled_win.as_ref().unwrap().clone(); - let adj = sw.vadjustment(); - // upper means highest value = lowest point in the sw - adj.set_value(adj.upper()); - sw.set_vadjustment(Some(&adj)); + let textbuf = self.textbuf.clone(); + let textview = self.textview.as_ref().unwrap().clone(); + gtk::glib::idle_add_local_once(move || { + let end_mark = textbuf.create_mark(None, &textbuf.end_iter(), false); + textview.scroll_mark_onscreen(&end_mark); + }); } } - BuildWindowMsg::UpdateBuildStatus(status) => { + Self::Input::UpdateBuildStatus(status) => { let label = self.build_status_label.as_ref().unwrap(); label.remove_css_class("success"); label.remove_css_class("error"); @@ -155,7 +156,7 @@ impl SimpleComponent for BuildWindow { } self.set_build_status(status); } - BuildWindowMsg::UpdateCanClose(val) => { + Self::Input::UpdateCanClose(val) => { self.set_can_close(val); } }; @@ -166,21 +167,21 @@ impl SimpleComponent for BuildWindow { root: &Self::Root, sender: ComponentSender, ) -> ComponentParts { - let mut model = BuildWindow { + let mut model = Self { tracker: 0, title: "".into(), content: "".into(), can_close: false, textbuf: gtk::TextBuffer::builder().build(), + textview: None, build_status: BuildStatus::Building, win: None, build_status_label: None, - scrolled_win: None, }; let widgets = view_output!(); - model.scrolled_win = Some(widgets.scrolled_win.clone()); model.win = Some(widgets.win.clone()); model.build_status_label = Some(widgets.build_status_label.clone()); + model.textview = Some(widgets.textview.clone()); ComponentParts { model, widgets } } } diff --git a/src/ui/debug_view.rs b/src/ui/debug_view.rs index 5708ef2..0c7e9d5 100644 --- a/src/ui/debug_view.rs +++ b/src/ui/debug_view.rs @@ -44,7 +44,7 @@ pub struct DebugView { #[tracker::do_not_track] pub textbuf: gtk::TextBuffer, #[tracker::do_not_track] - pub scrolled_win: Option, + pub textview: Option, #[tracker::do_not_track] pub searchbar: Option, #[tracker::do_not_track] @@ -98,10 +98,10 @@ impl SimpleComponent for DebugView { }, connect_entry: &search_entry, }, - #[name(scrolled_win)] gtk::ScrolledWindow { set_hexpand: true, set_vexpand: true, + #[name(textview)] gtk::TextView { set_hexpand: true, set_vexpand: true, @@ -113,13 +113,13 @@ impl SimpleComponent for DebugView { } } - fn update(&mut self, message: Self::Input, _sender: ComponentSender) { + fn update(&mut self, message: Self::Input, sender: ComponentSender) { self.reset(); match message { - DebugViewMsg::DebugLevelChanged(level) => {} - DebugViewMsg::SearchTermChanged(term) => {} - DebugViewMsg::LogUpdated(n_log) => { + Self::Input::DebugLevelChanged(level) => {} + Self::Input::SearchTermChanged(term) => {} + Self::Input::LogUpdated(n_log) => { let searchbar = self.searchbar.as_ref().unwrap().clone(); let search_entry = self.search_entry.as_ref().unwrap().clone(); let mut search_text: String = search_entry.text().into(); @@ -135,13 +135,14 @@ impl SimpleComponent for DebugView { self.log = n_log.concat(); } self.textbuf.set_text(&self.log); - let sw = self.scrolled_win.as_ref().unwrap().clone(); - let adj = sw.vadjustment(); - // upper means highest value = lowest point in the sw - adj.set_value(adj.upper()); - sw.set_vadjustment(Some(&adj)); + let textbuf = self.textbuf.clone(); + let textview = self.textview.as_ref().unwrap().clone(); + gtk::glib::idle_add_local_once(move || { + let end_mark = textbuf.create_mark(None, &textbuf.end_iter(), false); + 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, sender: ComponentSender, ) -> ComponentParts { - let mut model = DebugView { + let mut model = Self { tracker: 0, debug_level: DebugLevel::Debug, search_term: "".into(), log: "".into(), textbuf: gtk::TextBuffer::builder().build(), + textview: None, enable_debug_view: init.enable_debug_view, - scrolled_win: None, searchbar: None, search_entry: None, }; let widgets = view_output!(); - model.scrolled_win = Some(widgets.scrolled_win.clone()); model.searchbar = Some(widgets.searchbar.clone()); model.search_entry = Some(widgets.search_entry.clone()); + model.textview = Some(widgets.textview.clone()); ComponentParts { model, widgets } }