diff --git a/editor/limbo_ai_editor_plugin.cpp b/editor/limbo_ai_editor_plugin.cpp index a18ea65..1815a62 100644 --- a/editor/limbo_ai_editor_plugin.cpp +++ b/editor/limbo_ai_editor_plugin.cpp @@ -316,6 +316,12 @@ void LimboAIEditor::_remove_task_from_favorite(const String &p_task) { ProjectSettings::get_singleton()->save(); } +void LimboAIEditor::_save_and_restart() { + ProjectSettings::get_singleton()->save(); + EditorNode::get_singleton()->save_all_scenes(); + EditorNode::get_singleton()->restart_editor(); +} + void LimboAIEditor::_extract_subtree(const String &p_path) { Ref selected = task_tree->get_selected(); ERR_FAIL_COND(selected.is_null()); @@ -699,6 +705,16 @@ void LimboAIEditor::_misc_option_selected(int p_id) { case MISC_PROJECT_SETTINGS: { _edit_project_settings(); } break; + case MISC_LAYOUT_CLASSIC: { + EDITOR_SETTINGS()->set_setting("limbo_ai/editor/layout", LAYOUT_CLASSIC); + EDITOR_SETTINGS()->save(); + _update_banners(); + } break; + case MISC_LAYOUT_WIDESCREEN_OPTIMIZED: { + EDITOR_SETTINGS()->set_setting("limbo_ai/editor/layout", LAYOUT_WIDESCREEN_OPTIMIZED); + EDITOR_SETTINGS()->save(); + _update_banners(); + } break; case MISC_CREATE_SCRIPT_TEMPLATE: { String template_path = _get_script_template_path(); String template_dir = template_path.get_base_dir(); @@ -1217,6 +1233,20 @@ void LimboAIEditor::_update_misc_menu() { #endif // LIMBOAI_MODULE misc_menu->add_item(TTR("Project Settings..."), MISC_PROJECT_SETTINGS); + PopupMenu *layout_menu = Object::cast_to(misc_menu->get_node_or_null(NodePath("LayoutMenu"))); + if (layout_menu == nullptr) { + layout_menu = memnew(PopupMenu); + layout_menu->set_name("LayoutMenu"); + layout_menu->connect(LW_NAME(id_pressed), callable_mp(this, &LimboAIEditor::_misc_option_selected)); + misc_menu->add_child(layout_menu); + } + layout_menu->add_radio_check_item(TTR("Classic"), MISC_LAYOUT_CLASSIC); + layout_menu->add_radio_check_item(TTR("Widescreen Optimized"), MISC_LAYOUT_WIDESCREEN_OPTIMIZED); + misc_menu->add_submenu_item(TTR("Layout"), "LayoutMenu"); + EditorLayout saved_layout = (EditorLayout)(int)EDITOR_GET("limbo_ai/editor/layout"); + layout_menu->set_item_checked(0, saved_layout == LAYOUT_CLASSIC); + layout_menu->set_item_checked(1, saved_layout == LAYOUT_WIDESCREEN_OPTIMIZED); + misc_menu->add_separator(); misc_menu->add_item( FILE_EXISTS(_get_script_template_path()) ? TTR("Edit Script Template") : TTR("Create Script Template"), @@ -1257,6 +1287,15 @@ void LimboAIEditor::_update_banners() { banners->call_deferred(LW_NAME(add_child), banner); } } + + EditorLayout saved_layout = (EditorLayout)(int)EDITOR_GET("limbo_ai/editor/layout"); + if (saved_layout != editor_layout) { + ActionBanner *banner = memnew(ActionBanner); + banner->set_text(TTR("Restart required to apply changes to editor layout.")); + banner->add_action(TTR("Save & Restart"), callable_mp(this, &LimboAIEditor::_save_and_restart), true); + banner->set_meta(LW_NAME(managed), Variant(true)); + banners->call_deferred(LW_NAME(add_child), banner); + } } void LimboAIEditor::_do_update_theme_item_cache() { @@ -1570,7 +1609,7 @@ LimboAIEditor::LimboAIEditor() { hsc->add_child(task_palette); editor_layout = (EditorLayout)(int)EDITOR_GET("limbo_ai/editor/layout"); - if (editor_layout == EditorLayout::WIDESCREEN_OPTIMIZED) { + if (editor_layout == LAYOUT_WIDESCREEN_OPTIMIZED) { // * Alternative layout optimized for wide screen. VBoxContainer *sidebar_vbox = memnew(VBoxContainer); hsc->add_child(sidebar_vbox); @@ -1600,7 +1639,7 @@ LimboAIEditor::LimboAIEditor() { usage_hint->reparent(editor_vbox); } - hsc->set_split_offset((editor_layout == EditorLayout::CLASSIC ? -320 : 320) * EDSCALE); + hsc->set_split_offset((editor_layout == LAYOUT_CLASSIC ? -320 : 320) * EDSCALE); change_type_popup = memnew(PopupPanel); add_child(change_type_popup); diff --git a/editor/limbo_ai_editor_plugin.h b/editor/limbo_ai_editor_plugin.h index bda549c..57ba68c 100644 --- a/editor/limbo_ai_editor_plugin.h +++ b/editor/limbo_ai_editor_plugin.h @@ -98,6 +98,8 @@ private: MISC_DOC_INTRODUCTION, MISC_DOC_CUSTOM_TASKS, MISC_OPEN_DEBUGGER, + MISC_LAYOUT_CLASSIC, + MISC_LAYOUT_WIDESCREEN_OPTIMIZED, MISC_PROJECT_SETTINGS, MISC_CREATE_SCRIPT_TEMPLATE, }; @@ -112,8 +114,8 @@ private: }; enum EditorLayout { - CLASSIC, - WIDESCREEN_OPTIMIZED, + LAYOUT_CLASSIC, + LAYOUT_WIDESCREEN_OPTIMIZED, }; struct ThemeCache { @@ -201,6 +203,7 @@ private: void _mark_as_dirty(bool p_dirty); void _create_user_task_dir(); void _remove_task_from_favorite(const String &p_task); + void _save_and_restart(); void _extract_subtree(const String &p_path); void _replace_task(const Ref &p_task, const Ref &p_by_task);