diff options
Diffstat (limited to 'scene')
-rw-r--r-- | scene/gui/color_picker.cpp | 16 | ||||
-rw-r--r-- | scene/gui/line_edit.cpp | 56 | ||||
-rw-r--r-- | scene/gui/line_edit.h | 5 | ||||
-rw-r--r-- | scene/gui/scroll_container.cpp | 2 | ||||
-rw-r--r-- | scene/gui/tree.cpp | 8 | ||||
-rw-r--r-- | scene/main/scene_tree.cpp | 16 | ||||
-rw-r--r-- | scene/resources/resource_format_text.cpp | 2 |
7 files changed, 69 insertions, 36 deletions
diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index 002a738b83..fe4c91cb56 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -245,7 +245,21 @@ void ColorPicker::finish_shaders() { } void ColorPicker::set_focus_on_line_edit() { - callable_mp((Control *)c_text, &Control::grab_focus).call_deferred(); + bool has_hardware_keyboard = true; +#if defined(ANDROID_ENABLED) || defined(IOS_ENABLED) + has_hardware_keyboard = DisplayServer::get_singleton()->has_hardware_keyboard(); +#endif // ANDROID_ENABLED || IOS_ENABLED + if (has_hardware_keyboard) { + callable_mp((Control *)c_text, &Control::grab_focus).call_deferred(); + } else { + // A hack to avoid showing the virtual keyboard when the ColorPicker window popups and + // no hardware keyboard is detected on Android and IOS. + // This will only focus the LineEdit without editing, the virtual keyboard will only be visible when + // we touch the LineEdit to enter edit mode. + callable_mp(c_text, &LineEdit::set_editable).call_deferred(false); + callable_mp((Control *)c_text, &Control::grab_focus).call_deferred(); + callable_mp(c_text, &LineEdit::set_editable).call_deferred(true); + } } void ColorPicker::_update_controls() { diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index 6e5b555cdf..9967805134 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -45,28 +45,37 @@ #include "editor/editor_settings.h" #endif -void LineEdit::_edit() { +void LineEdit::edit() { if (!is_inside_tree()) { return; } if (!has_focus()) { grab_focus(); + return; } if (!editable || editing) { return; } + if (select_all_on_focus) { + if (Input::get_singleton()->is_mouse_button_pressed(MouseButton::LEFT)) { + // Select all when the mouse button is up. + pending_select_all_on_focus = true; + } else { + select_all(); + } + } + editing = true; _validate_caret_can_draw(); show_virtual_keyboard(); queue_redraw(); - emit_signal(SNAME("editing_toggled"), true); } -void LineEdit::_unedit() { +void LineEdit::unedit() { if (!editing) { return; } @@ -84,8 +93,6 @@ void LineEdit::_unedit() { if (deselect_on_focus_loss_enabled && !selection.drag_attempt) { deselect(); } - - emit_signal(SNAME("editing_toggled"), false); } bool LineEdit::is_editing() const { @@ -390,7 +397,8 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) { } if (editable && !editing) { - _edit(); + edit(); + emit_signal(SNAME("editing_toggled"), true); } accept_event(); @@ -406,7 +414,8 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) { set_caret_at_pixel_pos(b->get_position().x); if (!editing) { - _edit(); + edit(); + emit_signal(SNAME("editing_toggled"), true); } if (!paste_buffer.is_empty()) { @@ -506,7 +515,8 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) { } if (editable && !editing) { - _edit(); + edit(); + emit_signal(SNAME("editing_toggled"), true); return; } queue_redraw(); @@ -599,7 +609,9 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) { } if (editable && !editing && k->is_action_pressed("ui_text_submit", false)) { - _edit(); + edit(); + emit_signal(SNAME("editing_toggled"), true); + accept_event(); return; } @@ -734,7 +746,8 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) { } if (editing) { - _unedit(); + unedit(); + emit_signal(SNAME("editing_toggled"), false); } accept_event(); @@ -743,7 +756,8 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) { if (k->is_action("ui_cancel")) { if (editing) { - _unedit(); + unedit(); + emit_signal(SNAME("editing_toggled"), false); } accept_event(); @@ -1332,24 +1346,17 @@ void LineEdit::_notification(int p_what) { } break; case NOTIFICATION_FOCUS_ENTER: { - if (select_all_on_focus) { - if (Input::get_singleton()->is_mouse_button_pressed(MouseButton::LEFT)) { - // Select all when the mouse button is up. - pending_select_all_on_focus = true; - } else { - select_all(); - } - } - // Only allow editing if the LineEdit is not focused with arrow keys. if (!(Input::get_singleton()->is_action_pressed("ui_up") || Input::get_singleton()->is_action_pressed("ui_down") || Input::get_singleton()->is_action_pressed("ui_left") || Input::get_singleton()->is_action_pressed("ui_right"))) { - _edit(); + edit(); + emit_signal(SNAME("editing_toggled"), true); } } break; case NOTIFICATION_FOCUS_EXIT: { if (editing) { - _unedit(); + unedit(); + emit_signal(SNAME("editing_toggled"), false); } } break; @@ -2138,7 +2145,8 @@ void LineEdit::set_editable(bool p_editable) { editable = p_editable; if (!editable && editing) { - _unedit(); + unedit(); + emit_signal(SNAME("editing_toggled"), false); } _validate_caret_can_draw(); @@ -2759,6 +2767,8 @@ void LineEdit::_bind_methods() { ClassDB::bind_method(D_METHOD("set_horizontal_alignment", "alignment"), &LineEdit::set_horizontal_alignment); ClassDB::bind_method(D_METHOD("get_horizontal_alignment"), &LineEdit::get_horizontal_alignment); + ClassDB::bind_method(D_METHOD("edit"), &LineEdit::edit); + ClassDB::bind_method(D_METHOD("unedit"), &LineEdit::unedit); ClassDB::bind_method(D_METHOD("is_editing"), &LineEdit::is_editing); ClassDB::bind_method(D_METHOD("clear"), &LineEdit::clear); ClassDB::bind_method(D_METHOD("select", "from", "to"), &LineEdit::select, DEFVAL(0), DEFVAL(-1)); diff --git a/scene/gui/line_edit.h b/scene/gui/line_edit.h index ac7436646b..9253dd8711 100644 --- a/scene/gui/line_edit.h +++ b/scene/gui/line_edit.h @@ -207,9 +207,6 @@ private: float base_scale = 1.0; } theme_cache; - void _edit(); - void _unedit(); - void _close_ime_window(); void _update_ime_window_position(); @@ -265,6 +262,8 @@ protected: virtual void gui_input(const Ref<InputEvent> &p_event) override; public: + void edit(); + void unedit(); bool is_editing() const; bool has_ime_text() const; diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp index 2211bd76fc..1ac0e8b59f 100644 --- a/scene/gui/scroll_container.cpp +++ b/scene/gui/scroll_container.cpp @@ -547,7 +547,7 @@ PackedStringArray ScrollContainer::get_configuration_warnings() const { int found = 0; for (int i = 0; i < get_child_count(); i++) { - Control *c = as_sortable_control(get_child(i)); + Control *c = as_sortable_control(get_child(i), SortableVisbilityMode::VISIBLE); if (!c) { continue; } diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index 8238d54381..646cd9c70e 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -4034,25 +4034,25 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) { } break; case MouseButton::WHEEL_UP: { - if (_scroll(false, -mb->get_factor() / 8)) { + if (_scroll(mb->is_shift_pressed(), -mb->get_factor() / 8)) { accept_event(); } } break; case MouseButton::WHEEL_DOWN: { - if (_scroll(false, mb->get_factor() / 8)) { + if (_scroll(mb->is_shift_pressed(), mb->get_factor() / 8)) { accept_event(); } } break; case MouseButton::WHEEL_LEFT: { - if (_scroll(true, -mb->get_factor() / 8)) { + if (_scroll(!mb->is_shift_pressed(), -mb->get_factor() / 8)) { accept_event(); } } break; case MouseButton::WHEEL_RIGHT: { - if (_scroll(true, mb->get_factor() / 8)) { + if (_scroll(!mb->is_shift_pressed(), mb->get_factor() / 8)) { accept_event(); } diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 106130872d..71d91b970e 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -302,11 +302,15 @@ void SceneTree::call_group_flagsp(uint32_t p_call_flags, const StringName &p_gro continue; } + Node *node = gr_nodes[i]; if (!(p_call_flags & GROUP_CALL_DEFERRED)) { Callable::CallError ce; - gr_nodes[i]->callp(p_function, p_args, p_argcount, ce); + node->callp(p_function, p_args, p_argcount, ce); + if (unlikely(ce.error != Callable::CallError::CALL_OK && ce.error != Callable::CallError::CALL_ERROR_INVALID_METHOD)) { + ERR_PRINT(vformat("Error calling group method on node \"%s\": %s.", node->get_name(), Variant::get_callable_error_text(Callable(node, p_function), p_args, p_argcount, ce))); + } } else { - MessageQueue::get_singleton()->push_callp(gr_nodes[i], p_function, p_args, p_argcount); + MessageQueue::get_singleton()->push_callp(node, p_function, p_args, p_argcount); } } @@ -316,11 +320,15 @@ void SceneTree::call_group_flagsp(uint32_t p_call_flags, const StringName &p_gro continue; } + Node *node = gr_nodes[i]; if (!(p_call_flags & GROUP_CALL_DEFERRED)) { Callable::CallError ce; - gr_nodes[i]->callp(p_function, p_args, p_argcount, ce); + node->callp(p_function, p_args, p_argcount, ce); + if (unlikely(ce.error != Callable::CallError::CALL_OK && ce.error != Callable::CallError::CALL_ERROR_INVALID_METHOD)) { + ERR_PRINT(vformat("Error calling group method on node \"%s\": %s.", node->get_name(), Variant::get_callable_error_text(Callable(node, p_function), p_args, p_argcount, ce))); + } } else { - MessageQueue::get_singleton()->push_callp(gr_nodes[i], p_function, p_args, p_argcount); + MessageQueue::get_singleton()->push_callp(node, p_function, p_args, p_argcount); } } } diff --git a/scene/resources/resource_format_text.cpp b/scene/resources/resource_format_text.cpp index d531eea311..5aa6bf718c 100644 --- a/scene/resources/resource_format_text.cpp +++ b/scene/resources/resource_format_text.cpp @@ -1708,6 +1708,8 @@ static String _resource_get_class(Ref<Resource> p_resource) { } Error ResourceFormatSaverTextInstance::save(const String &p_path, const Ref<Resource> &p_resource, uint32_t p_flags) { + Resource::seed_scene_unique_id(p_path.hash()); // Seeding for save path should make it deterministic for importers. + if (p_path.ends_with(".tscn")) { packed_scene = p_resource; } |