aboutsummaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
authorzhugehyuk <icedac@users.noreply.github.com>2026-05-25 03:28:33 +0900
committerGitHub <noreply@github.com>2026-05-24 21:28:33 +0300
commit43c6ca3a5dbdcefc6c6dc29be9ce81d990baf39e (patch)
tree73be12f81129dab324ea08901c733a6a56ec0e61 /src/ui
parent5ce738cf5397d0d8a50ed1aa6335297073cc0f0f (diff)
feat: persist pane history across restarts (#248)
refs #217 Co-authored-by: Can Celik <ogulcancelik@gmail.com>
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/settings.rs97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/ui/settings.rs b/src/ui/settings.rs
index f104c882..2e5ae806 100644
--- a/src/ui/settings.rs
+++ b/src/ui/settings.rs
@@ -131,6 +131,9 @@ pub(super) fn render_settings_overlay(app: &AppState, frame: &mut Frame, area: R
app.settings.list.selected,
);
}
+ SettingsSection::Experiments => {
+ render_settings_experiments(app, frame, content_area);
+ }
SettingsSection::Integrations => {
render_settings_integrations(app, frame, content_area);
}
@@ -375,3 +378,97 @@ fn render_settings_toggle(
1,
);
}
+
+fn render_settings_experiments(app: &AppState, frame: &mut Frame, area: Rect) {
+ let p = &app.palette;
+ let [desc_area, _, list_area] = Layout::vertical([
+ Constraint::Length(2),
+ Constraint::Length(1),
+ Constraint::Min(1),
+ ])
+ .areas::<3>(area);
+
+ super::widgets::render_modal_description(
+ frame,
+ desc_area,
+ "optional features that are off by default",
+ Style::default().fg(p.overlay1),
+ );
+
+ let marker = if app.pane_history_persistence_enabled() {
+ "[✓]"
+ } else {
+ "[ ]"
+ };
+ let style = if app.settings.list.selected == 0 {
+ Style::default()
+ .bg(p.surface0)
+ .fg(p.text)
+ .add_modifier(Modifier::BOLD)
+ } else {
+ Style::default().fg(p.subtext0)
+ };
+ let row = Rect::new(list_area.x, list_area.y, list_area.width, 1);
+ frame.render_widget(
+ Paragraph::new(format!(" pane screen history {marker}")).style(style),
+ row,
+ );
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::app::{state::SettingsSection, Mode};
+ use ratatui::{backend::TestBackend, Terminal};
+
+ #[test]
+ fn experiments_pane_history_uses_settings_checkmark_marker() {
+ let mut app = AppState::test_new();
+ app.pane_history_persistence = true;
+ app.settings.section = SettingsSection::Experiments;
+ app.settings.list.selected = 0;
+ app.mode = Mode::Settings;
+
+ let mut terminal =
+ Terminal::new(TestBackend::new(80, 24)).expect("test terminal should initialize");
+ terminal
+ .draw(|frame| render_settings_overlay(&app, frame, Rect::new(0, 0, 80, 24)))
+ .expect("settings overlay should render");
+
+ let rendered = terminal
+ .backend()
+ .buffer()
+ .content()
+ .iter()
+ .map(|cell| cell.symbol())
+ .collect::<String>();
+
+ assert!(rendered.contains("pane screen history [✓]"));
+ assert!(!rendered.contains("[x]"));
+ }
+
+ #[test]
+ fn experiments_pane_history_keeps_empty_checkbox_marker_when_disabled() {
+ let mut app = AppState::test_new();
+ app.pane_history_persistence = false;
+ app.settings.section = SettingsSection::Experiments;
+ app.settings.list.selected = 0;
+ app.mode = Mode::Settings;
+
+ let mut terminal =
+ Terminal::new(TestBackend::new(80, 24)).expect("test terminal should initialize");
+ terminal
+ .draw(|frame| render_settings_overlay(&app, frame, Rect::new(0, 0, 80, 24)))
+ .expect("settings overlay should render");
+
+ let rendered = terminal
+ .backend()
+ .buffer()
+ .content()
+ .iter()
+ .map(|cell| cell.symbol())
+ .collect::<String>();
+
+ assert!(rendered.contains("pane screen history [ ]"));
+ }
+}