summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editor/code_editor.cpp2
-rw-r--r--editor/plugins/animation_player_editor_plugin.cpp3
-rw-r--r--editor/plugins/script_text_editor.cpp4
-rw-r--r--modules/gdnative/pluginscript/pluginscript_script.cpp23
-rw-r--r--scene/3d/physics_body.cpp8
-rw-r--r--scene/gui/line_edit.cpp37
-rw-r--r--scene/gui/line_edit.h2
7 files changed, 67 insertions, 12 deletions
diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp
index 16780a795f..e3138dc1e5 100644
--- a/editor/code_editor.cpp
+++ b/editor/code_editor.cpp
@@ -1565,6 +1565,7 @@ void CodeTextEditor::goto_next_bookmark() {
if (bline > line) {
text_editor->unfold_line(bline);
text_editor->cursor_set_line(bline);
+ text_editor->center_viewport_to_cursor();
return;
}
}
@@ -1589,6 +1590,7 @@ void CodeTextEditor::goto_prev_bookmark() {
if (bline < line) {
text_editor->unfold_line(bline);
text_editor->cursor_set_line(bline);
+ text_editor->center_viewport_to_cursor();
return;
}
}
diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp
index 80353bab01..718156f12a 100644
--- a/editor/plugins/animation_player_editor_plugin.cpp
+++ b/editor/plugins/animation_player_editor_plugin.cpp
@@ -85,6 +85,9 @@ void AnimationPlayerEditor::_notification(int p_what) {
track_editor->set_anim_pos(player->get_current_animation_position());
EditorNode::get_singleton()->get_inspector()->refresh();
+ } else if (!player->is_valid()) {
+ // Reset timeline when the player has been stopped externally
+ frame->set_value(0);
} else if (last_active) {
// Need the last frame after it stopped.
frame->set_value(player->get_current_animation_position());
diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp
index f63445dab8..2e41801637 100644
--- a/editor/plugins/script_text_editor.cpp
+++ b/editor/plugins/script_text_editor.cpp
@@ -707,6 +707,7 @@ void ScriptTextEditor::_bookmark_item_pressed(int p_idx) {
_edit_option(bookmarks_menu->get_item_id(p_idx));
} else {
code_editor->goto_line(bookmarks_menu->get_item_metadata(p_idx));
+ code_editor->get_text_edit()->call_deferred("center_viewport_to_cursor"); //Need to be deferred, because goto uses call_deferred().
}
}
@@ -856,6 +857,7 @@ void ScriptTextEditor::_breakpoint_item_pressed(int p_idx) {
_edit_option(breakpoints_menu->get_item_id(p_idx));
} else {
code_editor->goto_line(breakpoints_menu->get_item_metadata(p_idx));
+ code_editor->get_text_edit()->call_deferred("center_viewport_to_cursor"); //Need to be deferred, because goto uses call_deferred().
}
}
@@ -1307,6 +1309,7 @@ void ScriptTextEditor::_edit_option(int p_op) {
if (bline > line) {
tx->unfold_line(bline);
tx->cursor_set_line(bline);
+ tx->center_viewport_to_cursor();
return;
}
}
@@ -1332,6 +1335,7 @@ void ScriptTextEditor::_edit_option(int p_op) {
if (bline < line) {
tx->unfold_line(bline);
tx->cursor_set_line(bline);
+ tx->center_viewport_to_cursor();
return;
}
}
diff --git a/modules/gdnative/pluginscript/pluginscript_script.cpp b/modules/gdnative/pluginscript/pluginscript_script.cpp
index f7c961d38b..6bb521173f 100644
--- a/modules/gdnative/pluginscript/pluginscript_script.cpp
+++ b/modules/gdnative/pluginscript/pluginscript_script.cpp
@@ -251,7 +251,19 @@ Error PluginScript::reload(bool p_keep_state) {
(godot_string *)&_path,
(godot_string *)&_source,
(godot_error *)&err);
+// Manifest's attributes must be explicitly freed
+#define FREE_SCRIPT_MANIFEST(manifest) \
+ { \
+ godot_string_name_destroy(&manifest.name); \
+ godot_string_name_destroy(&manifest.base); \
+ godot_dictionary_destroy(&manifest.member_lines); \
+ godot_array_destroy(&manifest.methods); \
+ godot_array_destroy(&manifest.signals); \
+ godot_array_destroy(&manifest.properties); \
+ }
+
if (err) {
+ FREE_SCRIPT_MANIFEST(manifest);
// TODO: GDscript uses `ScriptDebugger` here to jump into the parsing error
return err;
}
@@ -269,6 +281,7 @@ Error PluginScript::reload(bool p_keep_state) {
_ref_base_parent = res;
} else {
String name = *(StringName *)&manifest.name;
+ FREE_SCRIPT_MANIFEST(manifest);
ERR_FAIL_V_MSG(ERR_PARSE_ERROR, _path + ": Script '" + name + "' has an invalid parent '" + *base_name + "'.");
}
}
@@ -317,13 +330,6 @@ Error PluginScript::reload(bool p_keep_state) {
_methods_rpc_mode[pi.name] = MultiplayerAPI::RPCMode(int(var));
}
}
- // Manifest's attributes must be explicitly freed
- godot_string_name_destroy(&manifest.name);
- godot_string_name_destroy(&manifest.base);
- godot_dictionary_destroy(&manifest.member_lines);
- godot_array_destroy(&manifest.methods);
- godot_array_destroy(&manifest.signals);
- godot_array_destroy(&manifest.properties);
#ifdef TOOLS_ENABLED
/*for (Set<PlaceHolderScriptInstance*>::Element *E=placeholders.front();E;E=E->next()) {
@@ -331,7 +337,10 @@ Error PluginScript::reload(bool p_keep_state) {
_update_placeholder(E->get());
}*/
#endif
+
+ FREE_SCRIPT_MANIFEST(manifest);
return OK;
+#undef FREE_SCRIPT_MANIFEST
}
void PluginScript::get_script_method_list(List<MethodInfo> *r_methods) const {
diff --git a/scene/3d/physics_body.cpp b/scene/3d/physics_body.cpp
index a107c3bf7a..2c0e6ee744 100644
--- a/scene/3d/physics_body.cpp
+++ b/scene/3d/physics_body.cpp
@@ -2161,6 +2161,9 @@ void PhysicalBone::_notification(int p_what) {
update_bone_id();
reset_to_rest_position();
_reset_physics_simulation_state();
+ if (!joint.is_valid() && joint_data) {
+ _reload_joint();
+ }
break;
case NOTIFICATION_EXIT_TREE:
if (parent_skeleton) {
@@ -2169,7 +2172,10 @@ void PhysicalBone::_notification(int p_what) {
}
}
parent_skeleton = NULL;
- update_bone_id();
+ if (joint.is_valid()) {
+ PhysicsServer::get_singleton()->free(joint);
+ joint = RID();
+ }
break;
case NOTIFICATION_TRANSFORM_CHANGED:
if (Engine::get_singleton()->is_editor_hint()) {
diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp
index ab6f80bfa9..e6a27aa63f 100644
--- a/scene/gui/line_edit.cpp
+++ b/scene/gui/line_edit.cpp
@@ -823,7 +823,7 @@ void LineEdit::_notification(int p_what) {
int yofs = y_ofs + (caret_height - font->get_height()) / 2;
drawer.draw_char(ci, Point2(x_ofs, yofs + font_ascent), cchar, next, selected ? font_color_selected : font_color);
- if (char_ofs == cursor_pos && draw_caret) {
+ if (char_ofs == cursor_pos && draw_caret && !using_placeholder) {
if (ime_text.length() == 0) {
#ifdef TOOLS_ENABLED
VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(x_ofs, y_ofs), Size2(Math::round(EDSCALE), caret_height)), cursor_color);
@@ -866,12 +866,27 @@ void LineEdit::_notification(int p_what) {
}
}
- if (char_ofs == cursor_pos && draw_caret) { // May be at the end.
+ if ((char_ofs == cursor_pos || using_placeholder) && draw_caret) { // May be at the end, or placeholder.
if (ime_text.length() == 0) {
+ int caret_x_ofs = x_ofs;
+ if (using_placeholder) {
+ switch (align) {
+ case ALIGN_LEFT:
+ case ALIGN_FILL: {
+ caret_x_ofs = style->get_offset().x;
+ } break;
+ case ALIGN_CENTER: {
+ caret_x_ofs = ofs_max / 2;
+ } break;
+ case ALIGN_RIGHT: {
+ caret_x_ofs = ofs_max;
+ } break;
+ }
+ }
#ifdef TOOLS_ENABLED
- VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(x_ofs, y_ofs), Size2(Math::round(EDSCALE), caret_height)), cursor_color);
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(caret_x_ofs, y_ofs), Size2(Math::round(EDSCALE), caret_height)), cursor_color);
#else
- VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(x_ofs, y_ofs), Size2(1, caret_height)), cursor_color);
+ VisualServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(caret_x_ofs, y_ofs), Size2(1, caret_height)), cursor_color);
#endif
}
}
@@ -970,6 +985,8 @@ void LineEdit::undo() {
undo_stack_pos = undo_stack_pos->prev();
TextOperation op = undo_stack_pos->get();
text = op.text;
+ cached_width = op.cached_width;
+ window_pos = op.window_pos;
set_cursor_position(op.cursor_pos);
if (expand_to_text_length)
@@ -988,6 +1005,8 @@ void LineEdit::redo() {
undo_stack_pos = undo_stack_pos->next();
TextOperation op = undo_stack_pos->get();
text = op.text;
+ cached_width = op.cached_width;
+ window_pos = op.window_pos;
set_cursor_position(op.cursor_pos);
if (expand_to_text_length)
@@ -1169,6 +1188,10 @@ void LineEdit::delete_char() {
set_cursor_position(get_cursor_position() - 1);
+ if (align == ALIGN_CENTER || align == ALIGN_RIGHT) {
+ window_pos = CLAMP(window_pos - 1, 0, text.length() - 1);
+ }
+
_text_changed();
}
@@ -1196,6 +1219,10 @@ void LineEdit::delete_text(int p_from_column, int p_to_column) {
window_pos = cursor_pos;
}
+ if (align == ALIGN_CENTER || align == ALIGN_RIGHT) {
+ window_pos = CLAMP(window_pos - (p_to_column - p_from_column), 0, text.length() - 1);
+ }
+
if (!text_changed_dirty) {
if (is_inside_tree()) {
MessageQueue::get_singleton()->push_call(this, "_text_changed");
@@ -1677,7 +1704,9 @@ void LineEdit::_clear_undo_stack() {
void LineEdit::_create_undo_state() {
TextOperation op;
op.text = text;
+ op.cached_width = cached_width;
op.cursor_pos = cursor_pos;
+ op.window_pos = window_pos;
undo_stack.push_back(op);
}
diff --git a/scene/gui/line_edit.h b/scene/gui/line_edit.h
index 3424131dad..ebe49091eb 100644
--- a/scene/gui/line_edit.h
+++ b/scene/gui/line_edit.h
@@ -106,6 +106,8 @@ private:
struct TextOperation {
int cursor_pos;
+ int window_pos;
+ int cached_width;
String text;
};
List<TextOperation> undo_stack;