Remember TaskPanel's collapsed sections
This commit is contained in:
parent
5220c1c6e7
commit
5378337064
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#include "limbo_ai_editor_plugin.h"
|
#include "limbo_ai_editor_plugin.h"
|
||||||
|
|
||||||
|
#include "core/array.h"
|
||||||
#include "core/class_db.h"
|
#include "core/class_db.h"
|
||||||
#include "core/dictionary.h"
|
#include "core/dictionary.h"
|
||||||
#include "core/error_list.h"
|
#include "core/error_list.h"
|
||||||
|
@ -311,6 +312,15 @@ void TaskSection::add_task_button(String p_name, const Ref<Texture> &icon, Varia
|
||||||
tasks_container->add_child(btn);
|
tasks_container->add_child(btn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TaskSection::set_collapsed(bool p_collapsed) {
|
||||||
|
tasks_container->set_visible(!p_collapsed);
|
||||||
|
section_header->set_icon(p_collapsed ? get_icon("GuiTreeArrowRight", "EditorIcons") : get_icon("GuiTreeArrowDown", "EditorIcons"));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TaskSection::is_collapsed() const {
|
||||||
|
return !tasks_container->is_visible();
|
||||||
|
}
|
||||||
|
|
||||||
void TaskSection::_bind_methods() {
|
void TaskSection::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("_on_task_button_pressed", "p_class"), &TaskSection::_on_task_button_pressed);
|
ClassDB::bind_method(D_METHOD("_on_task_button_pressed", "p_class"), &TaskSection::_on_task_button_pressed);
|
||||||
ClassDB::bind_method(D_METHOD("_on_header_pressed"), &TaskSection::_on_header_pressed);
|
ClassDB::bind_method(D_METHOD("_on_header_pressed"), &TaskSection::_on_header_pressed);
|
||||||
|
@ -351,8 +361,30 @@ void TaskPanel::_on_filter_text_changed(String p_text) {
|
||||||
void TaskPanel::refresh() {
|
void TaskPanel::refresh() {
|
||||||
filter_edit->set_right_icon(get_icon("Search", "EditorIcons"));
|
filter_edit->set_right_icon(get_icon("Search", "EditorIcons"));
|
||||||
|
|
||||||
for (int i = 0; i < sections->get_child_count(); i++) {
|
Set<String> collapsed_sections;
|
||||||
sections->get_child(i)->queue_delete();
|
if (sections->get_child_count() == 0) {
|
||||||
|
// Restore collapsed state from config.
|
||||||
|
ConfigFile conf;
|
||||||
|
String conf_path = EditorSettings::get_singleton()->get_project_settings_dir().plus_file("limbo_ai.cfg");
|
||||||
|
if (conf.load(conf_path) == OK) {
|
||||||
|
Variant value = conf.get_value("bt_editor", "collapsed_sections", Array());
|
||||||
|
if (value.is_array()) {
|
||||||
|
Array arr = value;
|
||||||
|
for (int i = 0; i < arr.size(); i++) {
|
||||||
|
if (arr[i].get_type() == Variant::STRING) {
|
||||||
|
collapsed_sections.insert(arr[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i = 0; i < sections->get_child_count(); i++) {
|
||||||
|
TaskSection *sec = Object::cast_to<TaskSection>(sections->get_child(i));
|
||||||
|
if (sec->is_collapsed()) {
|
||||||
|
collapsed_sections.insert(sec->get_category_name());
|
||||||
|
}
|
||||||
|
sections->get_child(i)->queue_delete();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HashMap<String, List<String>> categories;
|
HashMap<String, List<String>> categories;
|
||||||
|
@ -403,6 +435,7 @@ void TaskPanel::refresh() {
|
||||||
sec->set_filter("");
|
sec->set_filter("");
|
||||||
sec->connect("task_button_pressed", this, "_on_task_button_pressed");
|
sec->connect("task_button_pressed", this, "_on_task_button_pressed");
|
||||||
sections->add_child(sec);
|
sections->add_child(sec);
|
||||||
|
sec->set_collapsed(collapsed_sections.has(cat));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -472,6 +505,26 @@ void TaskPanel::_populate_scripted_tasks_from_dir(String p_path, List<String> *p
|
||||||
memdelete(dir);
|
memdelete(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TaskPanel::_notification(int p_what) {
|
||||||
|
if (p_what == NOTIFICATION_EXIT_TREE) {
|
||||||
|
if (sections->get_child_count() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Array collapsed_sections;
|
||||||
|
for (int i = 0; i < sections->get_child_count(); i++) {
|
||||||
|
TaskSection *sec = Object::cast_to<TaskSection>(sections->get_child(i));
|
||||||
|
if (sec->is_collapsed()) {
|
||||||
|
collapsed_sections.push_back(sec->get_category_name());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ConfigFile conf;
|
||||||
|
String conf_path = EditorSettings::get_singleton()->get_project_settings_dir().plus_file("limbo_ai.cfg");
|
||||||
|
conf.load(conf_path);
|
||||||
|
conf.set_value("bt_editor", "collapsed_sections", collapsed_sections);
|
||||||
|
conf.save(conf_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void TaskPanel::_bind_methods() {
|
void TaskPanel::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("refresh"), &TaskPanel::refresh);
|
ClassDB::bind_method(D_METHOD("refresh"), &TaskPanel::refresh);
|
||||||
ClassDB::bind_method(D_METHOD("_on_task_button_pressed"), &TaskPanel::_on_task_button_pressed);
|
ClassDB::bind_method(D_METHOD("_on_task_button_pressed"), &TaskPanel::_on_task_button_pressed);
|
||||||
|
|
|
@ -74,6 +74,11 @@ public:
|
||||||
void set_filter(String p_filter);
|
void set_filter(String p_filter);
|
||||||
void add_task_button(String p_name, const Ref<Texture> &icon, Variant p_meta);
|
void add_task_button(String p_name, const Ref<Texture> &icon, Variant p_meta);
|
||||||
|
|
||||||
|
void set_collapsed(bool p_collapsed);
|
||||||
|
bool is_collapsed() const;
|
||||||
|
|
||||||
|
String get_category_name() const { return section_header->get_text(); }
|
||||||
|
|
||||||
TaskSection(String p_category_name, EditorNode *p_editor);
|
TaskSection(String p_category_name, EditorNode *p_editor);
|
||||||
~TaskSection();
|
~TaskSection();
|
||||||
};
|
};
|
||||||
|
@ -95,6 +100,8 @@ private:
|
||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
|
void _notification(int p_what);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void refresh();
|
void refresh();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue