mirror of
https://gitlab.com/gabmus/envision.git
synced 2025-08-02 22:29:01 +00:00
fix: log scrolling to bottom
This commit is contained in:
parent
acafbac9d9
commit
05ae25c539
2 changed files with 33 additions and 31 deletions
|
@ -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 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 }
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue