commit 86fc14c37c532d2aa6f2ede4dabd5929a7bea894 Author: lunarydess Date: Sat Feb 15 15:03:20 2025 +0100 :rocket: initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..956e389 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +.idea/ +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..ba4d9e6 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "Application-Catnip" +version = "0.0.0-develop" +edition = "2024" + +[dependencies] +egui = "0.31" +eframe = { version = "0.31", default-features = false, features = [ + "accesskit", "default_fonts", + "glow", "persistence", + "wayland", +] } +env_logger = "0.11" +serde = { version = "1", features = ["derive"] } +egui_code_editor = { git = "https://github.com/lunarydess/Application-Catnip-Editor.git", version = "0.3.0-develop" } diff --git a/src/app.rs b/src/app.rs new file mode 100644 index 0000000..41f997f --- /dev/null +++ b/src/app.rs @@ -0,0 +1,139 @@ +use eframe::epaint::text::TextWrapMode; +use egui::ThemePreference; +use egui_code_editor::{CodeEditor, ColorTheme, Syntax, DEFAULT_THEMES}; + +#[derive(serde::Deserialize, serde::Serialize)] +#[serde(default)] +pub struct TemplateApp { + label: String, + #[serde(skip)] + editor_theme: ColorTheme, + #[serde(skip)] + editor_syntax: Syntax, + #[serde(skip)] + value: f32, +} + +impl Default for TemplateApp { + fn default() -> Self { + Self { + label: "Hello World!".to_owned(), + editor_theme: ColorTheme::default(), + editor_syntax: Syntax::default(), + value: 2.7, + } + } +} + +impl TemplateApp { + pub fn new(cc: &eframe::CreationContext<'_>) -> Self { + if let Some(storage) = cc.storage { + return eframe::get_value(storage, eframe::APP_KEY).unwrap_or_default(); + } + Default::default() + } +} + +impl eframe::App for TemplateApp { + fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + // top bar + egui::TopBottomPanel::top("top_panel").show(ctx, |ui| { + egui::menu::bar(ui, |ui| { + let is_web = cfg!(target_arch = "wasm32"); + if !is_web { + ui.menu_button("File", |ui| { + if ui.button("Quit").clicked() { + ctx.send_viewport_cmd(egui::ViewportCommand::Close); + } + }); + } + + let mut theme = ui.ctx().options(|opt| opt.theme_preference); + egui::ComboBox::from_label("") + .wrap_mode(TextWrapMode::Wrap) + .selected_text(format!("{:?}", theme)) + .show_ui(ui, |ui| { + ui.selectable_value(&mut theme, ThemePreference::System, "💻 System"); + ui.selectable_value(&mut theme, ThemePreference::Light, "☀ Light"); + ui.selectable_value(&mut theme, ThemePreference::Dark, "🌙 Dark"); + }); + ui.ctx().set_theme(theme); + }); + }); + + // main content + egui::CentralPanel::default().show(ctx, |ui| { + ui.vertical_centered(|ui| { + ui.horizontal(|ui| { + // editor theme selector + egui::ComboBox::from_label("Theme") + .wrap_mode(TextWrapMode::Wrap) + .selected_text(format!("{:?}", &self.editor_theme.name)) + .show_ui(ui, |ui| { + let themes = DEFAULT_THEMES.iter().clone(); + for theme in themes { + ui.selectable_value(&mut self.editor_theme, *theme, theme.name); + } + }); + + // syntax selector + egui::ComboBox::from_label("Syntax") + .wrap_mode(TextWrapMode::Wrap) + .selected_text(format!("{:?}", &self.editor_syntax.language)) + .show_ui(ui, |ui| { + [ + Syntax::asm(), + Syntax::shell(), + Syntax::sql(), + Syntax::lua(), + Syntax::rust(), + Syntax::python(), + Syntax::java(), + ] + .iter() + .for_each(|syntax| { + ui.selectable_value( + &mut self.editor_syntax, + syntax.clone(), + syntax.language, + ); + }); + }); + }); + CodeEditor::default() + .id_source("cat editor :3") + .with_fontsize(12.0) + .with_theme(self.editor_theme) + .with_syntax(self.editor_syntax.clone()) + .with_numlines(true) + .show(ui, &mut self.label); + }); + + // header example: + // ui.heading("eframe template"); + + /* config examples with serde: + ui.horizontal(|ui| { + ui.label("Write something: "); + ui.te xt_edit_singleline(&mut self.label); + }); + + ui.add(egui::Slider::new(&mut self.value, 0.0..=10.0).text("value")); + */ + }); + + // bottom bar + egui::TopBottomPanel::bottom("bottom_panel").show(ctx, |ui| { + ui.horizontal(|ui| { + ui.spacing_mut().item_spacing.x = 0.0; + ui.label("made by "); + ui.hyperlink_to("lunarydess", "https://github.com/lunarydess"); + ui.label(" with ♡"); + }); + }); + } + + fn save(&mut self, storage: &mut dyn eframe::Storage) { + eframe::set_value(storage, eframe::APP_KEY, self); + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..954af26 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,2 @@ +mod app; +pub use app::TemplateApp; diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..cb72075 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,19 @@ +use eframe::Renderer; +use Application_Catnip::TemplateApp; + +fn main() { + env_logger::init(); + eframe::run_native( + "Meow", + eframe::NativeOptions { + centered: true, + renderer: Renderer::Glow, + viewport: egui::ViewportBuilder::default() + .with_inner_size([400.0, 300.0]) + .with_min_inner_size([300.0, 220.0]), + ..Default::default() + }, + Box::new(|context| Ok(Box::new(TemplateApp::new(context)))), + ) + .expect("TODO: panic message"); +}