From 3a27560ab14649db37cd9bf0a7e88b2f0b5cddaf Mon Sep 17 00:00:00 2001 From: Benjamin Klum Date: Thu, 26 Sep 2024 14:59:46 +0200 Subject: [PATCH] #1219 Add menu entry "Edit compartment-wide Lua code" --- main/src/infrastructure/ui/header_panel.rs | 42 +++++++++++++++++-- .../ui/simple_script_editor_panel.rs | 25 +++++++++++ 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/main/src/infrastructure/ui/header_panel.rs b/main/src/infrastructure/ui/header_panel.rs index 7c470010..a7af6e10 100644 --- a/main/src/infrastructure/ui/header_panel.rs +++ b/main/src/infrastructure/ui/header_panel.rs @@ -55,9 +55,9 @@ use crate::infrastructure::ui::{ deserialize_data_object, deserialize_data_object_from_json, dry_run_lua_script, get_text_from_clipboard, menus, serialize_data_object, serialize_data_object_to_json, serialize_data_object_to_lua, DataObject, GroupFilter, GroupPanel, IndependentPanelManager, - MappingRowsPanel, PlainTextEngine, ScriptEditorInput, SearchExpression, SerializationFormat, - SharedIndependentPanelManager, SharedMainState, SimpleScriptEditorPanel, SourceFilter, - UntaggedDataObject, + LuaCompartmentCommonScriptEngine, MappingRowsPanel, PlainTextEngine, ScriptEditorInput, + SearchExpression, SerializationFormat, SharedIndependentPanelManager, SharedMainState, + SimpleScriptEditorPanel, SourceFilter, UntaggedDataObject, }; use crate::infrastructure::ui::{dialog_util, CompanionAppPresenter}; use anyhow::{bail, Context}; @@ -139,6 +139,36 @@ impl HeaderPanel { self.open_extra_panel(editor); } + fn edit_compartment_common_lua(&self) { + let compartment = self.active_compartment(); + let session = self.session(); + let initial_notes = session + .borrow() + .compartment_common_lua(compartment) + .to_owned(); + let weak_session = self.session.clone(); + let input = ScriptEditorInput { + initial_value: initial_notes, + engine: Box::new(LuaCompartmentCommonScriptEngine::new()), + help_url: "", + set_value: move |edited_notes| { + let weak_session = weak_session.clone(); + if let Some(session) = weak_session.upgrade() { + session.borrow_mut().change_with_notification( + SessionCommand::ChangeCompartment( + compartment, + CompartmentCommand::SetCommonLua(edited_notes), + ), + None, + weak_session, + ) + } + }, + }; + let editor = SimpleScriptEditorPanel::new(input); + self.open_extra_panel(editor); + } + fn open_extra_panel(&self, panel: impl View + 'static) { open_child_panel_dyn(&self.extra_panel, panel, self.view.require_window()); } @@ -548,6 +578,10 @@ impl HeaderPanel { ), ], ), + item( + "Edit compartment-wide Lua code", + MainMenuAction::EditCompartmentWideLuaCode, + ), labeled_separator("Unit-related"), // Unit scope menu( @@ -855,6 +889,7 @@ impl HeaderPanel { self.create_compartment_preset_workspace(true) } MainMenuAction::ReloadAllCompartmentPresets => self.reload_all_compartment_presets(), + MainMenuAction::EditCompartmentWideLuaCode => self.edit_compartment_common_lua(), MainMenuAction::OpenPotBrowser => { self.show_pot_browser(); } @@ -3115,6 +3150,7 @@ enum MainMenuAction { EditCompartmentParameter(CompartmentKind, RangeInclusive), SendFeedbackNow, LogDebugInfo, + EditCompartmentWideLuaCode, CreateCompartmentPresetWorkspace, CreateCompartmentPresetWorkspaceIncludingFactoryPresets, } diff --git a/main/src/infrastructure/ui/simple_script_editor_panel.rs b/main/src/infrastructure/ui/simple_script_editor_panel.rs index 5f3cc581..42a852ff 100644 --- a/main/src/infrastructure/ui/simple_script_editor_panel.rs +++ b/main/src/infrastructure/ui/simple_script_editor_panel.rs @@ -74,6 +74,31 @@ impl ScriptEngine for LuaFeedbackScriptEngine { } } +pub struct LuaCompartmentCommonScriptEngine { + lua: SafeLua, +} + +impl LuaCompartmentCommonScriptEngine { + pub fn new() -> Self { + Self { + lua: SafeLua::new().unwrap(), + } + } +} + +impl ScriptEngine for LuaCompartmentCommonScriptEngine { + fn compile(&self, code: &str) -> Result, Box> { + let env = self.lua.create_fresh_environment(false)?; + self.lua + .compile_as_function("Feedback script", code, env.clone())?; + Ok(Box::new(())) + } + + fn file_extension(&self) -> &'static str { + ".lua" + } +} + pub struct PlainTextEngine; impl ScriptEngine for PlainTextEngine {