summaryrefslogtreecommitdiffstats
path: root/default-plugins/session-manager/src/main.rs
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2023-11-04 11:20:50 +0100
committerGitHub <noreply@github.com>2023-11-04 11:20:50 +0100
commit4c6b03acc16c968663d2875556aae25ef6dac87c (patch)
tree679530bd592cd7e5bfcedbc4e3f49708618b4886 /default-plugins/session-manager/src/main.rs
parent37bc6364fa0a906616b1abafceb84e2c8511045d (diff)
feat(sessions): resurrect sessions through the session-manager (and plugin API) (#2902)
* working with table and scrolling * ui and functionality complete * fix formatting * refactor: background jobs * style(fmt): rustfmt
Diffstat (limited to 'default-plugins/session-manager/src/main.rs')
-rw-r--r--default-plugins/session-manager/src/main.rs52
1 files changed, 47 insertions, 5 deletions
diff --git a/default-plugins/session-manager/src/main.rs b/default-plugins/session-manager/src/main.rs
index bd0b1f2b7..7e39307d9 100644
--- a/default-plugins/session-manager/src/main.rs
+++ b/default-plugins/session-manager/src/main.rs
@@ -1,3 +1,4 @@
+mod resurrectable_sessions;
mod session_list;
mod ui;
use zellij_tile::prelude::*;
@@ -5,18 +6,24 @@ use zellij_tile::prelude::*;
use std::collections::BTreeMap;
use ui::{
- components::{render_controls_line, render_new_session_line, render_prompt, Colors},
+ components::{
+ render_controls_line, render_new_session_line, render_prompt, render_resurrection_toggle,
+ Colors,
+ },
SessionUiInfo,
};
+use resurrectable_sessions::ResurrectableSessions;
use session_list::SessionList;
#[derive(Default)]
struct State {
session_name: Option<String>,
sessions: SessionList,
+ resurrectable_sessions: ResurrectableSessions,
search_term: String,
new_session_name: Option<String>,
+ browsing_resurrection_sessions: bool,
colors: Colors,
}
@@ -45,7 +52,9 @@ impl ZellijPlugin for State {
Event::PermissionRequestResult(_result) => {
should_render = true;
},
- Event::SessionUpdate(session_infos) => {
+ Event::SessionUpdate(session_infos, resurrectable_session_list) => {
+ self.resurrectable_sessions
+ .update(resurrectable_session_list);
self.update_session_infos(session_infos);
should_render = true;
},
@@ -55,6 +64,11 @@ impl ZellijPlugin for State {
}
fn render(&mut self, rows: usize, cols: usize) {
+ if self.browsing_resurrection_sessions {
+ self.resurrectable_sessions.render(rows, cols);
+ return;
+ }
+ render_resurrection_toggle(cols, false);
render_prompt(
self.new_session_name.is_some(),
&self.search_term,
@@ -94,12 +108,16 @@ impl State {
}
should_render = true;
} else if let Key::Down = key {
- if self.new_session_name.is_none() {
+ if self.browsing_resurrection_sessions {
+ self.resurrectable_sessions.move_selection_down();
+ } else if self.new_session_name.is_none() {
self.sessions.move_selection_down();
}
should_render = true;
} else if let Key::Up = key {
- if self.new_session_name.is_none() {
+ if self.browsing_resurrection_sessions {
+ self.resurrectable_sessions.move_selection_up();
+ } else if self.new_session_name.is_none() {
self.sessions.move_selection_up();
}
should_render = true;
@@ -108,6 +126,8 @@ impl State {
self.handle_selection();
} else if let Some(new_session_name) = self.new_session_name.as_mut() {
new_session_name.push(character);
+ } else if self.browsing_resurrection_sessions {
+ self.resurrectable_sessions.handle_character(character);
} else {
self.search_term.push(character);
self.sessions
@@ -121,6 +141,8 @@ impl State {
} else {
new_session_name.pop();
}
+ } else if self.browsing_resurrection_sessions {
+ self.resurrectable_sessions.handle_backspace();
} else {
self.search_term.pop();
self.sessions
@@ -153,13 +175,33 @@ impl State {
hide_self();
}
should_render = true;
+ } else if let Key::BackTab = key {
+ self.browsing_resurrection_sessions = !self.browsing_resurrection_sessions;
+ should_render = true;
+ } else if let Key::Delete = key {
+ if self.browsing_resurrection_sessions {
+ self.resurrectable_sessions.delete_selected_session();
+ should_render = true;
+ }
+ } else if let Key::Ctrl('d') = key {
+ if self.browsing_resurrection_sessions {
+ self.resurrectable_sessions
+ .show_delete_all_sessions_warning();
+ should_render = true;
+ }
} else if let Key::Esc = key {
hide_self();
}
should_render
}
fn handle_selection(&mut self) {
- if let Some(new_session_name) = &self.new_session_name {
+ if self.browsing_resurrection_sessions {
+ if let Some(session_name_to_resurrect) =
+ self.resurrectable_sessions.get_selected_session_name()
+ {
+ switch_session(Some(&session_name_to_resurrect));
+ }
+ } else if let Some(new_session_name) = &self.new_session_name {
if new_session_name.is_empty() {
switch_session(None);
} else if self.session_name.as_ref() == Some(new_session_name) {