project to code

This commit is contained in:
Penwing 2024-02-02 20:10:41 +01:00
parent bb35ce3295
commit 69fd6fdda2
2 changed files with 53 additions and 16 deletions

View file

@ -81,7 +81,7 @@ impl Calcifer {
ui.separator();
});
});
self.n_file_displayed = n_files.clone();
self.n_file_displayed = n_files;
}
pub fn draw_bottom_tray(&mut self, ctx: &egui::Context) {
@ -288,16 +288,24 @@ impl Calcifer {
}
fn draw_project_file(&mut self, ui: &mut egui::Ui) {
panels::draw_project(ui, self.theme.clone(), &mut self.project_content);
let current_tab = &mut self.tabs[self.selected_tab.to_index()];
self.project_content
.update_from_code(current_tab.code.clone());
panels::draw_project(ui, self.theme, &mut self.project_content);
match self.project_content.save_to_code() {
Ok(code) => current_tab.code = code,
Err(_err) => (),
}
}
pub fn draw_windows(&mut self, ctx: &egui::Context) {
if self.project_content.item_window.visible {
if self.project_content.categories.len() > 1
&& self.project_content.categories[self.project_content.selected_item.category]
&& !self.project_content.categories[self.project_content.selected_item.category]
.content
.len()
> 0
.is_empty()
{
self.project_content.item_window.show(
ctx,

View file

@ -1,4 +1,5 @@
use eframe::egui;
use serde::{Deserialize, Serialize};
use std::{
cmp::min,
sync::atomic::{AtomicUsize, Ordering},
@ -9,6 +10,19 @@ use crate::editor::ColorTheme;
use crate::sub_windows;
use crate::MAX_PROJECT_COLUMNS;
#[derive(Serialize, Deserialize)]
pub struct ProjectSave {
pub categories: Vec<Category>,
}
impl ProjectSave {
pub fn from_project(project: &Project) -> Self {
Self {
categories: project.categories.clone(),
}
}
}
pub struct Project {
pub categories: Vec<Category>,
pub selected_item: Location,
@ -26,6 +40,17 @@ impl Project {
}
}
pub fn update_from_code(&mut self, json: String) {
match serde_json::from_str::<ProjectSave>(&json) {
Ok(project_save) => self.categories = project_save.categories,
Err(_err) => self.categories = vec![Category::create()],
}
}
pub fn save_to_code(&self) -> Result<String, std::io::Error> {
Ok(serde_json::to_string(&ProjectSave::from_project(self))?)
}
fn add_category(&mut self) {
let last = self.categories.len() - 1;
self.categories[last].initialize();
@ -43,7 +68,7 @@ impl Project {
}
}
#[derive(Clone)]
#[derive(Clone, Serialize, Deserialize)]
pub struct Category {
name: String,
pub content: Vec<Item>,
@ -62,7 +87,7 @@ impl Category {
}
}
#[derive(Clone, Hash)]
#[derive(Clone, Hash, Serialize, Deserialize)]
pub struct Item {
pub name: String,
pub description: String,
@ -147,20 +172,24 @@ pub fn draw_project(ui: &mut egui::Ui, theme: ColorTheme, project: &mut Project)
}
}
}
if category.name != "+" {
if ui.add(egui::Button::new("+")).clicked() {
project.categories[category_index]
.content
.push(Item::new("item"));
}
if category.name != "+" && ui.add(egui::Button::new("+")).clicked() {
project.categories[category_index]
.content
.push(Item::new("item"));
}
// if category.name != "+" {
// if ui.add(egui::Button::new("+")).clicked() {
// project.categories[category_index]
// .content
// .push(Item::new("item"));
// }
// }
}
});
let mut moved = false;
let category = project.selected_item.category.clone();
let row = project.selected_item.row.clone();
let category = project.selected_item.category;
let row = project.selected_item.row;
if ui.input(|i| i.key_pressed(egui::Key::ArrowLeft) && i.modifiers.shift)
&& project.selected_item.category > 0