use std::collections::HashMap;
use std::hash::Hash;
use egui::{Response, Ui};
use elegance::MultiTerminal;
use crate::ansi::AnsiHandler;
use crate::backend::BackendHandle;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum OverflowPolicy {
#[default]
DropNewest,
DropOldest,
}
#[allow(dead_code)]
struct Pane {
backend: BackendHandle,
ansi: AnsiHandler,
}
#[allow(dead_code)] pub struct LiveMultiTerminal {
inner: MultiTerminal,
panes: HashMap<String, Pane>,
overflow: OverflowPolicy,
}
impl LiveMultiTerminal {
pub fn new(id_salt: impl Hash) -> Self {
Self {
inner: MultiTerminal::new(id_salt),
panes: HashMap::new(),
overflow: OverflowPolicy::default(),
}
}
pub fn overflow_policy(mut self, policy: OverflowPolicy) -> Self {
self.overflow = policy;
self
}
#[cfg(feature = "local")]
pub fn add_local_pane(
&mut self,
_id: impl Into<String>,
_config: crate::backend::local::LocalShellConfig,
) {
todo!("LiveMultiTerminal::add_local_pane — M1")
}
#[cfg(feature = "ssh")]
pub fn add_ssh_pane(
&mut self,
_id: impl Into<String>,
_config: crate::backend::ssh::SshConfig,
) {
todo!("LiveMultiTerminal::add_ssh_pane — M2")
}
pub fn controls(&mut self) -> LiveMultiTerminalControls<'_> {
LiveMultiTerminalControls {
inner: &mut self.inner,
}
}
pub fn show(&mut self, _ui: &mut Ui) -> Response {
todo!("LiveMultiTerminal::show — M1")
}
}
pub struct LiveMultiTerminalControls<'a> {
inner: &'a mut MultiTerminal,
}
impl<'a> LiveMultiTerminalControls<'a> {
pub fn toggle_broadcast(&mut self, id: &str) {
self.inner.toggle_broadcast(id);
}
pub fn solo(&mut self, id: &str) {
self.inner.solo(id);
}
pub fn solo_focused(&mut self) {
self.inner.solo_focused();
}
pub fn broadcast_all(&mut self) {
self.inner.broadcast_all();
}
pub fn invert_broadcast(&mut self) {
self.inner.invert_broadcast();
}
pub fn toggle_collapsed(&mut self, id: &str) {
self.inner.toggle_collapsed(id);
}
pub fn collapse_all(&mut self) {
self.inner.collapse_all();
}
pub fn expand_all(&mut self) {
self.inner.expand_all();
}
pub fn focused(&self) -> Option<&str> {
self.inner.focused()
}
pub fn set_focused(&mut self, id: Option<String>) {
self.inner.set_focused(id);
}
}