Add drag preview

This commit is contained in:
yds 2024-09-11 00:05:38 -03:00
parent 8ee3688da2
commit a460c7898b
3 changed files with 37 additions and 2 deletions

View File

@ -21,11 +21,18 @@
#ifdef LIMBOAI_MODULE
#include "core/object/script_language.h"
#include "editor/themes/editor_scale.h"
#include "scene/gui/box_container.h"
#include "scene/gui/texture_rect.h"
#include "scene/gui/label.h"
#endif // LIMBOAI_MODULE
#ifdef LIMBOAI_GDEXTENSION
#include <godot_cpp/classes/editor_interface.hpp>
#include <godot_cpp/classes/script.hpp>
#include <godot_cpp/classes/h_box_container.hpp>
#include <godot_cpp/classes/v_box_container.hpp>
#include <godot_cpp/classes/texture_rect.hpp>
#include <godot_cpp/classes/label.hpp>
using namespace godot;
#endif // LIMBOAI_GDEXTENSION
@ -296,6 +303,31 @@ Variant TaskTree::_get_drag_data_fw(const Point2 &p_point) {
return Variant();
}
VBoxContainer *vb = memnew(VBoxContainer);
int list_max = 10;
float opacity_step = 1.0f / list_max;
float opacity_item = 1.0f;
for (int i = 0; i < selected_tasks.size(); i++) {
Ref<BTTask> task = Object::cast_to<BTTask>(selected_tasks[i]);
if (i < list_max) {
HBoxContainer *hb = memnew(HBoxContainer);
TextureRect *tf = memnew(TextureRect);
int icon_size = get_theme_constant(LW_NAME(class_icon_size), LW_NAME(Editor));
tf->set_custom_minimum_size(Size2(icon_size, icon_size));
tf->set_stretch_mode(TextureRect::STRETCH_KEEP_ASPECT_CENTERED);
tf->set_expand_mode(TextureRect::EXPAND_IGNORE_SIZE);
tf->set_texture(icons[i]);
hb->add_child(tf);
Label *label = memnew(Label);
label->set_text(task->get_task_name());
hb->add_child(label);
vb->add_child(hb);
hb->set_modulate(Color(1, 1, 1, opacity_item));
opacity_item -= opacity_step;
}
}
set_drag_preview(vb);
Dictionary drag_data;
drag_data["type"] = "task";
drag_data["tasks"] = selected_tasks;
@ -330,7 +362,8 @@ bool TaskTree::_can_drop_data_fw(const Point2 &p_point, const Variant &p_data) c
if (tasks.is_empty()) {
return false; // No tasks.
}
for (const Ref<BTTask> &task : tasks) {
for (int i = 0; i < tasks.size(); i++) {
Ref<BTTask> task = tasks[i];
const Ref<BTTask> to_task = item->get_metadata(0);
if (to_task->is_descendant_of(task) || task == to_task ||
(task == to_task && task->get_index() + section >= to_task->get_index() && !item->is_collapsed() && item->get_child_count() > 0)) {
@ -480,7 +513,7 @@ void TaskTree::_bind_methods() {
ADD_SIGNAL(MethodInfo("task_selected"));
ADD_SIGNAL(MethodInfo("task_activated"));
ADD_SIGNAL(MethodInfo("probability_clicked"));
ADD_SIGNAL(MethodInfo("tasks_dragged", PropertyInfo(Variant::ARRAY, "tasks", PROPERTY_HINT_ARRAY_TYPE, MAKE_RESOURCE_TYPE_HINT("BTTask")),
ADD_SIGNAL(MethodInfo("tasks_dragged", PropertyInfo(Variant::ARRAY, "tasks", PROPERTY_HINT_ARRAY_TYPE, RESOURCE_TYPE_HINT("BTTask")),
PropertyInfo(Variant::OBJECT, "to_task", PROPERTY_HINT_RESOURCE_TYPE, "BTTask"),
PropertyInfo(Variant::INT, "type")));
}

View File

@ -78,6 +78,7 @@ LimboStringNames::LimboStringNames() {
HeaderSmall = SN("HeaderSmall");
Help = SN("Help");
icon_max_width = SN("icon_max_width");
class_icon_size = SN("class_icon_size");
id_pressed = SN("id_pressed");
Info = SN("Info");
item_collapsed = SN("item_collapsed");

View File

@ -94,6 +94,7 @@ public:
StringName HeaderSmall;
StringName Help;
StringName icon_max_width;
StringName class_icon_size;
StringName id_pressed;
StringName Info;
StringName item_collapsed;