|
@@ -2491,7 +2491,6 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int
|
|
|
cache.click_column = col;
|
|
|
cache.click_pos = click_pos;
|
|
|
update();
|
|
|
- //emit_signal(SNAME("button_pressed"));
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
@@ -2513,9 +2512,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int
|
|
|
if (!c.selected || p_button == MouseButton::RIGHT) {
|
|
|
p_item->select(col);
|
|
|
emit_signal(SNAME("multi_selected"), p_item, col, true);
|
|
|
- if (p_button == MouseButton::RIGHT) {
|
|
|
- emit_signal(SNAME("item_rmb_selected"), get_local_mouse_position());
|
|
|
- }
|
|
|
+ emit_signal(SNAME("item_mouse_selected"), get_local_mouse_position(), p_button);
|
|
|
|
|
|
//p_item->selected_signal.call(col);
|
|
|
} else {
|
|
@@ -2530,9 +2527,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int
|
|
|
bool inrange = false;
|
|
|
|
|
|
select_single_item(p_item, root, col, selected_item, &inrange);
|
|
|
- if (p_button == MouseButton::RIGHT) {
|
|
|
- emit_signal(SNAME("item_rmb_selected"), get_local_mouse_position());
|
|
|
- }
|
|
|
+ emit_signal(SNAME("item_mouse_selected"), get_local_mouse_position(), p_button);
|
|
|
} else {
|
|
|
int icount = _count_selected_items(root);
|
|
|
|
|
@@ -2544,9 +2539,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int
|
|
|
select_single_item(p_item, root, col);
|
|
|
}
|
|
|
|
|
|
- if (p_button == MouseButton::RIGHT) {
|
|
|
- emit_signal(SNAME("item_rmb_selected"), get_local_mouse_position());
|
|
|
- }
|
|
|
+ emit_signal(SNAME("item_mouse_selected"), get_local_mouse_position(), p_button);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2583,11 +2576,11 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int
|
|
|
if (force_edit_checkbox_only_on_checkbox) {
|
|
|
if (x < cache.checked->get_width()) {
|
|
|
p_item->set_checked(col, !c.checked);
|
|
|
- item_edited(col, p_item);
|
|
|
+ item_edited(col, p_item, p_button);
|
|
|
}
|
|
|
} else {
|
|
|
p_item->set_checked(col, !c.checked);
|
|
|
- item_edited(col, p_item);
|
|
|
+ item_edited(col, p_item, p_button);
|
|
|
}
|
|
|
click_handled = true;
|
|
|
//p_item->edited_signal.call(col);
|
|
@@ -2629,17 +2622,17 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int
|
|
|
|
|
|
p_item->set_range(col, c.val + (up ? 1.0 : -1.0) * c.step);
|
|
|
|
|
|
- item_edited(col, p_item);
|
|
|
+ item_edited(col, p_item, p_button);
|
|
|
|
|
|
} else if (p_button == MouseButton::RIGHT) {
|
|
|
p_item->set_range(col, (up ? c.max : c.min));
|
|
|
- item_edited(col, p_item);
|
|
|
+ item_edited(col, p_item, p_button);
|
|
|
} else if (p_button == MouseButton::WHEEL_UP) {
|
|
|
p_item->set_range(col, c.val + c.step);
|
|
|
- item_edited(col, p_item);
|
|
|
+ item_edited(col, p_item, p_button);
|
|
|
} else if (p_button == MouseButton::WHEEL_DOWN) {
|
|
|
p_item->set_range(col, c.val - c.step);
|
|
|
- item_edited(col, p_item);
|
|
|
+ item_edited(col, p_item, p_button);
|
|
|
}
|
|
|
|
|
|
//p_item->edited_signal.call(col);
|
|
@@ -2670,7 +2663,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int
|
|
|
}
|
|
|
|
|
|
if (!p_item->cells[col].custom_button || !on_arrow) {
|
|
|
- item_edited(col, p_item, p_button == MouseButton::LEFT);
|
|
|
+ item_edited(col, p_item, p_button);
|
|
|
}
|
|
|
click_handled = true;
|
|
|
return -1;
|
|
@@ -2717,8 +2710,8 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int
|
|
|
item_h += child_h;
|
|
|
}
|
|
|
}
|
|
|
- if (p_item == root && p_button == MouseButton::RIGHT) {
|
|
|
- emit_signal(SNAME("empty_rmb"), get_local_mouse_position());
|
|
|
+ if (p_item == root) {
|
|
|
+ emit_signal(SNAME("empty_clicked"), get_local_mouse_position(), p_button);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3126,7 +3119,6 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) {
|
|
|
}
|
|
|
|
|
|
Ref<InputEventMouseMotion> mm = p_event;
|
|
|
-
|
|
|
if (mm.is_valid()) {
|
|
|
if (cache.font.is_null()) { // avoid a strange case that may corrupt stuff
|
|
|
update_cache();
|
|
@@ -3256,18 +3248,17 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- Ref<InputEventMouseButton> b = p_event;
|
|
|
-
|
|
|
- if (b.is_valid()) {
|
|
|
+ Ref<InputEventMouseButton> mb = p_event;
|
|
|
+ if (mb.is_valid()) {
|
|
|
if (cache.font.is_null()) { // avoid a strange case that may corrupt stuff
|
|
|
update_cache();
|
|
|
}
|
|
|
|
|
|
bool rtl = is_layout_rtl();
|
|
|
|
|
|
- if (!b->is_pressed()) {
|
|
|
- if (b->get_button_index() == MouseButton::LEFT) {
|
|
|
- Point2 pos = b->get_position();
|
|
|
+ if (!mb->is_pressed()) {
|
|
|
+ if (mb->get_button_index() == MouseButton::LEFT) {
|
|
|
+ Point2 pos = mb->get_position();
|
|
|
if (rtl) {
|
|
|
pos.x = get_size().width - pos.x;
|
|
|
}
|
|
@@ -3302,7 +3293,7 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) {
|
|
|
warp_mouse(range_drag_capture_pos);
|
|
|
} else {
|
|
|
Rect2 rect = get_selected()->get_meta("__focus_rect");
|
|
|
- Point2 mpos = b->get_position();
|
|
|
+ Point2 mpos = mb->get_position();
|
|
|
int icon_size_x = 0;
|
|
|
Ref<Texture2D> icon = get_selected()->get_icon(selected_col);
|
|
|
if (icon.is_valid()) {
|
|
@@ -3330,17 +3321,6 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) {
|
|
|
pressing_for_editor = false;
|
|
|
}
|
|
|
|
|
|
- if (cache.click_type == Cache::CLICK_BUTTON && cache.click_item != nullptr) {
|
|
|
- // make sure in case of wrong reference after reconstructing whole TreeItems
|
|
|
- cache.click_item = get_item_at_position(cache.click_pos);
|
|
|
- emit_signal(SNAME("button_pressed"), cache.click_item, cache.click_column, cache.click_id);
|
|
|
- }
|
|
|
- cache.click_type = Cache::CLICK_NONE;
|
|
|
- cache.click_index = -1;
|
|
|
- cache.click_id = -1;
|
|
|
- cache.click_item = nullptr;
|
|
|
- cache.click_column = 0;
|
|
|
-
|
|
|
if (drag_touching) {
|
|
|
if (drag_speed == 0) {
|
|
|
drag_touching_deaccel = false;
|
|
@@ -3350,8 +3330,20 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) {
|
|
|
drag_touching_deaccel = true;
|
|
|
}
|
|
|
}
|
|
|
- update();
|
|
|
}
|
|
|
+
|
|
|
+ if (cache.click_type == Cache::CLICK_BUTTON && cache.click_item != nullptr) {
|
|
|
+ // make sure in case of wrong reference after reconstructing whole TreeItems
|
|
|
+ cache.click_item = get_item_at_position(cache.click_pos);
|
|
|
+ emit_signal("button_clicked", cache.click_item, cache.click_column, cache.click_id, mb->get_button_index());
|
|
|
+ }
|
|
|
+
|
|
|
+ cache.click_type = Cache::CLICK_NONE;
|
|
|
+ cache.click_index = -1;
|
|
|
+ cache.click_id = -1;
|
|
|
+ cache.click_item = nullptr;
|
|
|
+ cache.click_column = 0;
|
|
|
+ update();
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -3359,12 +3351,12 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- switch (b->get_button_index()) {
|
|
|
+ switch (mb->get_button_index()) {
|
|
|
case MouseButton::RIGHT:
|
|
|
case MouseButton::LEFT: {
|
|
|
Ref<StyleBox> bg = cache.bg;
|
|
|
|
|
|
- Point2 pos = b->get_position();
|
|
|
+ Point2 pos = mb->get_position();
|
|
|
if (rtl) {
|
|
|
pos.x = get_size().width - pos.x;
|
|
|
}
|
|
@@ -3374,7 +3366,7 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) {
|
|
|
pos.y -= _get_title_button_height();
|
|
|
|
|
|
if (pos.y < 0) {
|
|
|
- if (b->get_button_index() == MouseButton::LEFT) {
|
|
|
+ if (mb->get_button_index() == MouseButton::LEFT) {
|
|
|
pos.x += cache.offset.x;
|
|
|
int len = 0;
|
|
|
for (int i = 0; i < columns.size(); i++) {
|
|
@@ -3391,10 +3383,8 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
if (!root || (!root->get_first_child() && hide_root)) {
|
|
|
- if (b->get_button_index() == MouseButton::RIGHT && allow_rmb_select) {
|
|
|
- emit_signal(SNAME("empty_tree_rmb_selected"), get_local_mouse_position());
|
|
|
- }
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -3409,17 +3399,17 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) {
|
|
|
|
|
|
cache.rtl = is_layout_rtl();
|
|
|
blocked++;
|
|
|
- propagate_mouse_event(pos + cache.offset, 0, 0, x_limit + cache.offset.width, b->is_double_click(), root, b->get_button_index(), b);
|
|
|
+ propagate_mouse_event(pos + cache.offset, 0, 0, x_limit + cache.offset.width, mb->is_double_click(), root, mb->get_button_index(), mb);
|
|
|
blocked--;
|
|
|
|
|
|
if (pressing_for_editor) {
|
|
|
- pressing_pos = b->get_position();
|
|
|
+ pressing_pos = mb->get_position();
|
|
|
if (rtl) {
|
|
|
pressing_pos.x = get_size().width - pressing_pos.x;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (b->get_button_index() == MouseButton::RIGHT) {
|
|
|
+ if (mb->get_button_index() == MouseButton::RIGHT) {
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -3442,8 +3432,8 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) {
|
|
|
set_physics_process_internal(true);
|
|
|
}
|
|
|
|
|
|
- if (b->get_button_index() == MouseButton::LEFT) {
|
|
|
- if (get_item_at_position(b->get_position()) == nullptr && !b->is_shift_pressed() && !b->is_ctrl_pressed() && !b->is_command_pressed()) {
|
|
|
+ if (mb->get_button_index() == MouseButton::LEFT) {
|
|
|
+ if (get_item_at_position(mb->get_position()) == nullptr && !mb->is_shift_pressed() && !mb->is_ctrl_pressed() && !mb->is_command_pressed()) {
|
|
|
emit_signal(SNAME("nothing_selected"));
|
|
|
}
|
|
|
}
|
|
@@ -3457,7 +3447,7 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) {
|
|
|
} break;
|
|
|
case MouseButton::WHEEL_UP: {
|
|
|
double prev_value = v_scroll->get_value();
|
|
|
- v_scroll->set_value(v_scroll->get_value() - v_scroll->get_page() * b->get_factor() / 8);
|
|
|
+ v_scroll->set_value(v_scroll->get_value() - v_scroll->get_page() * mb->get_factor() / 8);
|
|
|
if (v_scroll->get_value() != prev_value) {
|
|
|
accept_event();
|
|
|
}
|
|
@@ -3465,7 +3455,7 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) {
|
|
|
} break;
|
|
|
case MouseButton::WHEEL_DOWN: {
|
|
|
double prev_value = v_scroll->get_value();
|
|
|
- v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() * b->get_factor() / 8);
|
|
|
+ v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() * mb->get_factor() / 8);
|
|
|
if (v_scroll->get_value() != prev_value) {
|
|
|
accept_event();
|
|
|
}
|
|
@@ -3911,16 +3901,16 @@ TreeItem *Tree::get_last_item() const {
|
|
|
return last;
|
|
|
}
|
|
|
|
|
|
-void Tree::item_edited(int p_column, TreeItem *p_item, bool p_lmb) {
|
|
|
+void Tree::item_edited(int p_column, TreeItem *p_item, MouseButton p_mouse_index) {
|
|
|
edited_item = p_item;
|
|
|
edited_col = p_column;
|
|
|
if (p_item != nullptr && p_column >= 0 && p_column < p_item->cells.size()) {
|
|
|
edited_item->cells.write[p_column].dirty = true;
|
|
|
}
|
|
|
- if (p_lmb) {
|
|
|
+ if (p_mouse_index == MouseButton::NONE) {
|
|
|
emit_signal(SNAME("item_edited"));
|
|
|
} else {
|
|
|
- emit_signal(SNAME("item_rmb_edited"));
|
|
|
+ emit_signal(SNAME("custom_item_clicked"), p_mouse_index);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -4965,17 +4955,15 @@ void Tree::_bind_methods() {
|
|
|
ADD_SIGNAL(MethodInfo("item_selected"));
|
|
|
ADD_SIGNAL(MethodInfo("cell_selected"));
|
|
|
ADD_SIGNAL(MethodInfo("multi_selected", PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "TreeItem"), PropertyInfo(Variant::INT, "column"), PropertyInfo(Variant::BOOL, "selected")));
|
|
|
- ADD_SIGNAL(MethodInfo("item_rmb_selected", PropertyInfo(Variant::VECTOR2, "position")));
|
|
|
- ADD_SIGNAL(MethodInfo("empty_rmb", PropertyInfo(Variant::VECTOR2, "position")));
|
|
|
- ADD_SIGNAL(MethodInfo("empty_tree_rmb_selected", PropertyInfo(Variant::VECTOR2, "position")));
|
|
|
+ ADD_SIGNAL(MethodInfo("item_mouse_selected", PropertyInfo(Variant::VECTOR2, "position"), PropertyInfo(Variant::INT, "mouse_button_index")));
|
|
|
+ ADD_SIGNAL(MethodInfo("empty_clicked", PropertyInfo(Variant::VECTOR2, "position"), PropertyInfo(Variant::INT, "mouse_button_index")));
|
|
|
ADD_SIGNAL(MethodInfo("item_edited"));
|
|
|
- ADD_SIGNAL(MethodInfo("item_rmb_edited"));
|
|
|
+ ADD_SIGNAL(MethodInfo("custom_item_clicked", PropertyInfo(Variant::INT, "mouse_button_index")));
|
|
|
ADD_SIGNAL(MethodInfo("item_custom_button_pressed"));
|
|
|
ADD_SIGNAL(MethodInfo("item_double_clicked"));
|
|
|
ADD_SIGNAL(MethodInfo("item_collapsed", PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "TreeItem")));
|
|
|
ADD_SIGNAL(MethodInfo("check_propagated_to_item", PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "TreeItem"), PropertyInfo(Variant::INT, "column")));
|
|
|
- //ADD_SIGNAL( MethodInfo("item_double_clicked" ) );
|
|
|
- ADD_SIGNAL(MethodInfo("button_pressed", PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "TreeItem"), PropertyInfo(Variant::INT, "column"), PropertyInfo(Variant::INT, "id")));
|
|
|
+ ADD_SIGNAL(MethodInfo("button_clicked", PropertyInfo(Variant::OBJECT, "item", PROPERTY_HINT_RESOURCE_TYPE, "TreeItem"), PropertyInfo(Variant::INT, "column"), PropertyInfo(Variant::INT, "id"), PropertyInfo(Variant::INT, "mouse_button_index")));
|
|
|
ADD_SIGNAL(MethodInfo("custom_popup_edited", PropertyInfo(Variant::BOOL, "arrow_clicked")));
|
|
|
ADD_SIGNAL(MethodInfo("item_activated"));
|
|
|
ADD_SIGNAL(MethodInfo("column_title_pressed", PropertyInfo(Variant::INT, "column")));
|