mirror of
https://github.com/ChrisTitusTech/linutil.git
synced 2024-11-22 05:12:27 +00:00
Compare commits
2 Commits
52252ff4b7
...
9aad900456
Author | SHA1 | Date | |
---|---|---|---|
|
9aad900456 | ||
|
12ba829d49 |
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -510,7 +510,6 @@ dependencies = [
|
||||||
"portable-pty",
|
"portable-pty",
|
||||||
"rand",
|
"rand",
|
||||||
"ratatui",
|
"ratatui",
|
||||||
"temp-dir",
|
|
||||||
"tree-sitter-bash",
|
"tree-sitter-bash",
|
||||||
"tree-sitter-highlight",
|
"tree-sitter-highlight",
|
||||||
"tui-term",
|
"tui-term",
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
use std::{
|
use std::{
|
||||||
fs::File,
|
fs::File,
|
||||||
io::{BufRead, BufReader, Read},
|
io::{BufRead, BufReader, Read},
|
||||||
|
ops::{Deref, DerefMut},
|
||||||
os::unix::fs::PermissionsExt,
|
os::unix::fs::PermissionsExt,
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
rc::Rc,
|
rc::Rc,
|
||||||
|
@ -14,8 +15,26 @@ use temp_dir::TempDir;
|
||||||
|
|
||||||
const TAB_DATA: Dir = include_dir!("$CARGO_MANIFEST_DIR/tabs");
|
const TAB_DATA: Dir = include_dir!("$CARGO_MANIFEST_DIR/tabs");
|
||||||
|
|
||||||
pub fn get_tabs(validate: bool) -> (TempDir, Vec<Tab>) {
|
// Allow the unused TempDir to be stored for later destructor call
|
||||||
let (temp_dir, tab_files) = TabList::get_tabs();
|
#[allow(dead_code)]
|
||||||
|
pub struct TabList(pub Vec<Tab>, TempDir);
|
||||||
|
|
||||||
|
// Implement deref to allow Vec<Tab> methods to be called on TabList
|
||||||
|
impl Deref for TabList {
|
||||||
|
type Target = Vec<Tab>;
|
||||||
|
|
||||||
|
fn deref(&self) -> &Self::Target {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl DerefMut for TabList {
|
||||||
|
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||||
|
&mut self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_tabs(validate: bool) -> TabList {
|
||||||
|
let (temp_dir, tab_files) = TabDirectories::get_tabs();
|
||||||
|
|
||||||
let tabs: Vec<_> = tab_files
|
let tabs: Vec<_> = tab_files
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
@ -62,11 +81,11 @@ pub fn get_tabs(validate: bool) -> (TempDir, Vec<Tab>) {
|
||||||
if tabs.is_empty() {
|
if tabs.is_empty() {
|
||||||
panic!("No tabs found");
|
panic!("No tabs found");
|
||||||
}
|
}
|
||||||
(temp_dir, tabs)
|
TabList(tabs, temp_dir)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
struct TabList {
|
struct TabDirectories {
|
||||||
directories: Vec<PathBuf>,
|
directories: Vec<PathBuf>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,9 +271,9 @@ fn is_executable(path: &Path) -> bool {
|
||||||
.unwrap_or(false)
|
.unwrap_or(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TabList {
|
impl TabDirectories {
|
||||||
fn get_tabs() -> (TempDir, Vec<PathBuf>) {
|
fn get_tabs() -> (TempDir, Vec<PathBuf>) {
|
||||||
let temp_dir = TempDir::new().unwrap();
|
let temp_dir = TempDir::with_prefix("linutil_scripts").unwrap();
|
||||||
TAB_DATA
|
TAB_DATA
|
||||||
.extract(&temp_dir)
|
.extract(&temp_dir)
|
||||||
.expect("Failed to extract the saved directory");
|
.expect("Failed to extract the saved directory");
|
||||||
|
|
|
@ -5,7 +5,7 @@ use std::rc::Rc;
|
||||||
use ego_tree::Tree;
|
use ego_tree::Tree;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
pub use inner::get_tabs;
|
pub use inner::{get_tabs, TabList};
|
||||||
|
|
||||||
#[derive(Clone, Hash, Eq, PartialEq)]
|
#[derive(Clone, Hash, Eq, PartialEq)]
|
||||||
pub enum Command {
|
pub enum Command {
|
||||||
|
|
|
@ -22,7 +22,6 @@ oneshot = "0.1.8"
|
||||||
portable-pty = "0.8.1"
|
portable-pty = "0.8.1"
|
||||||
ratatui = "0.28.1"
|
ratatui = "0.28.1"
|
||||||
tui-term = "0.1.12"
|
tui-term = "0.1.12"
|
||||||
temp-dir = "0.1.14"
|
|
||||||
unicode-width = "0.2.0"
|
unicode-width = "0.2.0"
|
||||||
rand = { version = "0.8.5", optional = true }
|
rand = { version = "0.8.5", optional = true }
|
||||||
linutil_core = { path = "../core", version = "24.9.28" }
|
linutil_core = { path = "../core", version = "24.9.28" }
|
||||||
|
|
|
@ -11,7 +11,7 @@ use crate::{
|
||||||
};
|
};
|
||||||
use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
|
use crossterm::event::{KeyCode, KeyEvent, KeyEventKind, KeyModifiers};
|
||||||
use ego_tree::NodeId;
|
use ego_tree::NodeId;
|
||||||
use linutil_core::{ListNode, Tab};
|
use linutil_core::{ListNode, TabList};
|
||||||
#[cfg(feature = "tips")]
|
#[cfg(feature = "tips")]
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use ratatui::{
|
use ratatui::{
|
||||||
|
@ -21,7 +21,6 @@ use ratatui::{
|
||||||
widgets::{Block, Borders, List, ListState, Paragraph},
|
widgets::{Block, Borders, List, ListState, Paragraph},
|
||||||
Frame,
|
Frame,
|
||||||
};
|
};
|
||||||
use temp_dir::TempDir;
|
|
||||||
|
|
||||||
const MIN_WIDTH: u16 = 77;
|
const MIN_WIDTH: u16 = 77;
|
||||||
const MIN_HEIGHT: u16 = 19;
|
const MIN_HEIGHT: u16 = 19;
|
||||||
|
@ -41,14 +40,12 @@ P* - privileged *
|
||||||
";
|
";
|
||||||
|
|
||||||
pub struct AppState {
|
pub struct AppState {
|
||||||
/// This must be passed to retain the temp dir until the end of the program
|
|
||||||
_temp_dir: TempDir,
|
|
||||||
/// Selected theme
|
/// Selected theme
|
||||||
theme: Theme,
|
theme: Theme,
|
||||||
/// Currently focused area
|
/// Currently focused area
|
||||||
pub focus: Focus,
|
pub focus: Focus,
|
||||||
/// List of tabs
|
/// List of tabs
|
||||||
tabs: Vec<Tab>,
|
tabs: TabList,
|
||||||
/// Current tab
|
/// Current tab
|
||||||
current_tab: ListState,
|
current_tab: ListState,
|
||||||
/// This stack keeps track of our "current directory". You can think of it as `pwd`. but not
|
/// This stack keeps track of our "current directory". You can think of it as `pwd`. but not
|
||||||
|
@ -81,11 +78,10 @@ pub struct ListEntry {
|
||||||
|
|
||||||
impl AppState {
|
impl AppState {
|
||||||
pub fn new(theme: Theme, override_validation: bool) -> Self {
|
pub fn new(theme: Theme, override_validation: bool) -> Self {
|
||||||
let (temp_dir, tabs) = linutil_core::get_tabs(!override_validation);
|
let tabs = linutil_core::get_tabs(!override_validation);
|
||||||
let root_id = tabs[0].tree.root().id();
|
let root_id = tabs[0].tree.root().id();
|
||||||
|
|
||||||
let mut state = Self {
|
let mut state = Self {
|
||||||
_temp_dir: temp_dir,
|
|
||||||
theme,
|
theme,
|
||||||
focus: Focus::List,
|
focus: Focus::List,
|
||||||
tabs,
|
tabs,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user