fixed path
This commit is contained in:
parent
16650a2ca1
commit
0f7a95bff3
|
@ -1,11 +1,10 @@
|
||||||
use eframe::egui;
|
use eframe::egui;
|
||||||
use egui::{text::CCursor, text_edit::CCursorRange, Rangef};
|
use egui::{text::CCursor, text_edit::CCursorRange, Rangef};
|
||||||
use std::{cmp::max, env, path::Path, path::PathBuf};
|
use std::{cmp::max, env, path::PathBuf};// path::Path,
|
||||||
|
|
||||||
use crate::tools;
|
use crate::tools;
|
||||||
use crate::Calcifer;
|
use crate::Calcifer;
|
||||||
use crate::MAX_TABS;
|
use crate::MAX_TABS;
|
||||||
use crate::PATH_ROOT;
|
|
||||||
use crate::PROJECT_EXTENSION;
|
use crate::PROJECT_EXTENSION;
|
||||||
use tools::hex_str_to_color;
|
use tools::hex_str_to_color;
|
||||||
|
|
||||||
|
@ -23,7 +22,7 @@ impl Calcifer {
|
||||||
ui.vertical(|ui| {
|
ui.vertical(|ui| {
|
||||||
if ui.add(egui::Button::new("📁")).clicked() {
|
if ui.add(egui::Button::new("📁")).clicked() {
|
||||||
if let Some(path) = rfd::FileDialog::new()
|
if let Some(path) = rfd::FileDialog::new()
|
||||||
.set_directory(Path::new(&PATH_ROOT))
|
.set_directory(self.home.as_path())
|
||||||
.pick_file()
|
.pick_file()
|
||||||
{
|
{
|
||||||
self.open_file(Some(&path));
|
self.open_file(Some(&path));
|
||||||
|
@ -55,10 +54,21 @@ impl Calcifer {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
egui::SidePanel::left("file_tree_panel").show(ctx, |ui| {
|
egui::SidePanel::left("file_tree_panel").show(ctx, |ui| {
|
||||||
ui.heading("Bookshelf");
|
ui.horizontal(|ui| {
|
||||||
|
ui.label("Bookshelf ");
|
||||||
|
if ui.add(egui::Button::new("📖")).clicked() {
|
||||||
|
self.file_tree = tools::file_tree::generate_file_tree(self.home.as_path(), 7);
|
||||||
|
}
|
||||||
|
});
|
||||||
ui.separator();
|
ui.separator();
|
||||||
let _ = self.list_files(ui, Path::new(&PATH_ROOT));
|
let mut n_files : usize = 0;
|
||||||
|
if let Some(file_tree) = self.file_tree.clone() {
|
||||||
|
self.list_files(ui, &file_tree, 1, &mut n_files);
|
||||||
|
} else {
|
||||||
|
ui.label("No book on the Bookshelf");
|
||||||
|
}
|
||||||
ui.separator();
|
ui.separator();
|
||||||
|
ui.label(format!("{} files displayed", n_files));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,7 +206,7 @@ impl Calcifer {
|
||||||
pub fn draw_content_panel(&mut self, ctx: &egui::Context) {
|
pub fn draw_content_panel(&mut self, ctx: &egui::Context) {
|
||||||
egui::CentralPanel::default().show(ctx, |ui| {
|
egui::CentralPanel::default().show(ctx, |ui| {
|
||||||
ui.horizontal(|ui| {
|
ui.horizontal(|ui| {
|
||||||
if ui.add(egui::Button::new("open in terminal")).clicked() {
|
if ui.add(egui::Button::new("open directory in terminal")).clicked() {
|
||||||
let mut path = self.tabs[self.selected_tab.to_index()].path.clone();
|
let mut path = self.tabs[self.selected_tab.to_index()].path.clone();
|
||||||
path.pop();
|
path.pop();
|
||||||
tools::send_command(format!("cd {}", path.display()));
|
tools::send_command(format!("cd {}", path.display()));
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
use eframe::egui;
|
use eframe::egui;
|
||||||
use egui::Color32;
|
use egui::Color32;
|
||||||
use std::{cmp::min, ffi::OsStr, fs, io, path::Path, path::PathBuf};
|
use std::{cmp::min, fs, path::Path, path::PathBuf};
|
||||||
|
|
||||||
use crate::tools;
|
use crate::tools;
|
||||||
use crate::Calcifer;
|
use crate::Calcifer;
|
||||||
use crate::DEFAULT_THEMES;
|
use crate::DEFAULT_THEMES;
|
||||||
use crate::MAX_TABS;
|
use crate::MAX_TABS;
|
||||||
use crate::PATH_ROOT;
|
|
||||||
use crate::SAVE_PATH;
|
|
||||||
use crate::TIME_LABELS;
|
use crate::TIME_LABELS;
|
||||||
|
use crate::save_path;
|
||||||
use tools::hex_str_to_color;
|
use tools::hex_str_to_color;
|
||||||
|
use tools::file_tree;
|
||||||
|
|
||||||
impl Calcifer {
|
impl Calcifer {
|
||||||
pub fn handle_confirm(&mut self) {
|
pub fn handle_confirm(&mut self) {
|
||||||
|
@ -45,7 +45,7 @@ impl Calcifer {
|
||||||
|
|
||||||
pub fn save_tab_as(&self) -> Option<PathBuf> {
|
pub fn save_tab_as(&self) -> Option<PathBuf> {
|
||||||
if let Some(path) = rfd::FileDialog::new()
|
if let Some(path) = rfd::FileDialog::new()
|
||||||
.set_directory(Path::new(&PATH_ROOT))
|
.set_directory(self.home.as_path())
|
||||||
.save_file()
|
.save_file()
|
||||||
{
|
{
|
||||||
if let Err(err) = fs::write(&path, &self.tabs[self.selected_tab.to_index()].code) {
|
if let Err(err) = fs::write(&path, &self.tabs[self.selected_tab.to_index()].code) {
|
||||||
|
@ -107,7 +107,7 @@ impl Calcifer {
|
||||||
theme: state_theme,
|
theme: state_theme,
|
||||||
};
|
};
|
||||||
|
|
||||||
let _ = tools::save_state(&app_state, SAVE_PATH);
|
let _ = tools::save_state(&app_state, save_path().as_path());
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn move_through_tabs(&mut self, forward: bool) {
|
pub fn move_through_tabs(&mut self, forward: bool) {
|
||||||
|
@ -122,55 +122,6 @@ impl Calcifer {
|
||||||
self.selected_tab = tools::TabNumber::from_index(new_index);
|
self.selected_tab = tools::TabNumber::from_index(new_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn list_files(&mut self, ui: &mut egui::Ui, path: &Path) -> io::Result<()> {
|
|
||||||
if path.file_name().is_none() {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
|
|
||||||
let name = path
|
|
||||||
.file_name()
|
|
||||||
.unwrap_or_else(|| OsStr::new(""))
|
|
||||||
.to_string_lossy()
|
|
||||||
.into_owned();
|
|
||||||
|
|
||||||
if !path.is_dir() {
|
|
||||||
if ui.button(name).clicked() {
|
|
||||||
self.open_file(Some(path));
|
|
||||||
}
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
|
|
||||||
egui::CollapsingHeader::new(name).show(ui, |ui| match fs::read_dir(path) {
|
|
||||||
Err(err) => {
|
|
||||||
ui.label(format!("Error reading directory: {}", err));
|
|
||||||
}
|
|
||||||
Ok(entries) => {
|
|
||||||
let mut paths: Vec<Result<fs::DirEntry, io::Error>> = entries
|
|
||||||
.map(|r| r.map_err(|e| io::Error::new(io::ErrorKind::Other, e)))
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
paths.sort_by(|a, b| match (a, b) {
|
|
||||||
(Ok(entry_a), Ok(entry_b)) => tools::sort_directories_first(entry_a, entry_b),
|
|
||||||
(Err(_), Ok(_)) => std::cmp::Ordering::Greater,
|
|
||||||
(Ok(_), Err(_)) => std::cmp::Ordering::Less,
|
|
||||||
(Err(_), Err(_)) => std::cmp::Ordering::Equal,
|
|
||||||
});
|
|
||||||
|
|
||||||
for result in paths {
|
|
||||||
match result {
|
|
||||||
Ok(entry) => {
|
|
||||||
let _ = self.list_files(ui, &entry.path());
|
|
||||||
}
|
|
||||||
Err(err) => {
|
|
||||||
ui.label(format!("Error processing directory entry: {}", err));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn open_file(&mut self, path_option: Option<&Path>) {
|
pub fn open_file(&mut self, path_option: Option<&Path>) {
|
||||||
if let Some(path) = path_option.clone() {
|
if let Some(path) = path_option.clone() {
|
||||||
for (index, tab) in self.tabs.clone().iter().enumerate() {
|
for (index, tab) in self.tabs.clone().iter().enumerate() {
|
||||||
|
@ -234,4 +185,32 @@ impl Calcifer {
|
||||||
));
|
));
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn list_files(&mut self, ui: &mut egui::Ui, file: &file_tree::File, depth: isize, n_files: &mut usize) {
|
||||||
|
*n_files += 1;
|
||||||
|
|
||||||
|
if let Some(folder_content) = &file.folder_content {
|
||||||
|
let collapsing_response = egui::CollapsingHeader::new(file.name.clone())
|
||||||
|
.default_open(depth > 0)
|
||||||
|
.show(ui, |ui| {
|
||||||
|
if !self.tree_dir_opened.contains(&file.name) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for deeper_file in folder_content {
|
||||||
|
self.list_files(ui, &deeper_file, depth - 1, n_files);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if collapsing_response.fully_closed() {
|
||||||
|
self.tree_dir_opened.retain(|s| s != &file.name);
|
||||||
|
} else {
|
||||||
|
if !self.tree_dir_opened.contains(&file.name) {
|
||||||
|
self.tree_dir_opened.push(file.name.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ui.button(&file.name).clicked() {
|
||||||
|
self.open_file(Some(&file.path));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
40
src/main.rs
40
src/main.rs
|
@ -6,25 +6,21 @@ use eframe::egui;
|
||||||
use egui::FontFamily::Proportional;
|
use egui::FontFamily::Proportional;
|
||||||
use egui::FontId;
|
use egui::FontId;
|
||||||
use egui::TextStyle::{Body, Button, Heading, Monospace, Small};
|
use egui::TextStyle::{Body, Button, Heading, Monospace, Small};
|
||||||
use std::{ops::Range, path::Path, sync::Arc, thread, time};
|
use std::{ops::Range, path::PathBuf, sync::Arc, thread, time};
|
||||||
|
use homedir::get_my_home;
|
||||||
|
|
||||||
use calcifer::code_editor::themes::DEFAULT_THEMES;
|
use calcifer::code_editor::themes::DEFAULT_THEMES;
|
||||||
|
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
mod build {
|
const TITLE: &str = " debug";
|
||||||
pub const SAVE_PATH: &str = "/home/penwing/Documents/.save/debug/calcifer_save.json";
|
|
||||||
pub const TITLE: &str = " debug";
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(debug_assertions))]
|
#[cfg(not(debug_assertions))]
|
||||||
mod build {
|
const TITLE: &str = "";
|
||||||
pub const SAVE_PATH: &str = "/home/penwing/Documents/.save/calcifer_save.json";
|
|
||||||
pub const TITLE: &str = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
use build::SAVE_PATH;
|
|
||||||
use build::TITLE;
|
|
||||||
|
|
||||||
|
const ALLOWED_FILE_EXTENSIONS: [&str; 6] = [
|
||||||
|
"", "rs", "toml", "txt", "project", "sh",
|
||||||
|
];
|
||||||
const PROJECT_EXTENSION: &str = "project";
|
const PROJECT_EXTENSION: &str = "project";
|
||||||
const TERMINAL_HEIGHT: f32 = 200.0;
|
const TERMINAL_HEIGHT: f32 = 200.0;
|
||||||
const TERMINAL_RANGE: Range<f32> = 100.0..500.0;
|
const TERMINAL_RANGE: Range<f32> = 100.0..500.0;
|
||||||
|
@ -33,7 +29,6 @@ const TIME_LABELS: [&str; 7] = [
|
||||||
"input", "settings", "tree", "terminal", "tabs", "content", "windows",
|
"input", "settings", "tree", "terminal", "tabs", "content", "windows",
|
||||||
];
|
];
|
||||||
const MAX_FPS: f32 = 30.0;
|
const MAX_FPS: f32 = 30.0;
|
||||||
const PATH_ROOT: &str = "/home/penwing/Documents/";
|
|
||||||
const DISPLAY_PATH_DEPTH: usize = 3;
|
const DISPLAY_PATH_DEPTH: usize = 3;
|
||||||
const MAX_TABS: usize = 20;
|
const MAX_TABS: usize = 20;
|
||||||
|
|
||||||
|
@ -48,8 +43,8 @@ fn main() -> Result<(), eframe::Error> {
|
||||||
};
|
};
|
||||||
|
|
||||||
// Attempt to load previous state
|
// Attempt to load previous state
|
||||||
let app_state: tools::AppState = if Path::new(SAVE_PATH).exists() {
|
let app_state: tools::AppState = if save_path().exists() {
|
||||||
match tools::load_state(SAVE_PATH) {
|
match tools::load_state(save_path().as_path()) {
|
||||||
Ok(app_state) => app_state,
|
Ok(app_state) => app_state,
|
||||||
Err(_) => tools::AppState::default(),
|
Err(_) => tools::AppState::default(),
|
||||||
}
|
}
|
||||||
|
@ -76,6 +71,10 @@ struct Calcifer {
|
||||||
|
|
||||||
project_mode: bool,
|
project_mode: bool,
|
||||||
|
|
||||||
|
home: PathBuf,
|
||||||
|
tree_dir_opened: Vec<String>,
|
||||||
|
file_tree: Option<tools::file_tree::File>,
|
||||||
|
|
||||||
tree_visible: bool,
|
tree_visible: bool,
|
||||||
profiler_visible: bool,
|
profiler_visible: bool,
|
||||||
terminal_visible: bool,
|
terminal_visible: bool,
|
||||||
|
@ -107,6 +106,10 @@ impl Default for Calcifer {
|
||||||
|
|
||||||
project_mode: true,
|
project_mode: true,
|
||||||
|
|
||||||
|
home: get_my_home().unwrap().unwrap(),
|
||||||
|
tree_dir_opened: vec![],
|
||||||
|
file_tree: None,
|
||||||
|
|
||||||
tree_visible: false,
|
tree_visible: false,
|
||||||
profiler_visible: false,
|
profiler_visible: false,
|
||||||
terminal_visible: false,
|
terminal_visible: false,
|
||||||
|
@ -250,3 +253,12 @@ impl eframe::App for Calcifer {
|
||||||
self.save_state();
|
self.save_state();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn save_path() -> PathBuf {
|
||||||
|
if TITLE.is_empty() {
|
||||||
|
get_my_home().unwrap().unwrap().as_path().join(".calcifer").join("save.json").to_path_buf()
|
||||||
|
} else {
|
||||||
|
get_my_home().unwrap().unwrap().as_path().join(".calcifer").join("debug").join("save.json").to_path_buf()
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue