Zoom per tab/pane & not writing config to fs when zooming - perf improvement.

This commit is contained in:
l-const 2024-08-20 04:52:34 +03:00 committed by Jeremy Soller
parent c4cb09f183
commit 023aedee65
2 changed files with 54 additions and 14 deletions

View file

@ -397,7 +397,6 @@ pub struct App {
curr_font_weights: Vec<u16>, curr_font_weights: Vec<u16>,
curr_font_stretch_names: Vec<String>, curr_font_stretch_names: Vec<String>,
curr_font_stretches: Vec<Stretch>, curr_font_stretches: Vec<Stretch>,
zoom_adj: i8,
zoom_step_names: Vec<String>, zoom_step_names: Vec<String>,
zoom_steps: Vec<u16>, zoom_steps: Vec<u16>,
theme_names_dark: Vec<String>, theme_names_dark: Vec<String>,
@ -477,6 +476,18 @@ impl App {
.sort_by(|a, b| LANGUAGE_SORTER.compare(a, b)); .sort_by(|a, b| LANGUAGE_SORTER.compare(a, b));
} }
fn reset_terminal_panes_zoom(&mut self) {
for (_pane, tab_model) in self.pane_model.panes.iter() {
for entity in tab_model.iter() {
if let Some(terminal) = tab_model.data::<Mutex<Terminal>>(entity) {
let mut terminal = terminal.lock().unwrap();
terminal.set_zoom_adj(0);
}
}
}
}
fn update_config(&mut self) -> Command<Message> { fn update_config(&mut self) -> Command<Message> {
let theme = self.config.app_theme.theme(); let theme = self.config.app_theme.theme();
@ -499,7 +510,7 @@ impl App {
for entity in tab_model.iter() { for entity in tab_model.iter() {
if let Some(terminal) = tab_model.data::<Mutex<Terminal>>(entity) { if let Some(terminal) = tab_model.data::<Mutex<Terminal>>(entity) {
let mut terminal = terminal.lock().unwrap(); let mut terminal = terminal.lock().unwrap();
terminal.set_config(&self.config, &self.themes, self.zoom_adj); terminal.set_config(&self.config, &self.themes);
} }
} }
} }
@ -511,6 +522,29 @@ impl App {
cosmic::app::command::set_theme(theme) cosmic::app::command::set_theme(theme)
} }
fn update_render_active_pane_zoom(&mut self, zoom_message: Message) -> Command<Message> {
// skip writing config to fs when zoom in/ out
// recalculate the pane due to the changes of zoom_adj value
// but only for the active pane/tab
if let Some(tab_model) = self.pane_model.active() {
for entity in tab_model.iter() {
if tab_model.is_active(entity) {
if let Some(terminal) = tab_model.data::<Mutex<Terminal>>(entity) {
let mut terminal = terminal.lock().unwrap();
let current_zoom_adj = terminal.zoom_adj();
match zoom_message {
Message::ZoomIn => terminal.set_zoom_adj(current_zoom_adj.saturating_add(1)),
Message::ZoomOut => terminal.set_zoom_adj(current_zoom_adj.saturating_sub(1)),
_ => {}
}
terminal.set_config(&self.config, &self.themes);
}
}
}
}
Command::none()
}
fn save_color_schemes(&mut self, color_scheme_kind: ColorSchemeKind) -> Command<Message> { fn save_color_schemes(&mut self, color_scheme_kind: ColorSchemeKind) -> Command<Message> {
// Optimized for just saving color_schemes // Optimized for just saving color_schemes
if let Some(ref config_handler) = self.config_handler { if let Some(ref config_handler) = self.config_handler {
@ -1253,7 +1287,7 @@ impl App {
tab_title_override, tab_title_override,
) { ) {
Ok(mut terminal) => { Ok(mut terminal) => {
terminal.set_config(&self.config, &self.themes, self.zoom_adj); terminal.set_config(&self.config, &self.themes);
tab_model tab_model
.data_set::<Mutex<Terminal>>(entity, Mutex::new(terminal)); .data_set::<Mutex<Terminal>>(entity, Mutex::new(terminal));
} }
@ -1451,7 +1485,6 @@ impl Application for App {
curr_font_weights: Vec::new(), curr_font_weights: Vec::new(),
curr_font_stretch_names: Vec::new(), curr_font_stretch_names: Vec::new(),
curr_font_stretches: Vec::new(), curr_font_stretches: Vec::new(),
zoom_adj: 0,
zoom_step_names, zoom_step_names,
zoom_steps, zoom_steps,
theme_names_dark: Vec::new(), theme_names_dark: Vec::new(),
@ -1528,7 +1561,6 @@ impl Application for App {
} }
}; };
} }
match message { match message {
Message::AppTheme(app_theme) => { Message::AppTheme(app_theme) => {
config_set!(app_theme, app_theme); config_set!(app_theme, app_theme);
@ -1831,7 +1863,7 @@ impl Application for App {
Message::DefaultFontSize(index) => match self.font_sizes.get(index) { Message::DefaultFontSize(index) => match self.font_sizes.get(index) {
Some(font_size) => { Some(font_size) => {
config_set!(font_size, *font_size); config_set!(font_size, *font_size);
self.zoom_adj = 0; // reset zoom self.reset_terminal_panes_zoom(); // reset zoom
return self.update_config(); return self.update_config();
} }
None => { None => {
@ -1878,7 +1910,7 @@ impl Application for App {
Message::DefaultZoomStep(index) => match self.zoom_steps.get(index) { Message::DefaultZoomStep(index) => match self.zoom_steps.get(index) {
Some(zoom_step) => { Some(zoom_step) => {
config_set!(font_size_zoom_step_mul_100, *zoom_step); config_set!(font_size_zoom_step_mul_100, *zoom_step);
self.zoom_adj = 0; // reset zoom self.reset_terminal_panes_zoom(); // reset zoom
return self.update_config(); return self.update_config();
} }
None => { None => {
@ -2514,15 +2546,13 @@ impl Application for App {
} }
}, },
Message::ZoomIn => { Message::ZoomIn => {
self.zoom_adj = self.zoom_adj.saturating_add(1); return self.update_render_active_pane_zoom(message);
return self.update_config();
} }
Message::ZoomOut => { Message::ZoomOut => {
self.zoom_adj = self.zoom_adj.saturating_sub(1); return self.update_render_active_pane_zoom(message);
return self.update_config();
} }
Message::ZoomReset => { Message::ZoomReset => {
self.zoom_adj = 0; self.reset_terminal_panes_zoom();
return self.update_config(); return self.update_config();
} }
} }

View file

@ -139,6 +139,7 @@ fn convert_color(colors: &Colors, color: Color) -> cosmic_text::Color {
} }
type TabModel = segmented_button::Model<segmented_button::SingleSelect>; type TabModel = segmented_button::Model<segmented_button::SingleSelect>;
pub struct TerminalPaneGrid { pub struct TerminalPaneGrid {
pub panes: pane_grid::State<TabModel>, pub panes: pane_grid::State<TabModel>,
pub panes_created: usize, pub panes_created: usize,
@ -212,6 +213,7 @@ pub struct Terminal {
search_value: String, search_value: String,
size: Size, size: Size,
use_bright_bold: bool, use_bright_bold: bool,
zoom_adj: i8
} }
impl Terminal { impl Terminal {
@ -303,6 +305,7 @@ impl Terminal {
tab_title_override, tab_title_override,
term, term,
use_bright_bold, use_bright_bold,
zoom_adj: Default::default()
}) })
} }
@ -332,6 +335,14 @@ impl Terminal {
self.size self.size
} }
pub fn zoom_adj(&self) -> i8 {
self.zoom_adj
}
pub fn set_zoom_adj(&mut self, value: i8) {
self.zoom_adj = value;
}
pub fn redraw(&self) -> bool { pub fn redraw(&self) -> bool {
self.buffer.redraw() self.buffer.redraw()
} }
@ -528,11 +539,10 @@ impl Terminal {
&mut self, &mut self,
config: &AppConfig, config: &AppConfig,
themes: &HashMap<(String, ColorSchemeKind), Colors>, themes: &HashMap<(String, ColorSchemeKind), Colors>,
zoom_adj: i8,
) { ) {
let mut update_cell_size = false; let mut update_cell_size = false;
let mut update = false; let mut update = false;
let zoom_adj = self.zoom_adj;
if self.default_attrs.stretch != config.typed_font_stretch() { if self.default_attrs.stretch != config.typed_font_stretch() {
self.default_attrs = self.default_attrs.stretch(config.typed_font_stretch()); self.default_attrs = self.default_attrs.stretch(config.typed_font_stretch());
update_cell_size = true; update_cell_size = true;