summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/io/file_access_buffered.h10
-rw-r--r--core/undo_redo.cpp2
-rw-r--r--doc/classes/Color.xml3
-rw-r--r--doc/classes/EditorPlugin.xml2
-rw-r--r--doc/classes/Joint2D.xml2
-rw-r--r--doc/classes/OS.xml2
-rw-r--r--doc/classes/ProjectSettings.xml2
-rw-r--r--doc/classes/RichTextLabel.xml4
-rw-r--r--doc/classes/ToolButton.xml57
-rw-r--r--doc/classes/Vector2.xml3
-rw-r--r--doc/classes/Vector2i.xml3
-rw-r--r--doc/classes/Vector3.xml3
-rw-r--r--doc/classes/Vector3i.xml3
-rw-r--r--doc/classes/VisualShaderNodeSample3D.xml26
-rw-r--r--doc/classes/VisualShaderNodeTexture2DArray.xml20
-rw-r--r--doc/classes/bool.xml13
-rw-r--r--editor/animation_track_editor.cpp15
-rw-r--r--editor/animation_track_editor.h9
-rw-r--r--editor/code_editor.cpp12
-rw-r--r--editor/code_editor.h9
-rw-r--r--editor/connections_dialog.cpp13
-rw-r--r--editor/create_dialog.cpp3
-rw-r--r--editor/debugger/script_editor_debugger.cpp24
-rw-r--r--editor/editor_audio_buses.cpp9
-rw-r--r--editor/editor_audio_buses.h1
-rw-r--r--editor/editor_export.cpp1
-rw-r--r--editor/editor_file_dialog.cpp30
-rw-r--r--editor/editor_file_dialog.h21
-rw-r--r--editor/editor_help.cpp6
-rw-r--r--editor/editor_help.h4
-rw-r--r--editor/editor_help_search.cpp6
-rw-r--r--editor/editor_help_search.h4
-rw-r--r--editor/editor_log.cpp2
-rw-r--r--editor/editor_log.h15
-rw-r--r--editor/editor_node.cpp46
-rw-r--r--editor/editor_node.h38
-rw-r--r--editor/editor_plugin.cpp2
-rw-r--r--editor/editor_plugin.h3
-rw-r--r--editor/editor_properties.cpp3
-rw-r--r--editor/editor_themes.cpp16
-rw-r--r--editor/filesystem_dock.cpp9
-rw-r--r--editor/filesystem_dock.h1
-rw-r--r--editor/groups_editor.cpp6
-rw-r--r--editor/groups_editor.h5
-rw-r--r--editor/icons/AssetLib.svg2
-rw-r--r--editor/icons/ToolButton.svg1
-rw-r--r--editor/import/editor_scene_importer_gltf.cpp1
-rw-r--r--editor/import/resource_importer_scene.cpp4
-rw-r--r--editor/inspector_dock.cpp12
-rw-r--r--editor/inspector_dock.h9
-rw-r--r--editor/node_dock.cpp6
-rw-r--r--editor/node_dock.h4
-rw-r--r--editor/plugins/abstract_polygon_2d_editor.cpp9
-rw-r--r--editor/plugins/abstract_polygon_2d_editor.h7
-rw-r--r--editor/plugins/animation_blend_space_1d_editor.cpp15
-rw-r--r--editor/plugins/animation_blend_space_1d_editor.h12
-rw-r--r--editor/plugins/animation_blend_space_2d_editor.cpp21
-rw-r--r--editor/plugins/animation_blend_space_2d_editor.h14
-rw-r--r--editor/plugins/animation_player_editor_plugin.cpp39
-rw-r--r--editor/plugins/animation_player_editor_plugin.h4
-rw-r--r--editor/plugins/animation_state_machine_editor.cpp18
-rw-r--r--editor/plugins/animation_state_machine_editor.h12
-rw-r--r--editor/plugins/audio_stream_editor_plugin.cpp6
-rw-r--r--editor/plugins/audio_stream_editor_plugin.h4
-rw-r--r--editor/plugins/baked_lightmap_editor_plugin.cpp3
-rw-r--r--editor/plugins/baked_lightmap_editor_plugin.h2
-rw-r--r--editor/plugins/canvas_item_editor_plugin.cpp98
-rw-r--r--editor/plugins/canvas_item_editor_plugin.h38
-rw-r--r--editor/plugins/collision_polygon_3d_editor_plugin.cpp6
-rw-r--r--editor/plugins/collision_polygon_3d_editor_plugin.h5
-rw-r--r--editor/plugins/gi_probe_editor_plugin.cpp3
-rw-r--r--editor/plugins/gi_probe_editor_plugin.h2
-rw-r--r--editor/plugins/item_list_editor_plugin.cpp3
-rw-r--r--editor/plugins/item_list_editor_plugin.h2
-rw-r--r--editor/plugins/node_3d_editor_plugin.cpp40
-rw-r--r--editor/plugins/path_2d_editor_plugin.cpp15
-rw-r--r--editor/plugins/path_2d_editor_plugin.h11
-rw-r--r--editor/plugins/path_3d_editor_plugin.cpp12
-rw-r--r--editor/plugins/path_3d_editor_plugin.h8
-rw-r--r--editor/plugins/physical_bone_3d_editor_plugin.cpp3
-rw-r--r--editor/plugins/physical_bone_3d_editor_plugin.h2
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.cpp19
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.h10
-rw-r--r--editor/plugins/script_editor_plugin.cpp15
-rw-r--r--editor/plugins/script_editor_plugin.h9
-rw-r--r--editor/plugins/sprite_frames_editor_plugin.cpp33
-rw-r--r--editor/plugins/sprite_frames_editor_plugin.h22
-rw-r--r--editor/plugins/texture_region_editor_plugin.cpp9
-rw-r--r--editor/plugins/texture_region_editor_plugin.h6
-rw-r--r--editor/plugins/theme_editor_plugin.cpp5
-rw-r--r--editor/plugins/tile_map_editor_plugin.cpp29
-rw-r--r--editor/plugins/tile_map_editor_plugin.h19
-rw-r--r--editor/plugins/tile_set_editor_plugin.cpp36
-rw-r--r--editor/plugins/tile_set_editor_plugin.h6
-rw-r--r--editor/plugins/version_control_editor_plugin.cpp2
-rw-r--r--editor/plugins/version_control_editor_plugin.h4
-rw-r--r--editor/plugins/visual_shader_editor_plugin.cpp8
-rw-r--r--editor/plugins/visual_shader_editor_plugin.h4
-rw-r--r--editor/project_export.cpp6
-rw-r--r--editor/project_manager.cpp1
-rw-r--r--editor/project_manager.h1
-rw-r--r--editor/project_settings_editor.cpp5
-rw-r--r--editor/project_settings_editor.h2
-rw-r--r--editor/scene_tree_dock.cpp21
-rw-r--r--editor/scene_tree_dock.h11
-rw-r--r--editor/settings_config_dialog.cpp3
-rw-r--r--editor/settings_config_dialog.h3
-rw-r--r--editor/translations/af.po5
-rw-r--r--editor/translations/ar.po5
-rw-r--r--editor/translations/bg.po4
-rw-r--r--editor/translations/bn.po5
-rw-r--r--editor/translations/ca.po5
-rw-r--r--editor/translations/cs.po11
-rw-r--r--editor/translations/da.po18
-rw-r--r--editor/translations/de.po5
-rw-r--r--editor/translations/editor.pot4
-rw-r--r--editor/translations/el.po5
-rw-r--r--editor/translations/eo.po5
-rw-r--r--editor/translations/es.po42
-rw-r--r--editor/translations/es_AR.po5
-rw-r--r--editor/translations/et.po4
-rw-r--r--editor/translations/eu.po4
-rw-r--r--editor/translations/fa.po5
-rw-r--r--editor/translations/fi.po5
-rw-r--r--editor/translations/fil.po4
-rw-r--r--editor/translations/fr.po4
-rw-r--r--editor/translations/ga.po4
-rw-r--r--editor/translations/he.po4
-rw-r--r--editor/translations/hi.po5
-rw-r--r--editor/translations/hr.po5
-rw-r--r--editor/translations/hu.po5
-rw-r--r--editor/translations/id.po5
-rw-r--r--editor/translations/is.po4
-rw-r--r--editor/translations/it.po60
-rw-r--r--editor/translations/ja.po5
-rw-r--r--editor/translations/ka.po5
-rw-r--r--editor/translations/ko.po5
-rw-r--r--editor/translations/lt.po5
-rw-r--r--editor/translations/lv.po5
-rw-r--r--editor/translations/mi.po4
-rw-r--r--editor/translations/ml.po4
-rw-r--r--editor/translations/mr.po4
-rw-r--r--editor/translations/ms.po4
-rw-r--r--editor/translations/nb.po14
-rw-r--r--editor/translations/nl.po19
-rw-r--r--editor/translations/or.po4
-rw-r--r--editor/translations/pl.po115
-rw-r--r--editor/translations/pr.po22
-rw-r--r--editor/translations/pt_BR.po216
-rw-r--r--editor/translations/pt_PT.po5
-rw-r--r--editor/translations/ro.po5
-rw-r--r--editor/translations/ru.po182
-rw-r--r--editor/translations/si.po4
-rw-r--r--editor/translations/sk.po5
-rw-r--r--editor/translations/sl.po5
-rw-r--r--editor/translations/sq.po4
-rw-r--r--editor/translations/sr_Cyrl.po5
-rw-r--r--editor/translations/sr_Latn.po4
-rw-r--r--editor/translations/sv.po5
-rw-r--r--editor/translations/ta.po4
-rw-r--r--editor/translations/te.po4
-rw-r--r--editor/translations/th.po5
-rw-r--r--editor/translations/tr.po5
-rw-r--r--editor/translations/uk.po5
-rw-r--r--editor/translations/ur_PK.po4
-rw-r--r--editor/translations/vi.po5
-rw-r--r--editor/translations/zh_CN.po78
-rw-r--r--editor/translations/zh_HK.po4
-rw-r--r--editor/translations/zh_TW.po11
-rw-r--r--main/main.cpp2
-rw-r--r--misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj4
-rw-r--r--misc/dist/ios_xcode/godot_ios/export_options.plist4
-rwxr-xr-xmisc/dist/osx_template.app/Contents/Info.plist2
-rw-r--r--modules/bullet/SCsub4
-rw-r--r--modules/bullet/space_bullet.cpp22
-rw-r--r--modules/csg/csg.cpp8
-rw-r--r--modules/gdnative/gdnative_library_editor_plugin.cpp2
-rw-r--r--modules/gdnavigation/navigation_mesh_editor_plugin.cpp6
-rw-r--r--modules/gdnavigation/navigation_mesh_editor_plugin.h4
-rw-r--r--modules/gridmap/grid_map_editor_plugin.cpp6
-rw-r--r--modules/gridmap/grid_map_editor_plugin.h4
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/BottomPanel.cs8
-rw-r--r--modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs4
-rw-r--r--modules/mono/glue/GodotSharp/GodotSharp/Core/Extensions/SceneTreeExtensions.cs17
-rw-r--r--modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj1
-rw-r--r--modules/mono/glue/glue_header.h2
-rw-r--r--modules/mono/glue/scene_tree_glue.cpp (renamed from platform/haiku/context_gl_haiku.cpp)99
-rw-r--r--modules/mono/glue/scene_tree_glue.h (renamed from platform/haiku/godot_haiku.cpp)31
-rw-r--r--modules/mono/mono_gd/gd_mono_marshal.cpp4
-rw-r--r--platform/android/java/build.gradle8
-rw-r--r--platform/android/java/plugins/godotpayment/build.gradle32
-rw-r--r--platform/android/java/plugins/godotpayment/src/main/AndroidManifest.xml11
-rw-r--r--platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/GodotPayment.java239
-rw-r--r--platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/GodotPaymentUtils.java66
-rw-r--r--platform/android/java/settings.gradle1
-rw-r--r--platform/android/java_godot_lib_jni.cpp1
-rw-r--r--platform/android/plugin/godot_plugin_config.h23
-rw-r--r--platform/haiku/SCsub25
-rw-r--r--platform/haiku/audio_driver_media_kit.cpp135
-rw-r--r--platform/haiku/audio_driver_media_kit.h74
-rw-r--r--platform/haiku/context_gl_haiku.h62
-rw-r--r--platform/haiku/detect.py158
-rw-r--r--platform/haiku/godot.rdef60
-rw-r--r--platform/haiku/haiku_application.cpp35
-rw-r--r--platform/haiku/haiku_application.h43
-rw-r--r--platform/haiku/haiku_direct_window.cpp363
-rw-r--r--platform/haiku/haiku_direct_window.h89
-rw-r--r--platform/haiku/haiku_gl_view.cpp47
-rw-r--r--platform/haiku/haiku_gl_view.h45
-rw-r--r--platform/haiku/key_mapping_haiku.cpp249
-rw-r--r--platform/haiku/key_mapping_haiku.h42
-rw-r--r--platform/haiku/logo.pngbin1265 -> 0 bytes
-rw-r--r--platform/haiku/os_haiku.cpp358
-rw-r--r--platform/haiku/os_haiku.h123
-rw-r--r--platform/haiku/platform_config.h36
-rw-r--r--platform/iphone/export/export.cpp8
-rw-r--r--platform/osx/display_server_osx.mm8
-rw-r--r--platform/osx/export/export.cpp15
-rw-r--r--platform/uwp/export/export.cpp4
-rw-r--r--platform/windows/display_server_windows.cpp19
-rw-r--r--platform/windows/joypad_windows.cpp18
-rw-r--r--platform/windows/joypad_windows.h1
-rw-r--r--scene/3d/camera_3d.cpp6
-rw-r--r--scene/3d/light_3d.cpp7
-rw-r--r--scene/gui/color_picker.cpp3
-rw-r--r--scene/gui/color_picker.h3
-rw-r--r--scene/gui/file_dialog.cpp15
-rw-r--r--scene/gui/file_dialog.h7
-rw-r--r--scene/gui/graph_edit.cpp13
-rw-r--r--scene/gui/graph_edit.h10
-rw-r--r--scene/gui/line_edit.cpp16
-rw-r--r--scene/gui/rich_text_label.cpp33
-rw-r--r--scene/gui/rich_text_label.h7
-rw-r--r--scene/gui/text_edit.cpp25
-rw-r--r--scene/gui/tool_button.cpp35
-rw-r--r--scene/gui/tool_button.h43
-rw-r--r--scene/main/scene_tree.cpp3
-rw-r--r--scene/register_scene_types.cpp6
-rw-r--r--scene/resources/default_theme/default_theme.cpp24
-rw-r--r--scene/resources/visual_shader_nodes.cpp245
-rw-r--r--scene/resources/visual_shader_nodes.h87
-rw-r--r--servers/physics_server_3d.cpp2
-rw-r--r--servers/rendering/rasterizer_rd/shader_compiler_rd.cpp29
-rw-r--r--servers/rendering/shader_language.cpp256
-rw-r--r--servers/rendering/shader_language.h5
245 files changed, 2281 insertions, 3458 deletions
diff --git a/core/io/file_access_buffered.h b/core/io/file_access_buffered.h
index 61c0fa7489..99d5ce903d 100644
--- a/core/io/file_access_buffered.h
+++ b/core/io/file_access_buffered.h
@@ -51,16 +51,16 @@ protected:
Error set_error(Error p_error) const;
mutable struct File {
- bool open;
- int size;
- int offset;
+ bool open = false;
+ int size = 0;
+ int offset = 0;
String name;
- int access_flags;
+ int access_flags = 0;
} file;
mutable struct Cache {
Vector<uint8_t> buffer;
- int offset;
+ int offset = 0;
} cache;
virtual int read_data_block(int p_offset, int p_size, uint8_t *p_dest = nullptr) const = 0;
diff --git a/core/undo_redo.cpp b/core/undo_redo.cpp
index 90750f2c6e..1dcbb0cd6b 100644
--- a/core/undo_redo.cpp
+++ b/core/undo_redo.cpp
@@ -435,6 +435,7 @@ Variant UndoRedo::_add_do_method(const Variant **p_args, int p_argcount, Callabl
v[i] = *p_args[i + 2];
}
+ static_assert(VARIANT_ARG_MAX == 5, "This code needs to be updated if VARIANT_ARG_MAX != 5");
add_do_method(object, method, v[0], v[1], v[2], v[3], v[4]);
return Variant();
}
@@ -471,6 +472,7 @@ Variant UndoRedo::_add_undo_method(const Variant **p_args, int p_argcount, Calla
v[i] = *p_args[i + 2];
}
+ static_assert(VARIANT_ARG_MAX == 5, "This code needs to be updated if VARIANT_ARG_MAX != 5");
add_undo_method(object, method, v[0], v[1], v[2], v[3], v[4]);
return Variant();
}
diff --git a/doc/classes/Color.xml b/doc/classes/Color.xml
index b35d4fb36a..17b474531e 100644
--- a/doc/classes/Color.xml
+++ b/doc/classes/Color.xml
@@ -5,8 +5,9 @@
</brief_description>
<description>
A color is represented by red, green, and blue [code](r, g, b)[/code] components. Additionally, [code]a[/code] represents the alpha component, often used for transparency. Values are in floating-point and usually range from 0 to 1. Some properties (such as [member CanvasItem.modulate]) may accept values greater than 1.
- You can also create a color from standardized color names by using [method @GDScript.ColorN] or directly using the color constants defined here. The standardized color set is based on the [url=https://en.wikipedia.org/wiki/X11_color_names]X11 color names[/url].
+ You can also create a color from standardized color names by using [method @GDScript.ColorN] or directly using the color constants defined here. The standardized color set is based on the [url=https://en.wikipedia.org/wiki/X11_color_names]X11 color names[/url].
If you want to supply values in a range of 0 to 255, you should use [method @GDScript.Color8].
+ [b]Note:[/b] In a boolean context, a Color will evaluate to [code]false[/code] if it's equal to [code]Color(0, 0, 0, 1)[/code] (opaque black). Otherwise, a Color will always evaluate to [code]true[/code].
</description>
<tutorials>
</tutorials>
diff --git a/doc/classes/EditorPlugin.xml b/doc/classes/EditorPlugin.xml
index 19583fca28..2fa791a9df 100644
--- a/doc/classes/EditorPlugin.xml
+++ b/doc/classes/EditorPlugin.xml
@@ -22,7 +22,7 @@
</description>
</method>
<method name="add_control_to_bottom_panel">
- <return type="ToolButton">
+ <return type="Button">
</return>
<argument index="0" name="control" type="Control">
</argument>
diff --git a/doc/classes/Joint2D.xml b/doc/classes/Joint2D.xml
index fb0e184c26..b055293b9d 100644
--- a/doc/classes/Joint2D.xml
+++ b/doc/classes/Joint2D.xml
@@ -15,7 +15,7 @@
When [member node_a] and [member node_b] move in different directions the [code]bias[/code] controls how fast the joint pulls them back to their original position. The lower the [code]bias[/code] the more the two bodies can pull on the joint.
</member>
<member name="disable_collision" type="bool" setter="set_exclude_nodes_from_collision" getter="get_exclude_nodes_from_collision" default="true">
- If [code]true[/code], [member node_a] and [member node_b] can collide.
+ If [code]true[/code], [member node_a] and [member node_b] can not collide.
</member>
<member name="node_a" type="NodePath" setter="set_node_a" getter="get_node_a" default="NodePath(&quot;&quot;)">
The first body attached to the joint. Must derive from [PhysicsBody2D].
diff --git a/doc/classes/OS.xml b/doc/classes/OS.xml
index 23473290c7..105def21ca 100644
--- a/doc/classes/OS.xml
+++ b/doc/classes/OS.xml
@@ -205,7 +205,7 @@
<return type="String">
</return>
<description>
- Returns the name of the host OS. Possible values are: [code]"Android"[/code], [code]"Haiku"[/code], [code]"iOS"[/code], [code]"HTML5"[/code], [code]"OSX"[/code], [code]"Server"[/code], [code]"Windows"[/code], [code]"UWP"[/code], [code]"X11"[/code].
+ Returns the name of the host OS. Possible values are: [code]"Android"[/code], [code]"iOS"[/code], [code]"HTML5"[/code], [code]"OSX"[/code], [code]"Server"[/code], [code]"Windows"[/code], [code]"UWP"[/code], [code]"X11"[/code].
</description>
</method>
<method name="get_process_id" qualifiers="const">
diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml
index 92e5b4a84f..7191492098 100644
--- a/doc/classes/ProjectSettings.xml
+++ b/doc/classes/ProjectSettings.xml
@@ -821,6 +821,8 @@
</member>
<member name="mono/profiler/enabled" type="bool" setter="" getter="" default="false">
</member>
+ <member name="mono/project/auto_update_project" type="bool" setter="" getter="" default="true">
+ </member>
<member name="mono/unhandled_exception_policy" type="int" setter="" getter="" default="0">
</member>
<member name="network/limits/debugger/max_chars_per_second" type="int" setter="" getter="" default="32768">
diff --git a/doc/classes/RichTextLabel.xml b/doc/classes/RichTextLabel.xml
index db036d7d88..d4eba77ffa 100644
--- a/doc/classes/RichTextLabel.xml
+++ b/doc/classes/RichTextLabel.xml
@@ -294,6 +294,10 @@
The currently installed custom effects. This is an array of [RichTextEffect]s.
To add a custom effect, it's more convenient to use [method install_effect].
</member>
+ <member name="fit_content_height" type="bool" setter="set_fit_content_height" getter="is_fit_content_height_enabled" default="false">
+ If [code]true[/code], the label's height will be automatically updated to fit its content.
+ [b]Note:[/b] This property is used as a workaround to fix issues with [RichTextLabel] in [Container]s, but it's unreliable in some cases and will be removed in future versions.
+ </member>
<member name="meta_underlined" type="bool" setter="set_meta_underline" getter="is_meta_underlined" default="true">
If [code]true[/code], the label underlines meta tags such as [code][url]{text}[/url][/code].
</member>
diff --git a/doc/classes/ToolButton.xml b/doc/classes/ToolButton.xml
deleted file mode 100644
index f78627b163..0000000000
--- a/doc/classes/ToolButton.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<class name="ToolButton" inherits="Button" version="4.0">
- <brief_description>
- Flat button helper class.
- </brief_description>
- <description>
- This is a helper class to generate a flat [Button] (see [member Button.flat]), creating a [ToolButton] is equivalent to:
- [codeblock]
- var btn = Button.new()
- btn.flat = true
- [/codeblock]
- </description>
- <tutorials>
- </tutorials>
- <methods>
- </methods>
- <members>
- <member name="flat" type="bool" setter="set_flat" getter="is_flat" override="true" default="true" />
- </members>
- <constants>
- </constants>
- <theme_items>
- <theme_item name="disabled" type="StyleBox">
- [StyleBox] used when the [ToolButton] is disabled.
- </theme_item>
- <theme_item name="focus" type="StyleBox">
- [StyleBox] used when the [ToolButton] is focused. It is displayed over the current [StyleBox], so using [StyleBoxEmpty] will just disable the focus visual effect.
- </theme_item>
- <theme_item name="font" type="Font">
- [Font] of the [ToolButton]'s text.
- </theme_item>
- <theme_item name="font_color" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )">
- Default text [Color] of the [ToolButton].
- </theme_item>
- <theme_item name="font_color_disabled" type="Color" default="Color( 0.9, 0.95, 1, 0.3 )">
- Text [Color] used when the [ToolButton] is disabled.
- </theme_item>
- <theme_item name="font_color_hover" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
- Text [Color] used when the [ToolButton] is being hovered.
- </theme_item>
- <theme_item name="font_color_pressed" type="Color" default="Color( 1, 1, 1, 1 )">
- Text [Color] used when the [ToolButton] is being pressed.
- </theme_item>
- <theme_item name="hover" type="StyleBox">
- [StyleBox] used when the [ToolButton] is being hovered.
- </theme_item>
- <theme_item name="hseparation" type="int" default="3">
- The horizontal space between [ToolButton]'s icon and text.
- </theme_item>
- <theme_item name="normal" type="StyleBox">
- Default [StyleBox] for the [ToolButton].
- </theme_item>
- <theme_item name="pressed" type="StyleBox">
- [StyleBox] used when the [ToolButton] is being pressed.
- </theme_item>
- </theme_items>
-</class>
diff --git a/doc/classes/Vector2.xml b/doc/classes/Vector2.xml
index 64ebc1fa09..7f4a212679 100644
--- a/doc/classes/Vector2.xml
+++ b/doc/classes/Vector2.xml
@@ -5,7 +5,8 @@
</brief_description>
<description>
2-element structure that can be used to represent positions in 2D space or any other pair of numeric values.
- It uses floating point coordinates.
+ It uses floating-point coordinates. See [Vector2i] for its integer counterpart.
+ [b]Note:[/b] In a boolean context, a Vector2 will evaluate to [code]false[/code] if it's equal to [code]Vector2(0, 0)[/code]. Otherwise, a Vector2 will always evaluate to [code]true[/code].
</description>
<tutorials>
<link>https://docs.godotengine.org/en/latest/tutorials/math/index.html</link>
diff --git a/doc/classes/Vector2i.xml b/doc/classes/Vector2i.xml
index 71c7aaa4e5..2f7ca985b2 100644
--- a/doc/classes/Vector2i.xml
+++ b/doc/classes/Vector2i.xml
@@ -5,7 +5,8 @@
</brief_description>
<description>
2-element structure that can be used to represent positions in 2D space or any other pair of numeric values.
- It uses integer coordinates.
+ It uses integer coordinates and is therefore preferable to [Vector2] when exact precision is required.
+ [b]Note:[/b] In a boolean context, a Vector2i will evaluate to [code]false[/code] if it's equal to [code]Vector2i(0, 0)[/code]. Otherwise, a Vector2i will always evaluate to [code]true[/code].
</description>
<tutorials>
<link>https://docs.godotengine.org/en/latest/tutorials/math/index.html</link>
diff --git a/doc/classes/Vector3.xml b/doc/classes/Vector3.xml
index 29222bb4d1..0c861e5ee2 100644
--- a/doc/classes/Vector3.xml
+++ b/doc/classes/Vector3.xml
@@ -5,7 +5,8 @@
</brief_description>
<description>
3-element structure that can be used to represent positions in 3D space or any other pair of numeric values.
- It uses floating point coordinates.
+ It uses floating-point coordinates. See [Vector3i] for its integer counterpart.
+ [b]Note:[/b] In a boolean context, a Vector3 will evaluate to [code]false[/code] if it's equal to [code]Vector3(0, 0, 0)[/code]. Otherwise, a Vector3 will always evaluate to [code]true[/code].
</description>
<tutorials>
<link>https://docs.godotengine.org/en/latest/tutorials/math/index.html</link>
diff --git a/doc/classes/Vector3i.xml b/doc/classes/Vector3i.xml
index c5aa3d0347..91d64ea609 100644
--- a/doc/classes/Vector3i.xml
+++ b/doc/classes/Vector3i.xml
@@ -5,7 +5,8 @@
</brief_description>
<description>
3-element structure that can be used to represent positions in 3D space or any other pair of numeric values.
- It uses integer coordinates.
+ It uses integer coordinates and is therefore preferable to [Vector3] when exact precision is required.
+ [b]Note:[/b] In a boolean context, a Vector3i will evaluate to [code]false[/code] if it's equal to [code]Vector3i(0, 0, 0)[/code]. Otherwise, a Vector3i will always evaluate to [code]true[/code].
</description>
<tutorials>
<link>https://docs.godotengine.org/en/latest/tutorials/math/index.html</link>
diff --git a/doc/classes/VisualShaderNodeSample3D.xml b/doc/classes/VisualShaderNodeSample3D.xml
new file mode 100644
index 0000000000..cf6933ab55
--- /dev/null
+++ b/doc/classes/VisualShaderNodeSample3D.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="VisualShaderNodeSample3D" inherits="VisualShaderNode" version="4.0">
+ <brief_description>
+ A base node for nodes which samples 3D textures in the visual shader graph.
+ </brief_description>
+ <description>
+ A virtual class, use the descendants instead.
+ </description>
+ <tutorials>
+ </tutorials>
+ <methods>
+ </methods>
+ <members>
+ <member name="source" type="int" setter="set_source" getter="get_source" enum="VisualShaderNodeSample3D.Source" default="0">
+ An input source type.
+ </member>
+ </members>
+ <constants>
+ <constant name="SOURCE_TEXTURE" value="0" enum="Source">
+ Creates internal uniform and provides a way to assign it within node.
+ </constant>
+ <constant name="SOURCE_PORT" value="1" enum="Source">
+ Use the uniform texture from sampler port.
+ </constant>
+ </constants>
+</class>
diff --git a/doc/classes/VisualShaderNodeTexture2DArray.xml b/doc/classes/VisualShaderNodeTexture2DArray.xml
new file mode 100644
index 0000000000..3c6d328ed0
--- /dev/null
+++ b/doc/classes/VisualShaderNodeTexture2DArray.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<class name="VisualShaderNodeTexture2DArray" inherits="VisualShaderNodeSample3D" version="4.0">
+ <brief_description>
+ A 2D texture uniform array to be used within the visual shader graph.
+ </brief_description>
+ <description>
+ Translated to [code]uniform sampler2DArray[/code] in the shader language.
+ </description>
+ <tutorials>
+ </tutorials>
+ <methods>
+ </methods>
+ <members>
+ <member name="texture_array" type="Texture2DArray" setter="set_texture_array" getter="get_texture_array">
+ A source texture array. Used if [member VisualShaderNodeSample3D.source] is set to [constant VisualShaderNodeSample3D.SOURCE_TEXTURE].
+ </member>
+ </members>
+ <constants>
+ </constants>
+</class>
diff --git a/doc/classes/bool.xml b/doc/classes/bool.xml
index 4482a280b2..869fc14d40 100644
--- a/doc/classes/bool.xml
+++ b/doc/classes/bool.xml
@@ -4,14 +4,14 @@
Boolean built-in type.
</brief_description>
<description>
- Boolean is a built-in type. It can represent any data type that is either a true or false value. You can think of it as an switch with on or off (1 or 0) setting. It's often used as part of programming logic in condition statements like [code]if[/code] statements.
- [b]Note:[/b] In a code below [code]if can_shoot[/code] is equivalent of [code]if can_shoot == true[/code]. It is good practice to follow the natural spoken language structure when possible. Use [code]if can_shoot[/code] rather than [code]if can_shoot == true[/code] and use [code]if not can_shoot[/code] rather than [code]if can_shoot == false[/code].
+ Boolean is a built-in type. There are two boolean values: [code]true[/code] and [code]false[/code]. You can think of it as an switch with on or off (1 or 0) setting. Booleans are used in programming for logic in condition statements, like [code]if[/code] statements.
+ Booleans can be directly used in [code]if[/code] statements. The code below demonstrates this on the [code]if can_shoot:[/code] line. You don't need to use [code]== true[/code], you only need [code]if can_shoot:[/code]. Similarly, use [code]if not can_shoot:[/code] rather than [code]== false[/code].
[codeblock]
var can_shoot = true
func shoot():
if can_shoot:
- # Perform shooting actions here.
+ pass # Perform shooting actions here.
[/codeblock]
The following code will only create a bullet if both conditions are met: action "shoot" is pressed and if [code]can_shoot[/code] is [code]true[/code].
[b]Note:[/b] [code]Input.is_action_pressed("shoot")[/code] is also a boolean that is [code]true[/code] when "shoot" is pressed and [code]false[/code] when "shoot" isn't pressed.
@@ -46,7 +46,7 @@
<argument index="0" name="from" type="int">
</argument>
<description>
- Cast an [int] value to a boolean value, this method will return [code]true[/code] if called with an integer value different to 0 and [code]false[/code] in other case.
+ Cast an [int] value to a boolean value, this method will return [code]false[/code] if [code]0[/code] is passed in, and [code]true[/code] for all other ints.
</description>
</method>
<method name="bool">
@@ -55,7 +55,7 @@
<argument index="0" name="from" type="float">
</argument>
<description>
- Cast a [float] value to a boolean value, this method will return [code]true[/code] if called with a floating-point value different to 0 and [code]false[/code] in other case.
+ Cast a [float] value to a boolean value, this method will return [code]false[/code] if [code]0.0[/code] is passed in, and [code]true[/code] for all other floats.
</description>
</method>
<method name="bool">
@@ -64,7 +64,8 @@
<argument index="0" name="from" type="String">
</argument>
<description>
- Cast a [String] value to a boolean value, this method will return [code]true[/code] if called with a non-empty string and [code]false[/code] in other case. Examples: [code]bool("False")[/code] returns [code]true[/code], [code]bool("")[/code] returns [code]false[/code].
+ Cast a [String] value to a boolean value, this method will return [code]false[/code] if [code]""[/code] is passed in, and [code]true[/code] for all non-empty strings.
+ Examples: [code]bool("False")[/code] returns [code]true[/code], [code]bool("")[/code] returns [code]false[/code].
</description>
</method>
</methods>
diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp
index 8fd1f5951e..f36e84dab6 100644
--- a/editor/animation_track_editor.cpp
+++ b/editor/animation_track_editor.cpp
@@ -1783,7 +1783,8 @@ AnimationTimelineEdit::AnimationTimelineEdit() {
length->set_tooltip(TTR("Animation length (seconds)"));
length->connect("value_changed", callable_mp(this, &AnimationTimelineEdit::_anim_length_changed));
len_hb->add_child(length);
- loop = memnew(ToolButton);
+ loop = memnew(Button);
+ loop->set_flat(true);
loop->set_tooltip(TTR("Animation Looping"));
loop->connect("pressed", callable_mp(this, &AnimationTimelineEdit::_anim_loop_pressed));
loop->set_toggle_mode(true);
@@ -2786,7 +2787,8 @@ Variant AnimationTrackEdit::get_drag_data(const Point2 &p_point) {
drag_data["group"] = base_path;
drag_data["index"] = track;
- ToolButton *tb = memnew(ToolButton);
+ Button *tb = memnew(Button);
+ tb->set_flat(true);
tb->set_text(path_cache);
tb->set_icon(icon_cache);
set_drag_preview(tb);
@@ -5640,14 +5642,16 @@ AnimationTrackEditor::AnimationTrackEditor() {
bottom_hb->add_spacer();
- selected_filter = memnew(ToolButton);
+ selected_filter = memnew(Button);
+ selected_filter->set_flat(true);
selected_filter->connect("pressed", callable_mp(this, &AnimationTrackEditor::_view_group_toggle)); //same function works the same
selected_filter->set_toggle_mode(true);
selected_filter->set_tooltip(TTR("Only show tracks from nodes selected in tree."));
bottom_hb->add_child(selected_filter);
- view_group = memnew(ToolButton);
+ view_group = memnew(Button);
+ view_group->set_flat(true);
view_group->connect("pressed", callable_mp(this, &AnimationTrackEditor::_view_group_toggle));
view_group->set_toggle_mode(true);
view_group->set_tooltip(TTR("Group tracks by node or display them as plain list."));
@@ -5655,7 +5659,8 @@ AnimationTrackEditor::AnimationTrackEditor() {
bottom_hb->add_child(view_group);
bottom_hb->add_child(memnew(VSeparator));
- snap = memnew(ToolButton);
+ snap = memnew(Button);
+ snap->set_flat(true);
snap->set_text(TTR("Snap:") + " ");
bottom_hb->add_child(snap);
snap->set_disabled(true);
diff --git a/editor/animation_track_editor.h b/editor/animation_track_editor.h
index 6a46a1e3ff..911280dc3b 100644
--- a/editor/animation_track_editor.h
+++ b/editor/animation_track_editor.h
@@ -44,7 +44,6 @@
#include "scene/gui/spin_box.h"
#include "scene/gui/tab_container.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
#include "scene/resources/animation.h"
#include "scene_tree_editor.h"
@@ -59,7 +58,7 @@ class AnimationTimelineEdit : public Range {
HBoxContainer *len_hb;
EditorSpinSlider *length;
- ToolButton *loop;
+ Button *loop;
TextureRect *time_icon;
MenuButton *add_track;
@@ -310,7 +309,7 @@ class AnimationTrackEditor : public VBoxContainer {
HSlider *zoom;
EditorSpinSlider *step;
TextureRect *zoom_icon;
- ToolButton *snap;
+ Button *snap;
OptionButton *snap_mode;
Button *imported_anim_warning;
@@ -457,8 +456,8 @@ class AnimationTrackEditor : public VBoxContainer {
void _anim_duplicate_keys(bool transpose);
void _view_group_toggle();
- ToolButton *view_group;
- ToolButton *selected_filter;
+ Button *view_group;
+ Button *selected_filter;
void _selection_changed();
diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp
index 717c1406c8..c5df947d64 100644
--- a/editor/code_editor.cpp
+++ b/editor/code_editor.cpp
@@ -628,12 +628,14 @@ FindReplaceBar::FindReplaceBar() {
hbc_button_search->add_child(matches_label);
matches_label->hide();
- find_prev = memnew(ToolButton);
+ find_prev = memnew(Button);
+ find_prev->set_flat(true);
hbc_button_search->add_child(find_prev);
find_prev->set_focus_mode(FOCUS_NONE);
find_prev->connect("pressed", callable_mp(this, &FindReplaceBar::search_prev));
- find_next = memnew(ToolButton);
+ find_next = memnew(Button);
+ find_next->set_flat(true);
hbc_button_search->add_child(find_next);
find_next->set_focus_mode(FOCUS_NONE);
find_next->connect("pressed", callable_mp(this, &FindReplaceBar::search_next));
@@ -1706,7 +1708,8 @@ CodeTextEditor::CodeTextEditor() {
error_line = 0;
error_column = 0;
- toggle_scripts_button = memnew(ToolButton);
+ toggle_scripts_button = memnew(Button);
+ toggle_scripts_button->set_flat(true);
toggle_scripts_button->connect("pressed", callable_mp(this, &CodeTextEditor::_toggle_scripts_pressed));
status_bar->add_child(toggle_scripts_button);
toggle_scripts_button->hide();
@@ -1726,7 +1729,8 @@ CodeTextEditor::CodeTextEditor() {
find_replace_bar->connect("error", callable_mp(error, &Label::set_text));
// Warnings
- warning_button = memnew(ToolButton);
+ warning_button = memnew(Button);
+ warning_button->set_flat(true);
status_bar->add_child(warning_button);
warning_button->set_v_size_flags(SIZE_EXPAND | SIZE_SHRINK_CENTER);
warning_button->set_default_cursor_shape(CURSOR_POINTING_HAND);
diff --git a/editor/code_editor.h b/editor/code_editor.h
index d806be885f..ab298202bd 100644
--- a/editor/code_editor.h
+++ b/editor/code_editor.h
@@ -37,7 +37,6 @@
#include "scene/gui/dialogs.h"
#include "scene/gui/line_edit.h"
#include "scene/gui/text_edit.h"
-#include "scene/gui/tool_button.h"
#include "scene/main/timer.h"
class GotoLineDialog : public ConfirmationDialog {
@@ -63,8 +62,8 @@ class FindReplaceBar : public HBoxContainer {
LineEdit *search_text;
Label *matches_label;
- ToolButton *find_prev;
- ToolButton *find_next;
+ Button *find_prev;
+ Button *find_next;
CheckBox *case_sensitive;
CheckBox *whole_words;
TextureButton *hide_button;
@@ -142,8 +141,8 @@ class CodeTextEditor : public VBoxContainer {
FindReplaceBar *find_replace_bar;
HBoxContainer *status_bar;
- ToolButton *toggle_scripts_button;
- ToolButton *warning_button;
+ Button *toggle_scripts_button;
+ Button *warning_button;
Label *warning_count_label;
Label *line_and_col_txt;
diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp
index 6507956d07..facd57418d 100644
--- a/editor/connections_dialog.cpp
+++ b/editor/connections_dialog.cpp
@@ -108,17 +108,26 @@ public:
* Signal automatically called by parent dialog.
*/
void ConnectDialog::ok_pressed() {
- if (dst_method->get_text() == "") {
+ String method_name = dst_method->get_text();
+
+ if (method_name == "") {
error->set_text(TTR("Method in target node must be specified."));
error->popup_centered();
return;
}
+
+ if (!method_name.strip_edges().is_valid_identifier()) {
+ error->set_text(TTR("Method name must be a valid identifier."));
+ error->popup_centered();
+ return;
+ }
+
Node *target = tree->get_selected();
if (!target) {
return; // Nothing selected in the tree, not an error.
}
if (target->get_script().is_null()) {
- if (!target->has_method(dst_method->get_text())) {
+ if (!target->has_method(method_name)) {
error->set_text(TTR("Target method not found. Specify a valid method or attach a script to the target node."));
error->popup_centered();
return;
diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp
index 73468f8ce0..310de9dd90 100644
--- a/editor/create_dialog.cpp
+++ b/editor/create_dialog.cpp
@@ -673,7 +673,8 @@ Variant CreateDialog::get_drag_data_fw(const Point2 &p_point, Control *p_from) {
d["type"] = "create_favorite_drag";
d["class"] = ti->get_text(0);
- ToolButton *tb = memnew(ToolButton);
+ Button *tb = memnew(Button);
+ tb->set_flat(true);
tb->set_icon(ti->get_icon(0));
tb->set_text(ti->get_text(0));
favorites->set_drag_preview(tb);
diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp
index 49137f76fa..a042afc788 100644
--- a/editor/debugger/script_editor_debugger.cpp
+++ b/editor/debugger/script_editor_debugger.cpp
@@ -1517,27 +1517,31 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
hbc->add_child(memnew(VSeparator));
- skip_breakpoints = memnew(ToolButton);
+ skip_breakpoints = memnew(Button);
+ skip_breakpoints->set_flat(true);
hbc->add_child(skip_breakpoints);
skip_breakpoints->set_tooltip(TTR("Skip Breakpoints"));
skip_breakpoints->connect("pressed", callable_mp(this, &ScriptEditorDebugger::debug_skip_breakpoints));
hbc->add_child(memnew(VSeparator));
- copy = memnew(ToolButton);
+ copy = memnew(Button);
+ copy->set_flat(true);
hbc->add_child(copy);
copy->set_tooltip(TTR("Copy Error"));
copy->connect("pressed", callable_mp(this, &ScriptEditorDebugger::debug_copy));
hbc->add_child(memnew(VSeparator));
- step = memnew(ToolButton);
+ step = memnew(Button);
+ step->set_flat(true);
hbc->add_child(step);
step->set_tooltip(TTR("Step Into"));
step->set_shortcut(ED_GET_SHORTCUT("debugger/step_into"));
step->connect("pressed", callable_mp(this, &ScriptEditorDebugger::debug_step));
- next = memnew(ToolButton);
+ next = memnew(Button);
+ next->set_flat(true);
hbc->add_child(next);
next->set_tooltip(TTR("Step Over"));
next->set_shortcut(ED_GET_SHORTCUT("debugger/step_over"));
@@ -1545,13 +1549,15 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
hbc->add_child(memnew(VSeparator));
- dobreak = memnew(ToolButton);
+ dobreak = memnew(Button);
+ dobreak->set_flat(true);
hbc->add_child(dobreak);
dobreak->set_tooltip(TTR("Break"));
dobreak->set_shortcut(ED_GET_SHORTCUT("debugger/break"));
dobreak->connect("pressed", callable_mp(this, &ScriptEditorDebugger::debug_break));
- docontinue = memnew(ToolButton);
+ docontinue = memnew(Button);
+ docontinue->set_flat(true);
hbc->add_child(docontinue);
docontinue->set_tooltip(TTR("Continue"));
docontinue->set_shortcut(ED_GET_SHORTCUT("debugger/continue"));
@@ -1730,9 +1736,11 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
vmem_total->set_editable(false);
vmem_total->set_custom_minimum_size(Size2(100, 0) * EDSCALE);
vmem_hb->add_child(vmem_total);
- vmem_refresh = memnew(ToolButton);
+ vmem_refresh = memnew(Button);
+ vmem_refresh->set_flat(true);
vmem_hb->add_child(vmem_refresh);
- vmem_export = memnew(ToolButton);
+ vmem_export = memnew(Button);
+ vmem_export->set_flat(true);
vmem_export->set_tooltip(TTR("Export list to a CSV file"));
vmem_hb->add_child(vmem_export);
vmem_vb->add_child(vmem_hb);
diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp
index 5cf5201b18..10825973ae 100644
--- a/editor/editor_audio_buses.cpp
+++ b/editor/editor_audio_buses.cpp
@@ -782,19 +782,22 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) {
HBoxContainer *hbc = memnew(HBoxContainer);
vb->add_child(hbc);
- solo = memnew(ToolButton);
+ solo = memnew(Button);
+ solo->set_flat(true);
solo->set_toggle_mode(true);
solo->set_tooltip(TTR("Solo"));
solo->set_focus_mode(FOCUS_NONE);
solo->connect("pressed", callable_mp(this, &EditorAudioBus::_solo_toggled));
hbc->add_child(solo);
- mute = memnew(ToolButton);
+ mute = memnew(Button);
+ mute->set_flat(true);
mute->set_toggle_mode(true);
mute->set_tooltip(TTR("Mute"));
mute->set_focus_mode(FOCUS_NONE);
mute->connect("pressed", callable_mp(this, &EditorAudioBus::_mute_toggled));
hbc->add_child(mute);
- bypass = memnew(ToolButton);
+ bypass = memnew(Button);
+ bypass->set_flat(true);
bypass->set_toggle_mode(true);
bypass->set_tooltip(TTR("Bypass"));
bypass->set_focus_mode(FOCUS_NONE);
diff --git a/editor/editor_audio_buses.h b/editor/editor_audio_buses.h
index 65caf84f0f..5d5502002d 100644
--- a/editor/editor_audio_buses.h
+++ b/editor/editor_audio_buses.h
@@ -45,7 +45,6 @@
#include "scene/gui/slider.h"
#include "scene/gui/texture_progress.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
class EditorAudioBuses;
diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp
index 25594bf7c8..951bec2c83 100644
--- a/editor/editor_export.cpp
+++ b/editor/editor_export.cpp
@@ -100,7 +100,6 @@ void EditorExportPreset::update_files_to_export() {
for (int i = 0; i < to_remove.size(); ++i) {
selected_files.erase(to_remove[i]);
}
- EditorExport::singleton->save_presets();
}
Vector<String> EditorExportPreset::get_files_to_export() const {
diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp
index 5ae5d1cb31..663f3dd856 100644
--- a/editor/editor_file_dialog.cpp
+++ b/editor/editor_file_dialog.cpp
@@ -1455,11 +1455,14 @@ EditorFileDialog::EditorFileDialog() {
HBoxContainer *pathhb = memnew(HBoxContainer);
- dir_prev = memnew(ToolButton);
+ dir_prev = memnew(Button);
+ dir_prev->set_flat(true);
dir_prev->set_tooltip(TTR("Go to previous folder."));
- dir_next = memnew(ToolButton);
+ dir_next = memnew(Button);
+ dir_next->set_flat(true);
dir_next->set_tooltip(TTR("Go to next folder."));
- dir_up = memnew(ToolButton);
+ dir_up = memnew(Button);
+ dir_up->set_flat(true);
dir_up->set_tooltip(TTR("Go to parent folder."));
pathhb->add_child(dir_prev);
@@ -1479,18 +1482,21 @@ EditorFileDialog::EditorFileDialog() {
pathhb->add_child(dir);
dir->set_h_size_flags(Control::SIZE_EXPAND_FILL);
- refresh = memnew(ToolButton);
+ refresh = memnew(Button);
+ refresh->set_flat(true);
refresh->set_tooltip(TTR("Refresh files."));
refresh->connect("pressed", callable_mp(this, &EditorFileDialog::update_file_list));
pathhb->add_child(refresh);
- favorite = memnew(ToolButton);
+ favorite = memnew(Button);
+ favorite->set_flat(true);
favorite->set_toggle_mode(true);
favorite->set_tooltip(TTR("(Un)favorite current folder."));
favorite->connect("pressed", callable_mp(this, &EditorFileDialog::_favorite_pressed));
pathhb->add_child(favorite);
- show_hidden = memnew(ToolButton);
+ show_hidden = memnew(Button);
+ show_hidden->set_flat(true);
show_hidden->set_toggle_mode(true);
show_hidden->set_pressed(is_showing_hidden_files());
show_hidden->set_tooltip(TTR("Toggle the visibility of hidden files."));
@@ -1502,7 +1508,8 @@ EditorFileDialog::EditorFileDialog() {
Ref<ButtonGroup> view_mode_group;
view_mode_group.instance();
- mode_thumbnails = memnew(ToolButton);
+ mode_thumbnails = memnew(Button);
+ mode_thumbnails->set_flat(true);
mode_thumbnails->connect("pressed", callable_mp(this, &EditorFileDialog::set_display_mode), varray(DISPLAY_THUMBNAILS));
mode_thumbnails->set_toggle_mode(true);
mode_thumbnails->set_pressed(display_mode == DISPLAY_THUMBNAILS);
@@ -1510,7 +1517,8 @@ EditorFileDialog::EditorFileDialog() {
mode_thumbnails->set_tooltip(TTR("View items as a grid of thumbnails."));
pathhb->add_child(mode_thumbnails);
- mode_list = memnew(ToolButton);
+ mode_list = memnew(Button);
+ mode_list->set_flat(true);
mode_list->connect("pressed", callable_mp(this, &EditorFileDialog::set_display_mode), varray(DISPLAY_LIST));
mode_list->set_toggle_mode(true);
mode_list->set_pressed(display_mode == DISPLAY_LIST);
@@ -1547,10 +1555,12 @@ EditorFileDialog::EditorFileDialog() {
fav_vb->add_child(fav_hb);
fav_hb->add_child(memnew(Label(TTR("Favorites:"))));
fav_hb->add_spacer();
- fav_up = memnew(ToolButton);
+ fav_up = memnew(Button);
+ fav_up->set_flat(true);
fav_hb->add_child(fav_up);
fav_up->connect("pressed", callable_mp(this, &EditorFileDialog::_favorite_move_up));
- fav_down = memnew(ToolButton);
+ fav_down = memnew(Button);
+ fav_down->set_flat(true);
fav_hb->add_child(fav_down);
fav_down->connect("pressed", callable_mp(this, &EditorFileDialog::_favorite_move_down));
diff --git a/editor/editor_file_dialog.h b/editor/editor_file_dialog.h
index cbedfc72a6..1e224b933d 100644
--- a/editor/editor_file_dialog.h
+++ b/editor/editor_file_dialog.h
@@ -40,7 +40,6 @@
#include "scene/gui/separator.h"
#include "scene/gui/split_container.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
class DependencyRemoveDialog;
@@ -95,9 +94,9 @@ private:
bool can_create_dir;
LineEdit *dir;
- ToolButton *dir_prev;
- ToolButton *dir_next;
- ToolButton *dir_up;
+ Button *dir_prev;
+ Button *dir_next;
+ Button *dir_up;
HBoxContainer *drives_container;
HBoxContainer *shortcuts_container;
@@ -116,15 +115,15 @@ private:
ConfirmationDialog *confirm_save;
DependencyRemoveDialog *remove_dialog;
- ToolButton *mode_thumbnails;
- ToolButton *mode_list;
+ Button *mode_thumbnails;
+ Button *mode_list;
- ToolButton *refresh;
- ToolButton *favorite;
- ToolButton *show_hidden;
+ Button *refresh;
+ Button *favorite;
+ Button *show_hidden;
- ToolButton *fav_up;
- ToolButton *fav_down;
+ Button *fav_up;
+ Button *fav_down;
ItemList *favorites;
ItemList *recent;
diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp
index f50ac6d580..2a59aadd61 100644
--- a/editor/editor_help.cpp
+++ b/editor/editor_help.cpp
@@ -1664,12 +1664,14 @@ FindBar::FindBar() {
add_child(matches_label);
matches_label->hide();
- find_prev = memnew(ToolButton);
+ find_prev = memnew(Button);
+ find_prev->set_flat(true);
add_child(find_prev);
find_prev->set_focus_mode(FOCUS_NONE);
find_prev->connect("pressed", callable_mp(this, &FindBar::search_prev));
- find_next = memnew(ToolButton);
+ find_next = memnew(Button);
+ find_next->set_flat(true);
add_child(find_next);
find_next->set_focus_mode(FOCUS_NONE);
find_next->connect("pressed", callable_mp(this, &FindBar::search_next));
diff --git a/editor/editor_help.h b/editor/editor_help.h
index 4d42c1d38a..7c3edeb299 100644
--- a/editor/editor_help.h
+++ b/editor/editor_help.h
@@ -47,8 +47,8 @@ class FindBar : public HBoxContainer {
GDCLASS(FindBar, HBoxContainer);
LineEdit *search_text;
- ToolButton *find_prev;
- ToolButton *find_next;
+ Button *find_prev;
+ Button *find_next;
Label *matches_label;
TextureButton *hide_button;
String prev_search;
diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp
index 5bfcbf06fc..d2b9405552 100644
--- a/editor/editor_help_search.cpp
+++ b/editor/editor_help_search.cpp
@@ -201,14 +201,16 @@ EditorHelpSearch::EditorHelpSearch() {
register_text_enter(search_box);
hbox->add_child(search_box);
- case_sensitive_button = memnew(ToolButton);
+ case_sensitive_button = memnew(Button);
+ case_sensitive_button->set_flat(true);
case_sensitive_button->set_tooltip(TTR("Case Sensitive"));
case_sensitive_button->connect("pressed", callable_mp(this, &EditorHelpSearch::_update_results));
case_sensitive_button->set_toggle_mode(true);
case_sensitive_button->set_focus_mode(Control::FOCUS_NONE);
hbox->add_child(case_sensitive_button);
- hierarchy_button = memnew(ToolButton);
+ hierarchy_button = memnew(Button);
+ hierarchy_button->set_flat(true);
hierarchy_button->set_tooltip(TTR("Show Hierarchy"));
hierarchy_button->connect("pressed", callable_mp(this, &EditorHelpSearch::_update_results));
hierarchy_button->set_toggle_mode(true);
diff --git a/editor/editor_help_search.h b/editor/editor_help_search.h
index f7dbc5c3ad..b37f74fd7e 100644
--- a/editor/editor_help_search.h
+++ b/editor/editor_help_search.h
@@ -54,8 +54,8 @@ class EditorHelpSearch : public ConfirmationDialog {
};
LineEdit *search_box;
- ToolButton *case_sensitive_button;
- ToolButton *hierarchy_button;
+ Button *case_sensitive_button;
+ Button *hierarchy_button;
OptionButton *filter_combo;
Tree *results_tree;
bool old_search;
diff --git a/editor/editor_log.cpp b/editor/editor_log.cpp
index ea5f73acd1..9595eb8a72 100644
--- a/editor/editor_log.cpp
+++ b/editor/editor_log.cpp
@@ -124,7 +124,7 @@ void EditorLog::add_message(const String &p_msg, MessageType p_type) {
}
}
-void EditorLog::set_tool_button(ToolButton *p_tool_button) {
+void EditorLog::set_tool_button(Button *p_tool_button) {
tool_button = p_tool_button;
}
diff --git a/editor/editor_log.h b/editor/editor_log.h
index 1c9a2d4062..3bf5615346 100644
--- a/editor/editor_log.h
+++ b/editor/editor_log.h
@@ -31,17 +31,16 @@
#ifndef EDITOR_LOG_H
#define EDITOR_LOG_H
-#include "scene/gui/control.h"
-#include "scene/gui/label.h"
-#include "scene/gui/rich_text_label.h"
-#include "scene/gui/texture_button.h"
-//#include "scene/gui/empty_control.h"
#include "core/os/thread.h"
#include "pane_drag.h"
#include "scene/gui/box_container.h"
+#include "scene/gui/button.h"
+#include "scene/gui/control.h"
+#include "scene/gui/label.h"
#include "scene/gui/panel_container.h"
+#include "scene/gui/rich_text_label.h"
+#include "scene/gui/texture_button.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
class EditorLog : public VBoxContainer {
GDCLASS(EditorLog, VBoxContainer);
@@ -52,7 +51,7 @@ class EditorLog : public VBoxContainer {
RichTextLabel *log;
HBoxContainer *title_hb;
//PaneDrag *pd;
- ToolButton *tool_button;
+ Button *tool_button;
static void _error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, ErrorHandlerType p_type);
@@ -78,7 +77,7 @@ public:
};
void add_message(const String &p_msg, MessageType p_type = MSG_TYPE_STD);
- void set_tool_button(ToolButton *p_tool_button);
+ void set_tool_button(Button *p_tool_button);
void deinit();
void clear();
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index 9a9a1bfdeb..bb34a45938 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -58,7 +58,6 @@
#include "scene/gui/tab_container.h"
#include "scene/gui/tabs.h"
#include "scene/gui/texture_progress.h"
-#include "scene/gui/tool_button.h"
#include "scene/resources/packed_scene.h"
#include "servers/navigation_server_2d.h"
#include "servers/navigation_server_3d.h"
@@ -485,7 +484,7 @@ void EditorNode::_notification(int p_what) {
// update_icons
for (int i = 0; i < singleton->main_editor_buttons.size(); i++) {
- ToolButton *tb = singleton->main_editor_buttons[i];
+ Button *tb = singleton->main_editor_buttons[i];
EditorPlugin *p_editor = singleton->editor_table[i];
Ref<Texture2D> icon = p_editor->get_icon();
@@ -2776,7 +2775,8 @@ void EditorNode::select_editor_by_name(const String &p_name) {
void EditorNode::add_editor_plugin(EditorPlugin *p_editor, bool p_config_changed) {
if (p_editor->has_main_screen()) {
- ToolButton *tb = memnew(ToolButton);
+ Button *tb = memnew(Button);
+ tb->set_flat(true);
tb->set_toggle_mode(true);
tb->connect("pressed", callable_mp(singleton, &EditorNode::_editor_select), varray(singleton->main_editor_buttons.size()));
tb->set_text(p_editor->get_name());
@@ -4621,8 +4621,9 @@ void EditorNode::_scene_tab_changed(int p_tab) {
editor_data.get_undo_redo().commit_action();
}
-ToolButton *EditorNode::add_bottom_panel_item(String p_text, Control *p_item) {
- ToolButton *tb = memnew(ToolButton);
+Button *EditorNode::add_bottom_panel_item(String p_text, Control *p_item) {
+ Button *tb = memnew(Button);
+ tb->set_flat(true);
tb->connect("toggled", callable_mp(this, &EditorNode::_bottom_panel_switch), varray(bottom_panel_items.size()));
tb->set_text(p_text);
tb->set_toggle_mode(true);
@@ -5698,7 +5699,8 @@ EditorNode::EditorNode() {
dock_select_popup->add_child(dock_vb);
HBoxContainer *dock_hb = memnew(HBoxContainer);
- dock_tab_move_left = memnew(ToolButton);
+ dock_tab_move_left = memnew(Button);
+ dock_tab_move_left->set_flat(true);
dock_tab_move_left->set_icon(theme->get_icon("Back", "EditorIcons"));
dock_tab_move_left->set_focus_mode(Control::FOCUS_NONE);
dock_tab_move_left->connect("pressed", callable_mp(this, &EditorNode::_dock_move_left));
@@ -5710,7 +5712,8 @@ EditorNode::EditorNode() {
dock_label->set_align(Label::ALIGN_CENTER);
dock_hb->add_child(dock_label);
- dock_tab_move_right = memnew(ToolButton);
+ dock_tab_move_right = memnew(Button);
+ dock_tab_move_right->set_flat(true);
dock_tab_move_right->set_icon(theme->get_icon("Forward", "EditorIcons"));
dock_tab_move_right->set_focus_mode(Control::FOCUS_NONE);
dock_tab_move_right->connect("pressed", callable_mp(this, &EditorNode::_dock_move_right));
@@ -5804,7 +5807,8 @@ EditorNode::EditorNode() {
srt->add_child(tabbar_container);
tabbar_container->add_child(scene_tabs);
- distraction_free = memnew(ToolButton);
+ distraction_free = memnew(Button);
+ distraction_free->set_flat(true);
#ifdef OSX_ENABLED
distraction_free->set_shortcut(ED_SHORTCUT("editor/distraction_free_mode", TTR("Distraction Free Mode"), KEY_MASK_CMD | KEY_MASK_CTRL | KEY_D));
#else
@@ -5815,7 +5819,8 @@ EditorNode::EditorNode() {
distraction_free->set_icon(gui_base->get_theme_icon("DistractionFree", "EditorIcons"));
distraction_free->set_toggle_mode(true);
- scene_tab_add = memnew(ToolButton);
+ scene_tab_add = memnew(Button);
+ scene_tab_add->set_flat(true);
tabbar_container->add_child(scene_tab_add);
tabbar_container->add_child(distraction_free);
scene_tab_add->set_tooltip(TTR("Add a new scene."));
@@ -5852,7 +5857,8 @@ EditorNode::EditorNode() {
file_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox("MenuHover", "EditorStyles"));
left_menu_hb->add_child(file_menu);
- prev_scene = memnew(ToolButton);
+ prev_scene = memnew(Button);
+ prev_scene->set_flat(true);
prev_scene->set_icon(gui_base->get_theme_icon("PrevScene", "EditorIcons"));
prev_scene->set_tooltip(TTR("Go to previously opened scene."));
prev_scene->set_disabled(true);
@@ -6081,7 +6087,8 @@ EditorNode::EditorNode() {
HBoxContainer *play_hb = memnew(HBoxContainer);
menu_hb->add_child(play_hb);
- play_button = memnew(ToolButton);
+ play_button = memnew(Button);
+ play_button->set_flat(true);
play_hb->add_child(play_button);
play_button->set_toggle_mode(true);
play_button->set_icon(gui_base->get_theme_icon("MainPlay", "EditorIcons"));
@@ -6094,7 +6101,8 @@ EditorNode::EditorNode() {
play_button->set_shortcut(ED_SHORTCUT("editor/play", TTR("Play"), KEY_F5));
#endif
- pause_button = memnew(ToolButton);
+ pause_button = memnew(Button);
+ pause_button->set_flat(true);
pause_button->set_toggle_mode(true);
pause_button->set_icon(gui_base->get_theme_icon("Pause", "EditorIcons"));
pause_button->set_focus_mode(Control::FOCUS_NONE);
@@ -6107,7 +6115,8 @@ EditorNode::EditorNode() {
pause_button->set_shortcut(ED_SHORTCUT("editor/pause_scene", TTR("Pause Scene"), KEY_F7));
#endif
- stop_button = memnew(ToolButton);
+ stop_button = memnew(Button);
+ stop_button->set_flat(true);
play_hb->add_child(stop_button);
stop_button->set_focus_mode(Control::FOCUS_NONE);
stop_button->set_icon(gui_base->get_theme_icon("Stop", "EditorIcons"));
@@ -6124,7 +6133,8 @@ EditorNode::EditorNode() {
play_hb->add_child(run_native);
run_native->connect("native_run", callable_mp(this, &EditorNode::_run_native));
- play_scene_button = memnew(ToolButton);
+ play_scene_button = memnew(Button);
+ play_scene_button->set_flat(true);
play_hb->add_child(play_scene_button);
play_scene_button->set_toggle_mode(true);
play_scene_button->set_focus_mode(Control::FOCUS_NONE);
@@ -6137,7 +6147,8 @@ EditorNode::EditorNode() {
play_scene_button->set_shortcut(ED_SHORTCUT("editor/play_scene", TTR("Play Scene"), KEY_F6));
#endif
- play_custom_scene_button = memnew(ToolButton);
+ play_custom_scene_button = memnew(Button);
+ play_custom_scene_button->set_flat(true);
play_hb->add_child(play_custom_scene_button);
play_custom_scene_button->set_toggle_mode(true);
play_custom_scene_button->set_focus_mode(Control::FOCUS_NONE);
@@ -6298,7 +6309,8 @@ EditorNode::EditorNode() {
version_label->set_self_modulate(Color(1, 1, 1, 0.6));
bottom_panel_hb->add_child(version_label);
- bottom_panel_raise = memnew(ToolButton);
+ bottom_panel_raise = memnew(Button);
+ bottom_panel_raise->set_flat(true);
bottom_panel_raise->set_icon(gui_base->get_theme_icon("ExpandBottomDock", "EditorIcons"));
bottom_panel_raise->set_shortcut(ED_SHORTCUT("editor/bottom_panel_expand", TTR("Expand Bottom Panel"), KEY_MASK_SHIFT | KEY_F12));
@@ -6309,7 +6321,7 @@ EditorNode::EditorNode() {
bottom_panel_raise->connect("toggled", callable_mp(this, &EditorNode::_bottom_panel_raise_toggled));
log = memnew(EditorLog);
- ToolButton *output_button = add_bottom_panel_item(TTR("Output"), log);
+ Button *output_button = add_bottom_panel_item(TTR("Output"), log);
log->set_tool_button(output_button);
old_split_ofs = 0;
diff --git a/editor/editor_node.h b/editor/editor_node.h
index 7c9cf44d6c..b0e0c5614c 100644
--- a/editor/editor_node.h
+++ b/editor/editor_node.h
@@ -83,7 +83,7 @@ class ScriptCreateDialog;
class TabContainer;
class Tabs;
class TextureProgress;
-class ToolButton;
+class Button;
class VSplitContainer;
class Window;
class SubViewport;
@@ -265,15 +265,15 @@ private:
MenuButton *settings_menu;
MenuButton *help_menu;
PopupMenu *tool_menu;
- ToolButton *export_button;
- ToolButton *prev_scene;
- ToolButton *play_button;
- ToolButton *pause_button;
- ToolButton *stop_button;
- ToolButton *run_settings_button;
- ToolButton *play_scene_button;
- ToolButton *play_custom_scene_button;
- ToolButton *search_button;
+ Button *export_button;
+ Button *prev_scene;
+ Button *play_button;
+ Button *pause_button;
+ Button *stop_button;
+ Button *run_settings_button;
+ Button *play_scene_button;
+ Button *play_custom_scene_button;
+ Button *search_button;
TextureProgress *audio_vu;
Timer *screenshot_timer;
@@ -336,7 +336,7 @@ private:
EditorQuickOpen *quick_run;
HBoxContainer *main_editor_button_vb;
- Vector<ToolButton *> main_editor_buttons;
+ Vector<Button *> main_editor_buttons;
Vector<EditorPlugin *> editor_table;
AudioStreamPreviewGenerator *preview_gen;
@@ -358,15 +358,15 @@ private:
PopupPanel *dock_select_popup;
Control *dock_select;
Button *dock_float;
- ToolButton *dock_tab_move_left;
- ToolButton *dock_tab_move_right;
+ Button *dock_tab_move_left;
+ Button *dock_tab_move_right;
int dock_popup_selected;
Timer *dock_drag_timer;
bool docks_visible;
HBoxContainer *tabbar_container;
- ToolButton *distraction_free;
- ToolButton *scene_tab_add;
+ Button *distraction_free;
+ Button *scene_tab_add;
bool scene_distraction;
bool script_distraction;
@@ -412,7 +412,7 @@ private:
struct BottomPanelItem {
String name;
Control *control;
- ToolButton *button;
+ Button *button;
};
Vector<BottomPanelItem> bottom_panel_items;
@@ -422,7 +422,7 @@ private:
HBoxContainer *bottom_panel_hb_editors;
VBoxContainer *bottom_panel_vb;
Label *version_label;
- ToolButton *bottom_panel_raise;
+ Button *bottom_panel_raise;
void _bottom_panel_raise_toggled(bool);
@@ -821,9 +821,9 @@ public:
bool is_exiting() const { return exiting; }
- ToolButton *get_pause_button() { return pause_button; }
+ Button *get_pause_button() { return pause_button; }
- ToolButton *add_bottom_panel_item(String p_text, Control *p_item);
+ Button *add_bottom_panel_item(String p_text, Control *p_item);
bool are_bottom_panels_hidden() const;
void make_bottom_panel_item_visible(Control *p_item);
void raise_bottom_panel_item(Control *p_item);
diff --git a/editor/editor_plugin.cpp b/editor/editor_plugin.cpp
index 6d93e92555..32b799cd61 100644
--- a/editor/editor_plugin.cpp
+++ b/editor/editor_plugin.cpp
@@ -332,7 +332,7 @@ void EditorPlugin::remove_autoload_singleton(const String &p_name) {
EditorNode::get_singleton()->get_project_settings()->get_autoload_settings()->autoload_remove(p_name);
}
-ToolButton *EditorPlugin::add_control_to_bottom_panel(Control *p_control, const String &p_title) {
+Button *EditorPlugin::add_control_to_bottom_panel(Control *p_control, const String &p_title) {
ERR_FAIL_NULL_V(p_control, nullptr);
return EditorNode::get_singleton()->add_bottom_panel_item(p_title, p_control);
}
diff --git a/editor/editor_plugin.h b/editor/editor_plugin.h
index aac36bfdfd..e84984d57a 100644
--- a/editor/editor_plugin.h
+++ b/editor/editor_plugin.h
@@ -37,7 +37,6 @@
#include "editor/import/editor_import_plugin.h"
#include "editor/import/resource_importer_scene.h"
#include "editor/script_create_dialog.h"
-#include "scene/gui/tool_button.h"
#include "scene/main/node.h"
#include "scene/resources/texture.h"
@@ -161,7 +160,7 @@ public:
void add_control_to_container(CustomControlContainer p_location, Control *p_control);
void remove_control_from_container(CustomControlContainer p_location, Control *p_control);
- ToolButton *add_control_to_bottom_panel(Control *p_control, const String &p_title);
+ Button *add_control_to_bottom_panel(Control *p_control, const String &p_title);
void add_control_to_dock(DockSlot p_slot, Control *p_control);
void remove_control_from_docks(Control *p_control);
void remove_control_from_bottom_panel(Control *p_control);
diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp
index 74267452e6..eee610e9a8 100644
--- a/editor/editor_properties.cpp
+++ b/editor/editor_properties.cpp
@@ -164,7 +164,8 @@ EditorPropertyMultilineText::EditorPropertyMultilineText() {
add_focusable(text);
hb->add_child(text);
text->set_h_size_flags(SIZE_EXPAND_FILL);
- open_big_text = memnew(ToolButton);
+ open_big_text = memnew(Button);
+ open_big_text->set_flat(true);
open_big_text->connect("pressed", callable_mp(this, &EditorPropertyMultilineText::_open_big_text));
hb->add_child(open_big_text);
big_text_dialog = nullptr;
diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp
index ace106cd3e..5f59e6e70a 100644
--- a/editor/editor_themes.cpp
+++ b/editor/editor_themes.cpp
@@ -570,17 +570,17 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_stylebox("focus", "PopupMenu", style_menu);
theme->set_stylebox("disabled", "PopupMenu", style_menu);
- theme->set_stylebox("normal", "ToolButton", style_menu);
- theme->set_stylebox("hover", "ToolButton", style_menu);
- theme->set_stylebox("pressed", "ToolButton", style_menu);
- theme->set_stylebox("focus", "ToolButton", style_menu);
- theme->set_stylebox("disabled", "ToolButton", style_menu);
+ theme->set_stylebox("normal", "Button", style_menu);
+ theme->set_stylebox("hover", "Button", style_menu);
+ theme->set_stylebox("pressed", "Button", style_menu);
+ theme->set_stylebox("focus", "Button", style_menu);
+ theme->set_stylebox("disabled", "Button", style_menu);
theme->set_color("font_color", "MenuButton", font_color);
theme->set_color("font_color_hover", "MenuButton", font_color_hl);
- theme->set_color("font_color", "ToolButton", font_color);
- theme->set_color("font_color_hover", "ToolButton", font_color_hl);
- theme->set_color("font_color_pressed", "ToolButton", accent_color);
+ theme->set_color("font_color", "Button", font_color);
+ theme->set_color("font_color_hover", "Button", font_color_hl);
+ theme->set_color("font_color_pressed", "Button", accent_color);
theme->set_stylebox("MenuHover", "EditorStyles", style_menu_hover_border);
diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp
index f279f402d9..c700fdccad 100644
--- a/editor/filesystem_dock.cpp
+++ b/editor/filesystem_dock.cpp
@@ -2543,13 +2543,15 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
toolbar_hbc->add_theme_constant_override("separation", 0);
top_vbc->add_child(toolbar_hbc);
- button_hist_prev = memnew(ToolButton);
+ button_hist_prev = memnew(Button);
+ button_hist_prev->set_flat(true);
button_hist_prev->set_disabled(true);
button_hist_prev->set_focus_mode(FOCUS_NONE);
button_hist_prev->set_tooltip(TTR("Previous Folder/File"));
toolbar_hbc->add_child(button_hist_prev);
- button_hist_next = memnew(ToolButton);
+ button_hist_next = memnew(Button);
+ button_hist_next->set_flat(true);
button_hist_next->set_disabled(true);
button_hist_next->set_focus_mode(FOCUS_NONE);
button_hist_next->set_tooltip(TTR("Next Folder/File"));
@@ -2627,7 +2629,8 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
file_list_search_box->connect("text_changed", callable_mp(this, &FileSystemDock::_search_changed), varray(file_list_search_box));
path_hb->add_child(file_list_search_box);
- button_file_list_display_mode = memnew(ToolButton);
+ button_file_list_display_mode = memnew(Button);
+ button_file_list_display_mode->set_flat(true);
path_hb->add_child(button_file_list_display_mode);
files = memnew(ItemList);
diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h
index 08c2124ae8..b0118f11aa 100644
--- a/editor/filesystem_dock.h
+++ b/editor/filesystem_dock.h
@@ -40,7 +40,6 @@
#include "scene/gui/option_button.h"
#include "scene/gui/progress_bar.h"
#include "scene/gui/split_container.h"
-#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
#include "scene/main/timer.h"
diff --git a/editor/groups_editor.cpp b/editor/groups_editor.cpp
index 98b216acda..4e6e2d0237 100644
--- a/editor/groups_editor.cpp
+++ b/editor/groups_editor.cpp
@@ -477,7 +477,8 @@ GroupDialog::GroupDialog() {
vbc_buttons->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
vbc_buttons->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
- add_button = memnew(ToolButton);
+ add_button = memnew(Button);
+ add_button->set_flat(true);
add_button->set_text(TTR("Add"));
add_button->connect("pressed", callable_mp(this, &GroupDialog::_add_pressed));
@@ -486,7 +487,8 @@ GroupDialog::GroupDialog() {
vbc_buttons->add_spacer();
vbc_buttons->add_spacer();
- remove_button = memnew(ToolButton);
+ remove_button = memnew(Button);
+ remove_button->set_flat(true);
remove_button->set_text(TTR("Remove"));
remove_button->connect("pressed", callable_mp(this, &GroupDialog::_removed_pressed));
diff --git a/editor/groups_editor.h b/editor/groups_editor.h
index 911c82e7f0..d5daaa19eb 100644
--- a/editor/groups_editor.h
+++ b/editor/groups_editor.h
@@ -38,7 +38,6 @@
#include "scene/gui/item_list.h"
#include "scene/gui/line_edit.h"
#include "scene/gui/popup.h"
-#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
class GroupDialog : public AcceptDialog {
@@ -63,8 +62,8 @@ class GroupDialog : public AcceptDialog {
Label *group_empty;
- ToolButton *add_button;
- ToolButton *remove_button;
+ Button *add_button;
+ Button *remove_button;
String selected_group;
diff --git a/editor/icons/AssetLib.svg b/editor/icons/AssetLib.svg
index 72b20ec047..22307efde3 100644
--- a/editor/icons/AssetLib.svg
+++ b/editor/icons/AssetLib.svg
@@ -1 +1 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m8 1c-1.6569 0-3 1.3431-3 3v2h-3c-.66446.0003505-1.1438.6366-.96094 1.2754l2 7c.12287.42881.51487.7244.96094.72461h8c.44606-.000209.83806-.2958.96094-.72461l2-7c.1829-.63879-.29648-1.275-.96094-1.2754h-3v-2c0-1.6569-1.3431-3-3-3zm0 2c.55228 0 1 .44772 1 1v2h-2v-2c0-.55228.44772-1 1-1z" fill="#e0e0e0"/></svg> \ No newline at end of file
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="none" stroke="#e0e0e0" stroke-linejoin="round" stroke-width="2"><path d="m8 1v9l4-4"/><path d="m8 10-4-4"/><path d="m2 10v4h12v-4" stroke-linecap="round"/></g></svg>
diff --git a/editor/icons/ToolButton.svg b/editor/icons/ToolButton.svg
deleted file mode 100644
index 98a41d2a08..0000000000
--- a/editor/icons/ToolButton.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m11 1.1738c-1.1979.4235-1.999 1.5557-2 2.8262.0009552 1.2705.80214 2.4027 2 2.8262v7.1738c0 .554.446 1 1 1s1-.446 1-1v-7.1758c1.1972-.4232 1.9982-1.5544 2-2.8242-.0018-1.2698-.80282-2.401-2-2.8242v2.8242c0 .5523-.44772 1-1 1s-1-.4477-1-1zm-7 1.8262v3.1328l-1.4453-.96484-1.1094 1.6641 3 2c.3359.22389.77347.22389 1.1094 0l3-2-1.1094-1.6641-1.4453.96484v-3.1328zm-.5 8c-.831 0-1.5.669-1.5 1.5v.5h-1v2h8v-2h-1v-.5c0-.831-.669-1.5-1.5-1.5z" fill="#a5efac"/></svg> \ No newline at end of file
diff --git a/editor/import/editor_scene_importer_gltf.cpp b/editor/import/editor_scene_importer_gltf.cpp
index 1a232658fe..683db0e31d 100644
--- a/editor/import/editor_scene_importer_gltf.cpp
+++ b/editor/import/editor_scene_importer_gltf.cpp
@@ -2877,6 +2877,7 @@ void EditorSceneImporterGLTF::_import_animation(GLTFState &state, AnimationPlaye
int track_idx = animation->get_track_count();
animation->add_track(Animation::TYPE_TRANSFORM);
animation->track_set_path(track_idx, node_path);
+ animation->track_set_imported(track_idx, true);
//first determine animation length
const float increment = 1.0 / float(bake_fps);
diff --git a/editor/import/resource_importer_scene.cpp b/editor/import/resource_importer_scene.cpp
index ec82f78e75..65ebf9dc4f 100644
--- a/editor/import/resource_importer_scene.cpp
+++ b/editor/import/resource_importer_scene.cpp
@@ -943,9 +943,9 @@ void ResourceImporterScene::_make_external_resources(Node *p_node, const String
ERR_CONTINUE(anim.is_null());
if (!p_animations.has(anim)) {
- //mark what comes from the file first, this helps eventually keep user data
+ // We are making external files so they are modifiable
for (int i = 0; i < anim->get_track_count(); i++) {
- anim->track_set_imported(i, true);
+ anim->track_set_imported(i, false);
}
String ext_name;
diff --git a/editor/inspector_dock.cpp b/editor/inspector_dock.cpp
index 2b26851140..903d9a2d31 100644
--- a/editor/inspector_dock.cpp
+++ b/editor/inspector_dock.cpp
@@ -493,14 +493,16 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
HBoxContainer *general_options_hb = memnew(HBoxContainer);
add_child(general_options_hb);
- resource_new_button = memnew(ToolButton);
+ resource_new_button = memnew(Button);
+ resource_new_button->set_flat(true);
resource_new_button->set_tooltip(TTR("Create a new resource in memory and edit it."));
resource_new_button->set_icon(get_theme_icon("New", "EditorIcons"));
general_options_hb->add_child(resource_new_button);
resource_new_button->connect("pressed", callable_mp(this, &InspectorDock::_new_resource));
resource_new_button->set_focus_mode(Control::FOCUS_NONE);
- resource_load_button = memnew(ToolButton);
+ resource_load_button = memnew(Button);
+ resource_load_button->set_flat(true);
resource_load_button->set_tooltip(TTR("Load an existing resource from disk and edit it."));
resource_load_button->set_icon(get_theme_icon("Load", "EditorIcons"));
general_options_hb->add_child(resource_load_button);
@@ -519,7 +521,8 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
general_options_hb->add_spacer();
- backward_button = memnew(ToolButton);
+ backward_button = memnew(Button);
+ backward_button->set_flat(true);
general_options_hb->add_child(backward_button);
backward_button->set_icon(get_theme_icon("Back", "EditorIcons"));
backward_button->set_flat(true);
@@ -527,7 +530,8 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
backward_button->set_disabled(true);
backward_button->connect("pressed", callable_mp(this, &InspectorDock::_edit_back));
- forward_button = memnew(ToolButton);
+ forward_button = memnew(Button);
+ forward_button->set_flat(true);
general_options_hb->add_child(forward_button);
forward_button->set_icon(get_theme_icon("Forward", "EditorIcons"));
forward_button->set_flat(true);
diff --git a/editor/inspector_dock.h b/editor/inspector_dock.h
index 2a99a7db45..551d3d1643 100644
--- a/editor/inspector_dock.h
+++ b/editor/inspector_dock.h
@@ -42,7 +42,6 @@
#include "scene/gui/control.h"
#include "scene/gui/label.h"
#include "scene/gui/popup_menu.h"
-#include "scene/gui/tool_button.h"
class EditorNode;
@@ -74,13 +73,13 @@ class InspectorDock : public VBoxContainer {
Object *current;
- ToolButton *backward_button;
- ToolButton *forward_button;
+ Button *backward_button;
+ Button *forward_button;
EditorFileDialog *load_resource_dialog;
CreateDialog *new_resource_dialog;
- ToolButton *resource_new_button;
- ToolButton *resource_load_button;
+ Button *resource_new_button;
+ Button *resource_load_button;
MenuButton *resource_save_button;
MenuButton *history_menu;
LineEdit *search;
diff --git a/editor/node_dock.cpp b/editor/node_dock.cpp
index 9b9cfad9eb..2c89517008 100644
--- a/editor/node_dock.cpp
+++ b/editor/node_dock.cpp
@@ -92,7 +92,8 @@ NodeDock::NodeDock() {
add_child(mode_hb);
mode_hb->hide();
- connections_button = memnew(ToolButton);
+ connections_button = memnew(Button);
+ connections_button->set_flat(true);
connections_button->set_text(TTR("Signals"));
connections_button->set_toggle_mode(true);
connections_button->set_pressed(true);
@@ -101,7 +102,8 @@ NodeDock::NodeDock() {
mode_hb->add_child(connections_button);
connections_button->connect("pressed", callable_mp(this, &NodeDock::show_connections));
- groups_button = memnew(ToolButton);
+ groups_button = memnew(Button);
+ groups_button->set_flat(true);
groups_button->set_text(TTR("Groups"));
groups_button->set_toggle_mode(true);
groups_button->set_pressed(false);
diff --git a/editor/node_dock.h b/editor/node_dock.h
index c165974678..8e10db5eb3 100644
--- a/editor/node_dock.h
+++ b/editor/node_dock.h
@@ -37,8 +37,8 @@
class NodeDock : public VBoxContainer {
GDCLASS(NodeDock, VBoxContainer);
- ToolButton *connections_button;
- ToolButton *groups_button;
+ Button *connections_button;
+ Button *groups_button;
ConnectionsDock *connections;
GroupsEditor *groups;
diff --git a/editor/plugins/abstract_polygon_2d_editor.cpp b/editor/plugins/abstract_polygon_2d_editor.cpp
index b905c8db12..e99ffe2b83 100644
--- a/editor/plugins/abstract_polygon_2d_editor.cpp
+++ b/editor/plugins/abstract_polygon_2d_editor.cpp
@@ -703,17 +703,20 @@ AbstractPolygon2DEditor::AbstractPolygon2DEditor(EditorNode *p_editor, bool p_wi
edge_point = PosVertex();
add_child(memnew(VSeparator));
- button_create = memnew(ToolButton);
+ button_create = memnew(Button);
+ button_create->set_flat(true);
add_child(button_create);
button_create->connect("pressed", callable_mp(this, &AbstractPolygon2DEditor::_menu_option), varray(MODE_CREATE));
button_create->set_toggle_mode(true);
- button_edit = memnew(ToolButton);
+ button_edit = memnew(Button);
+ button_edit->set_flat(true);
add_child(button_edit);
button_edit->connect("pressed", callable_mp(this, &AbstractPolygon2DEditor::_menu_option), varray(MODE_EDIT));
button_edit->set_toggle_mode(true);
- button_delete = memnew(ToolButton);
+ button_delete = memnew(Button);
+ button_delete->set_flat(true);
add_child(button_delete);
button_delete->connect("pressed", callable_mp(this, &AbstractPolygon2DEditor::_menu_option), varray(MODE_DELETE));
button_delete->set_toggle_mode(true);
diff --git a/editor/plugins/abstract_polygon_2d_editor.h b/editor/plugins/abstract_polygon_2d_editor.h
index d5b3a916d1..b3a17f7660 100644
--- a/editor/plugins/abstract_polygon_2d_editor.h
+++ b/editor/plugins/abstract_polygon_2d_editor.h
@@ -34,16 +34,15 @@
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
#include "scene/2d/polygon_2d.h"
-#include "scene/gui/tool_button.h"
class CanvasItemEditor;
class AbstractPolygon2DEditor : public HBoxContainer {
GDCLASS(AbstractPolygon2DEditor, HBoxContainer);
- ToolButton *button_create;
- ToolButton *button_edit;
- ToolButton *button_delete;
+ Button *button_create;
+ Button *button_edit;
+ Button *button_delete;
struct Vertex {
Vertex() {}
diff --git a/editor/plugins/animation_blend_space_1d_editor.cpp b/editor/plugins/animation_blend_space_1d_editor.cpp
index 75eacf56ec..959301907c 100644
--- a/editor/plugins/animation_blend_space_1d_editor.cpp
+++ b/editor/plugins/animation_blend_space_1d_editor.cpp
@@ -595,7 +595,8 @@ AnimationNodeBlendSpace1DEditor::AnimationNodeBlendSpace1DEditor() {
Ref<ButtonGroup> bg;
bg.instance();
- tool_blend = memnew(ToolButton);
+ tool_blend = memnew(Button);
+ tool_blend->set_flat(true);
tool_blend->set_toggle_mode(true);
tool_blend->set_button_group(bg);
top_hb->add_child(tool_blend);
@@ -603,14 +604,16 @@ AnimationNodeBlendSpace1DEditor::AnimationNodeBlendSpace1DEditor() {
tool_blend->set_tooltip(TTR("Set the blending position within the space"));
tool_blend->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_tool_switch), varray(3));
- tool_select = memnew(ToolButton);
+ tool_select = memnew(Button);
+ tool_select->set_flat(true);
tool_select->set_toggle_mode(true);
tool_select->set_button_group(bg);
top_hb->add_child(tool_select);
tool_select->set_tooltip(TTR("Select and move points, create points with RMB."));
tool_select->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_tool_switch), varray(0));
- tool_create = memnew(ToolButton);
+ tool_create = memnew(Button);
+ tool_create->set_flat(true);
tool_create->set_toggle_mode(true);
tool_create->set_button_group(bg);
top_hb->add_child(tool_create);
@@ -619,14 +622,16 @@ AnimationNodeBlendSpace1DEditor::AnimationNodeBlendSpace1DEditor() {
tool_erase_sep = memnew(VSeparator);
top_hb->add_child(tool_erase_sep);
- tool_erase = memnew(ToolButton);
+ tool_erase = memnew(Button);
+ tool_erase->set_flat(true);
top_hb->add_child(tool_erase);
tool_erase->set_tooltip(TTR("Erase points."));
tool_erase->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace1DEditor::_erase_selected));
top_hb->add_child(memnew(VSeparator));
- snap = memnew(ToolButton);
+ snap = memnew(Button);
+ snap->set_flat(true);
snap->set_toggle_mode(true);
top_hb->add_child(snap);
snap->set_pressed(true);
diff --git a/editor/plugins/animation_blend_space_1d_editor.h b/editor/plugins/animation_blend_space_1d_editor.h
index 8cfd6714ad..c319b648ba 100644
--- a/editor/plugins/animation_blend_space_1d_editor.h
+++ b/editor/plugins/animation_blend_space_1d_editor.h
@@ -47,15 +47,15 @@ class AnimationNodeBlendSpace1DEditor : public AnimationTreeNodeEditorPlugin {
Ref<AnimationNodeBlendSpace1D> blend_space;
HBoxContainer *goto_parent_hb;
- ToolButton *goto_parent;
+ Button *goto_parent;
PanelContainer *panel;
- ToolButton *tool_blend;
- ToolButton *tool_select;
- ToolButton *tool_create;
+ Button *tool_blend;
+ Button *tool_select;
+ Button *tool_create;
VSeparator *tool_erase_sep;
- ToolButton *tool_erase;
- ToolButton *snap;
+ Button *tool_erase;
+ Button *snap;
SpinBox *snap_value;
LineEdit *label_value;
diff --git a/editor/plugins/animation_blend_space_2d_editor.cpp b/editor/plugins/animation_blend_space_2d_editor.cpp
index a7d5c2207b..1ab114fc01 100644
--- a/editor/plugins/animation_blend_space_2d_editor.cpp
+++ b/editor/plugins/animation_blend_space_2d_editor.cpp
@@ -819,7 +819,8 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
Ref<ButtonGroup> bg;
bg.instance();
- tool_blend = memnew(ToolButton);
+ tool_blend = memnew(Button);
+ tool_blend->set_flat(true);
tool_blend->set_toggle_mode(true);
tool_blend->set_button_group(bg);
top_hb->add_child(tool_blend);
@@ -827,21 +828,24 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
tool_blend->set_tooltip(TTR("Set the blending position within the space"));
tool_blend->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_tool_switch), varray(3));
- tool_select = memnew(ToolButton);
+ tool_select = memnew(Button);
+ tool_select->set_flat(true);
tool_select->set_toggle_mode(true);
tool_select->set_button_group(bg);
top_hb->add_child(tool_select);
tool_select->set_tooltip(TTR("Select and move points, create points with RMB."));
tool_select->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_tool_switch), varray(0));
- tool_create = memnew(ToolButton);
+ tool_create = memnew(Button);
+ tool_create->set_flat(true);
tool_create->set_toggle_mode(true);
tool_create->set_button_group(bg);
top_hb->add_child(tool_create);
tool_create->set_tooltip(TTR("Create points."));
tool_create->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_tool_switch), varray(1));
- tool_triangle = memnew(ToolButton);
+ tool_triangle = memnew(Button);
+ tool_triangle->set_flat(true);
tool_triangle->set_toggle_mode(true);
tool_triangle->set_button_group(bg);
top_hb->add_child(tool_triangle);
@@ -850,7 +854,8 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
tool_erase_sep = memnew(VSeparator);
top_hb->add_child(tool_erase_sep);
- tool_erase = memnew(ToolButton);
+ tool_erase = memnew(Button);
+ tool_erase->set_flat(true);
top_hb->add_child(tool_erase);
tool_erase->set_tooltip(TTR("Erase points and triangles."));
tool_erase->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_erase_selected));
@@ -858,7 +863,8 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
top_hb->add_child(memnew(VSeparator));
- auto_triangles = memnew(ToolButton);
+ auto_triangles = memnew(Button);
+ auto_triangles->set_flat(true);
top_hb->add_child(auto_triangles);
auto_triangles->connect("pressed", callable_mp(this, &AnimationNodeBlendSpace2DEditor::_auto_triangles_toggled));
auto_triangles->set_toggle_mode(true);
@@ -866,7 +872,8 @@ AnimationNodeBlendSpace2DEditor::AnimationNodeBlendSpace2DEditor() {
top_hb->add_child(memnew(VSeparator));
- snap = memnew(ToolButton);
+ snap = memnew(Button);
+ snap->set_flat(true);
snap->set_toggle_mode(true);
top_hb->add_child(snap);
snap->set_pressed(true);
diff --git a/editor/plugins/animation_blend_space_2d_editor.h b/editor/plugins/animation_blend_space_2d_editor.h
index b430a12297..659b96cefa 100644
--- a/editor/plugins/animation_blend_space_2d_editor.h
+++ b/editor/plugins/animation_blend_space_2d_editor.h
@@ -47,18 +47,18 @@ class AnimationNodeBlendSpace2DEditor : public AnimationTreeNodeEditorPlugin {
Ref<AnimationNodeBlendSpace2D> blend_space;
PanelContainer *panel;
- ToolButton *tool_blend;
- ToolButton *tool_select;
- ToolButton *tool_create;
- ToolButton *tool_triangle;
+ Button *tool_blend;
+ Button *tool_select;
+ Button *tool_create;
+ Button *tool_triangle;
VSeparator *tool_erase_sep;
- ToolButton *tool_erase;
- ToolButton *snap;
+ Button *tool_erase;
+ Button *snap;
SpinBox *snap_x;
SpinBox *snap_y;
OptionButton *interpolation;
- ToolButton *auto_triangles;
+ Button *auto_triangles;
LineEdit *label_x;
LineEdit *label_y;
diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp
index 1e0a9535e2..035526ca55 100644
--- a/editor/plugins/animation_player_editor_plugin.cpp
+++ b/editor/plugins/animation_player_editor_plugin.cpp
@@ -380,26 +380,25 @@ void AnimationPlayerEditor::_animation_save_as(const Ref<Resource> &p_resource)
file->add_filter("*." + extensions[i] + " ; " + extensions[i].to_upper());
}
+ String path;
//file->set_current_path(current_path);
if (p_resource->get_path() != "") {
- file->set_current_path(p_resource->get_path());
+ path = p_resource->get_path();
if (extensions.size()) {
- String ext = p_resource->get_path().get_extension().to_lower();
- if (extensions.find(ext) == nullptr) {
- file->set_current_path(p_resource->get_path().replacen("." + ext, "." + extensions.front()->get()));
+ if (extensions.find(p_resource->get_path().get_extension().to_lower()) == nullptr) {
+ path = p_resource->get_path().get_base_dir() + p_resource->get_name() + "." + extensions.front()->get();
}
}
} else {
- String existing;
if (extensions.size()) {
if (p_resource->get_name() != "") {
- existing = p_resource->get_name() + "." + extensions.front()->get().to_lower();
+ path = p_resource->get_name() + "." + extensions.front()->get().to_lower();
} else {
- existing = "new_" + p_resource->get_class().to_lower() + "." + extensions.front()->get().to_lower();
+ path = "new_" + p_resource->get_class().to_lower() + "." + extensions.front()->get().to_lower();
}
}
- file->set_current_path(existing);
}
+ file->set_current_path(path);
file->popup_centered_ratio();
file->set_title(TTR("Save Resource As..."));
current_option = RESOURCE_SAVE;
@@ -1503,24 +1502,29 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
HBoxContainer *hb = memnew(HBoxContainer);
add_child(hb);
- play_bw_from = memnew(ToolButton);
+ play_bw_from = memnew(Button);
+ play_bw_from->set_flat(true);
play_bw_from->set_tooltip(TTR("Play selected animation backwards from current pos. (A)"));
hb->add_child(play_bw_from);
- play_bw = memnew(ToolButton);
+ play_bw = memnew(Button);
+ play_bw->set_flat(true);
play_bw->set_tooltip(TTR("Play selected animation backwards from end. (Shift+A)"));
hb->add_child(play_bw);
- stop = memnew(ToolButton);
+ stop = memnew(Button);
+ stop->set_flat(true);
stop->set_toggle_mode(true);
hb->add_child(stop);
stop->set_tooltip(TTR("Stop animation playback. (S)"));
- play = memnew(ToolButton);
+ play = memnew(Button);
+ play->set_flat(true);
play->set_tooltip(TTR("Play selected animation from start. (Shift+D)"));
hb->add_child(play);
- play_from = memnew(ToolButton);
+ play_from = memnew(Button);
+ play_from->set_flat(true);
play_from->set_tooltip(TTR("Play selected animation from current pos. (D)"));
hb->add_child(play_from);
@@ -1572,7 +1576,8 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
animation->set_tooltip(TTR("Display list of animations in player."));
animation->set_clip_text(true);
- autoplay = memnew(ToolButton);
+ autoplay = memnew(Button);
+ autoplay->set_flat(true);
hb->add_child(autoplay);
autoplay->set_tooltip(TTR("Autoplay on Load"));
@@ -1584,7 +1589,8 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
hb->add_child(memnew(VSeparator));
- onion_toggle = memnew(ToolButton);
+ onion_toggle = memnew(Button);
+ onion_toggle->set_flat(true);
onion_toggle->set_toggle_mode(true);
onion_toggle->set_tooltip(TTR("Enable Onion Skinning"));
onion_toggle->connect("pressed", callable_mp(this, &AnimationPlayerEditor::_onion_skinning_menu), varray(ONION_SKINNING_ENABLE));
@@ -1609,7 +1615,8 @@ AnimationPlayerEditor::AnimationPlayerEditor(EditorNode *p_editor, AnimationPlay
hb->add_child(memnew(VSeparator));
- pin = memnew(ToolButton);
+ pin = memnew(Button);
+ pin->set_flat(true);
pin->set_toggle_mode(true);
pin->set_tooltip(TTR("Pin AnimationPlayer"));
hb->add_child(pin);
diff --git a/editor/plugins/animation_player_editor_plugin.h b/editor/plugins/animation_player_editor_plugin.h
index 18f2d3b25e..fe96deecf2 100644
--- a/editor/plugins/animation_player_editor_plugin.h
+++ b/editor/plugins/animation_player_editor_plugin.h
@@ -96,9 +96,9 @@ class AnimationPlayerEditor : public VBoxContainer {
Button *autoplay;
MenuButton *tool_anim;
- ToolButton *onion_toggle;
+ Button *onion_toggle;
MenuButton *onion_skinning;
- ToolButton *pin;
+ Button *pin;
SpinBox *frame;
LineEdit *scale;
LineEdit *name;
diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp
index a435b1c482..0970608853 100644
--- a/editor/plugins/animation_state_machine_editor.cpp
+++ b/editor/plugins/animation_state_machine_editor.cpp
@@ -1208,7 +1208,8 @@ AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
Ref<ButtonGroup> bg;
bg.instance();
- tool_select = memnew(ToolButton);
+ tool_select = memnew(Button);
+ tool_select->set_flat(true);
top_hb->add_child(tool_select);
tool_select->set_toggle_mode(true);
tool_select->set_button_group(bg);
@@ -1216,14 +1217,16 @@ AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
tool_select->set_tooltip(TTR("Select and move nodes.\nRMB to add new nodes.\nShift+LMB to create connections."));
tool_select->connect("pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_update_mode), varray(), CONNECT_DEFERRED);
- tool_create = memnew(ToolButton);
+ tool_create = memnew(Button);
+ tool_create->set_flat(true);
top_hb->add_child(tool_create);
tool_create->set_toggle_mode(true);
tool_create->set_button_group(bg);
tool_create->set_tooltip(TTR("Create new nodes."));
tool_create->connect("pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_update_mode), varray(), CONNECT_DEFERRED);
- tool_connect = memnew(ToolButton);
+ tool_connect = memnew(Button);
+ tool_connect->set_flat(true);
top_hb->add_child(tool_connect);
tool_connect->set_toggle_mode(true);
tool_connect->set_button_group(bg);
@@ -1233,7 +1236,8 @@ AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
tool_erase_hb = memnew(HBoxContainer);
top_hb->add_child(tool_erase_hb);
tool_erase_hb->add_child(memnew(VSeparator));
- tool_erase = memnew(ToolButton);
+ tool_erase = memnew(Button);
+ tool_erase->set_flat(true);
tool_erase->set_tooltip(TTR("Remove selected node or transition."));
tool_erase_hb->add_child(tool_erase);
tool_erase->connect("pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_erase_selected));
@@ -1241,13 +1245,15 @@ AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
tool_erase_hb->add_child(memnew(VSeparator));
- tool_autoplay = memnew(ToolButton);
+ tool_autoplay = memnew(Button);
+ tool_autoplay->set_flat(true);
tool_autoplay->set_tooltip(TTR("Toggle autoplay this animation on start, restart or seek to zero."));
tool_erase_hb->add_child(tool_autoplay);
tool_autoplay->connect("pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_autoplay_selected));
tool_autoplay->set_disabled(true);
- tool_end = memnew(ToolButton);
+ tool_end = memnew(Button);
+ tool_end->set_flat(true);
tool_end->set_tooltip(TTR("Set the end animation. This is useful for sub-transitions."));
tool_erase_hb->add_child(tool_end);
tool_end->connect("pressed", callable_mp(this, &AnimationNodeStateMachineEditor::_end_selected));
diff --git a/editor/plugins/animation_state_machine_editor.h b/editor/plugins/animation_state_machine_editor.h
index 022c32ef48..c4caf2e52b 100644
--- a/editor/plugins/animation_state_machine_editor.h
+++ b/editor/plugins/animation_state_machine_editor.h
@@ -46,16 +46,16 @@ class AnimationNodeStateMachineEditor : public AnimationTreeNodeEditorPlugin {
Ref<AnimationNodeStateMachine> state_machine;
- ToolButton *tool_select;
- ToolButton *tool_create;
- ToolButton *tool_connect;
+ Button *tool_select;
+ Button *tool_create;
+ Button *tool_connect;
Popup *name_edit_popup;
LineEdit *name_edit;
HBoxContainer *tool_erase_hb;
- ToolButton *tool_erase;
- ToolButton *tool_autoplay;
- ToolButton *tool_end;
+ Button *tool_erase;
+ Button *tool_autoplay;
+ Button *tool_end;
OptionButton *transition_mode;
OptionButton *play_mode;
diff --git a/editor/plugins/audio_stream_editor_plugin.cpp b/editor/plugins/audio_stream_editor_plugin.cpp
index 3b7a9320f0..b0f65af245 100644
--- a/editor/plugins/audio_stream_editor_plugin.cpp
+++ b/editor/plugins/audio_stream_editor_plugin.cpp
@@ -220,12 +220,14 @@ AudioStreamEditor::AudioStreamEditor() {
hbox->add_theme_constant_override("separation", 0);
vbox->add_child(hbox);
- _play_button = memnew(ToolButton);
+ _play_button = memnew(Button);
+ _play_button->set_flat(true);
hbox->add_child(_play_button);
_play_button->set_focus_mode(Control::FOCUS_NONE);
_play_button->connect("pressed", callable_mp(this, &AudioStreamEditor::_play));
- _stop_button = memnew(ToolButton);
+ _stop_button = memnew(Button);
+ _stop_button->set_flat(true);
hbox->add_child(_stop_button);
_stop_button->set_focus_mode(Control::FOCUS_NONE);
_stop_button->connect("pressed", callable_mp(this, &AudioStreamEditor::_stop));
diff --git a/editor/plugins/audio_stream_editor_plugin.h b/editor/plugins/audio_stream_editor_plugin.h
index dd7caaa15e..de176aab49 100644
--- a/editor/plugins/audio_stream_editor_plugin.h
+++ b/editor/plugins/audio_stream_editor_plugin.h
@@ -47,8 +47,8 @@ class AudioStreamEditor : public ColorRect {
Label *_current_label;
Label *_duration_label;
- ToolButton *_play_button;
- ToolButton *_stop_button;
+ Button *_play_button;
+ Button *_stop_button;
float _current;
bool _dragging;
diff --git a/editor/plugins/baked_lightmap_editor_plugin.cpp b/editor/plugins/baked_lightmap_editor_plugin.cpp
index 8fbe1646f7..ee9feb7f74 100644
--- a/editor/plugins/baked_lightmap_editor_plugin.cpp
+++ b/editor/plugins/baked_lightmap_editor_plugin.cpp
@@ -117,7 +117,8 @@ void BakedLightmapEditorPlugin::_bind_methods() {
BakedLightmapEditorPlugin::BakedLightmapEditorPlugin(EditorNode *p_node) {
editor = p_node;
- bake = memnew(ToolButton);
+ bake = memnew(Button);
+ bake->set_flat(true);
bake->set_icon(editor->get_gui_base()->get_theme_icon("Bake", "EditorIcons"));
bake->set_text(TTR("Bake Lightmaps"));
bake->hide();
diff --git a/editor/plugins/baked_lightmap_editor_plugin.h b/editor/plugins/baked_lightmap_editor_plugin.h
index 67fb368a86..54eb0f71ec 100644
--- a/editor/plugins/baked_lightmap_editor_plugin.h
+++ b/editor/plugins/baked_lightmap_editor_plugin.h
@@ -41,7 +41,7 @@ class BakedLightmapEditorPlugin : public EditorPlugin {
BakedLightmap *lightmap;
- ToolButton *bake;
+ Button *bake;
EditorNode *editor;
EditorFileDialog *file_dialog;
diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp
index 2f7080b1a5..bf698a5ceb 100644
--- a/editor/plugins/canvas_item_editor_plugin.cpp
+++ b/editor/plugins/canvas_item_editor_plugin.cpp
@@ -1207,7 +1207,26 @@ bool CanvasItemEditor::_gui_input_rulers_and_guides(const Ref<InputEvent> &p_eve
bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bool p_already_accepted) {
Ref<InputEventMouseButton> b = p_event;
if (b.is_valid() && !p_already_accepted) {
- bool pan_on_scroll = bool(EditorSettings::get_singleton()->get("editors/2d/scroll_to_pan")) && !b->get_control();
+ const bool pan_on_scroll = bool(EditorSettings::get_singleton()->get("editors/2d/scroll_to_pan")) && !b->get_control();
+
+ if (pan_on_scroll) {
+ // Perform horizontal scrolling first so we can check for Shift being held.
+ if (b->is_pressed() &&
+ (b->get_button_index() == BUTTON_WHEEL_LEFT || (b->get_shift() && b->get_button_index() == BUTTON_WHEEL_UP))) {
+ // Pan left
+ view_offset.x -= int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor();
+ update_viewport();
+ return true;
+ }
+
+ if (b->is_pressed() &&
+ (b->get_button_index() == BUTTON_WHEEL_RIGHT || (b->get_shift() && b->get_button_index() == BUTTON_WHEEL_DOWN))) {
+ // Pan right
+ view_offset.x += int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor();
+ update_viewport();
+ return true;
+ }
+ }
if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_DOWN) {
// Scroll or pan down
@@ -1239,24 +1258,6 @@ bool CanvasItemEditor::_gui_input_zoom_or_pan(const Ref<InputEvent> &p_event, bo
return true;
}
- if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_LEFT) {
- // Pan left
- if (pan_on_scroll) {
- view_offset.x -= int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor();
- update_viewport();
- return true;
- }
- }
-
- if (b->is_pressed() && b->get_button_index() == BUTTON_WHEEL_RIGHT) {
- // Pan right
- if (pan_on_scroll) {
- view_offset.x += int(EditorSettings::get_singleton()->get("editors/2d/pan_speed")) / zoom * b->get_factor();
- update_viewport();
- return true;
- }
- }
-
if (!panning) {
if (b->is_pressed() &&
(b->get_button_index() == BUTTON_MIDDLE ||
@@ -4447,7 +4448,7 @@ void CanvasItemEditor::_button_override_camera(bool p_pressed) {
}
void CanvasItemEditor::_button_tool_select(int p_index) {
- ToolButton *tb[TOOL_MAX] = { select_button, list_select_button, move_button, scale_button, rotate_button, pivot_button, pan_button, ruler_button };
+ Button *tb[TOOL_MAX] = { select_button, list_select_button, move_button, scale_button, rotate_button, pivot_button, pan_button, ruler_button };
for (int i = 0; i < TOOL_MAX; i++) {
tb[i]->set_pressed(i == p_index);
}
@@ -5577,13 +5578,15 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
viewport->add_child(controls_vb);
- zoom_minus = memnew(ToolButton);
+ zoom_minus = memnew(Button);
+ zoom_minus->set_flat(true);
zoom_hb->add_child(zoom_minus);
zoom_minus->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_zoom_minus));
zoom_minus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", TTR("Zoom Out"), KEY_MASK_CMD | KEY_MINUS));
zoom_minus->set_focus_mode(FOCUS_NONE);
- zoom_reset = memnew(ToolButton);
+ zoom_reset = memnew(Button);
+ zoom_reset->set_flat(true);
zoom_hb->add_child(zoom_reset);
zoom_reset->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_zoom_reset));
zoom_reset->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", TTR("Zoom Reset"), KEY_MASK_CMD | KEY_0));
@@ -5592,7 +5595,8 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
// Prevent the button's size from changing when the text size changes
zoom_reset->set_custom_minimum_size(Size2(75 * EDSCALE, 0));
- zoom_plus = memnew(ToolButton);
+ zoom_plus = memnew(Button);
+ zoom_plus->set_flat(true);
zoom_hb->add_child(zoom_plus);
zoom_plus->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_zoom_plus));
zoom_plus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", TTR("Zoom In"), KEY_MASK_CMD | KEY_EQUAL)); // Usually direct access key for PLUS
@@ -5600,7 +5604,8 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
updating_scroll = false;
- select_button = memnew(ToolButton);
+ select_button = memnew(Button);
+ select_button->set_flat(true);
hb->add_child(select_button);
select_button->set_toggle_mode(true);
select_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_SELECT));
@@ -5610,21 +5615,24 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
hb->add_child(memnew(VSeparator));
- move_button = memnew(ToolButton);
+ move_button = memnew(Button);
+ move_button->set_flat(true);
hb->add_child(move_button);
move_button->set_toggle_mode(true);
move_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_MOVE));
move_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/move_mode", TTR("Move Mode"), KEY_W));
move_button->set_tooltip(TTR("Move Mode"));
- rotate_button = memnew(ToolButton);
+ rotate_button = memnew(Button);
+ rotate_button->set_flat(true);
hb->add_child(rotate_button);
rotate_button->set_toggle_mode(true);
rotate_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_ROTATE));
rotate_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/rotate_mode", TTR("Rotate Mode"), KEY_E));
rotate_button->set_tooltip(TTR("Rotate Mode"));
- scale_button = memnew(ToolButton);
+ scale_button = memnew(Button);
+ scale_button->set_flat(true);
hb->add_child(scale_button);
scale_button->set_toggle_mode(true);
scale_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_SCALE));
@@ -5633,26 +5641,30 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
hb->add_child(memnew(VSeparator));
- list_select_button = memnew(ToolButton);
+ list_select_button = memnew(Button);
+ list_select_button->set_flat(true);
hb->add_child(list_select_button);
list_select_button->set_toggle_mode(true);
list_select_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_LIST_SELECT));
list_select_button->set_tooltip(TTR("Show a list of all objects at the position clicked\n(same as Alt+RMB in select mode)."));
- pivot_button = memnew(ToolButton);
+ pivot_button = memnew(Button);
+ pivot_button->set_flat(true);
hb->add_child(pivot_button);
pivot_button->set_toggle_mode(true);
pivot_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_EDIT_PIVOT));
pivot_button->set_tooltip(TTR("Click to change object's rotation pivot."));
- pan_button = memnew(ToolButton);
+ pan_button = memnew(Button);
+ pan_button->set_flat(true);
hb->add_child(pan_button);
pan_button->set_toggle_mode(true);
pan_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_PAN));
pan_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/pan_mode", TTR("Pan Mode"), KEY_G));
pan_button->set_tooltip(TTR("Pan Mode"));
- ruler_button = memnew(ToolButton);
+ ruler_button = memnew(Button);
+ ruler_button->set_flat(true);
hb->add_child(ruler_button);
ruler_button->set_toggle_mode(true);
ruler_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_tool_select), make_binds(TOOL_RULER));
@@ -5661,14 +5673,16 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
hb->add_child(memnew(VSeparator));
- smart_snap_button = memnew(ToolButton);
+ smart_snap_button = memnew(Button);
+ smart_snap_button->set_flat(true);
hb->add_child(smart_snap_button);
smart_snap_button->set_toggle_mode(true);
smart_snap_button->connect("toggled", callable_mp(this, &CanvasItemEditor::_button_toggle_smart_snap));
smart_snap_button->set_tooltip(TTR("Toggle smart snapping."));
smart_snap_button->set_shortcut(ED_SHORTCUT("canvas_item_editor/use_smart_snap", TTR("Use Smart Snap"), KEY_MASK_SHIFT | KEY_S));
- grid_snap_button = memnew(ToolButton);
+ grid_snap_button = memnew(Button);
+ grid_snap_button->set_flat(true);
hb->add_child(grid_snap_button);
grid_snap_button->set_toggle_mode(true);
grid_snap_button->connect("toggled", callable_mp(this, &CanvasItemEditor::_button_toggle_grid_snap));
@@ -5707,23 +5721,27 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
hb->add_child(memnew(VSeparator));
- lock_button = memnew(ToolButton);
+ lock_button = memnew(Button);
+ lock_button->set_flat(true);
hb->add_child(lock_button);
lock_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(LOCK_SELECTED));
lock_button->set_tooltip(TTR("Lock the selected object in place (can't be moved)."));
- unlock_button = memnew(ToolButton);
+ unlock_button = memnew(Button);
+ unlock_button->set_flat(true);
hb->add_child(unlock_button);
unlock_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(UNLOCK_SELECTED));
unlock_button->set_tooltip(TTR("Unlock the selected object (can be moved)."));
- group_button = memnew(ToolButton);
+ group_button = memnew(Button);
+ group_button->set_flat(true);
hb->add_child(group_button);
group_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(GROUP_SELECTED));
group_button->set_tooltip(TTR("Makes sure the object's children are not selectable."));
- ungroup_button = memnew(ToolButton);
+ ungroup_button = memnew(Button);
+ ungroup_button->set_flat(true);
hb->add_child(ungroup_button);
ungroup_button->connect("pressed", callable_mp(this, &CanvasItemEditor::_popup_callback), varray(UNGROUP_SELECTED));
ungroup_button->set_tooltip(TTR("Restores the object's children's ability to be selected."));
@@ -5748,7 +5766,8 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
hb->add_child(memnew(VSeparator));
- override_camera_button = memnew(ToolButton);
+ override_camera_button = memnew(Button);
+ override_camera_button->set_flat(true);
hb->add_child(override_camera_button);
override_camera_button->connect("toggled", callable_mp(this, &CanvasItemEditor::_button_override_camera));
override_camera_button->set_toggle_mode(true);
@@ -5795,7 +5814,8 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
anchors_popup->set_name("Anchors");
anchors_popup->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
- anchor_mode_button = memnew(ToolButton);
+ anchor_mode_button = memnew(Button);
+ anchor_mode_button->set_flat(true);
hb->add_child(anchor_mode_button);
anchor_mode_button->set_toggle_mode(true);
anchor_mode_button->hide();
diff --git a/editor/plugins/canvas_item_editor_plugin.h b/editor/plugins/canvas_item_editor_plugin.h
index 765d5f81d0..c5d74c6fc9 100644
--- a/editor/plugins/canvas_item_editor_plugin.h
+++ b/editor/plugins/canvas_item_editor_plugin.h
@@ -228,9 +228,9 @@ private:
VScrollBar *v_scroll;
HBoxContainer *hb;
- ToolButton *zoom_minus;
- ToolButton *zoom_reset;
- ToolButton *zoom_plus;
+ Button *zoom_minus;
+ Button *zoom_reset;
+ Button *zoom_plus;
Map<Control *, Timer *> popup_temporarily_timers;
@@ -336,31 +336,31 @@ private:
};
List<PoseClipboard> pose_clipboard;
- ToolButton *select_button;
+ Button *select_button;
- ToolButton *move_button;
- ToolButton *scale_button;
- ToolButton *rotate_button;
+ Button *move_button;
+ Button *scale_button;
+ Button *rotate_button;
- ToolButton *list_select_button;
- ToolButton *pivot_button;
- ToolButton *pan_button;
+ Button *list_select_button;
+ Button *pivot_button;
+ Button *pan_button;
- ToolButton *ruler_button;
+ Button *ruler_button;
- ToolButton *smart_snap_button;
- ToolButton *grid_snap_button;
+ Button *smart_snap_button;
+ Button *grid_snap_button;
MenuButton *snap_config_menu;
PopupMenu *smartsnap_config_popup;
- ToolButton *lock_button;
- ToolButton *unlock_button;
+ Button *lock_button;
+ Button *unlock_button;
- ToolButton *group_button;
- ToolButton *ungroup_button;
+ Button *group_button;
+ Button *ungroup_button;
MenuButton *skeleton_menu;
- ToolButton *override_camera_button;
+ Button *override_camera_button;
MenuButton *view_menu;
HBoxContainer *animation_hb;
MenuButton *animation_menu;
@@ -369,7 +369,7 @@ private:
PopupMenu *anchors_and_margins_popup;
PopupMenu *anchors_popup;
- ToolButton *anchor_mode_button;
+ Button *anchor_mode_button;
Button *key_loc_button;
Button *key_rot_button;
diff --git a/editor/plugins/collision_polygon_3d_editor_plugin.cpp b/editor/plugins/collision_polygon_3d_editor_plugin.cpp
index d9d9cf6a87..6eb17685f6 100644
--- a/editor/plugins/collision_polygon_3d_editor_plugin.cpp
+++ b/editor/plugins/collision_polygon_3d_editor_plugin.cpp
@@ -501,12 +501,14 @@ CollisionPolygon3DEditor::CollisionPolygon3DEditor(EditorNode *p_editor) {
undo_redo = EditorNode::get_undo_redo();
add_child(memnew(VSeparator));
- button_create = memnew(ToolButton);
+ button_create = memnew(Button);
+ button_create->set_flat(true);
add_child(button_create);
button_create->connect("pressed", callable_mp(this, &CollisionPolygon3DEditor::_menu_option), varray(MODE_CREATE));
button_create->set_toggle_mode(true);
- button_edit = memnew(ToolButton);
+ button_edit = memnew(Button);
+ button_edit->set_flat(true);
add_child(button_edit);
button_edit->connect("pressed", callable_mp(this, &CollisionPolygon3DEditor::_menu_option), varray(MODE_EDIT));
button_edit->set_toggle_mode(true);
diff --git a/editor/plugins/collision_polygon_3d_editor_plugin.h b/editor/plugins/collision_polygon_3d_editor_plugin.h
index 5215cbb678..05b8df520c 100644
--- a/editor/plugins/collision_polygon_3d_editor_plugin.h
+++ b/editor/plugins/collision_polygon_3d_editor_plugin.h
@@ -36,7 +36,6 @@
#include "scene/3d/collision_polygon_3d.h"
#include "scene/3d/immediate_geometry_3d.h"
#include "scene/3d/mesh_instance_3d.h"
-#include "scene/gui/tool_button.h"
class CanvasItemEditor;
@@ -53,8 +52,8 @@ class CollisionPolygon3DEditor : public HBoxContainer {
Mode mode;
- ToolButton *button_create;
- ToolButton *button_edit;
+ Button *button_create;
+ Button *button_edit;
Ref<StandardMaterial3D> line_material;
Ref<StandardMaterial3D> handle_material;
diff --git a/editor/plugins/gi_probe_editor_plugin.cpp b/editor/plugins/gi_probe_editor_plugin.cpp
index 94f771e643..1b48e17772 100644
--- a/editor/plugins/gi_probe_editor_plugin.cpp
+++ b/editor/plugins/gi_probe_editor_plugin.cpp
@@ -144,7 +144,8 @@ GIProbeEditorPlugin::GIProbeEditorPlugin(EditorNode *p_node) {
bake_hb = memnew(HBoxContainer);
bake_hb->set_h_size_flags(Control::SIZE_EXPAND_FILL);
bake_hb->hide();
- bake = memnew(ToolButton);
+ bake = memnew(Button);
+ bake->set_flat(true);
bake->set_icon(editor->get_gui_base()->get_theme_icon("Bake", "EditorIcons"));
bake->set_text(TTR("Bake GI Probe"));
bake->connect("pressed", callable_mp(this, &GIProbeEditorPlugin::_bake));
diff --git a/editor/plugins/gi_probe_editor_plugin.h b/editor/plugins/gi_probe_editor_plugin.h
index 508c3d825b..e55f287908 100644
--- a/editor/plugins/gi_probe_editor_plugin.h
+++ b/editor/plugins/gi_probe_editor_plugin.h
@@ -43,7 +43,7 @@ class GIProbeEditorPlugin : public EditorPlugin {
HBoxContainer *bake_hb;
Label *bake_info;
- ToolButton *bake;
+ Button *bake;
EditorNode *editor;
EditorFileDialog *probe_file;
diff --git a/editor/plugins/item_list_editor_plugin.cpp b/editor/plugins/item_list_editor_plugin.cpp
index 7402baad57..b4dcbdfe20 100644
--- a/editor/plugins/item_list_editor_plugin.cpp
+++ b/editor/plugins/item_list_editor_plugin.cpp
@@ -325,7 +325,8 @@ ItemListEditor::ItemListEditor() {
selected_idx = -1;
item_list = nullptr;
- toolbar_button = memnew(ToolButton);
+ toolbar_button = memnew(Button);
+ toolbar_button->set_flat(true);
toolbar_button->set_text(TTR("Items"));
add_child(toolbar_button);
toolbar_button->connect("pressed", callable_mp(this, &ItemListEditor::_edit_items));
diff --git a/editor/plugins/item_list_editor_plugin.h b/editor/plugins/item_list_editor_plugin.h
index 61dd617e3b..d89631633c 100644
--- a/editor/plugins/item_list_editor_plugin.h
+++ b/editor/plugins/item_list_editor_plugin.h
@@ -198,7 +198,7 @@ class ItemListEditor : public HBoxContainer {
Node *item_list;
- ToolButton *toolbar_button;
+ Button *toolbar_button;
AcceptDialog *dialog;
EditorInspector *property_editor;
diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp
index 975957d56c..961ae10f46 100644
--- a/editor/plugins/node_3d_editor_plugin.cpp
+++ b/editor/plugins/node_3d_editor_plugin.cpp
@@ -2106,12 +2106,7 @@ void Node3DEditorViewport::_nav_orbit(Ref<InputEventWithModifiers> p_event, cons
cursor.x_rot += p_relative.y * radians_per_pixel;
}
cursor.y_rot += p_relative.x * radians_per_pixel;
- if (cursor.x_rot > Math_PI / 2.0) {
- cursor.x_rot = Math_PI / 2.0;
- }
- if (cursor.x_rot < -Math_PI / 2.0) {
- cursor.x_rot = -Math_PI / 2.0;
- }
+ cursor.x_rot = CLAMP(cursor.x_rot, -1.57, 1.57);
name = "";
_update_name();
}
@@ -2139,12 +2134,7 @@ void Node3DEditorViewport::_nav_look(Ref<InputEventWithModifiers> p_event, const
cursor.x_rot += p_relative.y * radians_per_pixel;
}
cursor.y_rot += p_relative.x * radians_per_pixel;
- if (cursor.x_rot > Math_PI / 2.0) {
- cursor.x_rot = Math_PI / 2.0;
- }
- if (cursor.x_rot < -Math_PI / 2.0) {
- cursor.x_rot = -Math_PI / 2.0;
- }
+ cursor.x_rot = CLAMP(cursor.x_rot, -1.57, 1.57);
// Look is like the opposite of Orbit: the focus point rotates around the camera
Transform camera_transform = to_camera_transform(cursor);
@@ -3218,7 +3208,7 @@ void Node3DEditorViewport::update_transform_gizmo_view() {
Vector3 camz = -camera_xform.get_basis().get_axis(2).normalized();
Vector3 camy = -camera_xform.get_basis().get_axis(1).normalized();
Plane p(camera_xform.origin, camz);
- float gizmo_d = Math::abs(p.distance_to(xform.origin));
+ float gizmo_d = MAX(Math::abs(p.distance_to(xform.origin)), CMP_EPSILON);
float d0 = camera->unproject_position(camera_xform.origin + camz * gizmo_d).y;
float d1 = camera->unproject_position(camera_xform.origin + camz * gizmo_d + camy).y;
float dd = Math::abs(d0 - d1);
@@ -6048,7 +6038,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) {
button_binds.resize(1);
String sct;
- tool_button[TOOL_MODE_SELECT] = memnew(ToolButton);
+ tool_button[TOOL_MODE_SELECT] = memnew(Button);
hbc_menu->add_child(tool_button[TOOL_MODE_SELECT]);
tool_button[TOOL_MODE_SELECT]->set_toggle_mode(true);
tool_button[TOOL_MODE_SELECT]->set_flat(true);
@@ -6060,7 +6050,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) {
hbc_menu->add_child(memnew(VSeparator));
- tool_button[TOOL_MODE_MOVE] = memnew(ToolButton);
+ tool_button[TOOL_MODE_MOVE] = memnew(Button);
hbc_menu->add_child(tool_button[TOOL_MODE_MOVE]);
tool_button[TOOL_MODE_MOVE]->set_toggle_mode(true);
tool_button[TOOL_MODE_MOVE]->set_flat(true);
@@ -6068,7 +6058,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) {
tool_button[TOOL_MODE_MOVE]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
tool_button[TOOL_MODE_MOVE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_move", TTR("Move Mode"), KEY_W));
- tool_button[TOOL_MODE_ROTATE] = memnew(ToolButton);
+ tool_button[TOOL_MODE_ROTATE] = memnew(Button);
hbc_menu->add_child(tool_button[TOOL_MODE_ROTATE]);
tool_button[TOOL_MODE_ROTATE]->set_toggle_mode(true);
tool_button[TOOL_MODE_ROTATE]->set_flat(true);
@@ -6076,7 +6066,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) {
tool_button[TOOL_MODE_ROTATE]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
tool_button[TOOL_MODE_ROTATE]->set_shortcut(ED_SHORTCUT("spatial_editor/tool_rotate", TTR("Rotate Mode"), KEY_E));
- tool_button[TOOL_MODE_SCALE] = memnew(ToolButton);
+ tool_button[TOOL_MODE_SCALE] = memnew(Button);
hbc_menu->add_child(tool_button[TOOL_MODE_SCALE]);
tool_button[TOOL_MODE_SCALE]->set_toggle_mode(true);
tool_button[TOOL_MODE_SCALE]->set_flat(true);
@@ -6086,7 +6076,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) {
hbc_menu->add_child(memnew(VSeparator));
- tool_button[TOOL_MODE_LIST_SELECT] = memnew(ToolButton);
+ tool_button[TOOL_MODE_LIST_SELECT] = memnew(Button);
hbc_menu->add_child(tool_button[TOOL_MODE_LIST_SELECT]);
tool_button[TOOL_MODE_LIST_SELECT]->set_toggle_mode(true);
tool_button[TOOL_MODE_LIST_SELECT]->set_flat(true);
@@ -6094,25 +6084,25 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) {
tool_button[TOOL_MODE_LIST_SELECT]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
tool_button[TOOL_MODE_LIST_SELECT]->set_tooltip(TTR("Show a list of all objects at the position clicked\n(same as Alt+RMB in select mode)."));
- tool_button[TOOL_LOCK_SELECTED] = memnew(ToolButton);
+ tool_button[TOOL_LOCK_SELECTED] = memnew(Button);
hbc_menu->add_child(tool_button[TOOL_LOCK_SELECTED]);
button_binds.write[0] = MENU_LOCK_SELECTED;
tool_button[TOOL_LOCK_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
tool_button[TOOL_LOCK_SELECTED]->set_tooltip(TTR("Lock the selected object in place (can't be moved)."));
- tool_button[TOOL_UNLOCK_SELECTED] = memnew(ToolButton);
+ tool_button[TOOL_UNLOCK_SELECTED] = memnew(Button);
hbc_menu->add_child(tool_button[TOOL_UNLOCK_SELECTED]);
button_binds.write[0] = MENU_UNLOCK_SELECTED;
tool_button[TOOL_UNLOCK_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
tool_button[TOOL_UNLOCK_SELECTED]->set_tooltip(TTR("Unlock the selected object (can be moved)."));
- tool_button[TOOL_GROUP_SELECTED] = memnew(ToolButton);
+ tool_button[TOOL_GROUP_SELECTED] = memnew(Button);
hbc_menu->add_child(tool_button[TOOL_GROUP_SELECTED]);
button_binds.write[0] = MENU_GROUP_SELECTED;
tool_button[TOOL_GROUP_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
tool_button[TOOL_GROUP_SELECTED]->set_tooltip(TTR("Makes sure the object's children are not selectable."));
- tool_button[TOOL_UNGROUP_SELECTED] = memnew(ToolButton);
+ tool_button[TOOL_UNGROUP_SELECTED] = memnew(Button);
hbc_menu->add_child(tool_button[TOOL_UNGROUP_SELECTED]);
button_binds.write[0] = MENU_UNGROUP_SELECTED;
tool_button[TOOL_UNGROUP_SELECTED]->connect("pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed), button_binds);
@@ -6120,7 +6110,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) {
hbc_menu->add_child(memnew(VSeparator));
- tool_option_button[TOOL_OPT_LOCAL_COORDS] = memnew(ToolButton);
+ tool_option_button[TOOL_OPT_LOCAL_COORDS] = memnew(Button);
hbc_menu->add_child(tool_option_button[TOOL_OPT_LOCAL_COORDS]);
tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_toggle_mode(true);
tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_flat(true);
@@ -6128,7 +6118,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) {
tool_option_button[TOOL_OPT_LOCAL_COORDS]->connect("toggled", callable_mp(this, &Node3DEditor::_menu_item_toggled), button_binds);
tool_option_button[TOOL_OPT_LOCAL_COORDS]->set_shortcut(ED_SHORTCUT("spatial_editor/local_coords", TTR("Use Local Space"), KEY_T));
- tool_option_button[TOOL_OPT_USE_SNAP] = memnew(ToolButton);
+ tool_option_button[TOOL_OPT_USE_SNAP] = memnew(Button);
hbc_menu->add_child(tool_option_button[TOOL_OPT_USE_SNAP]);
tool_option_button[TOOL_OPT_USE_SNAP]->set_toggle_mode(true);
tool_option_button[TOOL_OPT_USE_SNAP]->set_flat(true);
@@ -6138,7 +6128,7 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) {
hbc_menu->add_child(memnew(VSeparator));
- tool_option_button[TOOL_OPT_OVERRIDE_CAMERA] = memnew(ToolButton);
+ tool_option_button[TOOL_OPT_OVERRIDE_CAMERA] = memnew(Button);
hbc_menu->add_child(tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]);
tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->set_toggle_mode(true);
tool_option_button[TOOL_OPT_OVERRIDE_CAMERA]->set_flat(true);
diff --git a/editor/plugins/path_2d_editor_plugin.cpp b/editor/plugins/path_2d_editor_plugin.cpp
index a3dab665b8..f79098ce5d 100644
--- a/editor/plugins/path_2d_editor_plugin.cpp
+++ b/editor/plugins/path_2d_editor_plugin.cpp
@@ -532,35 +532,40 @@ Path2DEditor::Path2DEditor(EditorNode *p_editor) {
sep = memnew(VSeparator);
base_hb->add_child(sep);
- curve_edit = memnew(ToolButton);
+ curve_edit = memnew(Button);
+ curve_edit->set_flat(true);
curve_edit->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveEdit", "EditorIcons"));
curve_edit->set_toggle_mode(true);
curve_edit->set_focus_mode(Control::FOCUS_NONE);
curve_edit->set_tooltip(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string(KEY_MASK_CMD) + TTR("Click: Add Point") + "\n" + TTR("Left Click: Split Segment (in curve)") + "\n" + TTR("Right Click: Delete Point"));
curve_edit->connect("pressed", callable_mp(this, &Path2DEditor::_mode_selected), varray(MODE_EDIT));
base_hb->add_child(curve_edit);
- curve_edit_curve = memnew(ToolButton);
+ curve_edit_curve = memnew(Button);
+ curve_edit_curve->set_flat(true);
curve_edit_curve->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveCurve", "EditorIcons"));
curve_edit_curve->set_toggle_mode(true);
curve_edit_curve->set_focus_mode(Control::FOCUS_NONE);
curve_edit_curve->set_tooltip(TTR("Select Control Points (Shift+Drag)"));
curve_edit_curve->connect("pressed", callable_mp(this, &Path2DEditor::_mode_selected), varray(MODE_EDIT_CURVE));
base_hb->add_child(curve_edit_curve);
- curve_create = memnew(ToolButton);
+ curve_create = memnew(Button);
+ curve_create->set_flat(true);
curve_create->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveCreate", "EditorIcons"));
curve_create->set_toggle_mode(true);
curve_create->set_focus_mode(Control::FOCUS_NONE);
curve_create->set_tooltip(TTR("Add Point (in empty space)"));
curve_create->connect("pressed", callable_mp(this, &Path2DEditor::_mode_selected), varray(MODE_CREATE));
base_hb->add_child(curve_create);
- curve_del = memnew(ToolButton);
+ curve_del = memnew(Button);
+ curve_del->set_flat(true);
curve_del->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveDelete", "EditorIcons"));
curve_del->set_toggle_mode(true);
curve_del->set_focus_mode(Control::FOCUS_NONE);
curve_del->set_tooltip(TTR("Delete Point"));
curve_del->connect("pressed", callable_mp(this, &Path2DEditor::_mode_selected), varray(MODE_DELETE));
base_hb->add_child(curve_del);
- curve_close = memnew(ToolButton);
+ curve_close = memnew(Button);
+ curve_close->set_flat(true);
curve_close->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveClose", "EditorIcons"));
curve_close->set_focus_mode(Control::FOCUS_NONE);
curve_close->set_tooltip(TTR("Close Curve"));
diff --git a/editor/plugins/path_2d_editor_plugin.h b/editor/plugins/path_2d_editor_plugin.h
index 390dfdfdf7..d0c02b28d4 100644
--- a/editor/plugins/path_2d_editor_plugin.h
+++ b/editor/plugins/path_2d_editor_plugin.h
@@ -34,7 +34,6 @@
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
#include "scene/2d/path_2d.h"
-#include "scene/gui/tool_button.h"
class CanvasItemEditor;
@@ -60,11 +59,11 @@ class Path2DEditor : public HBoxContainer {
};
Mode mode;
- ToolButton *curve_create;
- ToolButton *curve_edit;
- ToolButton *curve_edit_curve;
- ToolButton *curve_del;
- ToolButton *curve_close;
+ Button *curve_create;
+ Button *curve_edit;
+ Button *curve_edit_curve;
+ Button *curve_del;
+ Button *curve_close;
MenuButton *handle_menu;
bool mirror_handle_angle;
diff --git a/editor/plugins/path_3d_editor_plugin.cpp b/editor/plugins/path_3d_editor_plugin.cpp
index 25cffa3d6c..f53130c24d 100644
--- a/editor/plugins/path_3d_editor_plugin.cpp
+++ b/editor/plugins/path_3d_editor_plugin.cpp
@@ -557,28 +557,32 @@ Path3DEditorPlugin::Path3DEditorPlugin(EditorNode *p_node) {
sep = memnew(VSeparator);
sep->hide();
Node3DEditor::get_singleton()->add_control_to_menu_panel(sep);
- curve_edit = memnew(ToolButton);
+ curve_edit = memnew(Button);
+ curve_edit->set_flat(true);
curve_edit->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveEdit", "EditorIcons"));
curve_edit->set_toggle_mode(true);
curve_edit->hide();
curve_edit->set_focus_mode(Control::FOCUS_NONE);
curve_edit->set_tooltip(TTR("Select Points") + "\n" + TTR("Shift+Drag: Select Control Points") + "\n" + keycode_get_string(KEY_MASK_CMD) + TTR("Click: Add Point") + "\n" + TTR("Right Click: Delete Point"));
Node3DEditor::get_singleton()->add_control_to_menu_panel(curve_edit);
- curve_create = memnew(ToolButton);
+ curve_create = memnew(Button);
+ curve_create->set_flat(true);
curve_create->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveCreate", "EditorIcons"));
curve_create->set_toggle_mode(true);
curve_create->hide();
curve_create->set_focus_mode(Control::FOCUS_NONE);
curve_create->set_tooltip(TTR("Add Point (in empty space)") + "\n" + TTR("Split Segment (in curve)"));
Node3DEditor::get_singleton()->add_control_to_menu_panel(curve_create);
- curve_del = memnew(ToolButton);
+ curve_del = memnew(Button);
+ curve_del->set_flat(true);
curve_del->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveDelete", "EditorIcons"));
curve_del->set_toggle_mode(true);
curve_del->hide();
curve_del->set_focus_mode(Control::FOCUS_NONE);
curve_del->set_tooltip(TTR("Delete Point"));
Node3DEditor::get_singleton()->add_control_to_menu_panel(curve_del);
- curve_close = memnew(ToolButton);
+ curve_close = memnew(Button);
+ curve_close->set_flat(true);
curve_close->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("CurveClose", "EditorIcons"));
curve_close->hide();
curve_close->set_focus_mode(Control::FOCUS_NONE);
diff --git a/editor/plugins/path_3d_editor_plugin.h b/editor/plugins/path_3d_editor_plugin.h
index 8bec5df797..3a75717b73 100644
--- a/editor/plugins/path_3d_editor_plugin.h
+++ b/editor/plugins/path_3d_editor_plugin.h
@@ -68,10 +68,10 @@ class Path3DEditorPlugin : public EditorPlugin {
GDCLASS(Path3DEditorPlugin, EditorPlugin);
Separator *sep;
- ToolButton *curve_create;
- ToolButton *curve_edit;
- ToolButton *curve_del;
- ToolButton *curve_close;
+ Button *curve_create;
+ Button *curve_edit;
+ Button *curve_del;
+ Button *curve_close;
MenuButton *handle_menu;
EditorNode *editor;
diff --git a/editor/plugins/physical_bone_3d_editor_plugin.cpp b/editor/plugins/physical_bone_3d_editor_plugin.cpp
index bcbf88e7dc..30bf827b3c 100644
--- a/editor/plugins/physical_bone_3d_editor_plugin.cpp
+++ b/editor/plugins/physical_bone_3d_editor_plugin.cpp
@@ -55,7 +55,8 @@ PhysicalBone3DEditor::PhysicalBone3DEditor(EditorNode *p_editor) :
spatial_editor_hb->add_child(memnew(VSeparator));
- button_transform_joint = memnew(ToolButton);
+ button_transform_joint = memnew(Button);
+ button_transform_joint->set_flat(true);
spatial_editor_hb->add_child(button_transform_joint);
button_transform_joint->set_text(TTR("Move Joint"));
diff --git a/editor/plugins/physical_bone_3d_editor_plugin.h b/editor/plugins/physical_bone_3d_editor_plugin.h
index 79c7cc4bb1..8699176fe0 100644
--- a/editor/plugins/physical_bone_3d_editor_plugin.h
+++ b/editor/plugins/physical_bone_3d_editor_plugin.h
@@ -38,7 +38,7 @@ class PhysicalBone3DEditor : public Object {
EditorNode *editor;
HBoxContainer *spatial_editor_hb;
- ToolButton *button_transform_joint;
+ Button *button_transform_joint;
PhysicalBone3D *selected = nullptr;
diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp
index 1f98c0139b..1d273f74f0 100644
--- a/editor/plugins/polygon_2d_editor_plugin.cpp
+++ b/editor/plugins/polygon_2d_editor_plugin.cpp
@@ -1214,7 +1214,8 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
use_snap = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "snap_enabled", false);
snap_show_grid = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "show_grid", false);
- button_uv = memnew(ToolButton);
+ button_uv = memnew(Button);
+ button_uv->set_flat(true);
add_child(button_uv);
button_uv->set_tooltip(TTR("Open Polygon 2D UV editor."));
button_uv->connect("pressed", callable_mp(this, &Polygon2DEditor::_menu_option), varray(MODE_EDIT_UV));
@@ -1231,16 +1232,16 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
uv_edit_group.instance();
- uv_edit_mode[0] = memnew(ToolButton);
+ uv_edit_mode[0] = memnew(Button);
uv_mode_hb->add_child(uv_edit_mode[0]);
uv_edit_mode[0]->set_toggle_mode(true);
- uv_edit_mode[1] = memnew(ToolButton);
+ uv_edit_mode[1] = memnew(Button);
uv_mode_hb->add_child(uv_edit_mode[1]);
uv_edit_mode[1]->set_toggle_mode(true);
- uv_edit_mode[2] = memnew(ToolButton);
+ uv_edit_mode[2] = memnew(Button);
uv_mode_hb->add_child(uv_edit_mode[2]);
uv_edit_mode[2]->set_toggle_mode(true);
- uv_edit_mode[3] = memnew(ToolButton);
+ uv_edit_mode[3] = memnew(Button);
uv_mode_hb->add_child(uv_edit_mode[3]);
uv_edit_mode[3]->set_toggle_mode(true);
@@ -1264,7 +1265,7 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
uv_main_vb->add_child(uv_mode_hb);
for (int i = 0; i < UV_MODE_MAX; i++) {
- uv_button[i] = memnew(ToolButton);
+ uv_button[i] = memnew(Button);
uv_button[i]->set_toggle_mode(true);
uv_mode_hb->add_child(uv_button[i]);
uv_button[i]->connect("pressed", callable_mp(this, &Polygon2DEditor::_uv_mode), varray(i));
@@ -1334,7 +1335,8 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
uv_mode_hb->add_child(memnew(VSeparator));
- b_snap_enable = memnew(ToolButton);
+ b_snap_enable = memnew(Button);
+ b_snap_enable->set_flat(true);
uv_mode_hb->add_child(b_snap_enable);
b_snap_enable->set_text(TTR("Snap"));
b_snap_enable->set_focus_mode(FOCUS_NONE);
@@ -1343,7 +1345,8 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
b_snap_enable->set_tooltip(TTR("Enable Snap"));
b_snap_enable->connect("toggled", callable_mp(this, &Polygon2DEditor::_set_use_snap));
- b_snap_grid = memnew(ToolButton);
+ b_snap_grid = memnew(Button);
+ b_snap_grid->set_flat(true);
uv_mode_hb->add_child(b_snap_grid);
b_snap_grid->set_text(TTR("Grid"));
b_snap_grid->set_focus_mode(FOCUS_NONE);
diff --git a/editor/plugins/polygon_2d_editor_plugin.h b/editor/plugins/polygon_2d_editor_plugin.h
index b94ae53e2b..33ea7722ac 100644
--- a/editor/plugins/polygon_2d_editor_plugin.h
+++ b/editor/plugins/polygon_2d_editor_plugin.h
@@ -60,16 +60,16 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
UV_MODE_MAX
};
- ToolButton *uv_edit_mode[4];
+ Button *uv_edit_mode[4];
Ref<ButtonGroup> uv_edit_group;
Polygon2D *node;
UVMode uv_mode;
AcceptDialog *uv_edit;
- ToolButton *uv_button[UV_MODE_MAX];
- ToolButton *b_snap_enable;
- ToolButton *b_snap_grid;
+ Button *uv_button[UV_MODE_MAX];
+ Button *b_snap_enable;
+ Button *b_snap_grid;
Panel *uv_edit_draw;
HSlider *uv_zoom;
SpinBox *uv_zoom_value;
@@ -115,7 +115,7 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
AcceptDialog *error;
- ToolButton *button_uv;
+ Button *button_uv;
bool use_snap;
bool snap_show_grid;
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
index 48a9febcf9..3f17bf57c4 100644
--- a/editor/plugins/script_editor_plugin.cpp
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -2988,7 +2988,8 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
filename->add_theme_style_override("normal", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox("normal", "LineEdit"));
buttons_hbox->add_child(filename);
- members_overview_alphabeta_sort_button = memnew(ToolButton);
+ members_overview_alphabeta_sort_button = memnew(Button);
+ members_overview_alphabeta_sort_button->set_flat(true);
members_overview_alphabeta_sort_button->set_tooltip(TTR("Toggle alphabetical sorting of the method list."));
members_overview_alphabeta_sort_button->set_toggle_mode(true);
members_overview_alphabeta_sort_button->set_pressed(EditorSettings::get_singleton()->get("text_editor/tools/sort_members_outline_alphabetically"));
@@ -3115,13 +3116,15 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
menu_hb->add_spacer();
- site_search = memnew(ToolButton);
+ site_search = memnew(Button);
+ site_search->set_flat(true);
site_search->set_text(TTR("Online Docs"));
site_search->connect("pressed", callable_mp(this, &ScriptEditor::_menu_option), varray(SEARCH_WEBSITE));
menu_hb->add_child(site_search);
site_search->set_tooltip(TTR("Open Godot online documentation."));
- help_search = memnew(ToolButton);
+ help_search = memnew(Button);
+ help_search->set_flat(true);
help_search->set_text(TTR("Search Help"));
help_search->connect("pressed", callable_mp(this, &ScriptEditor::_menu_option), varray(SEARCH_HELP));
menu_hb->add_child(help_search);
@@ -3129,13 +3132,15 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
menu_hb->add_child(memnew(VSeparator));
- script_back = memnew(ToolButton);
+ script_back = memnew(Button);
+ script_back->set_flat(true);
script_back->connect("pressed", callable_mp(this, &ScriptEditor::_history_back));
menu_hb->add_child(script_back);
script_back->set_disabled(true);
script_back->set_tooltip(TTR("Go to previous edited document."));
- script_forward = memnew(ToolButton);
+ script_forward = memnew(Button);
+ script_forward->set_flat(true);
script_forward->connect("pressed", callable_mp(this, &ScriptEditor::_history_forward));
menu_hb->add_child(script_forward);
script_forward->set_disabled(true);
diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h
index f7352be7e8..8c4b7de27d 100644
--- a/editor/plugins/script_editor_plugin.h
+++ b/editor/plugins/script_editor_plugin.h
@@ -43,7 +43,6 @@
#include "scene/gui/split_container.h"
#include "scene/gui/tab_container.h"
#include "scene/gui/text_edit.h"
-#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
#include "scene/main/timer.h"
#include "scene/resources/text_file.h"
@@ -211,7 +210,7 @@ class ScriptEditor : public PanelContainer {
VBoxContainer *overview_vbox;
HBoxContainer *buttons_hbox;
Label *filename;
- ToolButton *members_overview_alphabeta_sort_button;
+ Button *members_overview_alphabeta_sort_button;
bool members_overview_enabled;
ItemList *help_overview;
bool help_overview_enabled;
@@ -221,15 +220,15 @@ class ScriptEditor : public PanelContainer {
AcceptDialog *error_dialog;
ConfirmationDialog *erase_tab_confirm;
ScriptCreateDialog *script_create_dialog;
- ToolButton *scripts_visible;
+ Button *scripts_visible;
String current_theme;
TextureRect *script_icon;
Label *script_name_label;
- ToolButton *script_back;
- ToolButton *script_forward;
+ Button *script_back;
+ Button *script_forward;
FindInFilesDialog *find_in_files_dialog;
FindInFilesPanel *find_in_files;
diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp
index 859fec1628..7102faf58a 100644
--- a/editor/plugins/sprite_frames_editor_plugin.cpp
+++ b/editor/plugins/sprite_frames_editor_plugin.cpp
@@ -873,12 +873,14 @@ SpriteFramesEditor::SpriteFramesEditor() {
HBoxContainer *hbc_animlist = memnew(HBoxContainer);
sub_vb->add_child(hbc_animlist);
- new_anim = memnew(ToolButton);
+ new_anim = memnew(Button);
+ new_anim->set_flat(true);
new_anim->set_tooltip(TTR("New Animation"));
hbc_animlist->add_child(new_anim);
new_anim->connect("pressed", callable_mp(this, &SpriteFramesEditor::_animation_add));
- remove_anim = memnew(ToolButton);
+ remove_anim = memnew(Button);
+ remove_anim->set_flat(true);
remove_anim->set_tooltip(TTR("Remove Animation"));
hbc_animlist->add_child(remove_anim);
remove_anim->connect("pressed", callable_mp(this, &SpriteFramesEditor::_animation_remove));
@@ -913,45 +915,54 @@ SpriteFramesEditor::SpriteFramesEditor() {
HBoxContainer *hbc = memnew(HBoxContainer);
sub_vb->add_child(hbc);
- load = memnew(ToolButton);
+ load = memnew(Button);
+ load->set_flat(true);
load->set_tooltip(TTR("Add a Texture from File"));
hbc->add_child(load);
- load_sheet = memnew(ToolButton);
+ load_sheet = memnew(Button);
+ load_sheet->set_flat(true);
load_sheet->set_tooltip(TTR("Add Frames from a Sprite Sheet"));
hbc->add_child(load_sheet);
hbc->add_child(memnew(VSeparator));
- copy = memnew(ToolButton);
+ copy = memnew(Button);
+ copy->set_flat(true);
copy->set_tooltip(TTR("Copy"));
hbc->add_child(copy);
- paste = memnew(ToolButton);
+ paste = memnew(Button);
+ paste->set_flat(true);
paste->set_tooltip(TTR("Paste"));
hbc->add_child(paste);
hbc->add_child(memnew(VSeparator));
- empty = memnew(ToolButton);
+ empty = memnew(Button);
+ empty->set_flat(true);
empty->set_tooltip(TTR("Insert Empty (Before)"));
hbc->add_child(empty);
- empty2 = memnew(ToolButton);
+ empty2 = memnew(Button);
+ empty2->set_flat(true);
empty2->set_tooltip(TTR("Insert Empty (After)"));
hbc->add_child(empty2);
hbc->add_child(memnew(VSeparator));
- move_up = memnew(ToolButton);
+ move_up = memnew(Button);
+ move_up->set_flat(true);
move_up->set_tooltip(TTR("Move (Before)"));
hbc->add_child(move_up);
- move_down = memnew(ToolButton);
+ move_down = memnew(Button);
+ move_down->set_flat(true);
move_down->set_tooltip(TTR("Move (After)"));
hbc->add_child(move_down);
- _delete = memnew(ToolButton);
+ _delete = memnew(Button);
+ _delete->set_flat(true);
_delete->set_tooltip(TTR("Delete"));
hbc->add_child(_delete);
diff --git a/editor/plugins/sprite_frames_editor_plugin.h b/editor/plugins/sprite_frames_editor_plugin.h
index 45646eb9e4..c050ae484b 100644
--- a/editor/plugins/sprite_frames_editor_plugin.h
+++ b/editor/plugins/sprite_frames_editor_plugin.h
@@ -43,22 +43,22 @@
class SpriteFramesEditor : public HSplitContainer {
GDCLASS(SpriteFramesEditor, HSplitContainer);
- ToolButton *load;
- ToolButton *load_sheet;
- ToolButton *_delete;
- ToolButton *copy;
- ToolButton *paste;
- ToolButton *empty;
- ToolButton *empty2;
- ToolButton *move_up;
- ToolButton *move_down;
+ Button *load;
+ Button *load_sheet;
+ Button *_delete;
+ Button *copy;
+ Button *paste;
+ Button *empty;
+ Button *empty2;
+ Button *move_up;
+ Button *move_down;
ItemList *tree;
bool loading_scene;
int sel;
HSplitContainer *split;
- ToolButton *new_anim;
- ToolButton *remove_anim;
+ Button *new_anim;
+ Button *remove_anim;
Tree *animations;
SpinBox *anim_speed;
diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp
index 9b8b111be5..3a92818779 100644
--- a/editor/plugins/texture_region_editor_plugin.cpp
+++ b/editor/plugins/texture_region_editor_plugin.cpp
@@ -1037,17 +1037,20 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
edit_draw->add_child(zoom_hb);
zoom_hb->set_begin(Point2(5, 5));
- zoom_out = memnew(ToolButton);
+ zoom_out = memnew(Button);
+ zoom_out->set_flat(true);
zoom_out->set_tooltip(TTR("Zoom Out"));
zoom_out->connect("pressed", callable_mp(this, &TextureRegionEditor::_zoom_out));
zoom_hb->add_child(zoom_out);
- zoom_reset = memnew(ToolButton);
+ zoom_reset = memnew(Button);
+ zoom_reset->set_flat(true);
zoom_reset->set_tooltip(TTR("Zoom Reset"));
zoom_reset->connect("pressed", callable_mp(this, &TextureRegionEditor::_zoom_reset));
zoom_hb->add_child(zoom_reset);
- zoom_in = memnew(ToolButton);
+ zoom_in = memnew(Button);
+ zoom_in->set_flat(true);
zoom_in->set_tooltip(TTR("Zoom In"));
zoom_in->connect("pressed", callable_mp(this, &TextureRegionEditor::_zoom_in));
zoom_hb->add_child(zoom_in);
diff --git a/editor/plugins/texture_region_editor_plugin.h b/editor/plugins/texture_region_editor_plugin.h
index 93da23fd50..8991603c0f 100644
--- a/editor/plugins/texture_region_editor_plugin.h
+++ b/editor/plugins/texture_region_editor_plugin.h
@@ -56,9 +56,9 @@ class TextureRegionEditor : public VBoxContainer {
friend class TextureRegionEditorPlugin;
OptionButton *snap_mode_button;
- ToolButton *zoom_in;
- ToolButton *zoom_reset;
- ToolButton *zoom_out;
+ Button *zoom_in;
+ Button *zoom_reset;
+ Button *zoom_out;
HBoxContainer *hb_grid; //For showing/hiding the grid controls when changing the SnapMode
SpinBox *sb_step_y;
SpinBox *sb_step_x;
diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp
index eb028659fd..43ace737c0 100644
--- a/editor/plugins/theme_editor_plugin.cpp
+++ b/editor/plugins/theme_editor_plugin.cpp
@@ -672,8 +672,9 @@ ThemeEditor::ThemeEditor() {
bt->set_text(TTR("Disabled Button"));
bt->set_disabled(true);
first_vb->add_child(bt);
- ToolButton *tb = memnew(ToolButton);
- tb->set_text("ToolButton");
+ Button *tb = memnew(Button);
+ tb->set_flat(true);
+ tb->set_text("Button");
first_vb->add_child(tb);
CheckButton *cb = memnew(CheckButton);
diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp
index 3281a59c1c..158f9e8587 100644
--- a/editor/plugins/tile_map_editor_plugin.cpp
+++ b/editor/plugins/tile_map_editor_plugin.cpp
@@ -91,7 +91,7 @@ void TileMapEditor::_notification(int p_what) {
}
void TileMapEditor::_update_button_tool() {
- ToolButton *tb[4] = { paint_button, bucket_fill_button, picker_button, select_button };
+ Button *tb[4] = { paint_button, bucket_fill_button, picker_button, select_button };
// Unpress all buttons
for (int i = 0; i < 4; i++) {
tb[i]->set_pressed(false);
@@ -1959,26 +1959,30 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
toolbar->add_child(memnew(VSeparator));
// Tools.
- paint_button = memnew(ToolButton);
+ paint_button = memnew(Button);
+ paint_button->set_flat(true);
paint_button->set_shortcut(ED_SHORTCUT("tile_map_editor/paint_tile", TTR("Paint Tile"), KEY_P));
paint_button->set_tooltip(TTR("Shift+LMB: Line Draw\nShift+Ctrl+LMB: Rectangle Paint"));
paint_button->connect("pressed", callable_mp(this, &TileMapEditor::_button_tool_select), make_binds(TOOL_NONE));
paint_button->set_toggle_mode(true);
toolbar->add_child(paint_button);
- bucket_fill_button = memnew(ToolButton);
+ bucket_fill_button = memnew(Button);
+ bucket_fill_button->set_flat(true);
bucket_fill_button->set_shortcut(ED_SHORTCUT("tile_map_editor/bucket_fill", TTR("Bucket Fill"), KEY_B));
bucket_fill_button->connect("pressed", callable_mp(this, &TileMapEditor::_button_tool_select), make_binds(TOOL_BUCKET));
bucket_fill_button->set_toggle_mode(true);
toolbar->add_child(bucket_fill_button);
- picker_button = memnew(ToolButton);
+ picker_button = memnew(Button);
+ picker_button->set_flat(true);
picker_button->set_shortcut(ED_SHORTCUT("tile_map_editor/pick_tile", TTR("Pick Tile"), KEY_I));
picker_button->connect("pressed", callable_mp(this, &TileMapEditor::_button_tool_select), make_binds(TOOL_PICKING));
picker_button->set_toggle_mode(true);
toolbar->add_child(picker_button);
- select_button = memnew(ToolButton);
+ select_button = memnew(Button);
+ select_button->set_flat(true);
select_button->set_shortcut(ED_SHORTCUT("tile_map_editor/select", TTR("Select"), KEY_M));
select_button->connect("pressed", callable_mp(this, &TileMapEditor::_button_tool_select), make_binds(TOOL_SELECTING));
select_button->set_toggle_mode(true);
@@ -2017,35 +2021,40 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
p->add_item(TTR("Fix Invalid Tiles"), OPTION_FIX_INVALID);
p->connect("id_pressed", callable_mp(this, &TileMapEditor::_menu_option));
- rotate_left_button = memnew(ToolButton);
+ rotate_left_button = memnew(Button);
+ rotate_left_button->set_flat(true);
rotate_left_button->set_tooltip(TTR("Rotate Left"));
rotate_left_button->set_focus_mode(FOCUS_NONE);
rotate_left_button->connect("pressed", callable_mp(this, &TileMapEditor::_rotate), varray(-1));
rotate_left_button->set_shortcut(ED_SHORTCUT("tile_map_editor/rotate_left", TTR("Rotate Left"), KEY_A));
tool_hb->add_child(rotate_left_button);
- rotate_right_button = memnew(ToolButton);
+ rotate_right_button = memnew(Button);
+ rotate_right_button->set_flat(true);
rotate_right_button->set_tooltip(TTR("Rotate Right"));
rotate_right_button->set_focus_mode(FOCUS_NONE);
rotate_right_button->connect("pressed", callable_mp(this, &TileMapEditor::_rotate), varray(1));
rotate_right_button->set_shortcut(ED_SHORTCUT("tile_map_editor/rotate_right", TTR("Rotate Right"), KEY_S));
tool_hb->add_child(rotate_right_button);
- flip_horizontal_button = memnew(ToolButton);
+ flip_horizontal_button = memnew(Button);
+ flip_horizontal_button->set_flat(true);
flip_horizontal_button->set_tooltip(TTR("Flip Horizontally"));
flip_horizontal_button->set_focus_mode(FOCUS_NONE);
flip_horizontal_button->connect("pressed", callable_mp(this, &TileMapEditor::_flip_horizontal));
flip_horizontal_button->set_shortcut(ED_SHORTCUT("tile_map_editor/flip_horizontal", TTR("Flip Horizontally"), KEY_X));
tool_hb->add_child(flip_horizontal_button);
- flip_vertical_button = memnew(ToolButton);
+ flip_vertical_button = memnew(Button);
+ flip_vertical_button->set_flat(true);
flip_vertical_button->set_tooltip(TTR("Flip Vertically"));
flip_vertical_button->set_focus_mode(FOCUS_NONE);
flip_vertical_button->connect("pressed", callable_mp(this, &TileMapEditor::_flip_vertical));
flip_vertical_button->set_shortcut(ED_SHORTCUT("tile_map_editor/flip_vertical", TTR("Flip Vertically"), KEY_Z));
tool_hb->add_child(flip_vertical_button);
- clear_transform_button = memnew(ToolButton);
+ clear_transform_button = memnew(Button);
+ clear_transform_button->set_flat(true);
clear_transform_button->set_tooltip(TTR("Clear Transform"));
clear_transform_button->set_focus_mode(FOCUS_NONE);
clear_transform_button->connect("pressed", callable_mp(this, &TileMapEditor::_clear_transform));
diff --git a/editor/plugins/tile_map_editor_plugin.h b/editor/plugins/tile_map_editor_plugin.h
index e25e2d2add..1d2ecdb61f 100644
--- a/editor/plugins/tile_map_editor_plugin.h
+++ b/editor/plugins/tile_map_editor_plugin.h
@@ -38,7 +38,6 @@
#include "scene/gui/label.h"
#include "scene/gui/line_edit.h"
#include "scene/gui/menu_button.h"
-#include "scene/gui/tool_button.h"
class TileMapEditor : public VBoxContainer {
GDCLASS(TileMapEditor, VBoxContainer);
@@ -88,16 +87,16 @@ class TileMapEditor : public VBoxContainer {
Label *tile_info;
MenuButton *options;
- ToolButton *paint_button;
- ToolButton *bucket_fill_button;
- ToolButton *picker_button;
- ToolButton *select_button;
+ Button *paint_button;
+ Button *bucket_fill_button;
+ Button *picker_button;
+ Button *select_button;
- ToolButton *flip_horizontal_button;
- ToolButton *flip_vertical_button;
- ToolButton *rotate_left_button;
- ToolButton *rotate_right_button;
- ToolButton *clear_transform_button;
+ Button *flip_horizontal_button;
+ Button *flip_vertical_button;
+ Button *rotate_left_button;
+ Button *rotate_right_button;
+ Button *clear_transform_button;
CheckBox *manual_button;
CheckBox *priority_button;
diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp
index 07bf5b53cd..a37cf7e426 100644
--- a/editor/plugins/tile_set_editor_plugin.cpp
+++ b/editor/plugins/tile_set_editor_plugin.cpp
@@ -341,12 +341,12 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
HBoxContainer *tileset_toolbar_container = memnew(HBoxContainer);
left_container->add_child(tileset_toolbar_container);
- tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE] = memnew(ToolButton);
+ tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE] = memnew(Button);
tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tileset_toolbar_button_pressed), varray(TOOL_TILESET_ADD_TEXTURE));
tileset_toolbar_container->add_child(tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]);
tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_tooltip(TTR("Add Texture(s) to TileSet."));
- tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE] = memnew(ToolButton);
+ tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE] = memnew(Button);
tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tileset_toolbar_button_pressed), varray(TOOL_TILESET_REMOVE_TEXTURE));
tileset_toolbar_container->add_child(tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]);
tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_tooltip(TTR("Remove selected Texture from TileSet."));
@@ -402,13 +402,13 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
tool_hb->add_child(spacer);
tool_hb->move_child(spacer, WORKSPACE_CREATE_SINGLE);
- tools[SELECT_NEXT] = memnew(ToolButton);
+ tools[SELECT_NEXT] = memnew(Button);
tool_hb->add_child(tools[SELECT_NEXT]);
tool_hb->move_child(tools[SELECT_NEXT], WORKSPACE_CREATE_SINGLE);
tools[SELECT_NEXT]->set_shortcut(ED_SHORTCUT("tileset_editor/next_shape", TTR("Next Coordinate"), KEY_PAGEDOWN));
tools[SELECT_NEXT]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(SELECT_NEXT));
tools[SELECT_NEXT]->set_tooltip(TTR("Select the next shape, subtile, or Tile."));
- tools[SELECT_PREVIOUS] = memnew(ToolButton);
+ tools[SELECT_PREVIOUS] = memnew(Button);
tool_hb->add_child(tools[SELECT_PREVIOUS]);
tool_hb->move_child(tools[SELECT_PREVIOUS], WORKSPACE_CREATE_SINGLE);
tools[SELECT_PREVIOUS]->set_shortcut(ED_SHORTCUT("tileset_editor/previous_shape", TTR("Previous Coordinate"), KEY_PAGEUP));
@@ -465,7 +465,7 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
toolbar = memnew(HBoxContainer);
Ref<ButtonGroup> tg(memnew(ButtonGroup));
- tools[TOOL_SELECT] = memnew(ToolButton);
+ tools[TOOL_SELECT] = memnew(Button);
toolbar->add_child(tools[TOOL_SELECT]);
tools[TOOL_SELECT]->set_toggle_mode(true);
tools[TOOL_SELECT]->set_button_group(tg);
@@ -474,27 +474,27 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
separator_bitmask = memnew(VSeparator);
toolbar->add_child(separator_bitmask);
- tools[BITMASK_COPY] = memnew(ToolButton);
+ tools[BITMASK_COPY] = memnew(Button);
tools[BITMASK_COPY]->set_tooltip(TTR("Copy bitmask."));
tools[BITMASK_COPY]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(BITMASK_COPY));
toolbar->add_child(tools[BITMASK_COPY]);
- tools[BITMASK_PASTE] = memnew(ToolButton);
+ tools[BITMASK_PASTE] = memnew(Button);
tools[BITMASK_PASTE]->set_tooltip(TTR("Paste bitmask."));
tools[BITMASK_PASTE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(BITMASK_PASTE));
toolbar->add_child(tools[BITMASK_PASTE]);
- tools[BITMASK_CLEAR] = memnew(ToolButton);
+ tools[BITMASK_CLEAR] = memnew(Button);
tools[BITMASK_CLEAR]->set_tooltip(TTR("Erase bitmask."));
tools[BITMASK_CLEAR]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(BITMASK_CLEAR));
toolbar->add_child(tools[BITMASK_CLEAR]);
- tools[SHAPE_NEW_RECTANGLE] = memnew(ToolButton);
+ tools[SHAPE_NEW_RECTANGLE] = memnew(Button);
toolbar->add_child(tools[SHAPE_NEW_RECTANGLE]);
tools[SHAPE_NEW_RECTANGLE]->set_toggle_mode(true);
tools[SHAPE_NEW_RECTANGLE]->set_button_group(tg);
tools[SHAPE_NEW_RECTANGLE]->set_tooltip(TTR("Create a new rectangle."));
tools[SHAPE_NEW_RECTANGLE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(SHAPE_NEW_RECTANGLE));
- tools[SHAPE_NEW_POLYGON] = memnew(ToolButton);
+ tools[SHAPE_NEW_POLYGON] = memnew(Button);
toolbar->add_child(tools[SHAPE_NEW_POLYGON]);
tools[SHAPE_NEW_POLYGON]->set_toggle_mode(true);
tools[SHAPE_NEW_POLYGON]->set_button_group(tg);
@@ -503,13 +503,13 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
separator_shape_toggle = memnew(VSeparator);
toolbar->add_child(separator_shape_toggle);
- tools[SHAPE_TOGGLE_TYPE] = memnew(ToolButton);
+ tools[SHAPE_TOGGLE_TYPE] = memnew(Button);
tools[SHAPE_TOGGLE_TYPE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(SHAPE_TOGGLE_TYPE));
toolbar->add_child(tools[SHAPE_TOGGLE_TYPE]);
separator_delete = memnew(VSeparator);
toolbar->add_child(separator_delete);
- tools[SHAPE_DELETE] = memnew(ToolButton);
+ tools[SHAPE_DELETE] = memnew(Button);
tools[SHAPE_DELETE]->connect("pressed", callable_mp(this, &TileSetEditor::_on_tool_clicked), varray(SHAPE_DELETE));
toolbar->add_child(tools[SHAPE_DELETE]);
@@ -533,12 +533,12 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
separator_grid = memnew(VSeparator);
toolbar->add_child(separator_grid);
- tools[SHAPE_KEEP_INSIDE_TILE] = memnew(ToolButton);
+ tools[SHAPE_KEEP_INSIDE_TILE] = memnew(Button);
tools[SHAPE_KEEP_INSIDE_TILE]->set_toggle_mode(true);
tools[SHAPE_KEEP_INSIDE_TILE]->set_pressed(true);
tools[SHAPE_KEEP_INSIDE_TILE]->set_tooltip(TTR("Keep polygon inside region Rect."));
toolbar->add_child(tools[SHAPE_KEEP_INSIDE_TILE]);
- tools[TOOL_GRID_SNAP] = memnew(ToolButton);
+ tools[TOOL_GRID_SNAP] = memnew(Button);
tools[TOOL_GRID_SNAP]->set_toggle_mode(true);
tools[TOOL_GRID_SNAP]->set_tooltip(TTR("Enable snap and show grid (configurable via the Inspector)."));
tools[TOOL_GRID_SNAP]->connect("toggled", callable_mp(this, &TileSetEditor::_on_grid_snap_toggled));
@@ -548,20 +548,20 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
separator->set_h_size_flags(SIZE_EXPAND_FILL);
toolbar->add_child(separator);
- tools[ZOOM_OUT] = memnew(ToolButton);
+ tools[ZOOM_OUT] = memnew(Button);
tools[ZOOM_OUT]->connect("pressed", callable_mp(this, &TileSetEditor::_zoom_out));
toolbar->add_child(tools[ZOOM_OUT]);
tools[ZOOM_OUT]->set_tooltip(TTR("Zoom Out"));
- tools[ZOOM_1] = memnew(ToolButton);
+ tools[ZOOM_1] = memnew(Button);
tools[ZOOM_1]->connect("pressed", callable_mp(this, &TileSetEditor::_zoom_reset));
toolbar->add_child(tools[ZOOM_1]);
tools[ZOOM_1]->set_tooltip(TTR("Zoom Reset"));
- tools[ZOOM_IN] = memnew(ToolButton);
+ tools[ZOOM_IN] = memnew(Button);
tools[ZOOM_IN]->connect("pressed", callable_mp(this, &TileSetEditor::_zoom_in));
toolbar->add_child(tools[ZOOM_IN]);
tools[ZOOM_IN]->set_tooltip(TTR("Zoom In"));
- tools[VISIBLE_INFO] = memnew(ToolButton);
+ tools[VISIBLE_INFO] = memnew(Button);
tools[VISIBLE_INFO]->set_toggle_mode(true);
tools[VISIBLE_INFO]->set_tooltip(TTR("Display Tile Names (Hold Alt Key)"));
toolbar->add_child(tools[VISIBLE_INFO]);
diff --git a/editor/plugins/tile_set_editor_plugin.h b/editor/plugins/tile_set_editor_plugin.h
index 2955dda244..d2687e7a4b 100644
--- a/editor/plugins/tile_set_editor_plugin.h
+++ b/editor/plugins/tile_set_editor_plugin.h
@@ -46,7 +46,7 @@ class TileSetEditor : public HSplitContainer {
GDCLASS(TileSetEditor, HSplitContainer);
- enum TextureToolButtons {
+ enum TextureButtons {
TOOL_TILESET_ADD_TEXTURE,
TOOL_TILESET_REMOVE_TEXTURE,
TOOL_TILESET_CREATE_SCENE,
@@ -111,7 +111,7 @@ class TileSetEditor : public HSplitContainer {
ItemList *texture_list;
int option;
- ToolButton *tileset_toolbar_buttons[TOOL_TILESET_MAX];
+ Button *tileset_toolbar_buttons[TOOL_TILESET_MAX];
MenuButton *tileset_toolbar_tools;
Map<RID, Ref<Texture2D>> texture_map;
@@ -146,7 +146,7 @@ class TileSetEditor : public HSplitContainer {
Button *tool_editmode[EDITMODE_MAX];
HSeparator *separator_editmode;
HBoxContainer *toolbar;
- ToolButton *tools[TOOL_MAX];
+ Button *tools[TOOL_MAX];
VSeparator *separator_shape_toggle;
VSeparator *separator_bitmask;
VSeparator *separator_delete;
diff --git a/editor/plugins/version_control_editor_plugin.cpp b/editor/plugins/version_control_editor_plugin.cpp
index a1436e123d..cfbe54ef61 100644
--- a/editor/plugins/version_control_editor_plugin.cpp
+++ b/editor/plugins/version_control_editor_plugin.cpp
@@ -300,7 +300,7 @@ void VersionControlEditorPlugin::register_editor() {
TabContainer *dock_vbc = (TabContainer *)version_commit_dock->get_parent_control();
dock_vbc->set_tab_title(version_commit_dock->get_index(), TTR("Commit"));
- ToolButton *vc = EditorNode::get_singleton()->add_bottom_panel_item(TTR("Version Control"), version_control_dock);
+ Button *vc = EditorNode::get_singleton()->add_bottom_panel_item(TTR("Version Control"), version_control_dock);
set_version_control_tool_button(vc);
}
}
diff --git a/editor/plugins/version_control_editor_plugin.h b/editor/plugins/version_control_editor_plugin.h
index 664e38d65f..248a1435fd 100644
--- a/editor/plugins/version_control_editor_plugin.h
+++ b/editor/plugins/version_control_editor_plugin.h
@@ -90,7 +90,7 @@ private:
Label *commit_status;
PanelContainer *version_control_dock;
- ToolButton *version_control_dock_button;
+ Button *version_control_dock_button;
VBoxContainer *diff_vbc;
HBoxContainer *diff_hbc;
Button *diff_refresh_button;
@@ -121,7 +121,7 @@ public:
static VersionControlEditorPlugin *get_singleton();
void popup_vcs_set_up_dialog(const Control *p_gui_base);
- void set_version_control_tool_button(ToolButton *p_button) { version_control_dock_button = p_button; }
+ void set_version_control_tool_button(Button *p_button) { version_control_dock_button = p_button; }
PopupMenu *get_version_control_actions_panel() const { return version_control_actions; }
VBoxContainer *get_version_commit_dock() const { return version_commit_dock; }
diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp
index 92bdba93e7..89ab747cde 100644
--- a/editor/plugins/visual_shader_editor_plugin.cpp
+++ b/editor/plugins/visual_shader_editor_plugin.cpp
@@ -2341,13 +2341,15 @@ VisualShaderEditor::VisualShaderEditor() {
graph->get_zoom_hbox()->add_child(edit_type);
graph->get_zoom_hbox()->move_child(edit_type, 0);
- add_node = memnew(ToolButton);
+ add_node = memnew(Button);
+ add_node->set_flat(true);
graph->get_zoom_hbox()->add_child(add_node);
add_node->set_text(TTR("Add Node..."));
graph->get_zoom_hbox()->move_child(add_node, 0);
add_node->connect("pressed", callable_mp(this, &VisualShaderEditor::_show_members_dialog), varray(false));
- preview_shader = memnew(ToolButton);
+ preview_shader = memnew(Button);
+ preview_shader->set_flat(true);
preview_shader->set_toggle_mode(true);
preview_shader->set_tooltip(TTR("Show resulted shader code."));
graph->get_zoom_hbox()->add_child(preview_shader);
@@ -2750,8 +2752,10 @@ VisualShaderEditor::VisualShaderEditor() {
texture_node_option_idx = add_options.size();
add_options.push_back(AddOption("Texture2D", "Textures", "Functions", "VisualShaderNodeTexture", TTR("Perform the texture lookup."), -1, -1));
add_options.push_back(AddOption("CubeMapUniform", "Textures", "Variables", "VisualShaderNodeCubemapUniform", TTR("Cubic texture uniform lookup."), -1, -1));
+ add_options.push_back(AddOption("Texture2DArray", "Textures", "Functions", "VisualShaderNodeTexture2DArray", TTR("Perform the 2D-array texture lookup."), -1, -1, -1, -1, -1));
add_options.push_back(AddOption("TextureUniform", "Textures", "Variables", "VisualShaderNodeTextureUniform", TTR("2D texture uniform lookup."), -1, -1));
add_options.push_back(AddOption("TextureUniformTriplanar", "Textures", "Variables", "VisualShaderNodeTextureUniformTriplanar", TTR("2D texture uniform lookup with triplanar."), -1, -1, VisualShader::TYPE_FRAGMENT | VisualShader::TYPE_LIGHT, Shader::MODE_SPATIAL));
+ add_options.push_back(AddOption("Texture2DArrayUniform", "Textures", "Variables", "VisualShaderNodeTexture2DArrayUniform", TTR("2D array of textures uniform lookup."), -1, -1, -1, -1, -1));
// TRANSFORM
diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h
index d2f10d9407..b7c0fb8e45 100644
--- a/editor/plugins/visual_shader_editor_plugin.h
+++ b/editor/plugins/visual_shader_editor_plugin.h
@@ -60,8 +60,8 @@ class VisualShaderEditor : public VBoxContainer {
Ref<VisualShader> visual_shader;
HSplitContainer *main_box;
GraphEdit *graph;
- ToolButton *add_node;
- ToolButton *preview_shader;
+ Button *add_node;
+ Button *preview_shader;
OptionButton *edit_type;
diff --git a/editor/project_export.cpp b/editor/project_export.cpp
index c53a59604a..67ab925a4f 100644
--- a/editor/project_export.cpp
+++ b/editor/project_export.cpp
@@ -1064,10 +1064,12 @@ ProjectExportDialog::ProjectExportDialog() {
//presets->set_drag_forwarding(this);
mc->add_child(presets);
presets->connect("item_selected", callable_mp(this, &ProjectExportDialog::_edit_preset));
- duplicate_preset = memnew(ToolButton);
+ duplicate_preset = memnew(Button);
+ duplicate_preset->set_flat(true);
preset_hb->add_child(duplicate_preset);
duplicate_preset->connect("pressed", callable_mp(this, &ProjectExportDialog::_duplicate_preset));
- delete_preset = memnew(ToolButton);
+ delete_preset = memnew(Button);
+ delete_preset->set_flat(true);
preset_hb->add_child(delete_preset);
delete_preset->connect("pressed", callable_mp(this, &ProjectExportDialog::_delete_preset));
diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp
index cbba4b4834..a800f9e8eb 100644
--- a/editor/project_manager.cpp
+++ b/editor/project_manager.cpp
@@ -50,7 +50,6 @@
#include "scene/gui/panel_container.h"
#include "scene/gui/separator.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
#include "scene/main/window.h"
#include "servers/display_server.h"
diff --git a/editor/project_manager.h b/editor/project_manager.h
index e5471bd392..66b38d0746 100644
--- a/editor/project_manager.h
+++ b/editor/project_manager.h
@@ -35,7 +35,6 @@
#include "scene/gui/dialogs.h"
#include "scene/gui/file_dialog.h"
#include "scene/gui/scroll_container.h"
-#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
class ProjectDialog;
diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp
index a7c260c0f8..a8029e1e2b 100644
--- a/editor/project_settings_editor.cpp
+++ b/editor/project_settings_editor.cpp
@@ -1865,14 +1865,15 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) {
restart_icon->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
restart_hb->add_child(restart_icon);
restart_label = memnew(Label);
- restart_label->set_text(TTR("The editor must be restarted for changes to take effect."));
+ restart_label->set_text(TTR("Changed settings will be applied to the editor after restarting."));
restart_hb->add_child(restart_label);
restart_hb->add_spacer();
Button *restart_button = memnew(Button);
restart_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_editor_restart));
restart_hb->add_child(restart_button);
restart_button->set_text(TTR("Save & Restart"));
- restart_close_button = memnew(ToolButton);
+ restart_close_button = memnew(Button);
+ restart_close_button->set_flat(true);
restart_close_button->connect("pressed", callable_mp(this, &ProjectSettingsEditor::_editor_restart_close));
restart_hb->add_child(restart_close_button);
restart_container->hide();
diff --git a/editor/project_settings_editor.h b/editor/project_settings_editor.h
index 445ef58351..728f31efa8 100644
--- a/editor/project_settings_editor.h
+++ b/editor/project_settings_editor.h
@@ -174,7 +174,7 @@ class ProjectSettingsEditor : public AcceptDialog {
Label *restart_label;
TextureRect *restart_icon;
PanelContainer *restart_container;
- ToolButton *restart_close_button;
+ Button *restart_close_button;
void _editor_restart_request();
void _editor_restart();
diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp
index 5795d85e66..dd42ed9760 100644
--- a/editor/scene_tree_dock.cpp
+++ b/editor/scene_tree_dock.cpp
@@ -1076,7 +1076,8 @@ void SceneTreeDock::_notification(int p_what) {
top_row->add_child(memnew(Label(TTR("Create Root Node:"))));
top_row->add_spacer();
- ToolButton *node_shortcuts_toggle = memnew(ToolButton);
+ Button *node_shortcuts_toggle = memnew(Button);
+ node_shortcuts_toggle->set_flat(true);
node_shortcuts_toggle->set_name("NodeShortcutsToggle");
node_shortcuts_toggle->set_icon(get_theme_icon("Favorites", "EditorIcons"));
node_shortcuts_toggle->set_toggle_mode(true);
@@ -2801,13 +2802,15 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel
ED_SHORTCUT("scene_tree/delete_no_confirm", TTR("Delete (No Confirm)"), KEY_MASK_SHIFT | KEY_DELETE);
ED_SHORTCUT("scene_tree/delete", TTR("Delete"), KEY_DELETE);
- button_add = memnew(ToolButton);
+ button_add = memnew(Button);
+ button_add->set_flat(true);
button_add->connect("pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_NEW, false));
button_add->set_tooltip(TTR("Add/Create a New Node."));
button_add->set_shortcut(ED_GET_SHORTCUT("scene_tree/add_child_node"));
filter_hbc->add_child(button_add);
- button_instance = memnew(ToolButton);
+ button_instance = memnew(Button);
+ button_instance->set_flat(true);
button_instance->connect("pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_INSTANCE, false));
button_instance->set_tooltip(TTR("Instance a scene file as a Node. Creates an inherited scene if no root node exists."));
button_instance->set_shortcut(ED_GET_SHORTCUT("scene_tree/instance_scene"));
@@ -2821,14 +2824,16 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel
filter->add_theme_constant_override("minimum_spaces", 0);
filter->connect("text_changed", callable_mp(this, &SceneTreeDock::_filter_changed));
- button_create_script = memnew(ToolButton);
+ button_create_script = memnew(Button);
+ button_create_script->set_flat(true);
button_create_script->connect("pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_ATTACH_SCRIPT, false));
button_create_script->set_tooltip(TTR("Attach a new or existing script to the selected node."));
button_create_script->set_shortcut(ED_GET_SHORTCUT("scene_tree/attach_script"));
filter_hbc->add_child(button_create_script);
button_create_script->hide();
- button_detach_script = memnew(ToolButton);
+ button_detach_script = memnew(Button);
+ button_detach_script->set_flat(true);
button_detach_script->connect("pressed", callable_mp(this, &SceneTreeDock::_tool_selected), make_binds(TOOL_DETACH_SCRIPT, false));
button_detach_script->set_tooltip(TTR("Detach the script from the selected node."));
button_detach_script->set_shortcut(ED_GET_SHORTCUT("scene_tree/detach_script"));
@@ -2838,14 +2843,16 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel
button_hb = memnew(HBoxContainer);
vbc->add_child(button_hb);
- edit_remote = memnew(ToolButton);
+ edit_remote = memnew(Button);
+ edit_remote->set_flat(true);
button_hb->add_child(edit_remote);
edit_remote->set_h_size_flags(SIZE_EXPAND_FILL);
edit_remote->set_text(TTR("Remote"));
edit_remote->set_toggle_mode(true);
edit_remote->connect("pressed", callable_mp(this, &SceneTreeDock::_remote_tree_selected));
- edit_local = memnew(ToolButton);
+ edit_local = memnew(Button);
+ edit_local->set_flat(true);
button_hb->add_child(edit_local);
edit_local->set_h_size_flags(SIZE_EXPAND_FILL);
edit_local->set_text(TTR("Local"));
diff --git a/editor/scene_tree_dock.h b/editor/scene_tree_dock.h
index 72be3fb02f..150c1976ef 100644
--- a/editor/scene_tree_dock.h
+++ b/editor/scene_tree_dock.h
@@ -46,7 +46,6 @@
#include "scene/gui/control.h"
#include "scene/gui/label.h"
#include "scene/gui/popup_menu.h"
-#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
#include "scene_tree_editor.h"
@@ -106,15 +105,15 @@ class SceneTreeDock : public VBoxContainer {
CreateDialog *create_dialog;
RenameDialog *rename_dialog;
- ToolButton *button_add;
- ToolButton *button_instance;
- ToolButton *button_create_script;
- ToolButton *button_detach_script;
+ Button *button_add;
+ Button *button_instance;
+ Button *button_create_script;
+ Button *button_detach_script;
Button *button_3d;
HBoxContainer *button_hb;
- ToolButton *edit_local, *edit_remote;
+ Button *edit_local, *edit_remote;
SceneTreeEditor *scene_tree;
Control *remote_tree;
diff --git a/editor/settings_config_dialog.cpp b/editor/settings_config_dialog.cpp
index c461bf0410..9f286bd8f6 100644
--- a/editor/settings_config_dialog.cpp
+++ b/editor/settings_config_dialog.cpp
@@ -432,7 +432,8 @@ EditorSettingsDialog::EditorSettingsDialog() {
restart_button->connect("pressed", callable_mp(this, &EditorSettingsDialog::_editor_restart));
restart_hb->add_child(restart_button);
restart_button->set_text(TTR("Save & Restart"));
- restart_close_button = memnew(ToolButton);
+ restart_close_button = memnew(Button);
+ restart_close_button->set_flat(true);
restart_close_button->connect("pressed", callable_mp(this, &EditorSettingsDialog::_editor_restart_close));
restart_hb->add_child(restart_close_button);
restart_container->hide();
diff --git a/editor/settings_config_dialog.h b/editor/settings_config_dialog.h
index 05566762fc..19fe1a7633 100644
--- a/editor/settings_config_dialog.h
+++ b/editor/settings_config_dialog.h
@@ -38,7 +38,6 @@
#include "scene/gui/rich_text_label.h"
#include "scene/gui/tab_container.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
class EditorSettingsDialog : public AcceptDialog {
GDCLASS(EditorSettingsDialog, AcceptDialog);
@@ -94,7 +93,7 @@ class EditorSettingsDialog : public AcceptDialog {
Label *restart_label;
TextureRect *restart_icon;
PanelContainer *restart_container;
- ToolButton *restart_close_button;
+ Button *restart_close_button;
void _editor_restart_request();
void _editor_restart();
diff --git a/editor/translations/af.po b/editor/translations/af.po
index 1f598ef5e5..daa0737106 100644
--- a/editor/translations/af.po
+++ b/editor/translations/af.po
@@ -784,6 +784,11 @@ msgstr "Metode in teiken Nodus moet gespesifiseer word!"
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Metode in teiken Nodus moet gespesifiseer word!"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/ar.po b/editor/translations/ar.po
index a60de1a41e..ffab95cc8b 100644
--- a/editor/translations/ar.po
+++ b/editor/translations/ar.po
@@ -785,6 +785,11 @@ msgid "Method in target node must be specified."
msgstr "يجب تحديد الدالة ÙÙŠ العقدة Ø§Ù„Ù…Ø³ØªÙ‡Ø¯ÙØ©."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "هذا الاسم ليس Ù…ÙØ¹Ø±Ùاً مميزاً صالحاً:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/bg.po b/editor/translations/bg.po
index f08f2b1362..c9f38d518a 100644
--- a/editor/translations/bg.po
+++ b/editor/translations/bg.po
@@ -746,6 +746,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/bn.po b/editor/translations/bn.po
index 3680e4ce6c..c438934246 100644
--- a/editor/translations/bn.po
+++ b/editor/translations/bn.po
@@ -809,6 +809,11 @@ msgstr "নিরà§à¦¦à§‡à¦¶à¦¿à¦¤ নোডের মেথড নিরà§à¦¦
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "নামটি কারà§à¦¯à¦•র সনাকà§à¦¤à¦•ারী নয়:"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/ca.po b/editor/translations/ca.po
index 1640367701..5fb91db7b4 100644
--- a/editor/translations/ca.po
+++ b/editor/translations/ca.po
@@ -765,6 +765,11 @@ msgid "Method in target node must be specified."
msgstr "S'ha d'especificar el mètode al node de destinació."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "El nom no és un identificador vàlid:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/cs.po b/editor/translations/cs.po
index fabec77283..809bc69149 100644
--- a/editor/translations/cs.po
+++ b/editor/translations/cs.po
@@ -24,7 +24,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-06-06 10:15+0000\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
"Last-Translator: Zbyněk <zbynek.fiala@gmail.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/"
"cs/>\n"
@@ -33,7 +33,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Weblate 4.1-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -773,6 +773,11 @@ msgid "Method in target node must be specified."
msgstr "Je nutné zadat metodu v cílovém uzlu."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Jméno není platný identifikátor:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -10055,7 +10060,7 @@ msgstr "Přidat akci"
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr "TlaÄítko"
+msgstr "Button"
#: editor/project_settings_editor.cpp
msgid "Left Button."
diff --git a/editor/translations/da.po b/editor/translations/da.po
index 8eeaaafaea..70b05c08ff 100644
--- a/editor/translations/da.po
+++ b/editor/translations/da.po
@@ -16,12 +16,13 @@
# Kristoffer Andersen <kjaa@google.com>, 2019.
# Joe Osborne <reachjoe.o@gmail.com>, 2020.
# Autowinto <happymansi@hotmail.com>, 2020.
+# Mikkel Mouridsen <mikkelmouridsen@me.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-02-02 08:51+0000\n"
-"Last-Translator: Autowinto <happymansi@hotmail.com>\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
+"Last-Translator: Mikkel Mouridsen <mikkelmouridsen@me.com>\n"
"Language-Team: Danish <https://hosted.weblate.org/projects/godot-engine/"
"godot/da/>\n"
"Language: da\n"
@@ -29,7 +30,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.11-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -443,7 +444,7 @@ msgstr "Det er ikke muligt at tilføje et nyt spor uden en rod"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr ""
+msgstr "Ugyldigt spor for Bezier (ingen passende underegenskaber)"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -785,7 +786,7 @@ msgstr "Advarsler"
#: editor/code_editor.cpp
msgid "Line and column numbers."
-msgstr ""
+msgstr "Linje- og kolonnenumre."
#: editor/connections_dialog.cpp
#, fuzzy
@@ -794,6 +795,11 @@ msgstr "Metode i target Node skal angives!"
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Navnet er ikke et gyldigt id:"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -1252,7 +1258,7 @@ msgstr "Udpakker Aktiver"
#: editor/editor_asset_installer.cpp editor/project_manager.cpp
msgid "The following files failed extraction from package:"
-msgstr ""
+msgstr "De følgende filer kunne ikke trækkes ud af pakken:"
#: editor/editor_asset_installer.cpp
#, fuzzy
diff --git a/editor/translations/de.po b/editor/translations/de.po
index b52206e56e..6fb1a29c12 100644
--- a/editor/translations/de.po
+++ b/editor/translations/de.po
@@ -806,6 +806,11 @@ msgid "Method in target node must be specified."
msgstr "Methode des Ziel-Nodes muss angegeben werden."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Name ist kein gültiger Bezeichner:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot
index 4dca7e4c5f..01121a8156 100644
--- a/editor/translations/editor.pot
+++ b/editor/translations/editor.pot
@@ -730,6 +730,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/el.po b/editor/translations/el.po
index 127da8ec1f..3f04c4cf01 100644
--- a/editor/translations/el.po
+++ b/editor/translations/el.po
@@ -763,6 +763,11 @@ msgid "Method in target node must be specified."
msgstr "ΠÏέπει να οÏιστεί συνάÏτηση στον στοχευμένο κόμβο."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Το όνομα δεν είναι έγκυÏο αναγνωÏιστικό:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/eo.po b/editor/translations/eo.po
index 3addde45ce..f98f043118 100644
--- a/editor/translations/eo.po
+++ b/editor/translations/eo.po
@@ -764,6 +764,11 @@ msgstr "Metodo en celo nodo devas esti specifita."
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Metodo en celo nodo devas esti specifita."
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/es.po b/editor/translations/es.po
index f8c4134d07..15efa44f3d 100644
--- a/editor/translations/es.po
+++ b/editor/translations/es.po
@@ -53,8 +53,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-06-15 01:48+0000\n"
-"Last-Translator: paco <pacosoftfree@protonmail.com>\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
+"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/"
"godot/es/>\n"
"Language: es\n"
@@ -62,7 +62,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.1-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -79,7 +79,8 @@ msgstr "Se esperaba un string de longitud 1 (un carácter)."
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
msgstr ""
-"No hay suficientes bytes para decodificar bytes, o el formato es invalido."
+"No hay suficientes bytes para decodificar los bytes, o el formato es "
+"inválido."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
@@ -96,11 +97,11 @@ msgstr "Operandos inválidos para el operador %s, %s y %s."
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr "Indice inválido de tipo %s para tipo base %s"
+msgstr "Ãndice inválido de tipo %s para el tipo base %s"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
-msgstr "El índice de nombre «%s» no es válido para el tipo de base %s"
+msgstr "El índice de nombre '%s' no es válido para el tipo de base %s"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
@@ -806,6 +807,11 @@ msgid "Method in target node must be specified."
msgstr "Se debe establecer un método en el nodo destino."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "El nombre no es un identificador válido:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -2014,7 +2020,7 @@ msgstr "Propiedades del Tema"
#: editor/editor_help.cpp
msgid "Enumerations"
-msgstr "Enumeraciones"
+msgstr "Enumerados"
#: editor/editor_help.cpp
msgid "Constants"
@@ -3378,7 +3384,7 @@ msgstr "Página: "
#: editor/editor_properties_array_dict.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove Item"
-msgstr "Eliminar Item"
+msgstr "Eliminar Ãtem"
#: editor/editor_properties_array_dict.cpp
msgid "New Key:"
@@ -5906,15 +5912,15 @@ msgstr "Degradado Editado"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item %d"
-msgstr "Elemento %d"
+msgstr "Ãtem %d"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Items"
-msgstr "Elementos"
+msgstr "Ãtems"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item List Editor"
-msgstr "Editor de Lista de Items"
+msgstr "Editor de Lista de Ãtems"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create Occluder Polygon"
@@ -6104,7 +6110,7 @@ msgstr "Depuración del Canal UV"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Remove item %d?"
-msgstr "¿Quieres borrar el elemento %d?"
+msgstr "¿Eliminar el ítem %d?"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid ""
@@ -6121,11 +6127,11 @@ msgstr "Librería de Mallas"
#: editor/plugins/mesh_library_editor_plugin.cpp
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Item"
-msgstr "Añadir Item"
+msgstr "Añadir Ãtem"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Remove Selected Item"
-msgstr "Borrar elemento seleccionado"
+msgstr "Eliminar Ãtem Seleccionado"
#: editor/plugins/mesh_library_editor_plugin.cpp
msgid "Import from Scene"
@@ -7935,7 +7941,7 @@ msgstr "Región de Textura"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All Items"
-msgstr "Añadir Todos los Elementos"
+msgstr "Añadir Todos los Ãtems"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add All"
@@ -7959,11 +7965,11 @@ msgstr "Menú de edición de tema."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Class Items"
-msgstr "Añadir elementos de clase"
+msgstr "Añadir Clases de Ãtems"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Remove Class Items"
-msgstr "Eliminar Ãtems de Clases"
+msgstr "Eliminar Clases de Ãtems"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Create Empty Template"
@@ -11146,7 +11152,7 @@ msgstr "Monitores"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
-msgstr "Elige uno o más elementos de la lista para mostrar el gráfico."
+msgstr "Elige uno o más ítems de la lista para mostrar el gráfico."
#: editor/script_editor_debugger.cpp
msgid "List of Video Memory Usage by Resource:"
diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po
index 46cb219e14..5cab610261 100644
--- a/editor/translations/es_AR.po
+++ b/editor/translations/es_AR.po
@@ -770,6 +770,11 @@ msgid "Method in target node must be specified."
msgstr "El método en el nodo objetivo debe ser especificado."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "El nombre no es un identificador válido:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/et.po b/editor/translations/et.po
index 7be6996d69..5fd61347e1 100644
--- a/editor/translations/et.po
+++ b/editor/translations/et.po
@@ -744,6 +744,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/eu.po b/editor/translations/eu.po
index b47056d82b..e461c0f1ec 100644
--- a/editor/translations/eu.po
+++ b/editor/translations/eu.po
@@ -735,6 +735,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/fa.po b/editor/translations/fa.po
index 3f94d1112b..428b69062a 100644
--- a/editor/translations/fa.po
+++ b/editor/translations/fa.po
@@ -784,6 +784,11 @@ msgstr "متد در گره مقصد باید مشخص شده باشد!"
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "نام یک شناسه‌ی معتبر نیست:"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/fi.po b/editor/translations/fi.po
index a95c65be41..125656ed67 100644
--- a/editor/translations/fi.po
+++ b/editor/translations/fi.po
@@ -757,6 +757,11 @@ msgid "Method in target node must be specified."
msgstr "Kohdesolmun metodi täytyy määrittää."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Nimi ei ole kelvollinen tunniste:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/fil.po b/editor/translations/fil.po
index 920b91a30c..ceda61c802 100644
--- a/editor/translations/fil.po
+++ b/editor/translations/fil.po
@@ -743,6 +743,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/fr.po b/editor/translations/fr.po
index fac3b9b84b..46d3adb070 100644
--- a/editor/translations/fr.po
+++ b/editor/translations/fr.po
@@ -834,6 +834,10 @@ msgid "Method in target node must be specified."
msgstr "La méthode du nœud cible doit être spécifiée."
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr "Le nom de la méthode doit être un identifiant valide."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/ga.po b/editor/translations/ga.po
index b9e6ba69c6..70dd5eada7 100644
--- a/editor/translations/ga.po
+++ b/editor/translations/ga.po
@@ -736,6 +736,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/he.po b/editor/translations/he.po
index 56126249dc..7895ae48fe 100644
--- a/editor/translations/he.po
+++ b/editor/translations/he.po
@@ -777,6 +777,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/hi.po b/editor/translations/hi.po
index 4782afecb0..e3ae2aabe5 100644
--- a/editor/translations/hi.po
+++ b/editor/translations/hi.po
@@ -756,6 +756,11 @@ msgid "Method in target node must be specified."
msgstr "Method को target node में निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ कीजिà¤."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Method को target node में निरà¥à¤¦à¤¿à¤·à¥à¤Ÿ कीजिà¤."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/hr.po b/editor/translations/hr.po
index ad095145b2..5355ee1dc9 100644
--- a/editor/translations/hr.po
+++ b/editor/translations/hr.po
@@ -741,6 +741,11 @@ msgid "Method in target node must be specified."
msgstr "Metoda u ciljnom Ävoru mora biti odreÄ‘ena."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Metoda u ciljnom Ävoru mora biti odreÄ‘ena."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/hu.po b/editor/translations/hu.po
index ef15f85977..b57028a426 100644
--- a/editor/translations/hu.po
+++ b/editor/translations/hu.po
@@ -790,6 +790,11 @@ msgstr "Nevezze meg a metódust a cél Node-ban!"
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Nevezze meg a metódust a cél Node-ban!"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/id.po b/editor/translations/id.po
index f7a86197b6..92c0c25da9 100644
--- a/editor/translations/id.po
+++ b/editor/translations/id.po
@@ -778,6 +778,11 @@ msgid "Method in target node must be specified."
msgstr "Method dalam node target harus ditentukan."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Nama bukan sebuah pengidentifikasi yang sah:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/is.po b/editor/translations/is.po
index 5a1ac9b73c..f0d93d1242 100644
--- a/editor/translations/is.po
+++ b/editor/translations/is.po
@@ -770,6 +770,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/it.po b/editor/translations/it.po
index eeec1e05eb..bb53d26fa4 100644
--- a/editor/translations/it.po
+++ b/editor/translations/it.po
@@ -50,12 +50,13 @@
# J. Lavoie <j.lavoie@net-c.ca>, 2020.
# Andrea Terenziani <andrea.terenziani.at@gmail.com>, 2020.
# Anonymous <noreply@weblate.org>, 2020.
+# riccardo boffelli <riccardo.boffelli.96@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-05-07 21:28+0000\n"
-"Last-Translator: Sean Bone <seanbone@zumguy.com>\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
+"Last-Translator: riccardo boffelli <riccardo.boffelli.96@gmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/"
"godot/it/>\n"
"Language: it\n"
@@ -63,7 +64,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.1-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -802,6 +803,11 @@ msgid "Method in target node must be specified."
msgstr "Il metodo del nodo designato deve essere specificato."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Il nome non è un identificatore valido:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -1499,7 +1505,7 @@ msgstr "Riordina gli Autoload"
#: editor/editor_autoload_settings.cpp
msgid "Can't add autoload:"
-msgstr ""
+msgstr "Non è possibile aggiungere l'autoload:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -2463,15 +2469,16 @@ msgid "Can't reload a scene that was never saved."
msgstr "Impossibile ricaricare una scena che non è mai stata salvata."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reload Saved Scene"
-msgstr "Salva Scena"
+msgstr "Ricarica scena salvata"
#: editor/editor_node.cpp
msgid ""
"The current scene has unsaved changes.\n"
"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
+"La scena attuale ha dei cambiamenti non salvati.\n"
+"Ricaricare comunque la scena salvata? Questa azione non può essere annullata."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -3418,11 +3425,10 @@ msgid "Did you forget the '_run' method?"
msgstr "Hai dimenticato il metodo '_run'?"
#: editor/editor_spin_slider.cpp
-#, fuzzy
msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
msgstr ""
-"Mantieni premuto Control per rilasciare un Getter. Mantieni premuto Shift "
-"per rilasciare una firma generica."
+"Tenere premuto il tasto Ctrl per arrotondare ai numeri interi. Tenere "
+"premuto Shift per modifiche più precise."
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
@@ -4022,8 +4028,10 @@ msgid "Error running post-import script:"
msgstr "Errore di esecuzione dello script di post-import:"
#: editor/import/resource_importer_scene.cpp
+#, fuzzy
msgid "Did you return a Node-derived object in the `post_import()` method?"
msgstr ""
+"Avete restituito un oggetto derivato da un Nodo nel metodo `post_import()`?"
#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
@@ -6992,9 +7000,8 @@ msgstr ""
"Manca il metodo '%s' connesso per il segnale '%s' dal nodo '%s' al nodo '%s'."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "[Ignore]"
-msgstr "(ignora)"
+msgstr "[ignora]"
#: editor/plugins/script_text_editor.cpp
msgid "Line"
@@ -7480,6 +7487,12 @@ msgid ""
"Closed eye: Gizmo is hidden.\n"
"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
+"Fare clic per passare da uno stato di visibilità all'altro.\n"
+"\n"
+"Apri gli occhi: Gizmo è visibile.\n"
+"Occhio chiuso: Gizmo è nascosto.\n"
+"Occhio semiaperto: Gizmo è visibile anche attraverso superfici opache "
+"(\"raggi X\")."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
@@ -10579,9 +10592,8 @@ msgid "Instance Child Scene"
msgstr "Istanzia Scena Figlia"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Detach Script"
-msgstr "Allega Script"
+msgstr "Rimuovi Script"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10747,11 +10759,15 @@ msgid "Open Documentation"
msgstr "Apri la documentazione"
#: editor/scene_tree_dock.cpp
+#, fuzzy
msgid ""
"Cannot attach a script: there are no languages registered.\n"
"This is probably because this editor was built with all language modules "
"disabled."
msgstr ""
+"Non è possibile allegare uno script: non ci sono linguaggi registrati.\n"
+"Questo probabilmente perché questo editor è stato costruito con tutti i "
+"moduli di lingua disabilitati."
#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
@@ -10802,14 +10818,12 @@ msgstr ""
"root esiste."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Attach a new or existing script to the selected node."
-msgstr "Allega un nuovo script o uno esistente al nodo selezionato."
+msgstr "Allega un nuovo script o uno già esistente al nodo selezionato."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Detach the script from the selected node."
-msgstr "Svuota uno script per il nodo selezionato."
+msgstr "Rimuovi lo script per il nodo selezionato."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -12072,30 +12086,40 @@ msgid "Invalid package name:"
msgstr "Nome del pacchetto non valido:"
#: platform/android/export/export.cpp
+#, fuzzy
msgid ""
"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
"project setting (changed in Godot 3.2.2).\n"
msgstr ""
+"Modulo \"GodotPaymentV3\" non valido incluso nell'impostazione del progetto "
+"\" android/moduli\" (modificato in Godot 3.2.2).\n"
#: platform/android/export/export.cpp
msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
+msgstr "Per utilizzare i plugin \"Use Custom Build\" deve essere abilitato."
#: platform/android/export/export.cpp
+#, fuzzy
msgid ""
"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
"\"."
msgstr ""
+"\"Degrees Of Freedom\" è valido solo quando \"Xr Mode\" è \"Oculus Mobile VR"
+"\"."
#: platform/android/export/export.cpp
+#, fuzzy
msgid ""
"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
msgstr ""
+"\"Hand Tracking\" è valido solo quando \"Xr Mode\" è \"Oculus Mobile VR\"."
#: platform/android/export/export.cpp
+#, fuzzy
msgid ""
"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
msgstr ""
+"\"Focus Awareness\" è valida solo quando \"Xr Mode\" è \"Oculus Mobile VR\"."
#: platform/android/export/export.cpp
msgid ""
diff --git a/editor/translations/ja.po b/editor/translations/ja.po
index 7d4aed4b29..fc8444d6bc 100644
--- a/editor/translations/ja.po
+++ b/editor/translations/ja.po
@@ -786,6 +786,11 @@ msgid "Method in target node must be specified."
msgstr "対象ノードã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’指定ã—ã¦ãã ã•ã„。"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "ã“ã®åå‰ã¯ç„¡åйãªè­˜åˆ¥å­ã§ã™:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/ka.po b/editor/translations/ka.po
index 2435a50898..af03b1af9e 100644
--- a/editor/translations/ka.po
+++ b/editor/translations/ka.po
@@ -790,6 +790,11 @@ msgstr "სáƒáƒ›áƒ˜áƒ–ნე კვáƒáƒœáƒ«áƒ¨áƒ˜ მეთáƒáƒ“ი უნდ
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "სáƒáƒ›áƒ˜áƒ–ნე კვáƒáƒœáƒ«áƒ¨áƒ˜ მეთáƒáƒ“ი უნდრიყáƒáƒ¡ გáƒáƒœáƒ¡áƒáƒ–ღვრული!"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/ko.po b/editor/translations/ko.po
index c568dc19b8..a895af27b6 100644
--- a/editor/translations/ko.po
+++ b/editor/translations/ko.po
@@ -768,6 +768,11 @@ msgid "Method in target node must be specified."
msgstr "ëŒ€ìƒ ë…¸ë“œì— ìžˆëŠ” 메서드는 반드시 지정해야 합니다."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "ì´ë¦„ì´ ì˜¬ë°”ë¥¸ ì‹ë³„ìžê°€ 아님:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/lt.po b/editor/translations/lt.po
index bbbe630d4a..fdf9ef15ae 100644
--- a/editor/translations/lt.po
+++ b/editor/translations/lt.po
@@ -773,6 +773,11 @@ msgstr "Metodas pasirinktame Node turi būti nurodytas!"
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Metodas pasirinktame Node turi būti nurodytas!"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/lv.po b/editor/translations/lv.po
index b69ecf7eef..8417a6b650 100644
--- a/editor/translations/lv.po
+++ b/editor/translations/lv.po
@@ -757,6 +757,11 @@ msgid "Method in target node must be specified."
msgstr "Metodi mÄ“rÄ·a mezglÄ nepiecieÅ¡ams specificÄ“t."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Metodi mÄ“rÄ·a mezglÄ nepiecieÅ¡ams specificÄ“t."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/mi.po b/editor/translations/mi.po
index fbf4bce3d6..ab68a71ee2 100644
--- a/editor/translations/mi.po
+++ b/editor/translations/mi.po
@@ -728,6 +728,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/ml.po b/editor/translations/ml.po
index 77ac327f71..db5f5638f3 100644
--- a/editor/translations/ml.po
+++ b/editor/translations/ml.po
@@ -738,6 +738,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/mr.po b/editor/translations/mr.po
index 38e3ee7185..1700bcb138 100644
--- a/editor/translations/mr.po
+++ b/editor/translations/mr.po
@@ -735,6 +735,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/ms.po b/editor/translations/ms.po
index 233b5cb428..160fa6e69f 100644
--- a/editor/translations/ms.po
+++ b/editor/translations/ms.po
@@ -758,6 +758,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/nb.po b/editor/translations/nb.po
index 5c80321d03..4e7ca2dce1 100644
--- a/editor/translations/nb.po
+++ b/editor/translations/nb.po
@@ -19,7 +19,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-06-03 20:09+0000\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/godot-"
"engine/godot/nb_NO/>\n"
@@ -28,7 +28,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.1-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -796,6 +796,11 @@ msgstr "Metode i mål-Node må spesifiseres!"
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Navn er ikke en gyldig identifikator:"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -3772,12 +3777,9 @@ msgid "Favorites"
msgstr "Favoritter:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Status: Import of file failed. Please fix file and reimport manually."
msgstr ""
-"\n"
-"Status: Import av fil feilet. Vennligst reparer filen eller reimporter "
-"manuelt."
+"Status: Import av fil feilet. Reparer filen eller importer igjen manuelt."
#: editor/filesystem_dock.cpp
#, fuzzy
diff --git a/editor/translations/nl.po b/editor/translations/nl.po
index 8e6c4bcfa4..3d560d3d6d 100644
--- a/editor/translations/nl.po
+++ b/editor/translations/nl.po
@@ -44,7 +44,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-06-15 01:48+0000\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
"Last-Translator: Stijn Hinlopen <f.a.hinlopen@gmail.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/"
"nl/>\n"
@@ -53,7 +53,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.1-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -790,6 +790,11 @@ msgid "Method in target node must be specified."
msgstr "Methode in doelknoop moet gespecificeerd worden."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Naam is geen geldige identifier:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -1987,15 +1992,15 @@ msgstr "standaard:"
#: editor/editor_help.cpp
msgid "Methods"
-msgstr "Methodes"
+msgstr "Methoden"
#: editor/editor_help.cpp
msgid "Theme Properties"
-msgstr "Thema Eigenschappen"
+msgstr "Thema-eigenschappen"
#: editor/editor_help.cpp
msgid "Enumerations"
-msgstr "Enumeraties"
+msgstr "Enumeratie"
#: editor/editor_help.cpp
msgid "Constants"
@@ -2003,7 +2008,7 @@ msgstr "Constanten"
#: editor/editor_help.cpp
msgid "Property Descriptions"
-msgstr "Eigenschap Beschrijvingen"
+msgstr "Eigenschapbeschrijvingen"
#: editor/editor_help.cpp
msgid "(value)"
@@ -2019,7 +2024,7 @@ msgstr ""
#: editor/editor_help.cpp
msgid "Method Descriptions"
-msgstr "Methode Beschrijvingen"
+msgstr "Methodebeschrijvingen"
#: editor/editor_help.cpp
msgid ""
diff --git a/editor/translations/or.po b/editor/translations/or.po
index afff834dee..d6678c2819 100644
--- a/editor/translations/or.po
+++ b/editor/translations/or.po
@@ -734,6 +734,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/pl.po b/editor/translations/pl.po
index 414e66685a..558a86f1cb 100644
--- a/editor/translations/pl.po
+++ b/editor/translations/pl.po
@@ -43,7 +43,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-06-06 10:15+0000\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
"Last-Translator: Tomek <kobewi4e@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/"
"godot/pl/>\n"
@@ -53,7 +53,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.1-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -791,6 +791,11 @@ msgid "Method in target node must be specified."
msgstr "Metoda w węźle docelowym musi zostać podana."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Nazwa nie jest prawidłowym identyfikatorem:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -1484,7 +1489,7 @@ msgstr "Przestaw Autoloady"
#: editor/editor_autoload_settings.cpp
msgid "Can't add autoload:"
-msgstr ""
+msgstr "Nie można dodać Autoload:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -1858,11 +1863,11 @@ msgstr "Przełącz ukryte pliki"
#: editor/editor_file_dialog.cpp
msgid "Toggle Favorite"
-msgstr "Ustaw jako ulubione"
+msgstr "Przełącz ulubione"
#: editor/editor_file_dialog.cpp
msgid "Toggle Mode"
-msgstr "Przełącz tryby"
+msgstr "Przełącz tryb"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
@@ -1870,11 +1875,11 @@ msgstr "Przejdź do wprowadzania ścieżki"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
-msgstr "Przesuń Ulubiony w górę"
+msgstr "Przesuń ulubiony w górę"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Down"
-msgstr "Przesuń Ulubiony w dół"
+msgstr "Przesuń ulubiony w dół"
#: editor/editor_file_dialog.cpp
msgid "Go to previous folder."
@@ -2122,7 +2127,7 @@ msgstr "Wyczyść"
#: editor/editor_log.cpp
msgid "Clear Output"
-msgstr "Wyczyść dane wyjściowe"
+msgstr "Wyczyść wyjście"
#: editor/editor_network_profiler.cpp editor/editor_node.cpp
#: editor/editor_profiler.cpp
@@ -2440,15 +2445,16 @@ msgid "Can't reload a scene that was never saved."
msgstr "Nie można przeładować sceny która nie została zapisana."
#: editor/editor_node.cpp
-#, fuzzy
msgid "Reload Saved Scene"
-msgstr "Zapisz scenÄ™"
+msgstr "Przywróć zapisaną scenę"
#: editor/editor_node.cpp
msgid ""
"The current scene has unsaved changes.\n"
"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
+"Aktualna scena ma niezapisane zmiany.\n"
+"Przywrócić zapisaną scenę tak czy inaczej? Ta akcja nie może zostać cofnięta."
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2854,8 +2860,10 @@ msgid ""
"When used remotely on a device, this is more efficient with network "
"filesystem."
msgstr ""
-"Wszelkie zmiany sceny w edytorze będą odtworzone w uruchomionej grze na "
-"urządzeniu zdalnym. Opcja ta działa szybciej na sieciowych systemach plików."
+"Kiedy ta opcja jest włączona, wszystkie zmiany na scenie w edytorze będą "
+"powtórzone w uruchomionej grze.\n"
+"Kiedy używane zdalnie na urządzeniu, ta opcja jest wydajniejsza w sieciowym "
+"systemie plików."
#: editor/editor_node.cpp
msgid "Sync Script Changes"
@@ -2868,9 +2876,10 @@ msgid ""
"When used remotely on a device, this is more efficient with network "
"filesystem."
msgstr ""
-"Wszelkie zmiany skryptów będą synchronizowane z urządzeniem zdalnym "
-"(działające instancje będą zrestartowane). Opcja ta działa szybciej z "
-"użyciem sieciowych systemów plików."
+"Kiedy ta opcja jest włączona, każdy zapisany skrypt będzie przeładowany w "
+"uruchomionej grze.\n"
+"Kiedy używane zdalnie na urządzeniu, ta opcja jest wydajniejsza w sieciowym "
+"systemie plików."
#: editor/editor_node.cpp editor/script_create_dialog.cpp
msgid "Editor"
@@ -2894,7 +2903,7 @@ msgstr "Zrzuty ekranu są przechowywane w folderze danych/ustawień edytora."
#: editor/editor_node.cpp
msgid "Toggle Fullscreen"
-msgstr "Pełny ekran"
+msgstr "Przełącz pełny ekran"
#: editor/editor_node.cpp
msgid "Toggle System Console"
@@ -3378,11 +3387,10 @@ msgid "Did you forget the '_run' method?"
msgstr "Zapomniano metody \"_run\"?"
#: editor/editor_spin_slider.cpp
-#, fuzzy
msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
msgstr ""
-"Przytrzymaj Ctrl, by upuścić pobieracz (Getter). Przytrzymaj Shift, by "
-"upuścić generyczną sygnaturę."
+"Przytrzyma Ctrl, by zaokrąglić do liczb całkowitych. Przytrzymaj Shift dla "
+"bardziej precyzyjnych zmian."
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
@@ -3983,7 +3991,7 @@ msgstr "Błąd podczas uruchamiania skryptu po imporcie:"
#: editor/import/resource_importer_scene.cpp
msgid "Did you return a Node-derived object in the `post_import()` method?"
-msgstr ""
+msgstr "Czy zwracasz obiekt dziedziczÄ…cy po Node w metodzie `post_import()`?"
#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
@@ -5416,7 +5424,7 @@ msgstr "Tryb przesuwania"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotate Mode"
-msgstr "Tryb Rotacji"
+msgstr "Tryb obrotu"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -5556,7 +5564,7 @@ msgstr "Widok"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Always Show Grid"
-msgstr "Zawsze pokaż siatkę"
+msgstr "Zawsze pokazuj siatkÄ™"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Helpers"
@@ -6938,9 +6946,8 @@ msgstr ""
"\"%s\"."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "[Ignore]"
-msgstr "(ignoruj)"
+msgstr "[Ignoruj]"
#: editor/plugins/script_text_editor.cpp
msgid "Line"
@@ -6978,7 +6985,7 @@ msgstr "Wielkie litery"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Lowercase"
-msgstr "Małe Litery"
+msgstr "Małe litery"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Capitalize"
@@ -7054,7 +7061,7 @@ msgstr "Wylicz wyrażenie"
#: editor/plugins/script_text_editor.cpp
msgid "Trim Trailing Whitespace"
-msgstr "Przytnij końcowe spacje"
+msgstr "Przytnij końcowe białe znaki"
#: editor/plugins/script_text_editor.cpp
msgid "Convert Indent to Spaces"
@@ -7387,7 +7394,7 @@ msgstr "\"Wolny widok\" w tył"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
-msgstr "\"Wolny widok\" w góre"
+msgstr "\"Wolny widok\" w górę"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Down"
@@ -7425,6 +7432,12 @@ msgid ""
"Closed eye: Gizmo is hidden.\n"
"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
+"Kliknij, by przełączyć pomiędzy stanami widoczności.\n"
+"\n"
+"Otwarte oko: uchwyt jest widzialny.\n"
+"Zamknięte oko: uchwyt jest ukryty.\n"
+"Półotwarte oko: uchwyt jest również widoczny przez nieprzezroczyste "
+"powierzchnie (\"x-ray\")."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
@@ -7519,7 +7532,7 @@ msgstr "2 widoki"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "2 Viewports (Alt)"
-msgstr "2 widoki (Alt)"
+msgstr "2 widoki (alternatywnie)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports"
@@ -7527,7 +7540,7 @@ msgstr "3 widoki"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "3 Viewports (Alt)"
-msgstr "3 widoki (Alt)"
+msgstr "3 widoki (alternatywnie)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "4 Viewports"
@@ -8807,7 +8820,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment and light shader modes."
-msgstr "Parametr wejściowy \"%s\" dla dla fragmentowego i światłowego shadera."
+msgstr "Parametr wejściowy \"%s\" dla fragmentowego i światłowego shadera."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for fragment shader mode."
@@ -9507,16 +9520,16 @@ msgid ""
"Filters to export non-resource files/folders\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
-"Filtry do eksportowania plików/folderów nie będących zasobami (oddzielone "
-"przecinkami, np. *.json, *.txt)"
+"Filtry do eksportowania plików/folderów nie będących zasobami\n"
+"(oddzielone przecinkami, np. *.json, *.txt, docs/*)"
#: editor/project_export.cpp
msgid ""
"Filters to exclude files/folders from project\n"
"(comma-separated, e.g: *.json, *.txt, docs/*)"
msgstr ""
-"Filtry do wykluczenia plików/folderów z projektu (rozdzielone przecinkami, "
-"np. *.json, *.txt)"
+"Filtry do wykluczenia plików/folderów z projektu\n"
+"(oddzielone przecinkami, np. *.json, *.txt, docs/*)"
#: editor/project_export.cpp
msgid "Patches"
@@ -10515,9 +10528,8 @@ msgid "Instance Child Scene"
msgstr "Dodaj instancjÄ™ sceny"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Detach Script"
-msgstr "Dodaj skrypt"
+msgstr "Odłącz skrypt"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10635,7 +10647,7 @@ msgstr "Nie można działać na węzłach z których dziedziczy obecna scena!"
#: editor/scene_tree_dock.cpp
msgid "Attach Script"
-msgstr "Dodaj skrypt"
+msgstr "Dołącz skrypt"
#: editor/scene_tree_dock.cpp
msgid "Remove Node(s)"
@@ -10687,6 +10699,9 @@ msgid ""
"This is probably because this editor was built with all language modules "
"disabled."
msgstr ""
+"Nie można dołączyć skryptu: brak zarejestrowanych języków.\n"
+"To prawdopodobnie przez to, że ten edytor został zbudowany z wyłączonymi "
+"wszystkimi modułami języków."
#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
@@ -10737,14 +10752,12 @@ msgstr ""
"główny nie istnieje."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Attach a new or existing script to the selected node."
msgstr "Dołącz nowy lub istniejący skrypt do zaznaczonego węzła."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Detach the script from the selected node."
-msgstr "Wyczyść skrypt dla zaznaczonego węzła."
+msgstr "Odłącz skrypt z zaznaczonego węzła."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10783,7 +10796,7 @@ msgid ""
"Node has %s connection(s) and %s group(s).\n"
"Click to show signals dock."
msgstr ""
-"Węzeł posiada %s połączeń i %s grup.\n"
+"Węzeł posiada %s połączeń i %s grup.\n"
"Kliknij, aby wyświetlić panel sygnałów."
#: editor/scene_tree_editor.cpp
@@ -11839,15 +11852,15 @@ msgstr "Znajdź typ węzła"
#: modules/visual_script/visual_script_editor.cpp
msgid "Copy Nodes"
-msgstr "Skopiuj Węzeł"
+msgstr "Skopiuj węzły"
#: modules/visual_script/visual_script_editor.cpp
msgid "Cut Nodes"
-msgstr "Wytnij Węzły"
+msgstr "Wytnij węzły"
#: modules/visual_script/visual_script_editor.cpp
msgid "Make Function"
-msgstr "Zmień na funkcję"
+msgstr "Zamień na funkcję"
#: modules/visual_script/visual_script_editor.cpp
msgid "Refresh Graph"
@@ -11969,11 +11982,9 @@ msgstr ""
"eksportu."
#: platform/android/export/export.cpp
-#, fuzzy
msgid "Release keystore incorrectly configured in the export preset."
msgstr ""
-"Debugowy keystore nieskonfigurowany w Ustawieniach Edytora ani w profilu "
-"eksportu."
+"Wydaniowy keystore jest niepoprawnie skonfigurowany w profilu eksportu."
#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
@@ -12007,26 +12018,34 @@ msgid ""
"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
"project setting (changed in Godot 3.2.2).\n"
msgstr ""
+"Niepoprawny moduł \"GodotPaymentV3\" załączony w ustawieniu projektu "
+"\"android/modules\" (zmieniony w Godocie 3.2.2).\n"
#: platform/android/export/export.cpp
msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
+msgstr "\"Use Custom Build\" musi być włączone, by używać wtyczek."
#: platform/android/export/export.cpp
msgid ""
"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
"\"."
msgstr ""
+"\"Degrees Of Freedom\" jest poprawne tylko gdy \"Xr Mode\" jest \"Oculus "
+"Mobile VR\"."
#: platform/android/export/export.cpp
msgid ""
"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
msgstr ""
+"\"Hand Tracking\" jest poprawne tylko gdy \"Xr Mode\" jest \"Oculus Mobile VR"
+"\"."
#: platform/android/export/export.cpp
msgid ""
"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
msgstr ""
+"\"Focus Awareness\" jest poprawne tylko gdy \"Xr Mode\" jest \"Oculus Mobile "
+"VR\"."
#: platform/android/export/export.cpp
msgid ""
diff --git a/editor/translations/pr.po b/editor/translations/pr.po
index 9d46edcbae..bfa3d0b52c 100644
--- a/editor/translations/pr.po
+++ b/editor/translations/pr.po
@@ -5,12 +5,13 @@
# Calum Knott <calum@calumk.com>, 2017.
# Zion Nimchuk <zionnimchuk@gmail.com>, 2016-2017.
# Allan Nordhøy <epost@anotheragency.no>, 2018.
+# David Fatheree <david.fathereewcchs@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-12-13 14:42+0100\n"
-"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
+"Last-Translator: David Fatheree <david.fathereewcchs@gmail.com>\n"
"Language-Team: Pirate <https://hosted.weblate.org/projects/godot-engine/"
"godot/pr/>\n"
"Language: pr\n"
@@ -18,7 +19,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Poedit 2.2\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -29,7 +30,7 @@ msgstr ""
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr ""
+msgstr "Expected a strin' o' length 1 (a character)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
@@ -39,19 +40,17 @@ msgstr "Nah enough bytes fer decodin' bytes, or ye got th' wrong ship."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr ""
+msgstr "Shiver me timbers! Ye input %i (not passed) in ye expression!"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
msgstr ""
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid operands to operator %s, %s and %s."
msgstr "Yer index property name '%s' in node %s be walkin' th' plank!"
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid index of type %s for base type %s"
msgstr "Yer index property name '%s' in node %s be walkin' th' plank!"
@@ -102,11 +101,11 @@ msgstr ""
#: editor/animation_bezier_editor.cpp
msgid "Balanced"
-msgstr ""
+msgstr "Smooth Sailin'"
#: editor/animation_bezier_editor.cpp
msgid "Mirror"
-msgstr ""
+msgstr "See'in Double"
#: editor/animation_bezier_editor.cpp editor/editor_profiler.cpp
msgid "Time:"
@@ -767,6 +766,11 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Yer name's got no valid identifier:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po
index 199d828897..426888b3a4 100644
--- a/editor/translations/pt_BR.po
+++ b/editor/translations/pt_BR.po
@@ -16,7 +16,7 @@
# jonathan railarem <railarem@gmail.com>, 2017.
# Lucas Silva <lucasb.hpp@gmail.com>, 2018.
# Luiz G. Correia <luizgabriell2.0@gmail.com>, 2017.
-# Mailson Silva Marins <mailsons335@gmail.com>, 2016.
+# Mailson Silva Marins <mailsons335@gmail.com>, 2016, 2020.
# MalcomRF <malcomkbk@gmail.com>, 2017.
# Marcus Correia <marknokalt@live.com>, 2017-2018.
# Michael Alexsander Silva Dias <michaelalexsander@protonmail.com>, 2017-2018.
@@ -73,7 +73,7 @@
# Alan Tavares <alan1tavares@gmail.com>, 2019.
# Rafael Silveira <res883@gmail.com>, 2019.
# Luigi <luigimendeszanchett@gmail.com>, 2019.
-# Nicolas Abril <nicolas.abril@protonmail.ch>, 2019.
+# Nicolas Abril <nicolas.abril@protonmail.ch>, 2019, 2020.
# johnnybigoode <jamarson@gmail.com>, 2019, 2020.
# Zeero <igcdzeero@gmail.com>, 2019.
# Gian Penna <gianfrancopen@gmail.com>, 2020.
@@ -92,13 +92,13 @@
# Anonymous <noreply@weblate.org>, 2020.
# André Sousa <andrelvsousa@gmail.com>, 2020.
# Kleyton Luiz de Sousa Vieira <kleytonluizdesouzavieira@gmail.com>, 2020.
+# Felipe Jesus Macedo <fmacedo746@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: 2016-05-30\n"
-"PO-Revision-Date: 2020-06-15 01:48+0000\n"
-"Last-Translator: Kleyton Luiz de Sousa Vieira "
-"<kleytonluizdesouzavieira@gmail.com>\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
+"Last-Translator: Felipe Jesus Macedo <fmacedo746@gmail.com>\n"
"Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
"godot-engine/godot/pt_BR/>\n"
"Language: pt_BR\n"
@@ -106,7 +106,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.1-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -125,11 +125,11 @@ msgstr "Não há bytes suficientes para decodificar, ou o formato é inválido."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
-msgstr "Entrada inválida %i (não passou) na expressão"
+msgstr "Entrada inválida %i (não passada) na expressão"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
-msgstr "self não pode ser usado porque a instância é nula (não passou)"
+msgstr "self não pode ser usado porque a instância é nula (não passada)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -145,7 +145,7 @@ msgstr "Nome inválido de índice '%s' para base tipo %s"
#: core/math/expression.cpp
msgid "Invalid arguments to construct '%s'"
-msgstr "Argumento inválido para construir '%s'"
+msgstr "Argumentos inválidos para o construto '%s'"
#: core/math/expression.cpp
msgid "On call to '%s':"
@@ -579,7 +579,7 @@ msgstr ""
"Esta animação pertence a uma cena importada, dessa forma, mudanças das "
"trilhas importadas não serão salvas.\n"
"\n"
-"Para ativar a possibilidade de adicionar trilhas customizadas, navegue até "
+"Para ativar a possibilidade de adicionar trilhas customizadas, navegue até "
"as configurações de importação da cena e defina\n"
"\"Animação > Armazenamento\" para \"Arquivos\", ative \"Animação > Mantenha "
"Trilhas Customizadas\", então reimporte.\n"
@@ -843,6 +843,11 @@ msgid "Method in target node must be specified."
msgstr "O método no nó alvo precisa ser especificado."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "O nome não é um identificador valido:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -1919,7 +1924,7 @@ msgstr "Alternar Modo"
#: editor/editor_file_dialog.cpp
msgid "Focus Path"
-msgstr "Focar no Caminho"
+msgstr "Habilitar"
#: editor/editor_file_dialog.cpp
msgid "Move Favorite Up"
@@ -2622,8 +2627,8 @@ msgid ""
"category."
msgstr ""
"A cena principal não foi definida, selecionar uma?\n"
-"Você pode alterá-la mais tarde nas \"Configurações do Projeto\" na "
-"categoria 'Application'."
+"Você pode alterá-la mais tarde nas \"Configurações do Projeto\" na categoria "
+"'Application'."
#: editor/editor_node.cpp
msgid ""
@@ -2899,8 +2904,8 @@ msgid ""
"Navigation meshes and polygons will be visible on the running game if this "
"option is turned on."
msgstr ""
-"Malhas e polígonos de navegação serão visíveis no jogo se esta opção estiver "
-"ligada."
+"Malhas e polígonos de navegação serão visíveis no jogo em execução se esta "
+"opção estiver ligada."
#: editor/editor_node.cpp
msgid "Sync Scene Changes"
@@ -3121,13 +3126,13 @@ msgid ""
"the \"Use Custom Build\" option should be enabled in the Android export "
"preset."
msgstr ""
-"Isso vai configurar seu projeto para construções customizadas do Android, "
-"instalando o modelo de fonte para \"res://android/build\".\n"
-"Você pode então aplicar modificações e construir seu próprio APK na guia "
-"Exportação (Adicionando módulos, trocando o AndroidManifest.xml, etc.).\n"
-"Note que para fazer uma construção customizada, em vez de usar APKs pre-"
-"construídos, a opção \"Usar Construção Customizada\" deve estar ativa nas "
-"predefinições de exportação Android."
+"Isso irá configurar o projeto para usar uma build do Android customizada "
+"instalando a template raiz para \"res://android/build\".\n"
+"Você poderá aplicar modificações e construir um APK customizado em exportar "
+"(adicionando módulos, changing the AndroidManifest.xml, etc.).\n"
+"Note que para fazer builds customizadas ao invés de usar APKs pré-"
+"construídas, a opção \"Usar Build Customizada\" deve sestar habilitada na "
+"pré-configuração de exportação Android."
#: editor/editor_node.cpp
msgid ""
@@ -4047,7 +4052,7 @@ msgstr "Erro ao rodar script pós-importação:"
#: editor/import/resource_importer_scene.cpp
msgid "Did you return a Node-derived object in the `post_import()` method?"
-msgstr ""
+msgstr "Você retornou um objeto derivado de nó no método `post import ()`?"
#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
@@ -5659,7 +5664,7 @@ msgstr "Seleção de Frame"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Preview Canvas Scale"
-msgstr "Visualizar Canvas Scale"
+msgstr "Pré-visualização da escala do Canvas"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Translation mask for inserting keys."
@@ -5667,7 +5672,7 @@ msgstr "Máscara de tradução para inserção de chaves."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation mask for inserting keys."
-msgstr "Mascara de rotação para inserção de chaves."
+msgstr "Máscara de rotação para inserção de chaves."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Scale mask for inserting keys."
@@ -7005,9 +7010,8 @@ msgid ""
msgstr "Falta método conectado '%s' para sinal '%s' do nó '%s' para nó '%s'."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "[Ignore]"
-msgstr "(ignore)"
+msgstr "(Ignore)"
#: editor/plugins/script_text_editor.cpp
msgid "Line"
@@ -7438,27 +7442,27 @@ msgstr "Não disponível ao usar o renderizador GLES2."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
-msgstr "Visão Livre Esquerda"
+msgstr "Visão Livre na Esquerda"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Right"
-msgstr "Visão Livre Direita"
+msgstr "Visão Livre na Direita"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Forward"
-msgstr "Visão Livre Frente"
+msgstr "Visão Livre na Frente"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr "Visão Livre Trás"
+msgstr "Visão Livre Atrás"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
-msgstr "Visão Livre Cima"
+msgstr "Visão Livre em Cima"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Down"
-msgstr "Visão Livre Baixo"
+msgstr "Visão Livre Embaixo"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Speed Modifier"
@@ -7492,6 +7496,12 @@ msgid ""
"Closed eye: Gizmo is hidden.\n"
"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
+"Clique para alternar entre estados de visibilidade.\n"
+"\n"
+"Olhos abertos: Gizmo está visível.\n"
+"Olhos fechados: Gizmo não está visível.\n"
+"Olhos semi-abertos: Gizmo está visível através de superficies opacas (\"raio-"
+"x\")."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
@@ -7517,7 +7527,7 @@ msgstr "Usar Espaço Local"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Use Snap"
-msgstr "Usar Snap"
+msgstr "Use Snap"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
@@ -8379,9 +8389,9 @@ msgid ""
"Shift+LMB: Set wildcard bit.\n"
"Click on another Tile to edit it."
msgstr ""
-"LMB: ligar bit.\n"
-"RMB: desligar bit.\n"
-"Shift+LMB: Escolher bit wildcard.\n"
+"LMB: Ligar bit.\n"
+"RMB: Desligar bit.\n"
+"Shift+LMB: Escolher bit curinga.\n"
"Clique em outro Mosaico para editá-lo."
#: editor/plugins/tile_set_editor_plugin.cpp
@@ -8516,7 +8526,7 @@ msgstr "Nenhuma mensagem de confirmação foi fornecida"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "No files added to stage"
-msgstr "Nenhum arquivo adicionado ao palco"
+msgstr "Nenhum arquivo em espera"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Commit"
@@ -8524,11 +8534,11 @@ msgstr "Confirmação"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "VCS Addon is not initialized"
-msgstr "Extensão VCS não está inicializada"
+msgstr "VCS Addon não inicializado"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Version Control System"
-msgstr "Sistema de Controle de Versionamento"
+msgstr "Sistema de Controle de Versão"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Initialize"
@@ -8536,7 +8546,7 @@ msgstr "Inicializar"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Staging area"
-msgstr "Ãrea Temporária"
+msgstr "Ãrea de espera"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Detect new changes"
@@ -8560,7 +8570,7 @@ msgstr "Excluído"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Typechange"
-msgstr "Alterar tipo"
+msgstr "Alteração de tipo"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Stage Selected"
@@ -8572,11 +8582,11 @@ msgstr "Salvar Tudo"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Add a commit message"
-msgstr "Adicione uma mensagem de confirmação"
+msgstr "Adicione uma mensagem ao commit"
#: editor/plugins/version_control_editor_plugin.cpp
msgid "Commit Changes"
-msgstr "Confirmar Mudanças de Script"
+msgstr "Confirmar Mudanças"
#: editor/plugins/version_control_editor_plugin.cpp
#: modules/gdnative/gdnative_library_singleton_editor.cpp
@@ -8774,7 +8784,7 @@ msgstr "Cor constante."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color uniform."
-msgstr "Cor uniforme."
+msgstr "Uniformidade de cor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Returns the boolean result of the %s comparison between two parameters."
@@ -8890,7 +8900,7 @@ msgstr "Parâmetro de entrada '%s' para o modo de sombra do vértice."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "'%s' input parameter for vertex and fragment shader mode."
msgstr ""
-"Parâmetro de entrada '%s' para os modos de sombra de vértice e fragmentada."
+"Parâmetro de entrada '%s' para os modo de sombra fragmentada e vértice."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Scalar function."
@@ -9144,7 +9154,7 @@ msgstr "Execute a pesquisa de textura cúbica."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Perform the texture lookup."
-msgstr "Faz uma busca de texturas."
+msgstr "Faz uma busca por texturas."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Cubic texture uniform lookup."
@@ -9160,7 +9170,7 @@ msgstr "Consulta de textura 2D uniforme com triplanar."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform function."
-msgstr "Função Transform."
+msgstr "Função Transformação..."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9182,7 +9192,7 @@ msgstr ""
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Composes transform from four vectors."
-msgstr "Compõe transformação a partir de quatro vetores."
+msgstr "Compõe a transformação de quatro vetores."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Decomposes transform to four vectors."
@@ -9190,19 +9200,19 @@ msgstr "Decompõe transformação em quatro vetores."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the determinant of a transform."
-msgstr "Calcula o determinante de uma transformada."
+msgstr "Calcula o determinante de uma transformação."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the inverse of a transform."
-msgstr "Calcula a inversa de uma transformada."
+msgstr "Calcula a inversa de uma transformação."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the transpose of a transform."
-msgstr "Calcula a transposta de uma transformada."
+msgstr "Calcula a transposta de uma transformação."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies transform by transform."
-msgstr "Multiplica a transformação por transformação."
+msgstr "Multiplica transformação por transformação."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Multiplies vector by transform."
@@ -9210,11 +9220,11 @@ msgstr "Multiplica vetor por transformação."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform constant."
-msgstr "Constante de transformação."
+msgstr "Transformar constante."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Transform uniform."
-msgstr "Uniforme de transformação."
+msgstr "Transformação uniforme."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector function."
@@ -9363,11 +9373,11 @@ msgstr "Subtrai vetor de vetor."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector constant."
-msgstr "Vetor constante."
+msgstr "Constante vetorial."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Vector uniform."
-msgstr "Vector uniforme."
+msgstr "Uniformidade vetorial."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9381,12 +9391,13 @@ msgstr ""
"declarações de função internas."
#: editor/plugins/visual_shader_editor_plugin.cpp
+#, fuzzy
msgid ""
"Returns falloff based on the dot product of surface normal and view "
"direction of camera (pass associated inputs to it)."
msgstr ""
-"Retorna falloff baseado no produto escalar do normal da superfície e da "
-"direção de visualização da câmera (passe entradas associadas a ela)."
+"Retorna falloff com base no produto dos pontos da superfície normal e na "
+"direção de visualização da câmera (passa as entradas associadas a ela)."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid ""
@@ -9413,7 +9424,7 @@ msgid ""
"(Fragment/Light mode only) (Vector) Derivative in 'x' using local "
"differencing."
msgstr ""
-"(Apenas modo Fragmento/Luz) (Vetor) Derivada em 'x' usando diferenciação "
+"(Apenas modo Fragmento/Luz) (Vetor) Derivativo em 'x' usando diferenciação "
"local."
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -9832,7 +9843,7 @@ msgstr "Projeto ausente"
#: editor/project_manager.cpp
msgid "Error: Project is missing on the filesystem."
-msgstr "Erro: O Projeto está ausente no sistema de arquivos."
+msgstr "Erro: Projeto não encontrado no sistema de arquivos."
#: editor/project_manager.cpp
msgid "Can't open project at '%s'."
@@ -9854,14 +9865,15 @@ msgid ""
"Warning: You won't be able to open the project with previous versions of the "
"engine anymore."
msgstr ""
-"O seguinte arquivo de configurações do projeto não especifica com qual "
-"versão do Godot ele foi criado.\n"
+"O seguinte arquivo de configurações do projeto não especifica a versão do "
+"Godot pelo qual ele foi criado.\n"
"\n"
"%s\n"
"\n"
-"Se escolher abrí-lo, será convertido para o formato atual de arquivo de "
-"configuração do Godot\n"
-"Aviso: Você não poderá mais abrir o projeto com versões anteriores do Godot."
+"Se você o abrir, ele será convertido para o formato de arquivo da "
+"configuração atual do Godot.\n"
+"Atenção: Você não será mais capaz de abrir o projeto com versões anteriores "
+"da engine."
#: editor/project_manager.cpp
msgid ""
@@ -9981,7 +9993,7 @@ msgstr "Novo Projeto"
#: editor/project_manager.cpp
msgid "Remove Missing"
-msgstr "Remover Ausentes"
+msgstr "Remover Ausente"
#: editor/project_manager.cpp
msgid "Templates"
@@ -10144,7 +10156,7 @@ msgstr "Botão Direito."
#: editor/project_settings_editor.cpp
msgid "Middle Button."
-msgstr "Botão do Meio."
+msgstr "Botão do Meio."
#: editor/project_settings_editor.cpp
msgid "Wheel Up."
@@ -10572,16 +10584,15 @@ msgstr "Instanciar Cena(s)"
#: editor/scene_tree_dock.cpp
msgid "Replace with Branch Scene"
-msgstr "Substituir com Ramo como Cena"
+msgstr "Substituir por cena ramo"
#: editor/scene_tree_dock.cpp
msgid "Instance Child Scene"
msgstr "Instânciar Cena Filha"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Detach Script"
-msgstr "Adicionar Script"
+msgstr "Remover Script"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10751,6 +10762,9 @@ msgid ""
"This is probably because this editor was built with all language modules "
"disabled."
msgstr ""
+"Não pode associar um script: Não existem linguagens registradas.\n"
+"É provável que o editor tenha sido construido com todos os módulos de "
+"linguagem desabilitados."
#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
@@ -10801,14 +10815,12 @@ msgstr ""
"existir um nó raiz."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Attach a new or existing script to the selected node."
-msgstr "Adicionar um script novo ou existente para o nó selecionado."
+msgstr "Adicionar um novo script, ou um já existente, para o nó selecionado."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Detach the script from the selected node."
-msgstr "Remove um script do nó selecionado."
+msgstr "Remove o script do nó selecionado."
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -10920,7 +10932,7 @@ msgstr "Selecione um Nó"
#: editor/script_create_dialog.cpp
msgid "Path is empty."
-msgstr "O caminho está vazio."
+msgstr "Caminho vazio."
#: editor/script_create_dialog.cpp
msgid "Filename is empty."
@@ -11328,7 +11340,7 @@ msgstr "Singleton GDNative ativado"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Disabled GDNative Singleton"
-msgstr "Singleton GDNative Desabilitado"
+msgstr "GDNative Singleton desativado"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Library"
@@ -11589,8 +11601,8 @@ msgid ""
"Node yielded, but did not return a function state in the first working "
"memory."
msgstr ""
-"Nó entrou em yield, mas não retornou um estado de função na primeira memória "
-"de trabalho."
+"O nó cedeu, mas não retornou um estado de função na primeira memória de "
+"trabalho."
#: modules/visual_script/visual_script.cpp
msgid ""
@@ -12041,20 +12053,20 @@ msgstr ""
#, fuzzy
msgid "Release keystore incorrectly configured in the export preset."
msgstr ""
-"Porta-chaves de depuração não configurado nas Configurações do Editor e nem "
-"na predefinição."
+"Keystore de liberação icorretamente configurada na predefinição de "
+"exportação."
#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
msgstr ""
-"A compilação personalizada requer um caminho SDK do Android válido nas "
+"Build personalizada precisa de um caminho Android SDK válido em "
"Configurações do Editor."
#: platform/android/export/export.cpp
msgid "Invalid Android SDK path for custom build in Editor Settings."
msgstr ""
-"Caminho SDK do Android inválido para a compilação personalizada nas "
-"Configurações do Editor."
+"Caminho do Android SDK inválido para o build personalizado em Configurações "
+"do Editor."
#: platform/android/export/export.cpp
msgid ""
@@ -12066,7 +12078,7 @@ msgstr ""
#: platform/android/export/export.cpp
msgid "Invalid public key for APK expansion."
-msgstr "Chave pública inválida para expansão de APK."
+msgstr "Chave pública inválida para expansão do APK."
#: platform/android/export/export.cpp
msgid "Invalid package name:"
@@ -12077,34 +12089,45 @@ msgid ""
"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
"project setting (changed in Godot 3.2.2).\n"
msgstr ""
+"Módulo inválido \"GodotPaymentV3\" incluido na configuração de projeto "
+"\"android/modules\" (changed in Godot 3.2.2).\n"
#: platform/android/export/export.cpp
msgid "\"Use Custom Build\" must be enabled to use the plugins."
msgstr ""
+"\"Use Custom Build\" precisa estar ativo para ser possível utilizar plugins."
#: platform/android/export/export.cpp
+#, fuzzy
msgid ""
"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
"\"."
msgstr ""
+"\"Degrees Of Freedom\" só é válido quando o \"Oculus Mobile VR\" está no "
+"\"Mode Xr\"."
#: platform/android/export/export.cpp
+#, fuzzy
msgid ""
"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
msgstr ""
+"\"Hand Tracking\" só é válido quando o\"Oculus Mobile VR\" está no \"Xr Mode"
+"\"."
#: platform/android/export/export.cpp
msgid ""
"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
msgstr ""
+"\"Focus Awareness\" só é válido quando o \"Oculus Mobile VR\" está no \"Xr "
+"Mode\"."
#: platform/android/export/export.cpp
msgid ""
"Trying to build from a custom built template, but no version info for it "
"exists. Please reinstall from the 'Project' menu."
msgstr ""
-"Tentando compilar a partir de um modelo compilado personalizado, mas nenhuma "
-"informação de versão para ele existe. Por favor, reinstale pelo menu "
+"Tentando construir a partir de um modelo compilado personalizado, mas "
+"nenhuma informação de versão para ele existe. Por favor, reinstale pelo menu "
"'Projeto'."
#: platform/android/export/export.cpp
@@ -12114,7 +12137,7 @@ msgid ""
" Godot Version: %s\n"
"Please reinstall Android build template from 'Project' menu."
msgstr ""
-"Diferença de versão da compilação do Android:\n"
+"Diferença na versão da build do Android:\n"
" Modelo instalado: %s\n"
" Versão do Godot: %s\n"
"Por favor reinstale o modelo de compilação do Android pelo menu 'Projeto'."
@@ -12128,13 +12151,13 @@ msgid ""
"Building of Android project failed, check output for the error.\n"
"Alternatively visit docs.godotengine.org for Android build documentation."
msgstr ""
-"A compilação do projeto Android falhou, verifique a saída pelo erro.\n"
+"A construção do projeto Android falhou, verifique a saída para detalhes.\n"
"Alternativamente, visite docs.godotengine.org para ver a documentação de "
"compilação do Android."
#: platform/android/export/export.cpp
msgid "No build apk generated at: "
-msgstr "Nenhuma compilação apk gerada em: "
+msgstr "Nenhuma construção apk gerada em: "
#: platform/iphone/export/export.cpp
msgid "Identifier is missing."
@@ -12545,7 +12568,8 @@ msgstr ""
#: scene/3d/collision_shape.cpp
msgid ""
"ConcavePolygonShape doesn't support RigidBody in another mode than static."
-msgstr "Lol."
+msgstr ""
+"ConcavePolygonShape não suporta um RigidBody em outro modo além do estático."
#: scene/3d/cpu_particles.cpp
msgid "Nothing is visible because no mesh has been assigned."
@@ -12718,7 +12742,7 @@ msgstr "Nada está ligado à entrada '%s' do nó '%s'."
#: scene/animation/animation_tree.cpp
msgid "No root AnimationNode for the graph is set."
-msgstr "Um AnimationNode raiz para o gráfico não está definido."
+msgstr "Nenhuma raiz AnimationNode para o gráfico está definida."
#: scene/animation/animation_tree.cpp
msgid "Path to an AnimationPlayer node containing animations is not set."
@@ -12784,9 +12808,9 @@ msgid ""
"The Hint Tooltip won't be displayed as the control's Mouse Filter is set to "
"\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."
msgstr ""
-"A Dica não será exibida quando o controle de Filtro do Mouse estiver "
-"definido como \"Ignorar\". Para resolver, defina o Filtro do Mouse como "
-"\"Parar\" ou \"Continuar\"."
+"A sugestão de dica não será exibida quando o Filtro do Mouse do controle "
+"estiver definido como \"Ignorar\". Para resolver isto, defina o Filtro do "
+"Mouse como \"Parar\" ou \"Passar\"."
#: scene/gui/dialogs.cpp
msgid "Alert!"
@@ -12831,7 +12855,7 @@ msgid ""
"Environment -> Default Environment) could not be loaded."
msgstr ""
"O Ambiente Padrão especificado nas Configurações de Projeto (Rendering -> "
-"Environment -> Default Environment) não pôde ser carregado."
+"Environment -> Default Environment) não pôde ser carregado."
#: scene/main/viewport.cpp
msgid ""
diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po
index 40a83eaa87..54accb0d6f 100644
--- a/editor/translations/pt_PT.po
+++ b/editor/translations/pt_PT.po
@@ -768,6 +768,11 @@ msgid "Method in target node must be specified."
msgstr "Método no nó alvo deve ser especificado."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "O nome não é um identificador válido:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/ro.po b/editor/translations/ro.po
index 5e362de330..cbf6a8f0a0 100644
--- a/editor/translations/ro.po
+++ b/editor/translations/ro.po
@@ -749,6 +749,11 @@ msgid "Method in target node must be specified."
msgstr "Metoda din nodul țintă trebuie specificată."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Metoda din nodul țintă trebuie specificată."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/ru.po b/editor/translations/ru.po
index 8bae9207d0..a2e562446d 100644
--- a/editor/translations/ru.po
+++ b/editor/translations/ru.po
@@ -27,7 +27,7 @@
# Yan <uvokinuvokines@gmail.com>, 2018.
# V. <Unit68189@gmail.com>, 2018, 2019.
# Victor Butorin <mrwebsterchannel@gmail.com>, 2018.
-# ÐлекÑандр <ol-vin@mail.ru>, 2018, 2019.
+# ÐлекÑандр <ol-vin@mail.ru>, 2018, 2019, 2020.
# Ðнатолий Горбунов <afgorbunov@gmail.com>, 2018, 2019.
# Vadim Vergasov <vadim.vergasov2003@gmail.com>, 2018, 2019.
# ÐÑлан Снупов <aslan170505@gmail.com>, 2018.
@@ -76,12 +76,14 @@
# Nikita <Kulacnikita@ya.ru>, 2020.
# Alexander <ramzi7208@gmail.com>, 2020.
# Alex Tern <ternvein@gmail.com>, 2020.
+# Varion Drakon Neonovich <variondrakon@gmail.com>, 2020.
+# d2cyb <dmitrydpb@gmail.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-06-15 12:01+0000\n"
-"Last-Translator: Alex Tern <ternvein@gmail.com>\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
+"Last-Translator: ÐлекÑандр <ol-vin@mail.ru>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/"
"godot/ru/>\n"
"Language: ru\n"
@@ -90,7 +92,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 4.1\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -99,13 +101,13 @@ msgstr "Ðеверный тип аргумента Ð´Ð»Ñ convert(), иÑполÑ
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
msgid "Expected a string of length 1 (a character)."
-msgstr "ОжидалаÑÑŒ Ñтрока длиной 1 (Ñимвол)."
+msgstr "ОжидалаÑÑŒ Ñтрока длиной 1 (Ñ‚.е. Ñимвол)."
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/mono/glue/gd_glue.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
msgid "Not enough bytes for decoding bytes, or invalid format."
-msgstr "ÐедоÑтаточно байтов Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ неверный формат."
+msgstr "ÐедоÑтаточно байтов Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð°Ð¹Ñ‚Ð¾Ð² или неверный формат."
#: core/math/expression.cpp
msgid "Invalid input %i (not passed) in expression"
@@ -134,7 +136,7 @@ msgstr "ÐедопуÑтимые аргументы Ð´Ð»Ñ Ð¿Ð¾ÑтроениÑ
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr "Ðа вызове '%s':"
+msgstr "При вызове '%s':"
#: core/ustring.cpp
msgid "B"
@@ -190,11 +192,11 @@ msgstr "Ð’Ñтавить ключ здеÑÑŒ"
#: editor/animation_bezier_editor.cpp
msgid "Duplicate Selected Key(s)"
-msgstr "Дублировать выделенные ключ(и)"
+msgstr "Дублировать выделенные ключи"
#: editor/animation_bezier_editor.cpp
msgid "Delete Selected Key(s)"
-msgstr "Удалить выделенные ключ(и)"
+msgstr "Удалить выделенные ключи"
#: editor/animation_bezier_editor.cpp
msgid "Add Bezier Point"
@@ -242,7 +244,7 @@ msgstr "Многократное изменение перехода"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Transform"
-msgstr "Ðнимационное многократное изменение положениÑ"
+msgstr "Ðнимационное многоÑменное преобразование"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Keyframe Value"
@@ -250,7 +252,7 @@ msgstr "Изменить значение ключевого кадра"
#: editor/animation_track_editor.cpp
msgid "Anim Multi Change Call"
-msgstr "Ðнимационный многократный вызов изменениÑ"
+msgstr "Изменить вызов анимации"
#: editor/animation_track_editor.cpp
msgid "Change Animation Length"
@@ -320,7 +322,7 @@ msgstr "Изменить Путь СледованиÑ"
#: editor/animation_track_editor.cpp
msgid "Toggle this track on/off."
-msgstr "Переключить Ñтот трек вкл/выкл."
+msgstr "Включить/выключить Ñтот трек."
#: editor/animation_track_editor.cpp
msgid "Update Mode (How this property is set)"
@@ -328,16 +330,15 @@ msgstr "Режим ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ (Как Ñто ÑвойÑтво уÑта
#: editor/animation_track_editor.cpp
msgid "Interpolation Mode"
-msgstr "Режим Перехода"
+msgstr "Режим интерполÑции"
#: editor/animation_track_editor.cpp
msgid "Loop Wrap Mode (Interpolate end with beginning on loop)"
-msgstr ""
-"Режим Обработки Ð—Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ (Переход заканчиваетÑÑ Ñ Ð½Ð°Ñ‡Ð°Ð»Ð¾Ð¼ нового цикла)"
+msgstr "Режим Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ (интерполировать начало и конец при зацикливании)"
#: editor/animation_track_editor.cpp
msgid "Remove this track."
-msgstr "Удалить Ñтот трек."
+msgstr "Удалить Ñту дорожку."
#: editor/animation_track_editor.cpp
msgid "Time (s): "
@@ -403,7 +404,7 @@ msgstr "Изменить режим Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ð¸"
#: editor/animation_track_editor.cpp
msgid "Change Animation Interpolation Mode"
-msgstr "Изменить режим интерполÑции анимации"
+msgstr "Изменить ÑпоÑоб интерполÑции анимации"
#: editor/animation_track_editor.cpp
msgid "Change Animation Loop Mode"
@@ -463,7 +464,8 @@ msgstr "ПереÑтавить дорожки"
#: editor/animation_track_editor.cpp
msgid "Transform tracks only apply to Spatial-based nodes."
-msgstr "Трек транÑформации применÑетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к оÑнованным на Spatial узлам."
+msgstr ""
+"Дорожка Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÑетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к оÑнованным на Spatial узлам."
#: editor/animation_track_editor.cpp
msgid ""
@@ -472,14 +474,14 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
-"Aудио треки могут указывать только на узлы типа:\n"
+"Ðудио дорожки могут указывать только на узлы типа:\n"
"-AudioStreamPlayer\n"
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr "Треки Ðнимации могут указывать только на узлы типа AnimationPlayer."
+msgstr "Дорожки анимации могут указывать только на узлы типа AnimationPlayer."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
@@ -487,11 +489,11 @@ msgstr "Проигрыватель анимации не может анимир
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ новый трек без корневого узла"
+msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ новую дорожку без корневого узла"
#: editor/animation_track_editor.cpp
msgid "Invalid track for Bezier (no suitable sub-properties)"
-msgstr "Ðеверный трек Ð´Ð»Ñ ÐºÑ€Ð¸Ð²Ð¾Ð¹ Безье (нет подходÑщих подÑвойÑтв)"
+msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° Ð´Ð»Ñ ÐºÑ€Ð¸Ð²Ð¾Ð¹ Безье (нет подходÑщих подÑвойÑтв)"
#: editor/animation_track_editor.cpp
msgid "Add Bezier Track"
@@ -499,11 +501,11 @@ msgstr "Добавить дорожку Безье"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr "Путь трека некорректен, потому Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ ключ."
+msgstr "Путь к дорожке некорректен, потому Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ ключ."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr "Трек не имеет тип Spatial, Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ ключ"
+msgstr "Дорожка не имеет тип Spatial, Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ ключ"
#: editor/animation_track_editor.cpp
msgid "Add Transform Track Key"
@@ -515,11 +517,11 @@ msgstr "Добавить ключ дорожки"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr "Путь трека некорректен, потому Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ ключ метода."
+msgstr "Путь к дорожке некорректен, потому Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ ключ метода."
#: editor/animation_track_editor.cpp
msgid "Add Method Track Key"
-msgstr "Добавить ключ отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð°"
+msgstr "Добавить ключ дорожки Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð°"
#: editor/animation_track_editor.cpp
msgid "Method not found in object: "
@@ -546,7 +548,7 @@ msgid ""
"This option does not work for Bezier editing, as it's only a single track."
msgstr ""
"Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð½Ðµ работает Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÑ€Ð¸Ð²Ñ‹Ð¼Ð¸ Безье, так как Ñто только "
-"один трек."
+"одна дорожка."
#: editor/animation_track_editor.cpp
msgid ""
@@ -561,14 +563,14 @@ msgid ""
"files."
msgstr ""
"Ð”Ð°Ð½Ð½Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ‚ импортированной Ñцене, поÑтому изменениÑ, "
-"внеÑенные в импортированные треки, не будут Ñохранены.\n"
+"внеÑенные в импортированные дорожки, не будут Ñохранены.\n"
"\n"
-"Чтобы активировать возможноÑть Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑких треков, перейдите "
-"к наÑтройкам импорта Ñцены и уÑтановите\n"
+"Чтобы активировать возможноÑть Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑких дорожек, "
+"перейдите к наÑтройкам импорта Ñцены и уÑтановите\n"
"\"ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ > Хранилище\" в значение \"Файлы\", а также включите пункт "
-"\"ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ > СохранÑть пользовательÑкие треки\", и заново импортируйте "
+"\"ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ > СохранÑть пользовательÑкие дорожки\", и заново импортируйте "
"Ñцену.\n"
-"Ð’ качеÑтве альтернативы иÑпользуйте преÑет импорта, который импортирует "
+"Ð’ качеÑтве альтернативы иÑпользуйте шаблон импорта, который импортирует "
"анимации в отдельные файлы."
#: editor/animation_track_editor.cpp
@@ -581,11 +583,11 @@ msgstr "Выберите узел AnimationPlayer Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ Ñ€Ð
#: editor/animation_track_editor.cpp
msgid "Only show tracks from nodes selected in tree."
-msgstr "Показывать треки только выделенных в дереве узлов."
+msgstr "Показывать дорожки только выделенных в дереве узлов."
#: editor/animation_track_editor.cpp
msgid "Group tracks by node or display them as plain list."
-msgstr "Группировать треки по узлам или показывать их как проÑтой ÑпиÑок."
+msgstr "Группировать дорожки по узлам или показывать их как проÑтой ÑпиÑок."
#: editor/animation_track_editor.cpp
msgid "Snap:"
@@ -619,7 +621,7 @@ msgstr "СвойÑтва анимации."
#: editor/animation_track_editor.cpp
msgid "Copy Tracks"
-msgstr "Копировать треки"
+msgstr "Копировать дорожки"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -635,7 +637,7 @@ msgstr "Дублировать выделенное"
#: editor/animation_track_editor.cpp
msgid "Duplicate Transposed"
-msgstr "Дублировать и перемеÑтить"
+msgstr "Дублировать и транÑпонировать"
#: editor/animation_track_editor.cpp
msgid "Delete Selection"
@@ -825,7 +827,12 @@ msgstr "Ðомера Ñтрок и Ñтолбцов."
#: editor/connections_dialog.cpp
msgid "Method in target node must be specified."
-msgstr "Метод должен быть указан в целевом узле."
+msgstr "Метод в целевом узле должен быть указан."
+
+#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Ð˜Ð¼Ñ Ð½Ðµ ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым идентификатором:"
#: editor/connections_dialog.cpp
msgid ""
@@ -837,7 +844,7 @@ msgstr ""
#: editor/connections_dialog.cpp
msgid "Connect to Node:"
-msgstr "ПриÑоединить к узлу:"
+msgstr "ПриÑоединить к Узлу:"
#: editor/connections_dialog.cpp
msgid "Connect to Script:"
@@ -849,7 +856,7 @@ msgstr "От Ñигнала:"
#: editor/connections_dialog.cpp
msgid "Scene does not contain any script."
-msgstr "Узел не Ñодержит Ñкрипт."
+msgstr "Сцена не Ñодержит каких-либо Ñкриптов."
#: editor/connections_dialog.cpp editor/editor_autoload_settings.cpp
#: editor/groups_editor.cpp editor/plugins/item_list_editor_plugin.cpp
@@ -870,7 +877,7 @@ msgstr "Удалить"
#: editor/connections_dialog.cpp
msgid "Add Extra Call Argument:"
-msgstr "Добавить дополнительный параметр вызова:"
+msgstr "Добавить дополнительный аргумент вызова:"
#: editor/connections_dialog.cpp
msgid "Extra Call Arguments:"
@@ -956,7 +963,7 @@ msgstr "Подключить Ñигнал к методу"
#: editor/connections_dialog.cpp
msgid "Edit Connection:"
-msgstr "Редактировать подключение:"
+msgstr "Редактировать Ñоединение:"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
@@ -1093,7 +1100,7 @@ msgstr "Владельцы:"
#: editor/dependency_editor.cpp
msgid "Remove selected files from the project? (Can't be restored)"
-msgstr "Удалить выбранные файлы из проекта? (ÐÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ!)"
+msgstr "Удалить выбранные файлы из проекта? (ÐÐµÐ»ÑŒÐ·Ñ Ð²Ð¾ÑÑтановить)"
#: editor/dependency_editor.cpp
msgid ""
@@ -1522,7 +1529,7 @@ msgstr "ПереÑтановка автозагрузок"
#: editor/editor_autoload_settings.cpp
msgid "Can't add autoload:"
-msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð²Ð°Ð¸Ñ‚ÑŒ автозагрузку:"
+msgstr "Ðе удаётÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ автозагрузку:"
#: editor/editor_autoload_settings.cpp
msgid "Add AutoLoad"
@@ -2482,7 +2489,7 @@ msgstr "Ðе возможно загрузить Ñцену, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ
#: editor/editor_node.cpp
msgid "Reload Saved Scene"
-msgstr "Перезагрузить Ñохранённую Ñцену"
+msgstr "Перезагрузить Ñохраненную Ñцену"
#: editor/editor_node.cpp
msgid ""
@@ -2768,12 +2775,12 @@ msgstr "Ðабор тайлов..."
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Undo"
-msgstr "Отменить"
+msgstr "Отменить (Undo)"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
-msgstr "Повторить"
+msgstr "Повторить (Redo)"
#: editor/editor_node.cpp
msgid "Miscellaneous project or scene-wide tools."
@@ -2930,7 +2937,7 @@ msgstr "Макет редактора"
#: editor/editor_node.cpp
msgid "Take Screenshot"
-msgstr "Сделать Ñнимок Ñкрана"
+msgstr "Сделать Ñкриншот"
#: editor/editor_node.cpp
msgid "Screenshots are stored in the Editor Data/Settings Folder."
@@ -3000,7 +3007,7 @@ msgstr "СообщеÑтво"
#: editor/editor_node.cpp
msgid "About"
-msgstr "О движке"
+msgstr "О Godot Engine"
#: editor/editor_node.cpp
msgid "Play the project."
@@ -3181,7 +3188,7 @@ msgstr "Открыть предыдущий редактор"
#: editor/editor_node.h
msgid "Warning!"
-msgstr "Внимание!"
+msgstr "Предупреждение!"
#: editor/editor_path.cpp
msgid "No sub-resources found."
@@ -3290,7 +3297,7 @@ msgstr "[ПуÑто]"
#: editor/editor_properties.cpp editor/plugins/root_motion_editor_plugin.cpp
msgid "Assign..."
-msgstr "ÐазначаетÑÑ..."
+msgstr "УÑтанавливать.."
#: editor/editor_properties.cpp
msgid "Invalid RID"
@@ -4025,7 +4032,7 @@ msgstr "Ошибка запуÑка поÑÑ‚-импорт Ñкрипта:"
#: editor/import/resource_importer_scene.cpp
msgid "Did you return a Node-derived object in the `post_import()` method?"
-msgstr ""
+msgstr "Вы вернули производный от Node объект в методе `post_import ()`?"
#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
@@ -4243,7 +4250,7 @@ msgstr "Загрузка..."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Move Node Point"
-msgstr "Передвинуть узел"
+msgstr "Передвинуть точку узла"
#: editor/plugins/animation_blend_space_1d_editor.cpp
msgid "Change BlendSpace1D Limits"
@@ -4698,7 +4705,7 @@ msgstr "ПеремеÑтить узел"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Transition exists!"
-msgstr "Переход уже ÑущеÑтвует!"
+msgstr "Переход ÑущеÑтвует!"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Add Transition"
@@ -5632,7 +5639,7 @@ msgstr "МаÑштаб при проÑмотре холÑта"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Translation mask for inserting keys."
-msgstr "МаÑка Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñемых ключей."
+msgstr "МаÑка транÑформации Ð´Ð»Ñ Ð²Ñтавки ключей."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Rotation mask for inserting keys."
@@ -5665,7 +5672,7 @@ msgstr "ÐвтовÑтавка ключа"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Animation Key and Pose Options"
-msgstr "ÐаÑтройки ключевых кадров и поз"
+msgstr "Опции анимационных ключей и поз"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
@@ -5777,7 +5784,7 @@ msgstr "МаÑка излучениÑ"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Solid Pixels"
-msgstr "Сплошные пикÑели"
+msgstr "Залитые пикÑели"
#: editor/plugins/cpu_particles_2d_editor_plugin.cpp
#: editor/plugins/particles_2d_editor_plugin.cpp
@@ -5923,16 +5930,15 @@ msgstr "Это не работает на корне Ñцены!"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Trimesh Static Shape"
-msgstr "Создать треугольную Ñетку ÑтатичеÑкой формы"
+msgstr "Создать Ñетку ÑтатичеÑкой формы"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Can't create a single convex collision shape for the scene root."
-msgstr ""
-"Ðе удаетÑÑ Ñоздать единÑтвенную выпуклую форму ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ñ€Ð½Ñ Ñцены."
+msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ñоздать единую выпуклую форму ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ñ€Ð½Ñ Ñцены."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Couldn't create a single convex collision shape."
-msgstr "Ðе удалоÑÑŒ Ñоздать одну выпуклую форму Ñтолкновений."
+msgstr "Ðе удалоÑÑŒ Ñоздать ни одной выпуклой формы ÑтолкновениÑ."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Single Convex Shape"
@@ -5945,11 +5951,11 @@ msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Couldn't create any collision shapes."
-msgstr "Ðе удалоÑÑŒ Ñоздать ни одной форму ÑтолкновениÑ."
+msgstr "Ðе удалоÑÑŒ Ñоздать ни одну форму ÑтолкновениÑ."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Multiple Convex Shapes"
-msgstr "Создать неÑколько выпуклых форм"
+msgstr "Создать неÑкольких выпуклых фигур"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Navigation Mesh"
@@ -6035,7 +6041,7 @@ msgstr ""
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "Create Multiple Convex Collision Siblings"
-msgstr "Создать неÑколько ÑоÑедних выпуклых форм ÑтолкновениÑ"
+msgstr "Создать выпуклую облаÑть ÑтолкновениÑ"
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid ""
@@ -6056,10 +6062,10 @@ msgid ""
"This can be used instead of the SpatialMaterial Grow property when using "
"that property isn't possible."
msgstr ""
-"Создаёт Ñтатичную обводочную полиÑетку. Её нормали переворачиваютÑÑ "
-"автоматичеÑки.\n"
-"Она может быть иÑпользована в Ñлучае, еÑли иÑпользовать ÑвойÑтво Grow "
-"материала SpatialMaterial не предÑтавлÑетÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ‹Ð¼."
+"Создать Ñтатичную контурную полиÑетку. ÐšÐ¾Ð½Ñ‚ÑƒÑ€Ð½Ð°Ñ Ð¿Ð¾Ð»Ð¸Ñетка будет иметь Ñвои "
+"нормали, перевернутые автоматичеÑки.\n"
+"Можно иÑпользовать вмеÑто ÑвойÑтва Grow в SpatialMaterial, в Ñлучае когда "
+"оно не применимо."
#: editor/plugins/mesh_instance_editor_plugin.cpp
msgid "View UV1"
@@ -6974,7 +6980,6 @@ msgstr ""
"'%s'."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "[Ignore]"
msgstr "(игнорировать)"
@@ -7335,7 +7340,7 @@ msgstr "ВыравнÑть преобразование Ñ Ð¾Ð±Ð»Ð°Ñтью пр
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Align Rotation with View"
-msgstr "ВыравнÑть поворот Ñ Ð¾Ð±Ð»Ð°Ñтью проÑмотра"
+msgstr "СовмеÑтить поворот Ñ Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ взглÑда"
#: editor/plugins/spatial_editor_plugin.cpp editor/scene_tree_dock.cpp
msgid "No parent to instance a child at."
@@ -7462,6 +7467,12 @@ msgid ""
"Closed eye: Gizmo is hidden.\n"
"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
+"Ðажмите Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ ÑоÑтоÑниÑми видимоÑти.\n"
+"\n"
+"Открытый глаз: Гизмо видно.\n"
+"Закрытый глаз: Гизмо Ñкрыто.\n"
+"Полуоткрытый глаз: Гизмо также видно Ñквозь непрозрачные поверхноÑти "
+"(«рентген»)."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
@@ -7694,7 +7705,7 @@ msgstr ""
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr "ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ, не может быть заменена Ñеткой."
+msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ, не может быть заменена полиÑеткой."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Convert to Mesh2D"
@@ -8597,7 +8608,7 @@ msgstr "Добавить входной порт"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Add output port"
-msgstr "Добавить выходной порт"
+msgstr "Добавить иÑходÑщий порт"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Change input port type"
@@ -8678,7 +8689,7 @@ msgstr "Показать полученный код шейдера."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Create Shader Node"
-msgstr "Создать узел шейдера"
+msgstr "Создать Шейдерный узел"
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Color function."
@@ -8722,7 +8733,7 @@ msgstr "Оператор выцветаниÑ."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "HardLight operator."
-msgstr "Оператор HardLight."
+msgstr "Оператор жёÑткого Ñвета."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Lighten operator."
@@ -9239,7 +9250,7 @@ msgstr "Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»ÑÑ†Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ð´Ð²ÑƒÐ¼Ñ Ð²ÐµÐºÑ‚
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Linear interpolation between two vectors using scalar."
-msgstr "Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»ÑÑ†Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ð´Ð²ÑƒÐ¼Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð°Ð¼Ð¸ Ñ Ð¸Ñпользованием ÑкалÑра."
+msgstr "Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»ÑÑ†Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ð´Ð²ÑƒÐ¼Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð°Ð¼Ð¸ иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÑкалÑÑ€."
#: editor/plugins/visual_shader_editor_plugin.cpp
msgid "Calculates the normalize product of vector."
@@ -10166,7 +10177,7 @@ msgstr "ÐаÑтройки Ñохранены нормально."
#: editor/project_settings_editor.cpp
msgid "Moved Input Action Event"
-msgstr "Событие ввода дейÑÑ‚Ð²Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¾"
+msgstr "ПеренеÑите Ñобытие ввода дейÑтвиÑ"
#: editor/project_settings_editor.cpp
msgid "Override for Feature"
@@ -10551,7 +10562,6 @@ msgid "Instance Child Scene"
msgstr "Добавить дочернюю Ñцену"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Detach Script"
msgstr "Прикрепить Ñкрипт"
@@ -10724,6 +10734,9 @@ msgid ""
"This is probably because this editor was built with all language modules "
"disabled."
msgstr ""
+"Ðевозможно прикрепить Ñкрипт: нет зарегиÑтрированных Ñзыков.\n"
+"ВероÑтно, Ñто ÑвÑзано Ñ Ñ‚ÐµÐ¼, что Ñтот редактор был поÑтроен Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼Ð¸ "
+"вÑеми Ñзыковыми модулÑми."
#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
@@ -10774,12 +10787,10 @@ msgstr ""
"не ÑущеÑтвует."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Attach a new or existing script to the selected node."
msgstr "Прикрепить новый или ÑущеÑтвующий Ñкрипт к выбранному узлу."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Detach the script from the selected node."
msgstr "Убрать Ñкрипт у выбранного узла."
@@ -11387,7 +11398,7 @@ msgstr "Залить выделенную GridMap"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Paste Selection"
-msgstr "Ð’Ñтавить выделенную Ñетку"
+msgstr "Ð’Ñтавка выделенной Ñетки"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Paint"
@@ -12008,7 +12019,6 @@ msgstr ""
"предуÑтановках."
#: platform/android/export/export.cpp
-#, fuzzy
msgid "Release keystore incorrectly configured in the export preset."
msgstr ""
"ÐžÑ‚Ð»Ð°Ð´Ð¾Ñ‡Ð½Ð°Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ð° не наÑтроена ни в наÑтройках редактора, ни в "
@@ -12046,26 +12056,34 @@ msgid ""
"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
"project setting (changed in Godot 3.2.2).\n"
msgstr ""
+"ÐедопуÑтимый модуль «GodotPaymentV3», включенный в наÑтройку проекта "
+"«android/modules» (изменен в Godot 3.2.2).\n"
#: platform/android/export/export.cpp
msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
+msgstr "«Use Custom Build» должен быть включен Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð²."
#: platform/android/export/export.cpp
msgid ""
"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
"\"."
msgstr ""
+"«Степени Ñвободы» дейÑтвительны только тогда, когда «Xr Mode» - Ñто «Oculus "
+"Mobile VR»."
#: platform/android/export/export.cpp
msgid ""
"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
msgstr ""
+"«ОтÑлеживание рук» дейÑтвует только тогда, когда «Xr Mode» - Ñто «Oculus "
+"Mobile VR»."
#: platform/android/export/export.cpp
msgid ""
"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
msgstr ""
+"«ОÑведомленноÑть о фокуÑе» дейÑтвительна только в том Ñлучае, еÑли «Режим "
+"Xr» - Ñто «Oculus Mobile VR»."
#: platform/android/export/export.cpp
msgid ""
@@ -12298,7 +12316,7 @@ msgstr ""
#: scene/2d/light_occluder_2d.cpp
msgid "The occluder polygon for this occluder is empty. Please draw a polygon."
msgstr ""
-"ЗаÑлонÑющий полигон Ð´Ð»Ñ Ñтого окклюдера пуÑÑ‚. ПожалуйÑта, нариÑуйте полигон."
+"ЗаÑлонÑющий полигон Ð´Ð»Ñ Ñтого окклюдера пуÑÑ‚. ПожалуйÑта, добавьте полигон."
#: scene/2d/navigation_polygon.cpp
msgid ""
diff --git a/editor/translations/si.po b/editor/translations/si.po
index 4d252a53d6..141696c00a 100644
--- a/editor/translations/si.po
+++ b/editor/translations/si.po
@@ -756,6 +756,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/sk.po b/editor/translations/sk.po
index a341552d1c..0920487af3 100644
--- a/editor/translations/sk.po
+++ b/editor/translations/sk.po
@@ -756,6 +756,11 @@ msgid "Method in target node must be specified."
msgstr "Metóda v target node-e musí byť špecifikovaná."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Metóda v target node-e musí byť špecifikovaná."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/sl.po b/editor/translations/sl.po
index faec304f67..114dce1e63 100644
--- a/editor/translations/sl.po
+++ b/editor/translations/sl.po
@@ -799,6 +799,11 @@ msgstr "Metoda v ciljnem gradniku mora biti navedena!"
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Ime ni pravilen identifikator:"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/sq.po b/editor/translations/sq.po
index 5bcf15eb82..32d08c7bc9 100644
--- a/editor/translations/sq.po
+++ b/editor/translations/sq.po
@@ -744,6 +744,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po
index 4e7064f00c..01d8c4ca91 100644
--- a/editor/translations/sr_Cyrl.po
+++ b/editor/translations/sr_Cyrl.po
@@ -841,6 +841,11 @@ msgstr "Метода у циљаном чвору мора бити наведе
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Име није важећи идентификатор:"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po
index e62d152c45..fe13877f42 100644
--- a/editor/translations/sr_Latn.po
+++ b/editor/translations/sr_Latn.po
@@ -765,6 +765,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/sv.po b/editor/translations/sv.po
index e316c74160..ddd0188d5d 100644
--- a/editor/translations/sv.po
+++ b/editor/translations/sv.po
@@ -772,6 +772,11 @@ msgstr "Metod i Mål-Node måste specificeras!"
#: editor/connections_dialog.cpp
#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Metod i Mål-Node måste specificeras!"
+
+#: editor/connections_dialog.cpp
+#, fuzzy
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/ta.po b/editor/translations/ta.po
index b8ea8d3538..8f161acfc9 100644
--- a/editor/translations/ta.po
+++ b/editor/translations/ta.po
@@ -757,6 +757,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/te.po b/editor/translations/te.po
index 589064278d..87fb947dd0 100644
--- a/editor/translations/te.po
+++ b/editor/translations/te.po
@@ -736,6 +736,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/th.po b/editor/translations/th.po
index db7fd6adea..3af6fde5a0 100644
--- a/editor/translations/th.po
+++ b/editor/translations/th.po
@@ -744,6 +744,11 @@ msgid "Method in target node must be specified."
msgstr "ต้องระบุเมธอดในโหนดเป้าหมาย"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "ไม่สามารถใช้ชื่อนี้ได้:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/tr.po b/editor/translations/tr.po
index 277cc2c807..27886e1d4d 100644
--- a/editor/translations/tr.po
+++ b/editor/translations/tr.po
@@ -798,6 +798,11 @@ msgid "Method in target node must be specified."
msgstr "Hedef düğümdeki metod tanımlanmalı."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Ad doÄŸru bir belirleyici deÄŸil:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/uk.po b/editor/translations/uk.po
index 75cce04e0e..66d7caab34 100644
--- a/editor/translations/uk.po
+++ b/editor/translations/uk.po
@@ -773,6 +773,11 @@ msgid "Method in target node must be specified."
msgstr "Має бути вказано метод у цільовому вузлі."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Ðазва не Ñ” коректним ідентифікатором:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po
index 10558ad98e..6985cbdc39 100644
--- a/editor/translations/ur_PK.po
+++ b/editor/translations/ur_PK.po
@@ -746,6 +746,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/vi.po b/editor/translations/vi.po
index fe846d5e08..ff214a7091 100644
--- a/editor/translations/vi.po
+++ b/editor/translations/vi.po
@@ -763,6 +763,11 @@ msgid "Method in target node must be specified."
msgstr "Phương thức trong nút đích phải được chỉ định."
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "Phương thức trong nút đích phải được chỉ định."
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po
index 5dc2b5948f..4acf70b8ae 100644
--- a/editor/translations/zh_CN.po
+++ b/editor/translations/zh_CN.po
@@ -64,12 +64,14 @@
# binotaliu <binota@protonmail.ch>, 2020.
# BinotaLIU <binota@protonmail.ch>, 2020.
# Tim Bao <honiebao@gmail.com>, 2020.
+# UnluckyNinja <unluckyninja1994@gmail.com>, 2020.
+# æ— åŒæµ <1257678024@qq.com>, 2020.
msgid ""
msgstr ""
"Project-Id-Version: Chinese (Simplified) (Godot Engine)\n"
"POT-Creation-Date: 2018-01-20 12:15+0200\n"
-"PO-Revision-Date: 2020-06-15 01:48+0000\n"
-"Last-Translator: Tim Bao <honiebao@gmail.com>\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
+"Last-Translator: æ— åŒæµ <1257678024@qq.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"godot-engine/godot/zh_Hans/>\n"
"Language: zh_CN\n"
@@ -77,7 +79,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.1-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -806,6 +808,11 @@ msgid "Method in target node must be specified."
msgstr "必须指定目标节点的方法。"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "åç§°ä¸æ˜¯æœ‰æ•ˆçš„æ ‡è¯†ç¬¦ï¼š"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -2438,6 +2445,8 @@ msgid ""
"The current scene has unsaved changes.\n"
"Reload the saved scene anyway? This action cannot be undone."
msgstr ""
+"当å‰åœºæ™¯æœ‰æœªä¿å­˜çš„æ›´æ”¹ã€‚\n"
+"是å¦é‡æ–°åŠ è½½ä¿å­˜çš„场景? æ­¤æ“作无法撤消。"
#: editor/editor_node.cpp
msgid "Quick Run Scene..."
@@ -2655,7 +2664,7 @@ msgstr "下一个标签页"
#: editor/editor_node.cpp
msgid "Previous tab"
-msgstr "上一个标签页"
+msgstr "上一个标签"
#: editor/editor_node.cpp
msgid "Filter Files..."
@@ -2855,7 +2864,7 @@ msgstr "编辑器布局"
#: editor/editor_node.cpp
msgid "Take Screenshot"
-msgstr "截å–å±å¹•"
+msgstr "截å±"
#: editor/editor_node.cpp
msgid "Screenshots are stored in the Editor Data/Settings Folder."
@@ -3339,9 +3348,8 @@ msgid "Did you forget the '_run' method?"
msgstr "您是å¦é—æ¼äº†_run()方法?"
#: editor/editor_spin_slider.cpp
-#, fuzzy
msgid "Hold Ctrl to round to integers. Hold Shift for more precise changes."
-msgstr "按ä½Ctrl键放置一个Getter节点。按ä½Shift键放置一个通用签å。"
+msgstr "按ä½Ctrlé”®æ¥å››èˆäº”入至整数。 按ä½Shifté”®èŽ·å–æ›´ç²¾ç¡®çš„å˜åŒ–。"
#: editor/editor_sub_scene.cpp
msgid "Select Node(s) to Import"
@@ -3932,7 +3940,7 @@ msgstr "åŽå¤„ç†è„šæœ¬è¿è¡Œå‘生错误:"
#: editor/import/resource_importer_scene.cpp
msgid "Did you return a Node-derived object in the `post_import()` method?"
-msgstr ""
+msgstr "你是å¦åœ¨ `post_import()` 方法中返回了 Node è¡ç”Ÿå¯¹è±¡ï¼Ÿ"
#: editor/import/resource_importer_scene.cpp
msgid "Saving..."
@@ -6844,9 +6852,8 @@ msgid ""
msgstr "未找到方法“%sâ€ï¼ˆè¿žæŽ¥äºŽä¿¡å·â€œ%sâ€ã€æ¥è‡ªèŠ‚ç‚¹â€œ%sâ€ã€ç›®æ ‡èŠ‚ç‚¹â€œ%sâ€ï¼‰ã€‚"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "[Ignore]"
-msgstr "(忽略)"
+msgstr "[忽略]"
#: editor/plugins/script_text_editor.cpp
msgid "Line"
@@ -7276,27 +7283,27 @@ msgstr "使用GLES2渲染器时ä¸å¯ç”¨ã€‚"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
-msgstr "自由视图 左"
+msgstr "自由观看å‘å·¦"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Right"
-msgstr "自由视图 å³"
+msgstr "自由观看å‘å³"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Forward"
-msgstr "自由视图 å‰"
+msgstr "自由观看å‘å‰"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Backwards"
-msgstr "自由视图 åŽ"
+msgstr "自由观看å‘åŽ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Up"
-msgstr "自由视图 上"
+msgstr "自由观看å‘上"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Down"
-msgstr "自由视图 下"
+msgstr "自由观看å‘下"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Speed Modifier"
@@ -7330,6 +7337,11 @@ msgid ""
"Closed eye: Gizmo is hidden.\n"
"Half-open eye: Gizmo is also visible through opaque surfaces (\"x-ray\")."
msgstr ""
+"点击以切æ¢å¯è§çжæ€ã€‚\n"
+"\n"
+"ç眼:标志å¯è§ã€‚\n"
+"闭眼:标志éšè—。\n"
+"åŠç眼:标志也å¯ç©¿è¿‡ä¸é€æ˜Žçš„表é¢å¯è§ï¼ˆâ€œXå…‰â€ï¼‰ã€‚"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Nodes To Floor"
@@ -7359,11 +7371,11 @@ msgstr "使用å¸é™„"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Bottom View"
-msgstr "底视图"
+msgstr "仰视图。"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Top View"
-msgstr "顶视图"
+msgstr "俯视"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rear View"
@@ -7371,7 +7383,7 @@ msgstr "åŽè§†å›¾"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Front View"
-msgstr "å‰è§†å›¾"
+msgstr "正视图"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Left View"
@@ -7383,7 +7395,7 @@ msgstr "å³è§†å›¾"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Switch Perspective/Orthogonal View"
-msgstr "åˆ‡æ¢æŠ•å½±/正交视图"
+msgstr "切æ¢é€è§†å›¾/正交视图"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Insert Animation Key"
@@ -7399,7 +7411,7 @@ msgstr "èšç„¦é€‰ä¸­é¡¹"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
-msgstr "切æ¢è‡ªç”±è§‚察模å¼"
+msgstr "切æ¢è‡ªç”±è§‚看"
#: editor/plugins/spatial_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
@@ -7408,7 +7420,7 @@ msgstr "å˜æ¢"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap Object to Floor"
-msgstr "将对象å¸é™„到地æ¿"
+msgstr "å¸é™„物体到地é¢"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -10354,9 +10366,8 @@ msgid "Instance Child Scene"
msgstr "实例化å­åœºæ™¯"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Detach Script"
-msgstr "添加脚本"
+msgstr "分离脚本"
#: editor/scene_tree_dock.cpp
msgid "This operation can't be done on the tree root."
@@ -10519,6 +10530,8 @@ msgid ""
"This is probably because this editor was built with all language modules "
"disabled."
msgstr ""
+"无法附加脚本:没有语言被注册。\n"
+"è¿™å¯èƒ½æ˜¯å› ä¸ºè¿™ä¸ªç¼–辑器是在所有语言模å—被关闭的状æ€ä¸‹è¢«æž„建的。"
#: editor/scene_tree_dock.cpp
msgid "Add Child Node"
@@ -10567,14 +10580,12 @@ msgid ""
msgstr "实例化场景文件为一个节点,如果没有根节点则创建一个继承自该文件的场景。"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Attach a new or existing script to the selected node."
msgstr "为选中节点创建或设置脚本。"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Detach the script from the selected node."
-msgstr "清除选中节点的脚本。"
+msgstr "从选中节点分离脚本。"
#: editor/scene_tree_dock.cpp
msgid "Remote"
@@ -11780,9 +11791,8 @@ msgid "Debug keystore not configured in the Editor Settings nor in the preset."
msgstr "未在编辑器设置或预设中é…置调试密钥库。"
#: platform/android/export/export.cpp
-#, fuzzy
msgid "Release keystore incorrectly configured in the export preset."
-msgstr "未在编辑器设置或预设中é…置调试密钥库。"
+msgstr "用于å‘布的密钥存储在导出预设中未被正确设置。"
#: platform/android/export/export.cpp
msgid "Custom build requires a valid Android SDK path in Editor Settings."
@@ -11811,26 +11821,28 @@ msgid ""
"Invalid \"GodotPaymentV3\" module included in the \"android/modules\" "
"project setting (changed in Godot 3.2.2).\n"
msgstr ""
+"“android/modulesâ€é¡¹ç›®è®¾ç½®ï¼ˆå˜æ›´äºŽGodot 3.2.2)中包å«äº†æ— æ•ˆæ¨¡"
+"组“GodotPaymentV3â€.\n"
#: platform/android/export/export.cpp
msgid "\"Use Custom Build\" must be enabled to use the plugins."
-msgstr ""
+msgstr "å¿…é¡»å¯ç”¨â€œä½¿ç”¨è‡ªå®šä¹‰æž„å»ºâ€æ‰èƒ½ä½¿ç”¨æ’件。"
#: platform/android/export/export.cpp
msgid ""
"\"Degrees Of Freedom\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR"
"\"."
-msgstr ""
+msgstr "“自由度â€åªæœ‰åœ¨å½““Xr Modeâ€æ˜¯â€œOculus Mobile VRâ€æ—¶æ‰æœ‰æ•ˆã€‚"
#: platform/android/export/export.cpp
msgid ""
"\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
-msgstr ""
+msgstr "“手部追踪â€åªæœ‰åœ¨å½““Xr Modeâ€æ˜¯â€œOculus Mobile VRâ€æ—¶æ‰æœ‰æ•ˆã€‚"
#: platform/android/export/export.cpp
msgid ""
"\"Focus Awareness\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\"."
-msgstr ""
+msgstr "“焦点感知â€åªæœ‰åœ¨å½““Xr Modeâ€æ˜¯â€œOculus Mobile VRâ€æ—¶æ‰æœ‰æ•ˆã€‚"
#: platform/android/export/export.cpp
msgid ""
diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po
index 4832307ce5..90c85892f6 100644
--- a/editor/translations/zh_HK.po
+++ b/editor/translations/zh_HK.po
@@ -793,6 +793,10 @@ msgid "Method in target node must be specified."
msgstr ""
#: editor/connections_dialog.cpp
+msgid "Method name must be a valid identifier."
+msgstr ""
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po
index 22051058ad..129a3fdad4 100644
--- a/editor/translations/zh_TW.po
+++ b/editor/translations/zh_TW.po
@@ -28,7 +28,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2020-06-15 01:48+0000\n"
+"PO-Revision-Date: 2020-06-22 06:40+0000\n"
"Last-Translator: BinotaLIU <me@binota.org>\n"
"Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/"
"godot-engine/godot/zh_Hant/>\n"
@@ -37,7 +37,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 4.1-dev\n"
+"X-Generator: Weblate 4.2-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -766,6 +766,11 @@ msgid "Method in target node must be specified."
msgstr "必須指定目標節點的方法。"
#: editor/connections_dialog.cpp
+#, fuzzy
+msgid "Method name must be a valid identifier."
+msgstr "åç¨±ä¸æ˜¯ä¸€å€‹æœ‰æ•ˆçš„識別符:"
+
+#: editor/connections_dialog.cpp
msgid ""
"Target method not found. Specify a valid method or attach a script to the "
"target node."
@@ -9880,7 +9885,7 @@ msgstr "新增事件"
#: editor/project_settings_editor.cpp
msgid "Button"
-msgstr "Button(按鈕)"
+msgstr "Button (按鈕)"
#: editor/project_settings_editor.cpp
msgid "Left Button."
diff --git a/main/main.cpp b/main/main.cpp
index 92b07dc83b..747b12677d 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -1633,6 +1633,8 @@ bool Main::start() {
GLOBAL_DEF("mono/profiler/args", "log:calls,alloc,sample,output=output.mlpd");
GLOBAL_DEF("mono/profiler/enabled", false);
GLOBAL_DEF("mono/unhandled_exception_policy", 0);
+ // From editor/csharp_project.cpp.
+ GLOBAL_DEF("mono/project/auto_update_project", true);
#endif
DocData doc;
diff --git a/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj b/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj
index 4b2870b67a..d21e78ccea 100644
--- a/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj
+++ b/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj
@@ -433,7 +433,7 @@
"$(inherited)",
"$(PROJECT_DIR)",
);
- PRODUCT_BUNDLE_IDENTIFIER = $identifier;
+ PRODUCT_BUNDLE_IDENTIFIER = $bundle_identifier;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "$provisioning_profile_uuid_debug";
TARGETED_DEVICE_FAMILY = "1,2";
@@ -459,7 +459,7 @@
"$(inherited)",
"$(PROJECT_DIR)",
);
- PRODUCT_BUNDLE_IDENTIFIER = $identifier;
+ PRODUCT_BUNDLE_IDENTIFIER = $bundle_identifier;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "$provisioning_profile_uuid_release";
TARGETED_DEVICE_FAMILY = "1,2";
diff --git a/misc/dist/ios_xcode/godot_ios/export_options.plist b/misc/dist/ios_xcode/godot_ios/export_options.plist
index 3878a4dbe6..71073d9a07 100644
--- a/misc/dist/ios_xcode/godot_ios/export_options.plist
+++ b/misc/dist/ios_xcode/godot_ios/export_options.plist
@@ -10,11 +10,11 @@
<key>provisioningProfiles</key>
<dict>
- <key>$identifier</key>
+ <key>$bundle_identifier</key>
<string>$provisioning_profile_uuid</string>
</dict>
<key>compileBitcode</key>
<false/>
</dict>
-</plist> \ No newline at end of file
+</plist>
diff --git a/misc/dist/osx_template.app/Contents/Info.plist b/misc/dist/osx_template.app/Contents/Info.plist
index 3b765e6bb8..aaee42aa5f 100755
--- a/misc/dist/osx_template.app/Contents/Info.plist
+++ b/misc/dist/osx_template.app/Contents/Info.plist
@@ -13,7 +13,7 @@
<key>CFBundleIconFile</key>
<string>icon.icns</string>
<key>CFBundleIdentifier</key>
- <string>$identifier</string>
+ <string>$bundle_identifier</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
diff --git a/modules/bullet/SCsub b/modules/bullet/SCsub
index b853ebfc63..21bdcca18e 100644
--- a/modules/bullet/SCsub
+++ b/modules/bullet/SCsub
@@ -201,8 +201,8 @@ if env["builtin_bullet"]:
env_bullet.Append(CPPFLAGS=["-isystem", Dir(thirdparty_dir).path])
else:
env_bullet.Prepend(CPPPATH=[thirdparty_dir])
- # if env['target'] == "debug" or env['target'] == "release_debug":
- # env_bullet.Append(CPPDEFINES=['BT_DEBUG'])
+ if env["target"] == "debug" or env["target"] == "release_debug":
+ env_bullet.Append(CPPDEFINES=["DEBUG"])
env_bullet.Append(CPPDEFINES=["BT_USE_OLD_DAMPING_METHOD"])
diff --git a/modules/bullet/space_bullet.cpp b/modules/bullet/space_bullet.cpp
index 99f58e7059..cfe8cd5322 100644
--- a/modules/bullet/space_bullet.cpp
+++ b/modules/bullet/space_bullet.cpp
@@ -123,6 +123,7 @@ int BulletPhysicsDirectSpaceState::intersect_shape(const RID &p_shape, const Tra
}
ShapeBullet *shape = space->get_physics_server()->get_shape_owner()->getornull(p_shape);
+ ERR_FAIL_COND_V(!shape, 0);
btCollisionShape *btShape = shape->create_bt_shape(p_xform.basis.get_scale_abs(), p_margin);
if (!btShape->isConvex()) {
@@ -152,7 +153,17 @@ int BulletPhysicsDirectSpaceState::intersect_shape(const RID &p_shape, const Tra
}
bool BulletPhysicsDirectSpaceState::cast_motion(const RID &p_shape, const Transform &p_xform, const Vector3 &p_motion, float p_margin, float &r_closest_safe, float &r_closest_unsafe, const Set<RID> &p_exclude, uint32_t p_collision_mask, bool p_collide_with_bodies, bool p_collide_with_areas, ShapeRestInfo *r_info) {
+ r_closest_safe = 0.0f;
+ r_closest_unsafe = 0.0f;
+ btVector3 bt_motion;
+ G_TO_B(p_motion, bt_motion);
+
+ if (bt_motion.fuzzyZero()) {
+ return false;
+ }
+
ShapeBullet *shape = space->get_physics_server()->get_shape_owner()->getornull(p_shape);
+ ERR_FAIL_COND_V(!shape, false);
btCollisionShape *btShape = shape->create_bt_shape(p_xform.basis.get_scale(), p_margin);
if (!btShape->isConvex()) {
@@ -162,9 +173,6 @@ bool BulletPhysicsDirectSpaceState::cast_motion(const RID &p_shape, const Transf
}
btConvexShape *bt_convex_shape = static_cast<btConvexShape *>(btShape);
- btVector3 bt_motion;
- G_TO_B(p_motion, bt_motion);
-
btTransform bt_xform_from;
G_TO_B(p_xform, bt_xform_from);
UNSCALE_BT_BASIS(bt_xform_from);
@@ -178,9 +186,6 @@ bool BulletPhysicsDirectSpaceState::cast_motion(const RID &p_shape, const Transf
space->dynamicsWorld->convexSweepTest(bt_convex_shape, bt_xform_from, bt_xform_to, btResult, space->dynamicsWorld->getDispatchInfo().m_allowedCcdPenetration);
- r_closest_unsafe = 1.0;
- r_closest_safe = 1.0;
-
if (btResult.hasHit()) {
const btScalar l = bt_motion.length();
r_closest_unsafe = btResult.m_closestHitFraction;
@@ -196,6 +201,9 @@ bool BulletPhysicsDirectSpaceState::cast_motion(const RID &p_shape, const Transf
r_info->collider_id = collision_object->get_instance_id();
r_info->shape = btResult.m_shapeId;
}
+ } else {
+ r_closest_safe = 1.0f;
+ r_closest_unsafe = 1.0f;
}
bulletdelete(bt_convex_shape);
@@ -209,6 +217,7 @@ bool BulletPhysicsDirectSpaceState::collide_shape(RID p_shape, const Transform &
}
ShapeBullet *shape = space->get_physics_server()->get_shape_owner()->getornull(p_shape);
+ ERR_FAIL_COND_V(!shape, false);
btCollisionShape *btShape = shape->create_bt_shape(p_shape_xform.basis.get_scale_abs(), p_margin);
if (!btShape->isConvex()) {
@@ -240,6 +249,7 @@ bool BulletPhysicsDirectSpaceState::collide_shape(RID p_shape, const Transform &
bool BulletPhysicsDirectSpaceState::rest_info(RID p_shape, const Transform &p_shape_xform, float p_margin, ShapeRestInfo *r_info, const Set<RID> &p_exclude, uint32_t p_collision_mask, bool p_collide_with_bodies, bool p_collide_with_areas) {
ShapeBullet *shape = space->get_physics_server()->get_shape_owner()->getornull(p_shape);
+ ERR_FAIL_COND_V(!shape, false);
btCollisionShape *btShape = shape->create_bt_shape(p_shape_xform.basis.get_scale_abs(), p_margin);
if (!btShape->isConvex()) {
diff --git a/modules/csg/csg.cpp b/modules/csg/csg.cpp
index ded0b970dc..d0c9bf5d38 100644
--- a/modules/csg/csg.cpp
+++ b/modules/csg/csg.cpp
@@ -904,8 +904,12 @@ void CSGBrushOperation::Build2DFaces::_merge_faces(const Vector<int> &p_segment_
vertices[p_segment_indices[closest_idx]].point
};
if (are_segements_parallel(edge1, edge2, vertex_snap2)) {
- degenerate_points.push_back(outer_edge_idx[0]);
- degenerate_points.push_back(outer_edge_idx[1]);
+ if (!degenerate_points.find(outer_edge_idx[0])) {
+ degenerate_points.push_back(outer_edge_idx[0]);
+ }
+ if (!degenerate_points.find(outer_edge_idx[1])) {
+ degenerate_points.push_back(outer_edge_idx[1]);
+ }
continue;
}
diff --git a/modules/gdnative/gdnative_library_editor_plugin.cpp b/modules/gdnative/gdnative_library_editor_plugin.cpp
index 2a9836329e..5896da4640 100644
--- a/modules/gdnative/gdnative_library_editor_plugin.cpp
+++ b/modules/gdnative/gdnative_library_editor_plugin.cpp
@@ -283,7 +283,7 @@ GDNativeLibraryEditor::GDNativeLibraryEditor() {
platforms["Haiku"] = platform_haiku;
NativePlatformConfig platform_uwp;
- platform_uwp.name = "Windows Universal";
+ platform_uwp.name = "UWP";
platform_uwp.entries.push_back("arm");
platform_uwp.entries.push_back("32");
platform_uwp.entries.push_back("64");
diff --git a/modules/gdnavigation/navigation_mesh_editor_plugin.cpp b/modules/gdnavigation/navigation_mesh_editor_plugin.cpp
index 5fe1060aae..648f4f7cdd 100644
--- a/modules/gdnavigation/navigation_mesh_editor_plugin.cpp
+++ b/modules/gdnavigation/navigation_mesh_editor_plugin.cpp
@@ -95,13 +95,15 @@ void NavigationMeshEditor::_bind_methods() {
NavigationMeshEditor::NavigationMeshEditor() {
bake_hbox = memnew(HBoxContainer);
- button_bake = memnew(ToolButton);
+ button_bake = memnew(Button);
+ button_bake->set_flat(true);
bake_hbox->add_child(button_bake);
button_bake->set_toggle_mode(true);
button_bake->set_text(TTR("Bake NavMesh"));
button_bake->connect("pressed", callable_mp(this, &NavigationMeshEditor::_bake_pressed));
- button_reset = memnew(ToolButton);
+ button_reset = memnew(Button);
+ button_reset->set_flat(true);
bake_hbox->add_child(button_reset);
// No button text, we only use a revert icon which is set when entering the tree.
button_reset->set_tooltip(TTR("Clear the navigation mesh."));
diff --git a/modules/gdnavigation/navigation_mesh_editor_plugin.h b/modules/gdnavigation/navigation_mesh_editor_plugin.h
index da3a981f8c..728f958eaa 100644
--- a/modules/gdnavigation/navigation_mesh_editor_plugin.h
+++ b/modules/gdnavigation/navigation_mesh_editor_plugin.h
@@ -46,8 +46,8 @@ class NavigationMeshEditor : public Control {
AcceptDialog *err_dialog;
HBoxContainer *bake_hbox;
- ToolButton *button_bake;
- ToolButton *button_reset;
+ Button *button_bake;
+ Button *button_reset;
Label *bake_info;
NavigationRegion3D *node;
diff --git a/modules/gridmap/grid_map_editor_plugin.cpp b/modules/gridmap/grid_map_editor_plugin.cpp
index 3b0e78546d..1b7ce98721 100644
--- a/modules/gridmap/grid_map_editor_plugin.cpp
+++ b/modules/gridmap/grid_map_editor_plugin.cpp
@@ -1241,14 +1241,16 @@ GridMapEditor::GridMapEditor(EditorNode *p_editor) {
search_box->connect("text_changed", callable_mp(this, &GridMapEditor::_text_changed));
search_box->connect("gui_input", callable_mp(this, &GridMapEditor::_sbox_input));
- mode_thumbnail = memnew(ToolButton);
+ mode_thumbnail = memnew(Button);
+ mode_thumbnail->set_flat(true);
mode_thumbnail->set_toggle_mode(true);
mode_thumbnail->set_pressed(true);
mode_thumbnail->set_icon(p_editor->get_gui_base()->get_theme_icon("FileThumbnail", "EditorIcons"));
hb->add_child(mode_thumbnail);
mode_thumbnail->connect("pressed", callable_mp(this, &GridMapEditor::_set_display_mode), varray(DISPLAY_THUMBNAIL));
- mode_list = memnew(ToolButton);
+ mode_list = memnew(Button);
+ mode_list->set_flat(true);
mode_list->set_toggle_mode(true);
mode_list->set_pressed(false);
mode_list->set_icon(p_editor->get_gui_base()->get_theme_icon("FileList", "EditorIcons"));
diff --git a/modules/gridmap/grid_map_editor_plugin.h b/modules/gridmap/grid_map_editor_plugin.h
index 19eea18965..0ae9b27833 100644
--- a/modules/gridmap/grid_map_editor_plugin.h
+++ b/modules/gridmap/grid_map_editor_plugin.h
@@ -74,8 +74,8 @@ class GridMapEditor : public VBoxContainer {
MenuButton *options;
SpinBox *floor;
double accumulated_floor_delta;
- ToolButton *mode_thumbnail;
- ToolButton *mode_list;
+ Button *mode_thumbnail;
+ Button *mode_list;
LineEdit *search_box;
HSlider *size_slider;
HBoxContainer *spatial_editor_hb;
diff --git a/modules/mono/editor/GodotTools/GodotTools/BottomPanel.cs b/modules/mono/editor/GodotTools/GodotTools/BottomPanel.cs
index 3cf495f025..3de3d8d318 100644
--- a/modules/mono/editor/GodotTools/GodotTools/BottomPanel.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/BottomPanel.cs
@@ -20,8 +20,8 @@ namespace GodotTools
private ItemList buildTabsList;
private TabContainer buildTabs;
- private ToolButton warningsBtn;
- private ToolButton errorsBtn;
+ private Button warningsBtn;
+ private Button errorsBtn;
private Button viewLogBtn;
private void _UpdateBuildTabsList()
@@ -285,7 +285,7 @@ namespace GodotTools
toolBarHBox.AddSpacer(begin: false);
- warningsBtn = new ToolButton
+ warningsBtn = new Button
{
Text = "Warnings".TTR(),
ToggleMode = true,
@@ -296,7 +296,7 @@ namespace GodotTools
warningsBtn.Toggled += _WarningsToggled;
toolBarHBox.AddChild(warningsBtn);
- errorsBtn = new ToolButton
+ errorsBtn = new Button
{
Text = "Errors".TTR(),
ToggleMode = true,
diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
index 403e25781d..f330f9ed2c 100644
--- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
@@ -30,7 +30,7 @@ namespace GodotTools
private AcceptDialog aboutDialog;
private CheckBox aboutDialogCheckBox;
- private ToolButton bottomPanelBtn;
+ private Button bottomPanelBtn;
public GodotIdeManager GodotIdeManager { get; private set; }
@@ -513,7 +513,7 @@ namespace GodotTools
menuPopup.IdPressed += _MenuOptionPressed;
- var buildButton = new ToolButton
+ var buildButton = new Button
{
Text = "Build",
HintTooltip = "Build solution",
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Extensions/SceneTreeExtensions.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Extensions/SceneTreeExtensions.cs
new file mode 100644
index 0000000000..20b11a48dd
--- /dev/null
+++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Extensions/SceneTreeExtensions.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Runtime.CompilerServices;
+using Godot.Collections;
+
+namespace Godot
+{
+ public partial class SceneTree
+ {
+ public Array<T> GetNodesInGroup<T>(StringName group) where T : class
+ {
+ return new Array<T>(godot_icall_SceneTree_get_nodes_in_group_Generic(Object.GetPtr(this), StringName.GetPtr(group), typeof(T)));
+ }
+
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ internal extern static IntPtr godot_icall_SceneTree_get_nodes_in_group_Generic(IntPtr obj, IntPtr group, Type elemType);
+ }
+}
diff --git a/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj b/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj
index b5ac124c9a..06ec2483c8 100644
--- a/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj
+++ b/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj
@@ -53,6 +53,7 @@
<Compile Include="Core\Extensions\NodeExtensions.cs" />
<Compile Include="Core\Extensions\ObjectExtensions.cs" />
<Compile Include="Core\Extensions\ResourceLoaderExtensions.cs" />
+ <Compile Include="Core\Extensions\SceneTreeExtensions.cs" />
<Compile Include="Core\GD.cs" />
<Compile Include="Core\GodotSynchronizationContext.cs" />
<Compile Include="Core\GodotTaskScheduler.cs" />
diff --git a/modules/mono/glue/glue_header.h b/modules/mono/glue/glue_header.h
index ee99a300b9..f6999d01fb 100644
--- a/modules/mono/glue/glue_header.h
+++ b/modules/mono/glue/glue_header.h
@@ -35,6 +35,7 @@
#include "gd_glue.h"
#include "nodepath_glue.h"
#include "rid_glue.h"
+#include "scene_tree_glue.h"
#include "string_glue.h"
#include "string_name_glue.h"
@@ -50,6 +51,7 @@ void godot_register_glue_header_icalls() {
godot_register_object_icalls();
godot_register_rid_icalls();
godot_register_string_icalls();
+ godot_register_scene_tree_icalls();
}
// Used by the generated glue
diff --git a/platform/haiku/context_gl_haiku.cpp b/modules/mono/glue/scene_tree_glue.cpp
index 3c4d43ff71..bea9544b08 100644
--- a/platform/haiku/context_gl_haiku.cpp
+++ b/modules/mono/glue/scene_tree_glue.cpp
@@ -1,5 +1,5 @@
/*************************************************************************/
-/* context_gl_haiku.cpp */
+/* scene_tree_glue.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
@@ -28,56 +28,55 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#include "context_gl_haiku.h"
-
-#if defined(OPENGL_ENABLED)
-
-ContextGL_Haiku::ContextGL_Haiku(HaikuDirectWindow *p_window) {
- window = p_window;
-
- uint32 type = BGL_RGB | BGL_DOUBLE | BGL_DEPTH;
- view = new HaikuGLView(window->Bounds(), type);
-
- use_vsync = false;
-}
-
-ContextGL_Haiku::~ContextGL_Haiku() {
- delete view;
-}
-
-Error ContextGL_Haiku::initialize() {
- window->AddChild(view);
- window->SetHaikuGLView(view);
-
- return OK;
-}
-
-void ContextGL_Haiku::release_current() {
- view->UnlockGL();
-}
-
-void ContextGL_Haiku::make_current() {
- view->LockGL();
-}
-
-void ContextGL_Haiku::swap_buffers() {
- view->SwapBuffers(use_vsync);
-}
-
-int ContextGL_Haiku::get_window_width() {
- return window->Bounds().IntegerWidth();
-}
-
-int ContextGL_Haiku::get_window_height() {
- return window->Bounds().IntegerHeight();
-}
-
-void ContextGL_Haiku::set_use_vsync(bool p_use) {
- use_vsync = p_use;
+#include "scene_tree_glue.h"
+
+#ifdef MONO_GLUE_ENABLED
+
+#include "core/class_db.h"
+#include "modules/mono/csharp_script.h"
+#include "modules/mono/mono_gd/gd_mono_utils.h"
+#include "scene/main/node.h"
+
+Array *godot_icall_SceneTree_get_nodes_in_group_Generic(SceneTree *ptr, StringName *group, MonoReflectionType *refltype) {
+ List<Node *> nodes;
+ Array ret;
+
+ // Retrieve all the nodes in the group
+ ptr->get_nodes_in_group(*group, &nodes);
+
+ // No need to bother if the group is empty
+ if (!nodes.empty()) {
+ MonoType *elem_type = mono_reflection_type_get_type(refltype);
+ MonoClass *mono_class = mono_class_from_mono_type(elem_type);
+ GDMonoClass *klass = GDMono::get_singleton()->get_class(mono_class);
+
+ if (klass == GDMonoUtils::get_class_native_base(klass)) {
+ // If we're trying to get native objects, just check the inheritance list
+ StringName native_class_name = GDMonoUtils::get_native_godot_class_name(klass);
+ for (int i = 0; i < nodes.size(); ++i) {
+ if (ClassDB::is_parent_class(nodes[i]->get_class(), native_class_name))
+ ret.push_back(nodes[i]);
+ }
+ } else {
+ // If we're trying to get csharpscript instances, get the mono object and compare the classes
+ for (int i = 0; i < nodes.size(); ++i) {
+ CSharpInstance *si = CAST_CSHARP_INSTANCE(nodes[i]->get_script_instance());
+
+ if (si != nullptr) {
+ MonoObject *obj = si->get_mono_object();
+ if (obj != nullptr && mono_object_get_class(obj) == mono_class) {
+ ret.push_back(nodes[i]);
+ }
+ }
+ }
+ }
+ }
+
+ return memnew(Array(ret));
}
-bool ContextGL_Haiku::is_using_vsync() const {
- return use_vsync;
+void godot_register_scene_tree_icalls() {
+ mono_add_internal_call("Godot.SceneTree::godot_icall_SceneTree_get_nodes_in_group_Generic", (void *)godot_icall_SceneTree_get_nodes_in_group_Generic);
}
-#endif
+#endif // MONO_GLUE_ENABLED
diff --git a/platform/haiku/godot_haiku.cpp b/modules/mono/glue/scene_tree_glue.h
index 0657f4c052..e9af35a30b 100644
--- a/platform/haiku/godot_haiku.cpp
+++ b/modules/mono/glue/scene_tree_glue.h
@@ -1,5 +1,5 @@
/*************************************************************************/
-/* godot_haiku.cpp */
+/* scene_tree_glue.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
@@ -28,22 +28,23 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
-#include "main/main.h"
-#include "os_haiku.h"
+#ifndef SCENE_TREE_GLUE_H
+#define SCENE_TREE_GLUE_H
-int main(int argc, char *argv[]) {
- OS_Haiku os;
+#ifdef MONO_GLUE_ENABLED
- Error error = Main::setup(argv[0], argc - 1, &argv[1]);
- if (error != OK) {
- return 255;
- }
+#include "core/array.h"
+#include "core/string_name.h"
+#include "scene/main/scene_tree.h"
- if (Main::start()) {
- os.run();
- }
+#include "../mono_gd/gd_mono_marshal.h"
- Main::cleanup();
+Array *godot_icall_SceneTree_get_nodes_in_group_Generic(SceneTree *ptr, StringName *group, MonoReflectionType *refltype);
- return os.get_exit_code();
-}
+// Register internal calls
+
+void godot_register_scene_tree_icalls();
+
+#endif // MONO_GLUE_ENABLED
+
+#endif // SCENE_TREE_GLUE_H
diff --git a/modules/mono/mono_gd/gd_mono_marshal.cpp b/modules/mono/mono_gd/gd_mono_marshal.cpp
index 085062261d..158742846b 100644
--- a/modules/mono/mono_gd/gd_mono_marshal.cpp
+++ b/modules/mono/mono_gd/gd_mono_marshal.cpp
@@ -624,8 +624,8 @@ MonoObject *variant_to_mono_object(const Variant *p_var, const ManagedType &p_ty
return BOX_BOOLEAN(val);
}
case Variant::INT: {
- int32_t val = p_var->operator signed int();
- return BOX_INT32(val);
+ int64_t val = p_var->operator int64_t();
+ return BOX_INT64(val);
}
case Variant::FLOAT: {
#ifdef REAL_T_IS_DOUBLE
diff --git a/platform/android/java/build.gradle b/platform/android/java/build.gradle
index 80c6be0fae..821a4dc584 100644
--- a/platform/android/java/build.gradle
+++ b/platform/android/java/build.gradle
@@ -97,13 +97,6 @@ task copyReleaseAARToAppModule(type: Copy) {
include('godot-lib.release.aar')
}
-task copyGodotPaymentPluginToAppModule(type: Copy) {
- dependsOn ':plugins:godotpayment:assembleRelease'
- from('plugins/godotpayment/build/outputs/aar')
- into('app/libs/plugins')
- include('GodotPayment.release.aar')
-}
-
/**
* Copy the Godot android library archive release file into the root bin directory.
* Depends on the library build task to ensure the AAR file is generated prior to copying.
@@ -161,7 +154,6 @@ task generateGodotTemplates(type: GradleBuild) {
}
}
- dependsOn 'copyGodotPaymentPluginToAppModule'
finalizedBy 'zipCustomBuild'
}
diff --git a/platform/android/java/plugins/godotpayment/build.gradle b/platform/android/java/plugins/godotpayment/build.gradle
deleted file mode 100644
index fb3aa8bba2..0000000000
--- a/platform/android/java/plugins/godotpayment/build.gradle
+++ /dev/null
@@ -1,32 +0,0 @@
-apply plugin: 'com.android.library'
-
-android {
- compileSdkVersion versions.compileSdk
- buildToolsVersion versions.buildTools
-
- defaultConfig {
- minSdkVersion versions.minSdk
- targetSdkVersion versions.targetSdk
- }
-
- libraryVariants.all { variant ->
- variant.outputs.all { output ->
- output.outputFileName = "GodotPayment.${variant.name}.aar"
- }
- }
-
-}
-
-dependencies {
- implementation libraries.supportCoreUtils
- implementation libraries.v4Support
- implementation 'com.android.billingclient:billing:2.2.1'
-
- if (rootProject.findProject(":lib")) {
- compileOnly project(":lib")
- } else if (rootProject.findProject(":godot:lib")) {
- compileOnly project(":godot:lib")
- } else {
- compileOnly fileTree(dir: 'libs', include: ['godot-lib*.aar'])
- }
-}
diff --git a/platform/android/java/plugins/godotpayment/src/main/AndroidManifest.xml b/platform/android/java/plugins/godotpayment/src/main/AndroidManifest.xml
deleted file mode 100644
index 61afa03799..0000000000
--- a/platform/android/java/plugins/godotpayment/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="org.godotengine.godot.plugin.payment">
-
- <application>
-
- <meta-data
- android:name="org.godotengine.plugin.v1.GodotPayment"
- android:value="org.godotengine.godot.plugin.payment.GodotPayment" />
-
- </application>
-</manifest>
diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/GodotPayment.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/GodotPayment.java
deleted file mode 100644
index bf8e485d96..0000000000
--- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/GodotPayment.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*************************************************************************/
-/* GodotPayment.java */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-package org.godotengine.godot.plugin.payment;
-
-import org.godotengine.godot.Dictionary;
-import org.godotengine.godot.Godot;
-import org.godotengine.godot.plugin.GodotPlugin;
-import org.godotengine.godot.plugin.SignalInfo;
-import org.godotengine.godot.plugin.payment.utils.GodotPaymentUtils;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.collection.ArraySet;
-
-import com.android.billingclient.api.AcknowledgePurchaseParams;
-import com.android.billingclient.api.AcknowledgePurchaseResponseListener;
-import com.android.billingclient.api.BillingClient;
-import com.android.billingclient.api.BillingClientStateListener;
-import com.android.billingclient.api.BillingFlowParams;
-import com.android.billingclient.api.BillingResult;
-import com.android.billingclient.api.ConsumeParams;
-import com.android.billingclient.api.ConsumeResponseListener;
-import com.android.billingclient.api.Purchase;
-import com.android.billingclient.api.PurchasesUpdatedListener;
-import com.android.billingclient.api.SkuDetails;
-import com.android.billingclient.api.SkuDetailsParams;
-import com.android.billingclient.api.SkuDetailsResponseListener;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Set;
-
-public class GodotPayment extends GodotPlugin implements PurchasesUpdatedListener, BillingClientStateListener {
- private final BillingClient billingClient;
- private final HashMap<String, SkuDetails> skuDetailsCache = new HashMap<>(); // sku → SkuDetails
-
- public GodotPayment(Godot godot) {
- super(godot);
-
- billingClient = BillingClient
- .newBuilder(getActivity())
- .enablePendingPurchases()
- .setListener(this)
- .build();
- }
-
- public void startConnection() {
- billingClient.startConnection(this);
- }
-
- public void endConnection() {
- billingClient.endConnection();
- }
-
- public boolean isReady() {
- return this.billingClient.isReady();
- }
-
- public Dictionary queryPurchases(String type) {
- Purchase.PurchasesResult result = billingClient.queryPurchases(type);
-
- Dictionary returnValue = new Dictionary();
- if (result.getBillingResult().getResponseCode() == BillingClient.BillingResponseCode.OK) {
- returnValue.put("status", 0); // OK = 0
- returnValue.put("purchases", GodotPaymentUtils.convertPurchaseListToDictionaryObjectArray(result.getPurchasesList()));
- } else {
- returnValue.put("status", 1); // FAILED = 1
- returnValue.put("response_code", result.getBillingResult().getResponseCode());
- returnValue.put("debug_message", result.getBillingResult().getDebugMessage());
- }
-
- return returnValue;
- }
-
- public void querySkuDetails(final String[] list, String type) {
- List<String> skuList = Arrays.asList(list);
-
- SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder()
- .setSkusList(skuList)
- .setType(type);
-
- billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {
- @Override
- public void onSkuDetailsResponse(BillingResult billingResult,
- List<SkuDetails> skuDetailsList) {
- if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
- for (SkuDetails skuDetails : skuDetailsList) {
- skuDetailsCache.put(skuDetails.getSku(), skuDetails);
- }
- emitSignal("sku_details_query_completed", (Object)GodotPaymentUtils.convertSkuDetailsListToDictionaryObjectArray(skuDetailsList));
- } else {
- emitSignal("sku_details_query_error", billingResult.getResponseCode(), billingResult.getDebugMessage(), list);
- }
- }
- });
- }
-
- public void acknowledgePurchase(final String purchaseToken) {
- AcknowledgePurchaseParams acknowledgePurchaseParams =
- AcknowledgePurchaseParams.newBuilder()
- .setPurchaseToken(purchaseToken)
- .build();
- billingClient.acknowledgePurchase(acknowledgePurchaseParams, new AcknowledgePurchaseResponseListener() {
- @Override
- public void onAcknowledgePurchaseResponse(BillingResult billingResult) {
- if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
- emitSignal("purchase_acknowledged", purchaseToken);
- } else {
- emitSignal("purchase_acknowledgement_error", billingResult.getResponseCode(), billingResult.getDebugMessage(), purchaseToken);
- }
- }
- });
- }
-
- public void consumePurchase(String purchaseToken) {
- ConsumeParams consumeParams = ConsumeParams.newBuilder()
- .setPurchaseToken(purchaseToken)
- .build();
-
- billingClient.consumeAsync(consumeParams, new ConsumeResponseListener() {
- @Override
- public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
- if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
- emitSignal("purchase_consumed", purchaseToken);
- } else {
- emitSignal("purchase_consumption_error", billingResult.getResponseCode(), billingResult.getDebugMessage(), purchaseToken);
- }
- }
- });
- }
-
- @Override
- public void onBillingSetupFinished(BillingResult billingResult) {
- if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
- emitSignal("connected");
- } else {
- emitSignal("connect_error", billingResult.getResponseCode(), billingResult.getDebugMessage());
- }
- }
-
- @Override
- public void onBillingServiceDisconnected() {
- emitSignal("disconnected");
- }
-
- public Dictionary purchase(String sku) {
- if (!skuDetailsCache.containsKey(sku)) {
- emitSignal("purchase_error", null, "You must query the sku details and wait for the result before purchasing!");
- }
-
- SkuDetails skuDetails = skuDetailsCache.get(sku);
- BillingFlowParams purchaseParams = BillingFlowParams.newBuilder()
- .setSkuDetails(skuDetails)
- .build();
-
- BillingResult result = billingClient.launchBillingFlow(getActivity(), purchaseParams);
-
- Dictionary returnValue = new Dictionary();
- if (result.getResponseCode() == BillingClient.BillingResponseCode.OK) {
- returnValue.put("status", 0); // OK = 0
- } else {
- returnValue.put("status", 1); // FAILED = 1
- returnValue.put("response_code", result.getResponseCode());
- returnValue.put("debug_message", result.getDebugMessage());
- }
-
- return returnValue;
- }
-
- @Override
- public void onPurchasesUpdated(final BillingResult billingResult, @Nullable final List<Purchase> list) {
- if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && list != null) {
- emitSignal("purchases_updated", (Object)GodotPaymentUtils.convertPurchaseListToDictionaryObjectArray(list));
- } else {
- emitSignal("purchase_error", billingResult.getResponseCode(), billingResult.getDebugMessage());
- }
- }
-
- @NonNull
- @Override
- public String getPluginName() {
- return "GodotPayment";
- }
-
- @NonNull
- @Override
- public List<String> getPluginMethods() {
- return Arrays.asList("startConnection", "endConnection", "purchase", "querySkuDetails", "isReady", "queryPurchases", "acknowledgePurchase", "consumePurchase");
- }
-
- @NonNull
- @Override
- public Set<SignalInfo> getPluginSignals() {
- Set<SignalInfo> signals = new ArraySet<>();
-
- signals.add(new SignalInfo("connected"));
- signals.add(new SignalInfo("disconnected"));
- signals.add(new SignalInfo("connect_error", Integer.class, String.class));
- signals.add(new SignalInfo("purchases_updated", Object[].class));
- signals.add(new SignalInfo("purchase_error", Integer.class, String.class));
- signals.add(new SignalInfo("sku_details_query_completed", Object[].class));
- signals.add(new SignalInfo("sku_details_query_error", Integer.class, String.class, String[].class));
- signals.add(new SignalInfo("purchase_acknowledged", String.class));
- signals.add(new SignalInfo("purchase_acknowledgement_error", Integer.class, String.class, String.class));
- signals.add(new SignalInfo("purchase_consumed", String.class));
- signals.add(new SignalInfo("purchase_consumption_error", Integer.class, String.class, String.class));
-
- return signals;
- }
-}
diff --git a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/GodotPaymentUtils.java b/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/GodotPaymentUtils.java
deleted file mode 100644
index f569c1b8bf..0000000000
--- a/platform/android/java/plugins/godotpayment/src/main/java/org/godotengine/godot/plugin/payment/utils/GodotPaymentUtils.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.godotengine.godot.plugin.payment.utils;
-
-import org.godotengine.godot.Dictionary;
-
-import com.android.billingclient.api.Purchase;
-import com.android.billingclient.api.SkuDetails;
-
-import java.util.List;
-
-public class GodotPaymentUtils {
- public static Dictionary convertPurchaseToDictionary(Purchase purchase) {
- Dictionary dictionary = new Dictionary();
- dictionary.put("order_id", purchase.getOrderId());
- dictionary.put("package_name", purchase.getPackageName());
- dictionary.put("purchase_state", Integer.valueOf(purchase.getPurchaseState()));
- dictionary.put("purchase_time", Long.valueOf(purchase.getPurchaseTime()));
- dictionary.put("purchase_token", purchase.getPurchaseToken());
- dictionary.put("signature", purchase.getSignature());
- dictionary.put("sku", purchase.getSku());
- dictionary.put("is_acknowledged", Boolean.valueOf(purchase.isAcknowledged()));
- dictionary.put("is_auto_renewing", Boolean.valueOf(purchase.isAutoRenewing()));
- return dictionary;
- }
-
- public static Dictionary convertSkuDetailsToDictionary(SkuDetails details) {
- Dictionary dictionary = new Dictionary();
- dictionary.put("sku", details.getSku());
- dictionary.put("title", details.getTitle());
- dictionary.put("description", details.getDescription());
- dictionary.put("price", details.getPrice());
- dictionary.put("price_currency_code", details.getPriceCurrencyCode());
- dictionary.put("price_amount_micros", Long.valueOf(details.getPriceAmountMicros()));
- dictionary.put("free_trial_period", details.getFreeTrialPeriod());
- dictionary.put("icon_url", details.getIconUrl());
- dictionary.put("introductory_price", details.getIntroductoryPrice());
- dictionary.put("introductory_price_amount_micros", Long.valueOf(details.getIntroductoryPriceAmountMicros()));
- dictionary.put("introductory_price_cycles", details.getIntroductoryPriceCycles());
- dictionary.put("introductory_price_period", details.getIntroductoryPricePeriod());
- dictionary.put("original_price", details.getOriginalPrice());
- dictionary.put("original_price_amount_micros", Long.valueOf(details.getOriginalPriceAmountMicros()));
- dictionary.put("subscription_period", details.getSubscriptionPeriod());
- dictionary.put("type", details.getType());
- dictionary.put("is_rewarded", Boolean.valueOf(details.isRewarded()));
- return dictionary;
- }
-
- public static Object[] convertPurchaseListToDictionaryObjectArray(List<Purchase> purchases) {
- Object[] purchaseDictionaries = new Object[purchases.size()];
-
- for (int i = 0; i < purchases.size(); i++) {
- purchaseDictionaries[i] = GodotPaymentUtils.convertPurchaseToDictionary(purchases.get(i));
- }
-
- return purchaseDictionaries;
- }
-
- public static Object[] convertSkuDetailsListToDictionaryObjectArray(List<SkuDetails> skuDetails) {
- Object[] skuDetailsDictionaries = new Object[skuDetails.size()];
-
- for (int i = 0; i < skuDetails.size(); i++) {
- skuDetailsDictionaries[i] = GodotPaymentUtils.convertSkuDetailsToDictionary(skuDetails.get(i));
- }
-
- return skuDetailsDictionaries;
- }
-}
diff --git a/platform/android/java/settings.gradle b/platform/android/java/settings.gradle
index 9536d3de6d..f6921c70aa 100644
--- a/platform/android/java/settings.gradle
+++ b/platform/android/java/settings.gradle
@@ -3,4 +3,3 @@ rootProject.name = "Godot"
include ':app'
include ':lib'
-include ':plugins:godotpayment'
diff --git a/platform/android/java_godot_lib_jni.cpp b/platform/android/java_godot_lib_jni.cpp
index 1f61c4a805..8667727b1d 100644
--- a/platform/android/java_godot_lib_jni.cpp
+++ b/platform/android/java_godot_lib_jni.cpp
@@ -435,6 +435,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_calldeferred(JNIEnv *
env->DeleteLocalRef(obj);
};
+ static_assert(VARIANT_ARG_MAX == 5, "This code needs to be updated if VARIANT_ARG_MAX != 5");
obj->call_deferred(str_method, args[0], args[1], args[2], args[3], args[4]);
// something
env->PopLocalFrame(nullptr);
diff --git a/platform/android/plugin/godot_plugin_config.h b/platform/android/plugin/godot_plugin_config.h
index 5bc0fc3a58..ea3c7b4f55 100644
--- a/platform/android/plugin/godot_plugin_config.h
+++ b/platform/android/plugin/godot_plugin_config.h
@@ -86,17 +86,18 @@ struct PluginConfig {
/*
* Set of prebuilt plugins.
+ * Currently unused, this is just for future reference:
*/
-static const PluginConfig GODOT_PAYMENT = {
- /*.valid_config =*/true,
- /*.last_updated =*/0,
- /*.name =*/"GodotPayment",
- /*.binary_type =*/"local",
- /*.binary =*/"res://android/build/libs/plugins/GodotPayment.release.aar",
- /*.local_dependencies =*/{},
- /*.remote_dependencies =*/String("com.android.billingclient:billing:2.2.1").split("|"),
- /*.custom_maven_repos =*/{}
-};
+// static const PluginConfig MY_PREBUILT_PLUGIN = {
+// /*.valid_config =*/true,
+// /*.last_updated =*/0,
+// /*.name =*/"GodotPayment",
+// /*.binary_type =*/"local",
+// /*.binary =*/"res://android/build/libs/plugins/GodotPayment.release.aar",
+// /*.local_dependencies =*/{},
+// /*.remote_dependencies =*/String("com.android.billingclient:billing:2.2.1").split("|"),
+// /*.custom_maven_repos =*/{}
+// };
static inline String resolve_local_dependency_path(String plugin_config_dir, String dependency_path) {
String absolute_path;
@@ -125,7 +126,7 @@ static inline PluginConfig resolve_prebuilt_plugin(PluginConfig prebuilt_plugin,
static inline Vector<PluginConfig> get_prebuilt_plugins(String plugins_base_dir) {
Vector<PluginConfig> prebuilt_plugins;
- prebuilt_plugins.push_back(resolve_prebuilt_plugin(GODOT_PAYMENT, plugins_base_dir));
+ // prebuilt_plugins.push_back(resolve_prebuilt_plugin(MY_PREBUILT_PLUGIN, plugins_base_dir));
return prebuilt_plugins;
}
diff --git a/platform/haiku/SCsub b/platform/haiku/SCsub
deleted file mode 100644
index dbff6c5ae9..0000000000
--- a/platform/haiku/SCsub
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-
-Import("env")
-
-common_haiku = [
- "os_haiku.cpp",
- "context_gl_haiku.cpp",
- "haiku_application.cpp",
- "haiku_direct_window.cpp",
- "haiku_gl_view.cpp",
- "key_mapping_haiku.cpp",
- "audio_driver_media_kit.cpp",
-]
-
-target = env.add_program("#bin/godot", ["godot_haiku.cpp"] + common_haiku)
-
-command = env.Command("#bin/godot.rsrc", "#platform/haiku/godot.rdef", ["rc -o $TARGET $SOURCE"])
-
-
-def addResourcesAction(target=None, source=None, env=None):
- return env.Execute("xres -o " + File(target)[0].path + " bin/godot.rsrc")
-
-
-env.AddPostAction(target, addResourcesAction)
-env.Depends(target, command)
diff --git a/platform/haiku/audio_driver_media_kit.cpp b/platform/haiku/audio_driver_media_kit.cpp
deleted file mode 100644
index 2fbbeeb176..0000000000
--- a/platform/haiku/audio_driver_media_kit.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/*************************************************************************/
-/* audio_driver_media_kit.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "audio_driver_media_kit.h"
-
-#ifdef MEDIA_KIT_ENABLED
-
-#include "core/project_settings.h"
-
-int32_t *AudioDriverMediaKit::samples_in = nullptr;
-
-Error AudioDriverMediaKit::init() {
- active = false;
-
- mix_rate = GLOBAL_GET("audio/mix_rate");
- speaker_mode = SPEAKER_MODE_STEREO;
- channels = 2;
-
- int latency = GLOBAL_GET("audio/output_latency");
- buffer_size = next_power_of_2(latency * mix_rate / 1000);
- samples_in = memnew_arr(int32_t, buffer_size * channels);
-
- media_raw_audio_format format;
- format = media_raw_audio_format::wildcard;
- format.frame_rate = mix_rate;
- format.channel_count = channels;
- format.format = media_raw_audio_format::B_AUDIO_INT;
- format.byte_order = B_MEDIA_LITTLE_ENDIAN;
- format.buffer_size = buffer_size * sizeof(int32_t) * channels;
-
- player = new BSoundPlayer(
- &format,
- "godot_sound_server",
- AudioDriverMediaKit::PlayBuffer,
- nullptr,
- this);
-
- if (player->InitCheck() != B_OK) {
- fprintf(stderr, "MediaKit ERR: can not create a BSoundPlayer instance\n");
- ERR_FAIL_COND_V(player == nullptr, ERR_CANT_OPEN);
- }
-
- player->Start();
-
- return OK;
-}
-
-void AudioDriverMediaKit::PlayBuffer(void *cookie, void *buffer, size_t size, const media_raw_audio_format &format) {
- AudioDriverMediaKit *ad = (AudioDriverMediaKit *)cookie;
- int32_t *buf = (int32_t *)buffer;
-
- if (!ad->active) {
- for (unsigned int i = 0; i < ad->buffer_size * ad->channels; i++) {
- AudioDriverMediaKit::samples_in[i] = 0;
- }
- } else {
- ad->lock();
- ad->audio_server_process(ad->buffer_size, AudioDriverMediaKit::samples_in);
- ad->unlock();
- }
-
- for (unsigned int i = 0; i < ad->buffer_size * ad->channels; i++) {
- buf[i] = AudioDriverMediaKit::samples_in[i];
- }
-}
-
-void AudioDriverMediaKit::start() {
- active = true;
-}
-
-int AudioDriverMediaKit::get_mix_rate() const {
- return mix_rate;
-}
-
-AudioDriverMediaKit::SpeakerMode AudioDriverMediaKit::get_speaker_mode() const {
- return speaker_mode;
-}
-
-void AudioDriverMediaKit::lock() {
- if (!mutex)
- return;
-
- mutex.lock();
-}
-
-void AudioDriverMediaKit::unlock() {
- if (!mutex)
- return;
-
- mutex.unlock();
-}
-
-void AudioDriverMediaKit::finish() {
- delete player;
-
- if (samples_in) {
- memdelete_arr(samples_in);
- };
-}
-
-AudioDriverMediaKit::AudioDriverMediaKit() {
- player = nullptr;
-}
-
-AudioDriverMediaKit::~AudioDriverMediaKit() {
-}
-
-#endif
diff --git a/platform/haiku/audio_driver_media_kit.h b/platform/haiku/audio_driver_media_kit.h
deleted file mode 100644
index 8272780fa7..0000000000
--- a/platform/haiku/audio_driver_media_kit.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*************************************************************************/
-/* audio_driver_media_kit.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "servers/audio_server.h"
-
-#ifdef MEDIA_KIT_ENABLED
-
-#include "core/os/mutex.h"
-#include "core/os/thread.h"
-
-#include <kernel/image.h> // needed for image_id
-
-#include <SoundPlayer.h>
-
-class AudioDriverMediaKit : public AudioDriver {
- Mutex mutex;
-
- BSoundPlayer *player;
- static int32_t *samples_in;
-
- static void PlayBuffer(void *cookie, void *buffer, size_t size, const media_raw_audio_format &format);
-
- unsigned int mix_rate;
- SpeakerMode speaker_mode;
- unsigned int buffer_size;
- int channels;
-
- bool active;
-
-public:
- const char *get_name() const {
- return "MediaKit";
- };
-
- virtual Error init();
- virtual void start();
- virtual int get_mix_rate() const;
- virtual SpeakerMode get_speaker_mode() const;
- virtual void lock();
- virtual void unlock();
- virtual void finish();
-
- AudioDriverMediaKit();
- ~AudioDriverMediaKit();
-};
-
-#endif
diff --git a/platform/haiku/context_gl_haiku.h b/platform/haiku/context_gl_haiku.h
deleted file mode 100644
index c5d258915d..0000000000
--- a/platform/haiku/context_gl_haiku.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*************************************************************************/
-/* context_gl_haiku.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef CONTEXT_GL_HAIKU_H
-#define CONTEXT_GL_HAIKU_H
-
-#if defined(OPENGL_ENABLED)
-
-#include "haiku_direct_window.h"
-#include "haiku_gl_view.h"
-
-class ContextGL_Haiku {
-private:
- HaikuGLView *view;
- HaikuDirectWindow *window;
-
- bool use_vsync;
-
-public:
- Error initialize();
- void release_current();
- void make_current();
- void swap_buffers();
- int get_window_width();
- int get_window_height();
-
- void set_use_vsync(bool p_use);
- bool is_using_vsync() const;
-
- ContextGL_Haiku(HaikuDirectWindow *p_window);
- ~ContextGL_Haiku();
-};
-
-#endif
-#endif
diff --git a/platform/haiku/detect.py b/platform/haiku/detect.py
deleted file mode 100644
index 0b84df8f9b..0000000000
--- a/platform/haiku/detect.py
+++ /dev/null
@@ -1,158 +0,0 @@
-import os
-import sys
-
-
-def is_active():
- return True
-
-
-def get_name():
- return "Haiku"
-
-
-def can_build():
-
- if os.name != "posix" or sys.platform == "darwin":
- return False
-
- return True
-
-
-def get_opts():
- from SCons.Variables import EnumVariable
-
- return [
- EnumVariable("debug_symbols", "Add debugging symbols to release builds", "yes", ("yes", "no", "full")),
- ]
-
-
-def get_flags():
-
- return []
-
-
-def configure(env):
-
- ## Build type
-
- if env["target"] == "release":
- env.Prepend(CCFLAGS=["-O3"])
- if env["debug_symbols"] == "yes":
- env.Prepend(CCFLAGS=["-g1"])
- if env["debug_symbols"] == "full":
- env.Prepend(CCFLAGS=["-g2"])
-
- elif env["target"] == "release_debug":
- env.Prepend(CCFLAGS=["-O2", "-DDEBUG_ENABLED"])
- if env["debug_symbols"] == "yes":
- env.Prepend(CCFLAGS=["-g1"])
- if env["debug_symbols"] == "full":
- env.Prepend(CCFLAGS=["-g2"])
-
- elif env["target"] == "debug":
- env.Prepend(CCFLAGS=["-g3", "-DDEBUG_ENABLED", "-DDEBUG_MEMORY_ENABLED"])
-
- ## Architecture
-
- is64 = sys.maxsize > 2 ** 32
- if env["bits"] == "default":
- env["bits"] = "64" if is64 else "32"
-
- ## Compiler configuration
-
- env["CC"] = "gcc-x86"
- env["CXX"] = "g++-x86"
-
- ## Dependencies
-
- if not env["builtin_libwebp"]:
- env.ParseConfig("pkg-config libwebp --cflags --libs")
-
- # freetype depends on libpng and zlib, so bundling one of them while keeping others
- # as shared libraries leads to weird issues
- if env["builtin_freetype"] or env["builtin_libpng"] or env["builtin_zlib"]:
- env["builtin_freetype"] = True
- env["builtin_libpng"] = True
- env["builtin_zlib"] = True
-
- if not env["builtin_freetype"]:
- env.ParseConfig("pkg-config freetype2 --cflags --libs")
-
- if not env["builtin_libpng"]:
- env.ParseConfig("pkg-config libpng16 --cflags --libs")
-
- if not env["builtin_bullet"]:
- # We need at least version 2.88
- import subprocess
-
- bullet_version = subprocess.check_output(["pkg-config", "bullet", "--modversion"]).strip()
- if bullet_version < "2.88":
- # Abort as system bullet was requested but too old
- print(
- "Bullet: System version {0} does not match minimal requirements ({1}). Aborting.".format(
- bullet_version, "2.88"
- )
- )
- sys.exit(255)
- env.ParseConfig("pkg-config bullet --cflags --libs")
-
- if not env["builtin_enet"]:
- env.ParseConfig("pkg-config libenet --cflags --libs")
-
- if not env["builtin_squish"]:
- env.ParseConfig("pkg-config libsquish --cflags --libs")
-
- if not env["builtin_zstd"]:
- env.ParseConfig("pkg-config libzstd --cflags --libs")
-
- # Sound and video libraries
- # Keep the order as it triggers chained dependencies (ogg needed by others, etc.)
-
- if not env["builtin_libtheora"]:
- env["builtin_libogg"] = False # Needed to link against system libtheora
- env["builtin_libvorbis"] = False # Needed to link against system libtheora
- env.ParseConfig("pkg-config theora theoradec --cflags --libs")
-
- if not env["builtin_libvpx"]:
- env.ParseConfig("pkg-config vpx --cflags --libs")
-
- if not env["builtin_libvorbis"]:
- env["builtin_libogg"] = False # Needed to link against system libvorbis
- env.ParseConfig("pkg-config vorbis vorbisfile --cflags --libs")
-
- if not env["builtin_opus"]:
- env["builtin_libogg"] = False # Needed to link against system opus
- env.ParseConfig("pkg-config opus opusfile --cflags --libs")
-
- if not env["builtin_libogg"]:
- env.ParseConfig("pkg-config ogg --cflags --libs")
-
- if env["builtin_libtheora"]:
- list_of_x86 = ["x86_64", "x86", "i386", "i586"]
- if any(platform.machine() in s for s in list_of_x86):
- env["x86_libtheora_opt_gcc"] = True
-
- if not env["builtin_wslay"]:
- env.ParseConfig("pkg-config libwslay --cflags --libs")
-
- if not env["builtin_mbedtls"]:
- # mbedTLS does not provide a pkgconfig config yet. See https://github.com/ARMmbed/mbedtls/issues/228
- env.Append(LIBS=["mbedtls", "mbedcrypto", "mbedx509"])
-
- if not env["builtin_miniupnpc"]:
- # No pkgconfig file so far, hardcode default paths.
- env.Prepend(CPPPATH=["/system/develop/headers/x86/miniupnpc"])
- env.Append(LIBS=["miniupnpc"])
-
- # On Linux wchar_t should be 32-bits
- # 16-bit library shouldn't be required due to compiler optimisations
- if not env["builtin_pcre2"]:
- env.ParseConfig("pkg-config libpcre2-32 --cflags --libs")
-
- ## Flags
-
- env.Prepend(CPPPATH=["#platform/haiku"])
- env.Append(CPPDEFINES=["UNIX_ENABLED", "OPENGL_ENABLED", "GLES_ENABLED"])
- env.Append(CPPDEFINES=["MEDIA_KIT_ENABLED"])
- env.Append(CPPDEFINES=["PTHREAD_NO_RENAME"]) # TODO: enable when we have pthread_setname_np
- env.Append(LIBS=["be", "game", "media", "network", "bnetapi", "z", "GL"])
diff --git a/platform/haiku/godot.rdef b/platform/haiku/godot.rdef
deleted file mode 100644
index a55cddbf0d..0000000000
--- a/platform/haiku/godot.rdef
+++ /dev/null
@@ -1,60 +0,0 @@
-resource app_version {
- major = 2,
- middle = 0,
- minor = 0,
-
- variety = B_APPV_FINAL,
- internal = 0,
-
- short_info = "Godot Game Engine",
- long_info = "An advanced, feature packed, multi-platform 2D and 3D game engine."
-};
-
-resource app_signature "application/x-vnd.godot";
-
-resource vector_icon {
- $"6E6369660403A39F9F05FF03478CBF03414042090A04B37FB379CC26B379CC26"
- $"CC20B37FCC200A09B5E9C41B2AC240B8E1BDFBBFA1BDA4C6A7BDFFCA1AC45CC9"
- $"7AC607C01CC75BB6F4C65A062AFE9FFF9F69FE7FFEDFCF0FC95FC3D7C95FC51E"
- $"C95FC51EC95FC53EC92BC565C94AC55BC92BC565C728C60BC728C60BC712C612"
- $"C6E6C600C6F9C60EC6D3C5F2C6C7C5C4C6C7C5DCC6C7C5C4C460C4E5C4BCC4E5"
- $"C626C4E5C626C4E5C64BC4A5C670C4CAC66BC4A5C670C1EDC6CFC1EDC6CFC1E9"
- $"C6CFC1E2C6D0C1E6C6D0C1D1C6D0C1B2C6BEC1BFC6C9C1A2C6AFC19851C198C6"
- $"9BC19851C505C031C507C507C016C507BFFCC507C507BE94C505BE9451BE9451"
- $"BE94C69BBE7BC6BEBE8BC6AFBE6DC6C9BE4AC6D0BE5CC6D0BE47C6D0BE40C6CF"
- $"BE44C6CFBE40C6CFBB87C670BB87C670BB63C66BBB47C626BB47C64BBB47C626"
- $"C4BCB965C460B965C5C4B965C5C4B965C5DCB947C600B95AC5F2B934C60EB904"
- $"C60BB91BC612B904C60BB701C565B701C565B6E3C55BB6CEC51EB6CEC53EB6CE"
- $"C51EC3D7B590C36CB590C36CB581C3B0B578C43AB578C3F5B578C78FBFF8CA27"
- $"BA2ACA22BFF8CA27BFFABFFCCA27BFFCCA27C5CACA22CA7CC43ACA7CC78FCA7C"
- $"C3FBCA67C37ECA754ACA67C37E0639F6F97FFEF8E7FFF9F6FFFFFFFFFF03B67D"
- $"BDEEC31FB730C35CB730C35CB74EC3662BC3A22BC3822BC3A2C4E8B8D1C55EB8"
- $"D1C406B8D1C406B8D1C3F0B8ECC3CDB8DBC3DBB8FDC3BFB929C3BDB913C3B9B9"
- $"29C3BDBB9FC436BB9FC436BBC2C43CBBDCC47EBBDCC45BBBDCC47EC5E6BE00C6"
- $"31BE00C4BBBE00C4BBBE00C4A7BE16C486BE08C494BE24C479BE4AC471BE37C4"
- $"71BE4AC471BE4BC016C473C1E2C471C1E2C471C1F6C471C217C486C209C479C2"
- $"25C494C22DC4BBC22DC4A7C22DC4BBC631C451C5E6C451C47EC451C47EC451C4"
- $"5BC48DC436C46AC43CC48DC436C704C3BDC704C3BDC719C3B9C741C3CDC730C3"
- $"BF53C3DBC75CC406C75CC3F0C75CC406C55EC8CAC4E8C8CAC3A2C8CAC3A2C8CA"
- $"C382C8FDC35CC8DFC366C8FDC35CC977C333BDEEC97ABDEEC97ABDEEC9F1BD56"
- $"CAC9BC0BCA60BCB6CA3DBB1CC8D9B981C991BA47C82FB9D7C6EDBAA0C789BA38"
- $"C69FBA52C5F0B9D0C647BA12C59BB98BC4E0B91FC53BB959C4FBB855C50EB6C0"
- $"C509B78FC424B64AC22DB5C4C32AB5FCC1C8B66DC11BB7D9C16BB725C0BCB7C9"
- $"BFFCB7C2C05CB7C3BFFCB7C2BFFCB7C2BFFCB7C2BFFBB7C2BFFAB7C2BFFAB7C2"
- $"BFF9B7C2BFF8B7C2BFF9B7C2BFF8B7C2BFF8B7C2BFF8B7C2BF98B7C3BED9B7D9"
- $"BF38B7C9BE88B725BDC7B5C4BE2CB66DBCCAB5FCBAE6B6C0BBD0B64ABAEBB78F"
- $"BB13B91F34B855BAB8B959BA04B9D0BA59B98BB9ADBA12B907BAA0B955BA52B8"
- $"6ABA38B71AB981B7C5B9D7B663BA47B52BBC0BB5B7BB1CB594BCB6B679BDEEB6"
- $"02BD56B679BDEE0005BD3EC06CBD3EC06CBD3EC197BB2147BC4C47B9F647B904"
- $"C06CB904C197B904BF41BB21BE4FB9F6BE4FBC4CBE4FBD3EC06CBD3EBF41BD3E"
- $"C06C0005BCBC42BCBC42BCBCC153BB55C1F3BC1BC1F3BA8EC1F3B9ED42B9EDC1"
- $"53B9EDBFC6BB55BF25BA8EBF25BC1BBF25BCBC42BCBCBFC6BCBC420007C01BC2"
- $"BBC01BC2BBBFBAC2BBBF6CC21CBF6CC274BF6CC21CBF6CC02ABF6CC02ABF6CBF"
- $"D3C01BBF8CBFBABF8CC07BBF8CC0C9C02AC0C9BFD3C0C9C02AC0C9C21CC0C9C2"
- $"1CC0C9C274C01BC2BBC07BC2BBC01BC2BB0005C2F7C06CC2F7C06CC2F7C197C5"
- $"1547C3E947C64047C732C06CC732C197C732BF41C515BE4FC640BE4FC3E9BE4F"
- $"C2F7C06CC2F7BF41C2F7C06C0005C37942C37942C379C153C4E1C1F3C41AC1F3"
- $"C5A7C1F3C64842C648C153C648BFC6C4E1BF25C5A7BF25C41ABF25C37942C379"
- $"BFC6C37942090A0000000A010101000A020102000A020103000A010104000A03"
- $"0105000A010106000A010107000A03010800"
-};
diff --git a/platform/haiku/haiku_application.cpp b/platform/haiku/haiku_application.cpp
deleted file mode 100644
index 82d9c093e1..0000000000
--- a/platform/haiku/haiku_application.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-/*************************************************************************/
-/* haiku_application.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "haiku_application.h"
-
-HaikuApplication::HaikuApplication() :
- BApplication("application/x-vnd.godot") {
-}
diff --git a/platform/haiku/haiku_application.h b/platform/haiku/haiku_application.h
deleted file mode 100644
index 2e04d921bf..0000000000
--- a/platform/haiku/haiku_application.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*************************************************************************/
-/* haiku_application.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef HAIKU_APPLICATION_H
-#define HAIKU_APPLICATION_H
-
-#include <kernel/image.h> // needed for image_id
-
-#include <Application.h>
-
-class HaikuApplication : public BApplication {
-public:
- HaikuApplication();
-};
-
-#endif
diff --git a/platform/haiku/haiku_direct_window.cpp b/platform/haiku/haiku_direct_window.cpp
deleted file mode 100644
index 0a40f847f4..0000000000
--- a/platform/haiku/haiku_direct_window.cpp
+++ /dev/null
@@ -1,363 +0,0 @@
-/*************************************************************************/
-/* haiku_direct_window.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include <UnicodeChar.h>
-
-#include "core/os/keyboard.h"
-#include "haiku_direct_window.h"
-#include "key_mapping_haiku.h"
-#include "main/main.h"
-
-HaikuDirectWindow::HaikuDirectWindow(BRect p_frame) :
- BDirectWindow(p_frame, "Godot", B_TITLED_WINDOW, B_QUIT_ON_WINDOW_CLOSE) {
- last_mouse_pos_valid = false;
- last_buttons_state = 0;
- last_button_mask = 0;
- last_key_modifier_state = 0;
-
- view = nullptr;
- update_runner = nullptr;
- input = nullptr;
- main_loop = nullptr;
-}
-
-HaikuDirectWindow::~HaikuDirectWindow() {
-}
-
-void HaikuDirectWindow::SetHaikuGLView(HaikuGLView *p_view) {
- view = p_view;
-}
-
-void HaikuDirectWindow::StartMessageRunner() {
- update_runner = new BMessageRunner(BMessenger(this),
- new BMessage(REDRAW_MSG), 1000000 / 60 /* 60 fps */);
-}
-
-void HaikuDirectWindow::StopMessageRunner() {
- delete update_runner;
-}
-
-void HaikuDirectWindow::SetInput(InputDefault *p_input) {
- input = p_input;
-}
-
-void HaikuDirectWindow::SetMainLoop(MainLoop *p_main_loop) {
- main_loop = p_main_loop;
-}
-
-bool HaikuDirectWindow::QuitRequested() {
- StopMessageRunner();
- main_loop->notification(NOTIFICATION_WM_CLOSE_REQUEST);
- return false;
-}
-
-void HaikuDirectWindow::DirectConnected(direct_buffer_info *info) {
- view->DirectConnected(info);
- view->EnableDirectMode(true);
-}
-
-void HaikuDirectWindow::MessageReceived(BMessage *message) {
- switch (message->what) {
- case REDRAW_MSG:
- if (Main::iteration()) {
- view->EnableDirectMode(false);
- Quit();
- }
- break;
-
- default:
- BDirectWindow::MessageReceived(message);
- }
-}
-
-void HaikuDirectWindow::DispatchMessage(BMessage *message, BHandler *handler) {
- switch (message->what) {
- case B_MOUSE_DOWN:
- case B_MOUSE_UP:
- HandleMouseButton(message);
- break;
-
- case B_MOUSE_MOVED:
- HandleMouseMoved(message);
- break;
-
- case B_MOUSE_WHEEL_CHANGED:
- HandleMouseWheelChanged(message);
- break;
-
- case B_KEY_DOWN:
- case B_KEY_UP:
- HandleKeyboardEvent(message);
- break;
-
- case B_MODIFIERS_CHANGED:
- HandleKeyboardModifierEvent(message);
- break;
-
- case B_WINDOW_RESIZED:
- HandleWindowResized(message);
- break;
-
- case LOCKGL_MSG:
- view->LockGL();
- break;
-
- case UNLOCKGL_MSG:
- view->UnlockGL();
- break;
-
- default:
- BDirectWindow::DispatchMessage(message, handler);
- }
-}
-
-void HaikuDirectWindow::HandleMouseButton(BMessage *message) {
- BPoint where;
- if (message->FindPoint("where", &where) != B_OK) {
- return;
- }
-
- uint32 modifiers = message->FindInt32("modifiers");
- uint32 buttons = message->FindInt32("buttons");
- uint32 button = buttons ^ last_buttons_state;
- last_buttons_state = buttons;
-
- // TODO: implement the mouse_mode checks
- /*
- if (mouse_mode == MOUSE_MODE_CAPTURED) {
- event.xbutton.x=last_mouse_pos.x;
- event.xbutton.y=last_mouse_pos.y;
- }
- */
-
- Ref<InputEventMouseButton> mouse_event;
- mouse_event.instance();
-
- mouse_event->set_button_mask(GetMouseButtonState(buttons));
- mouse_event->set_position({ where.x, where.y });
- mouse_event->set_global_position({ where.x, where.y });
- GetKeyModifierState(mouse_event, modifiers);
-
- switch (button) {
- default:
- case B_PRIMARY_MOUSE_BUTTON:
- mouse_event->set_button_index(1);
- break;
-
- case B_SECONDARY_MOUSE_BUTTON:
- mouse_event->set_button_index(2);
- break;
-
- case B_TERTIARY_MOUSE_BUTTON:
- mouse_event->set_button_index(3);
- break;
- }
-
- mouse_event->set_pressed(message->what == B_MOUSE_DOWN);
-
- if (message->what == B_MOUSE_DOWN && mouse_event->get_button_index() == 1) {
- int32 clicks = message->FindInt32("clicks");
-
- if (clicks > 1) {
- mouse_event->set_doubleclick(true);
- }
- }
-
- input->parse_input_event(mouse_event);
-}
-
-void HaikuDirectWindow::HandleMouseMoved(BMessage *message) {
- BPoint where;
- if (message->FindPoint("where", &where) != B_OK) {
- return;
- }
-
- Point2i pos(where.x, where.y);
- uint32 modifiers = message->FindInt32("modifiers");
- uint32 buttons = message->FindInt32("buttons");
-
- if (!last_mouse_pos_valid) {
- last_mouse_position = pos;
- last_mouse_pos_valid = true;
- }
-
- Point2i rel = pos - last_mouse_position;
-
- Ref<InputEventMouseMotion> motion_event;
- motion_event.instance();
- GetKeyModifierState(motion_event, modifiers);
-
- motion_event->set_button_mask(GetMouseButtonState(buttons));
- motion_event->set_position({ pos.x, pos.y });
- input->set_mouse_position(pos);
- motion_event->set_global_position({ pos.x, pos.y });
- motion_event->set_speed({ input->get_last_mouse_speed().x,
- input->get_last_mouse_speed().y });
-
- motion_event->set_relative({ rel.x, rel.y });
-
- last_mouse_position = pos;
-
- input->parse_input_event(motion_event);
-}
-
-void HaikuDirectWindow::HandleMouseWheelChanged(BMessage *message) {
- float wheel_delta_y = 0;
- if (message->FindFloat("be:wheel_delta_y", &wheel_delta_y) != B_OK) {
- return;
- }
-
- Ref<InputEventMouseButton> mouse_event;
- mouse_event.instance();
- //GetKeyModifierState(mouse_event, modifiers);
-
- mouse_event->set_button_index(wheel_delta_y < 0 ? 4 : 5);
- mouse_event->set_button_mask(last_button_mask);
- mouse_event->set_position({ last_mouse_position.x,
- last_mouse_position.y });
- mouse_event->set_global_position({ last_mouse_position.x,
- last_mouse_position.y });
-
- mouse_event->set_pressed(true);
- input->parse_input_event(mouse_event);
-
- mouse_event->set_pressed(false);
- input->parse_input_event(mouse_event);
-}
-
-void HaikuDirectWindow::HandleKeyboardEvent(BMessage *message) {
- int32 raw_char = 0;
- int32 key = 0;
- int32 modifiers = 0;
-
- if (message->FindInt32("raw_char", &raw_char) != B_OK) {
- return;
- }
-
- if (message->FindInt32("key", &key) != B_OK) {
- return;
- }
-
- if (message->FindInt32("modifiers", &modifiers) != B_OK) {
- return;
- }
-
- Ref<InputEventKey> event;
- event.instance();
- GetKeyModifierState(event, modifiers);
- event->set_pressed(message->what == B_KEY_DOWN);
- event->set_keycode(KeyMappingHaiku::get_keysym(raw_char, key));
- event->set_physical_keycode(KeyMappingHaiku::get_keysym(raw_char, key));
- event->set_echo(message->HasInt32("be:key_repeat"));
- event->set_unicode(0);
-
- const char *bytes = nullptr;
- if (message->FindString("bytes", &bytes) == B_OK) {
- event->set_unicode(BUnicodeChar::FromUTF8(&bytes));
- }
-
- //make it consistent across platforms.
- if (event->get_keycode() == KEY_BACKTAB) {
- event->set_keycode(KEY_TAB);
- event->set_physical_keycode(KEY_TAB);
- event->set_shift(true);
- }
-
- input->parse_input_event(event);
-}
-
-void HaikuDirectWindow::HandleKeyboardModifierEvent(BMessage *message) {
- int32 old_modifiers = 0;
- int32 modifiers = 0;
-
- if (message->FindInt32("be:old_modifiers", &old_modifiers) != B_OK) {
- return;
- }
-
- if (message->FindInt32("modifiers", &modifiers) != B_OK) {
- return;
- }
-
- int32 key = old_modifiers ^ modifiers;
-
- Ref<InputEventWithModifiers> event;
- event.instance();
- GetKeyModifierState(event, modifiers);
-
- event->set_shift(key & B_SHIFT_KEY);
- event->set_alt(key & B_OPTION_KEY);
- event->set_control(key & B_CONTROL_KEY);
- event->set_command(key & B_COMMAND_KEY);
-
- input->parse_input_event(event);
-}
-
-void HaikuDirectWindow::HandleWindowResized(BMessage *message) {
- int32 width = 0;
- int32 height = 0;
-
- if ((message->FindInt32("width", &width) != B_OK) || (message->FindInt32("height", &height) != B_OK)) {
- return;
- }
-
- current_video_mode->width = width;
- current_video_mode->height = height;
-}
-
-inline void HaikuDirectWindow::GetKeyModifierState(Ref<InputEventWithModifiers> event, uint32 p_state) {
- last_key_modifier_state = p_state;
-
- event->set_shift(p_state & B_SHIFT_KEY);
- event->set_control(p_state & B_CONTROL_KEY);
- event->set_alt(p_state & B_OPTION_KEY);
- event->set_metakey(p_state & B_COMMAND_KEY);
-
- return state;
-}
-
-inline int HaikuDirectWindow::GetMouseButtonState(uint32 p_state) {
- int state = 0;
-
- if (p_state & B_PRIMARY_MOUSE_BUTTON) {
- state |= 1 << 0;
- }
-
- if (p_state & B_SECONDARY_MOUSE_BUTTON) {
- state |= 1 << 1;
- }
-
- if (p_state & B_TERTIARY_MOUSE_BUTTON) {
- state |= 1 << 2;
- }
-
- last_button_mask = state;
-
- return state;
-}
diff --git a/platform/haiku/haiku_direct_window.h b/platform/haiku/haiku_direct_window.h
deleted file mode 100644
index 4817abbb7a..0000000000
--- a/platform/haiku/haiku_direct_window.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*************************************************************************/
-/* haiku_direct_window.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef HAIKU_DIRECT_WINDOW_H
-#define HAIKU_DIRECT_WINDOW_H
-
-#include <kernel/image.h> // needed for image_id
-
-#include <DirectWindow.h>
-
-#include "core/input/input.h"
-#include "core/os/os.h"
-
-#include "haiku_gl_view.h"
-
-#define REDRAW_MSG 'rdrw'
-#define LOCKGL_MSG 'glck'
-#define UNLOCKGL_MSG 'ulck'
-
-class HaikuDirectWindow : public BDirectWindow {
-private:
- Point2i last_mouse_position;
- bool last_mouse_pos_valid;
- uint32 last_buttons_state;
- uint32 last_key_modifier_state;
- int last_button_mask;
- OS::VideoMode *current_video_mode;
-
- MainLoop *main_loop;
- InputDefault *input;
- HaikuGLView *view;
- BMessageRunner *update_runner;
-
- void HandleMouseButton(BMessage *message);
- void HandleMouseMoved(BMessage *message);
- void HandleMouseWheelChanged(BMessage *message);
- void HandleWindowResized(BMessage *message);
- void HandleKeyboardEvent(BMessage *message);
- void HandleKeyboardModifierEvent(BMessage *message);
- inline void GetKeyModifierState(Ref<InputEventWithModifiers> event, uint32 p_state);
- inline int GetMouseButtonState(uint32 p_state);
-
-public:
- HaikuDirectWindow(BRect p_frame);
- ~HaikuDirectWindow();
-
- void SetHaikuGLView(HaikuGLView *p_view);
- void StartMessageRunner();
- void StopMessageRunner();
- void SetInput(InputDefault *p_input);
- void SetMainLoop(MainLoop *p_main_loop);
- inline void SetVideoMode(OS::VideoMode *video_mode) { current_video_mode = video_mode; };
- virtual bool QuitRequested();
- virtual void DirectConnected(direct_buffer_info *info);
- virtual void MessageReceived(BMessage *message);
- virtual void DispatchMessage(BMessage *message, BHandler *handler);
-
- inline Point2i GetLastMousePosition() { return last_mouse_position; };
- inline int GetLastButtonMask() { return last_button_mask; };
-};
-
-#endif
diff --git a/platform/haiku/haiku_gl_view.cpp b/platform/haiku/haiku_gl_view.cpp
deleted file mode 100644
index 970a1276fd..0000000000
--- a/platform/haiku/haiku_gl_view.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-/*************************************************************************/
-/* haiku_gl_view.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "haiku_gl_view.h"
-#include "main/main.h"
-
-HaikuGLView::HaikuGLView(BRect frame, uint32 type) :
- BGLView(frame, "GodotGLView", B_FOLLOW_ALL_SIDES, 0, type) {
-}
-
-void HaikuGLView::AttachedToWindow(void) {
- LockGL();
- BGLView::AttachedToWindow();
- UnlockGL();
- MakeFocus();
-}
-
-void HaikuGLView::Draw(BRect updateRect) {
- Main::force_redraw();
-}
diff --git a/platform/haiku/haiku_gl_view.h b/platform/haiku/haiku_gl_view.h
deleted file mode 100644
index 59e02d2367..0000000000
--- a/platform/haiku/haiku_gl_view.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*************************************************************************/
-/* haiku_gl_view.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef HAIKU_GL_VIEW_H
-#define HAIKU_GL_VIEW_H
-
-#include <kernel/image.h> // needed for image_id
-
-#include <GLView.h>
-
-class HaikuGLView : public BGLView {
-public:
- HaikuGLView(BRect frame, uint32 type);
- virtual void AttachedToWindow(void);
- virtual void Draw(BRect updateRect);
-};
-
-#endif
diff --git a/platform/haiku/key_mapping_haiku.cpp b/platform/haiku/key_mapping_haiku.cpp
deleted file mode 100644
index 692a1e5a78..0000000000
--- a/platform/haiku/key_mapping_haiku.cpp
+++ /dev/null
@@ -1,249 +0,0 @@
-/*************************************************************************/
-/* key_mapping_haiku.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include <InterfaceDefs.h>
-
-#include "core/os/keyboard.h"
-#include "key_mapping_haiku.h"
-
-struct _HaikuTranslatePair {
- unsigned int keysym;
- int32 keycode;
-};
-
-static _HaikuTranslatePair _mod_to_keycode[] = {
- { KEY_SHIFT, B_SHIFT_KEY },
- { KEY_ALT, B_COMMAND_KEY },
- { KEY_CONTROL, B_CONTROL_KEY },
- { KEY_CAPSLOCK, B_CAPS_LOCK },
- { KEY_SCROLLLOCK, B_SCROLL_LOCK },
- { KEY_NUMLOCK, B_NUM_LOCK },
- { KEY_SUPER_L, B_OPTION_KEY },
- { KEY_MENU, B_MENU_KEY },
- { KEY_SHIFT, B_LEFT_SHIFT_KEY },
- { KEY_SHIFT, B_RIGHT_SHIFT_KEY },
- { KEY_ALT, B_LEFT_COMMAND_KEY },
- { KEY_ALT, B_RIGHT_COMMAND_KEY },
- { KEY_CONTROL, B_LEFT_CONTROL_KEY },
- { KEY_CONTROL, B_RIGHT_CONTROL_KEY },
- { KEY_SUPER_L, B_LEFT_OPTION_KEY },
- { KEY_SUPER_R, B_RIGHT_OPTION_KEY },
- { KEY_UNKNOWN, 0 }
-};
-
-static _HaikuTranslatePair _fn_to_keycode[] = {
- { KEY_F1, B_F1_KEY },
- { KEY_F2, B_F2_KEY },
- { KEY_F3, B_F3_KEY },
- { KEY_F4, B_F4_KEY },
- { KEY_F5, B_F5_KEY },
- { KEY_F6, B_F6_KEY },
- { KEY_F7, B_F7_KEY },
- { KEY_F8, B_F8_KEY },
- { KEY_F9, B_F9_KEY },
- { KEY_F10, B_F10_KEY },
- { KEY_F11, B_F11_KEY },
- { KEY_F12, B_F12_KEY },
- //{ KEY_F13, ? },
- //{ KEY_F14, ? },
- //{ KEY_F15, ? },
- //{ KEY_F16, ? },
- { KEY_PRINT, B_PRINT_KEY },
- { KEY_SCROLLLOCK, B_SCROLL_KEY },
- { KEY_PAUSE, B_PAUSE_KEY },
- { KEY_UNKNOWN, 0 }
-};
-
-static _HaikuTranslatePair _hb_to_keycode[] = {
- { KEY_BACKSPACE, B_BACKSPACE },
- { KEY_TAB, B_TAB },
- { KEY_ENTER, B_RETURN },
- { KEY_CAPSLOCK, B_CAPS_LOCK },
- { KEY_ESCAPE, B_ESCAPE },
- { KEY_SPACE, B_SPACE },
- { KEY_PAGEUP, B_PAGE_UP },
- { KEY_PAGEDOWN, B_PAGE_DOWN },
- { KEY_END, B_END },
- { KEY_HOME, B_HOME },
- { KEY_LEFT, B_LEFT_ARROW },
- { KEY_UP, B_UP_ARROW },
- { KEY_RIGHT, B_RIGHT_ARROW },
- { KEY_DOWN, B_DOWN_ARROW },
- { KEY_PRINT, B_PRINT_KEY },
- { KEY_INSERT, B_INSERT },
- { KEY_DELETE, B_DELETE },
- // { KEY_HELP, ??? },
-
- { KEY_0, (0x30) },
- { KEY_1, (0x31) },
- { KEY_2, (0x32) },
- { KEY_3, (0x33) },
- { KEY_4, (0x34) },
- { KEY_5, (0x35) },
- { KEY_6, (0x36) },
- { KEY_7, (0x37) },
- { KEY_8, (0x38) },
- { KEY_9, (0x39) },
- { KEY_A, (0x61) },
- { KEY_B, (0x62) },
- { KEY_C, (0x63) },
- { KEY_D, (0x64) },
- { KEY_E, (0x65) },
- { KEY_F, (0x66) },
- { KEY_G, (0x67) },
- { KEY_H, (0x68) },
- { KEY_I, (0x69) },
- { KEY_J, (0x6A) },
- { KEY_K, (0x6B) },
- { KEY_L, (0x6C) },
- { KEY_M, (0x6D) },
- { KEY_N, (0x6E) },
- { KEY_O, (0x6F) },
- { KEY_P, (0x70) },
- { KEY_Q, (0x71) },
- { KEY_R, (0x72) },
- { KEY_S, (0x73) },
- { KEY_T, (0x74) },
- { KEY_U, (0x75) },
- { KEY_V, (0x76) },
- { KEY_W, (0x77) },
- { KEY_X, (0x78) },
- { KEY_Y, (0x79) },
- { KEY_Z, (0x7A) },
-
- /*
-{ KEY_PLAY, VK_PLAY},// (0xFA)
-{ KEY_STANDBY,VK_SLEEP },//(0x5F)
-{ KEY_BACK,VK_BROWSER_BACK},// (0xA6)
-{ KEY_FORWARD,VK_BROWSER_FORWARD},// (0xA7)
-{ KEY_REFRESH,VK_BROWSER_REFRESH},// (0xA8)
-{ KEY_STOP,VK_BROWSER_STOP},// (0xA9)
-{ KEY_SEARCH,VK_BROWSER_SEARCH},// (0xAA)
-{ KEY_FAVORITES, VK_BROWSER_FAVORITES},// (0xAB)
-{ KEY_HOMEPAGE,VK_BROWSER_HOME},// (0xAC)
-{ KEY_VOLUMEMUTE,VK_VOLUME_MUTE},// (0xAD)
-{ KEY_VOLUMEDOWN,VK_VOLUME_DOWN},// (0xAE)
-{ KEY_VOLUMEUP,VK_VOLUME_UP},// (0xAF)
-{ KEY_MEDIANEXT,VK_MEDIA_NEXT_TRACK},// (0xB0)
-{ KEY_MEDIAPREVIOUS,VK_MEDIA_PREV_TRACK},// (0xB1)
-{ KEY_MEDIASTOP,VK_MEDIA_STOP},// (0xB2)
-{ KEY_LAUNCHMAIL, VK_LAUNCH_MAIL},// (0xB4)
-{ KEY_LAUNCHMEDIA,VK_LAUNCH_MEDIA_SELECT},// (0xB5)
-{ KEY_LAUNCH0,VK_LAUNCH_APP1},// (0xB6)
-{ KEY_LAUNCH1,VK_LAUNCH_APP2},// (0xB7)
-*/
-
- { KEY_SEMICOLON, 0x3B },
- { KEY_EQUAL, 0x3D },
- { KEY_COLON, 0x2C },
- { KEY_MINUS, 0x2D },
- { KEY_PERIOD, 0x2E },
- { KEY_SLASH, 0x2F },
- { KEY_KP_MULTIPLY, 0x2A },
- { KEY_KP_ADD, 0x2B },
-
- { KEY_QUOTELEFT, 0x60 },
- { KEY_BRACKETLEFT, 0x5B },
- { KEY_BACKSLASH, 0x5C },
- { KEY_BRACKETRIGHT, 0x5D },
- { KEY_APOSTROPHE, 0x27 },
-
- { KEY_UNKNOWN, 0 }
-};
-
-unsigned int KeyMappingHaiku::get_keysym(int32 raw_char, int32 key) {
- if (raw_char == B_INSERT && key == 0x64) {
- return KEY_KP_0;
- }
- if (raw_char == B_END && key == 0x58) {
- return KEY_KP_1;
- }
- if (raw_char == B_DOWN_ARROW && key == 0x59) {
- return KEY_KP_2;
- }
- if (raw_char == B_PAGE_DOWN && key == 0x5A) {
- return KEY_KP_3;
- }
- if (raw_char == B_LEFT_ARROW && key == 0x48) {
- return KEY_KP_4;
- }
- if (raw_char == 0x35 && key == 0x49) {
- return KEY_KP_5;
- }
- if (raw_char == B_RIGHT_ARROW && key == 0x4A) {
- return KEY_KP_6;
- }
- if (raw_char == B_HOME && key == 0x37) {
- return KEY_KP_7;
- }
- if (raw_char == B_UP_ARROW && key == 0x38) {
- return KEY_KP_8;
- }
- if (raw_char == B_PAGE_UP && key == 0x39) {
- return KEY_KP_9;
- }
- if (raw_char == 0x2F && key == 0x23) {
- return KEY_KP_DIVIDE;
- }
- if (raw_char == 0x2D && key == 0x25) {
- return KEY_KP_SUBTRACT;
- }
- if (raw_char == B_DELETE && key == 0x65) {
- return KEY_KP_PERIOD;
- }
-
- if (raw_char == 0x10) {
- for (int i = 0; _fn_to_keycode[i].keysym != KEY_UNKNOWN; i++) {
- if (_fn_to_keycode[i].keycode == key) {
- return _fn_to_keycode[i].keysym;
- }
- }
-
- return KEY_UNKNOWN;
- }
-
- for (int i = 0; _hb_to_keycode[i].keysym != KEY_UNKNOWN; i++) {
- if (_hb_to_keycode[i].keycode == raw_char) {
- return _hb_to_keycode[i].keysym;
- }
- }
-
- return KEY_UNKNOWN;
-}
-
-unsigned int KeyMappingHaiku::get_modifier_keysym(int32 key) {
- for (int i = 0; _mod_to_keycode[i].keysym != KEY_UNKNOWN; i++) {
- if ((_mod_to_keycode[i].keycode & key) != 0) {
- return _mod_to_keycode[i].keysym;
- }
- }
-
- return KEY_UNKNOWN;
-}
diff --git a/platform/haiku/key_mapping_haiku.h b/platform/haiku/key_mapping_haiku.h
deleted file mode 100644
index e735108e44..0000000000
--- a/platform/haiku/key_mapping_haiku.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*************************************************************************/
-/* key_mapping_haiku.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef KEY_MAPPING_HAIKU_H
-#define KEY_MAPPING_HAIKU_H
-
-class KeyMappingHaiku {
- KeyMappingHaiku() {}
-
-public:
- static unsigned int get_keysym(int32 raw_char, int32 key);
- static unsigned int get_modifier_keysym(int32 key);
-};
-
-#endif
diff --git a/platform/haiku/logo.png b/platform/haiku/logo.png
deleted file mode 100644
index a2d8e242a6..0000000000
--- a/platform/haiku/logo.png
+++ /dev/null
Binary files differ
diff --git a/platform/haiku/os_haiku.cpp b/platform/haiku/os_haiku.cpp
deleted file mode 100644
index 7a2591784f..0000000000
--- a/platform/haiku/os_haiku.cpp
+++ /dev/null
@@ -1,358 +0,0 @@
-/*************************************************************************/
-/* os_haiku.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "os_haiku.h"
-
-#include "drivers/gles2/rasterizer_gles2.h"
-#include "main/main.h"
-#include "servers/physics_3d/physics_server_3d_sw.h"
-#include "servers/rendering/rendering_server_raster.h"
-#include "servers/rendering/rendering_server_wrap_mt.h"
-
-#include <Screen.h>
-
-OS_Haiku::OS_Haiku() {
-#ifdef MEDIA_KIT_ENABLED
- AudioDriverManager::add_driver(&driver_media_kit);
-#endif
-};
-
-void OS_Haiku::run() {
- if (!main_loop) {
- return;
- }
-
- main_loop->init();
- context_gl->release_current();
-
- // TODO: clean up
- BMessenger *bms = new BMessenger(window);
- BMessage *msg = new BMessage();
- bms->SendMessage(LOCKGL_MSG, msg);
-
- window->StartMessageRunner();
- app->Run();
- window->StopMessageRunner();
-
- delete app;
-
- delete bms;
- delete msg;
- main_loop->finish();
-}
-
-String OS_Haiku::get_name() const {
- return "Haiku";
-}
-
-int OS_Haiku::get_video_driver_count() const {
- return 1;
-}
-
-const char *OS_Haiku::get_video_driver_name(int p_driver) const {
- return "GLES2";
-}
-
-int OS_Haiku::get_current_video_driver() const {
- return video_driver_index;
-}
-
-Error OS_Haiku::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
- main_loop = nullptr;
- current_video_mode = p_desired;
-
- app = new HaikuApplication();
-
- BRect frame;
- frame.Set(50, 50, 50 + current_video_mode.width - 1, 50 + current_video_mode.height - 1);
-
- window = new HaikuDirectWindow(frame);
- window->SetVideoMode(&current_video_mode);
-
- if (current_video_mode.fullscreen) {
- window->SetFullScreen(true);
- }
-
- if (!current_video_mode.resizable) {
- uint32 flags = window->Flags();
- flags |= B_NOT_RESIZABLE;
- window->SetFlags(flags);
- }
-
-#if defined(OPENGL_ENABLED)
- context_gl = memnew(ContextGL_Haiku(window));
- context_gl->initialize();
- context_gl->make_current();
- context_gl->set_use_vsync(current_video_mode.use_vsync);
- // FIXME: That's not how the rasterizer setup should happen.
- RasterizerGLES2::register_config();
- RasterizerGLES2::make_current();
-#endif
-
- rendering_server = memnew(RenderingServerRaster);
- // FIXME: Reimplement threaded rendering
- if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) {
- rendering_server = memnew(RenderingServerWrapMT(rendering_server, false));
- }
-
- ERR_FAIL_COND_V(!rendering_server, ERR_UNAVAILABLE);
-
- video_driver_index = p_video_driver;
-
- input = memnew(InputDefault);
- window->SetInput(input);
-
- window->Show();
- rendering_server->init();
-
- AudioDriverManager::initialize(p_audio_driver);
-
- return OK;
-}
-
-void OS_Haiku::finalize() {
- if (main_loop) {
- memdelete(main_loop);
- }
-
- main_loop = nullptr;
-
- rendering_server->finish();
- memdelete(rendering_server);
-
- memdelete(input);
-
-#if defined(OPENGL_ENABLED)
- memdelete(context_gl);
-#endif
-}
-
-void OS_Haiku::set_main_loop(MainLoop *p_main_loop) {
- main_loop = p_main_loop;
- input->set_main_loop(p_main_loop);
- window->SetMainLoop(p_main_loop);
-}
-
-MainLoop *OS_Haiku::get_main_loop() const {
- return main_loop;
-}
-
-void OS_Haiku::delete_main_loop() {
- if (main_loop) {
- memdelete(main_loop);
- }
-
- main_loop = nullptr;
- window->SetMainLoop(nullptr);
-}
-
-void OS_Haiku::release_rendering_thread() {
- context_gl->release_current();
-}
-
-void OS_Haiku::make_rendering_thread() {
- context_gl->make_current();
-}
-
-bool OS_Haiku::can_draw() const {
- // TODO: implement
- return true;
-}
-
-void OS_Haiku::swap_buffers() {
- context_gl->swap_buffers();
-}
-
-Point2 OS_Haiku::get_mouse_position() const {
- return window->GetLastMousePosition();
-}
-
-int OS_Haiku::get_mouse_button_state() const {
- return window->GetLastButtonMask();
-}
-
-void OS_Haiku::set_cursor_shape(CursorShape p_shape) {
- //ERR_PRINT("set_cursor_shape() NOT IMPLEMENTED");
-}
-
-OS::CursorShape OS_Haiku::get_cursor_shape() const {
- // TODO: implement get_cursor_shape
-}
-
-void OS_Haiku::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot) {
- // TODO
-}
-
-int OS_Haiku::get_screen_count() const {
- // TODO: implement get_screen_count()
- return 1;
-}
-
-int OS_Haiku::get_current_screen() const {
- // TODO: implement get_current_screen()
- return 0;
-}
-
-void OS_Haiku::set_current_screen(int p_screen) {
- // TODO: implement set_current_screen()
-}
-
-Point2 OS_Haiku::get_screen_position(int p_screen) const {
- // TODO: make this work with the p_screen parameter
- BScreen *screen = new BScreen(window);
- BRect frame = screen->Frame();
- delete screen;
- return Point2i(frame.left, frame.top);
-}
-
-Size2 OS_Haiku::get_screen_size(int p_screen) const {
- // TODO: make this work with the p_screen parameter
- BScreen *screen = new BScreen(window);
- BRect frame = screen->Frame();
- delete screen;
- return Size2i(frame.IntegerWidth() + 1, frame.IntegerHeight() + 1);
-}
-
-void OS_Haiku::set_window_title(const String &p_title) {
- window->SetTitle(p_title.utf8().get_data());
-}
-
-Size2 OS_Haiku::get_window_size() const {
- BSize size = window->Size();
- return Size2i(size.IntegerWidth() + 1, size.IntegerHeight() + 1);
-}
-
-void OS_Haiku::set_window_size(const Size2 p_size) {
- // TODO: why does it stop redrawing after this is called?
- window->ResizeTo(p_size.x, p_size.y);
-}
-
-Point2 OS_Haiku::get_window_position() const {
- BPoint point(0, 0);
- window->ConvertToScreen(&point);
- return Point2i(point.x, point.y);
-}
-
-void OS_Haiku::set_window_position(const Point2 &p_position) {
- window->MoveTo(p_position.x, p_position.y);
-}
-
-void OS_Haiku::set_window_fullscreen(bool p_enabled) {
- window->SetFullScreen(p_enabled);
- current_video_mode.fullscreen = p_enabled;
- rendering_server->init();
-}
-
-bool OS_Haiku::is_window_fullscreen() const {
- return current_video_mode.fullscreen;
-}
-
-void OS_Haiku::set_window_resizable(bool p_enabled) {
- uint32 flags = window->Flags();
-
- if (p_enabled) {
- flags &= ~(B_NOT_RESIZABLE);
- } else {
- flags |= B_NOT_RESIZABLE;
- }
-
- window->SetFlags(flags);
- current_video_mode.resizable = p_enabled;
-}
-
-bool OS_Haiku::is_window_resizable() const {
- return current_video_mode.resizable;
-}
-
-void OS_Haiku::set_window_minimized(bool p_enabled) {
- window->Minimize(p_enabled);
-}
-
-bool OS_Haiku::is_window_minimized() const {
- return window->IsMinimized();
-}
-
-void OS_Haiku::set_window_maximized(bool p_enabled) {
- window->Minimize(!p_enabled);
-}
-
-bool OS_Haiku::is_window_maximized() const {
- return !window->IsMinimized();
-}
-
-void OS_Haiku::set_video_mode(const VideoMode &p_video_mode, int p_screen) {
- ERR_PRINT("set_video_mode() NOT IMPLEMENTED");
-}
-
-OS::VideoMode OS_Haiku::get_video_mode(int p_screen) const {
- return current_video_mode;
-}
-
-void OS_Haiku::get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen) const {
- ERR_PRINT("get_fullscreen_mode_list() NOT IMPLEMENTED");
-}
-
-String OS_Haiku::get_executable_path() const {
- return OS::get_executable_path();
-}
-
-bool OS_Haiku::_check_internal_feature_support(const String &p_feature) {
- return p_feature == "pc";
-}
-
-String OS_Haiku::get_config_path() const {
- if (has_environment("XDG_CONFIG_HOME")) {
- return get_environment("XDG_CONFIG_HOME");
- } else if (has_environment("HOME")) {
- return get_environment("HOME").plus_file("config/settings");
- } else {
- return ".";
- }
-}
-
-String OS_Haiku::get_data_path() const {
- if (has_environment("XDG_DATA_HOME")) {
- return get_environment("XDG_DATA_HOME");
- } else if (has_environment("HOME")) {
- return get_environment("HOME").plus_file("config/data");
- } else {
- return get_config_path();
- }
-}
-
-String OS_Haiku::get_cache_path() const {
- if (has_environment("XDG_CACHE_HOME")) {
- return get_environment("XDG_CACHE_HOME");
- } else if (has_environment("HOME")) {
- return get_environment("HOME").plus_file("config/cache");
- } else {
- return get_config_path();
- }
-}
diff --git a/platform/haiku/os_haiku.h b/platform/haiku/os_haiku.h
deleted file mode 100644
index d3ef9400d4..0000000000
--- a/platform/haiku/os_haiku.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*************************************************************************/
-/* os_haiku.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef OS_HAIKU_H
-#define OS_HAIKU_H
-
-#include "audio_driver_media_kit.h"
-#include "context_gl_haiku.h"
-#include "core/input/input.h"
-#include "drivers/unix/os_unix.h"
-#include "haiku_application.h"
-#include "haiku_direct_window.h"
-#include "servers/audio_server.h"
-#include "servers/rendering_server.h"
-
-class OS_Haiku : public OS_Unix {
-private:
- HaikuApplication *app;
- HaikuDirectWindow *window;
- MainLoop *main_loop;
- InputDefault *input;
- RenderingServer *rendering_server;
- VideoMode current_video_mode;
- int video_driver_index;
-
-#ifdef MEDIA_KIT_ENABLED
- AudioDriverMediaKit driver_media_kit;
-#endif
-
-#if defined(OPENGL_ENABLED)
- ContextGL_Haiku *context_gl;
-#endif
-
- virtual void delete_main_loop();
-
-protected:
- virtual int get_video_driver_count() const;
- virtual const char *get_video_driver_name(int p_driver) const;
- virtual int get_current_video_driver() const;
-
- virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
- virtual void finalize();
-
- virtual void set_main_loop(MainLoop *p_main_loop);
-
-public:
- OS_Haiku();
- void run();
-
- virtual String get_name() const;
-
- virtual MainLoop *get_main_loop() const;
-
- virtual bool can_draw() const;
- virtual void release_rendering_thread();
- virtual void make_rendering_thread();
- virtual void swap_buffers();
-
- virtual Point2 get_mouse_position() const;
- virtual int get_mouse_button_state() const;
- virtual void set_cursor_shape(CursorShape p_shape);
- virtual CursorShape get_cursor_shape() const;
- virtual void set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, const Vector2 &p_hotspot);
-
- virtual int get_screen_count() const;
- virtual int get_current_screen() const;
- virtual void set_current_screen(int p_screen);
- virtual Point2 get_screen_position(int p_screen = -1) const;
- virtual Size2 get_screen_size(int p_screen = -1) const;
- virtual void set_window_title(const String &p_title);
- virtual Size2 get_window_size() const;
- virtual void set_window_size(const Size2 p_size);
- virtual Point2 get_window_position() const;
- virtual void set_window_position(const Point2 &p_position);
- virtual void set_window_fullscreen(bool p_enabled);
- virtual bool is_window_fullscreen() const;
- virtual void set_window_resizable(bool p_enabled);
- virtual bool is_window_resizable() const;
- virtual void set_window_minimized(bool p_enabled);
- virtual bool is_window_minimized() const;
- virtual void set_window_maximized(bool p_enabled);
- virtual bool is_window_maximized() const;
-
- virtual void set_video_mode(const VideoMode &p_video_mode, int p_screen = 0);
- virtual VideoMode get_video_mode(int p_screen = 0) const;
- virtual void get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen = 0) const;
- virtual String get_executable_path() const;
-
- virtual bool _check_internal_feature_support(const String &p_feature);
-
- virtual String get_config_path() const;
- virtual String get_data_path() const;
- virtual String get_cache_path() const;
-};
-
-#endif
diff --git a/platform/haiku/platform_config.h b/platform/haiku/platform_config.h
deleted file mode 100644
index f2d5418adf..0000000000
--- a/platform/haiku/platform_config.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*************************************************************************/
-/* platform_config.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include <alloca.h>
-
-// for ifaddrs.h needed in drivers/unix/ip_unix.cpp
-#define _BSD_SOURCE 1
-
-#define GLES2_INCLUDE_H "thirdparty/glad/glad/glad.h"
diff --git a/platform/iphone/export/export.cpp b/platform/iphone/export/export.cpp
index 63c3cb8c23..aadc60175b 100644
--- a/platform/iphone/export/export.cpp
+++ b/platform/iphone/export/export.cpp
@@ -217,7 +217,7 @@ void EditorExportPlatformIOS::get_export_options(List<ExportOption> *r_options)
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/name", PROPERTY_HINT_PLACEHOLDER_TEXT, "Game Name"), ""));
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/info"), "Made with Godot Engine"));
- r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/identifier", PROPERTY_HINT_PLACEHOLDER_TEXT, "com.example.game"), ""));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/bundle_identifier", PROPERTY_HINT_PLACEHOLDER_TEXT, "com.example.game"), ""));
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/signature"), ""));
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/short_version"), "1.0"));
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/version"), "1.0"));
@@ -293,8 +293,8 @@ void EditorExportPlatformIOS::_fix_config_file(const Ref<EditorExportPreset> &p_
strnew += lines[i].replace("$name", p_config.pkg_name) + "\n";
} else if (lines[i].find("$info") != -1) {
strnew += lines[i].replace("$info", p_preset->get("application/info")) + "\n";
- } else if (lines[i].find("$identifier") != -1) {
- strnew += lines[i].replace("$identifier", p_preset->get("application/identifier")) + "\n";
+ } else if (lines[i].find("$bundle_identifier") != -1) {
+ strnew += lines[i].replace("$bundle_identifier", p_preset->get("application/bundle_identifier")) + "\n";
} else if (lines[i].find("$short_version") != -1) {
strnew += lines[i].replace("$short_version", p_preset->get("application/short_version")) + "\n";
} else if (lines[i].find("$version") != -1) {
@@ -1346,7 +1346,7 @@ bool EditorExportPlatformIOS::can_export(const Ref<EditorExportPreset> &p_preset
valid = false;
}
- String identifier = p_preset->get("application/identifier");
+ String identifier = p_preset->get("application/bundle_identifier");
String pn_err;
if (!is_package_name_valid(identifier, &pn_err)) {
err += TTR("Invalid Identifier:") + " " + pn_err + "\n";
diff --git a/platform/osx/display_server_osx.mm b/platform/osx/display_server_osx.mm
index 4a94e09c1c..920fd24c4a 100644
--- a/platform/osx/display_server_osx.mm
+++ b/platform/osx/display_server_osx.mm
@@ -1937,10 +1937,14 @@ void DisplayServerOSX::mouse_set_mode(MouseMode p_mode) {
// Apple Docs state that the display parameter is not used.
// "This parameter is not used. By default, you may pass kCGDirectMainDisplay."
// https://developer.apple.com/library/mac/documentation/graphicsimaging/reference/Quartz_Services_Ref/Reference/reference.html
- CGDisplayHideCursor(kCGDirectMainDisplay);
+ if (mouse_mode == MOUSE_MODE_VISIBLE || mouse_mode == MOUSE_MODE_CONFINED) {
+ CGDisplayHideCursor(kCGDirectMainDisplay);
+ }
CGAssociateMouseAndMouseCursorPosition(false);
} else if (p_mode == MOUSE_MODE_HIDDEN) {
- CGDisplayHideCursor(kCGDirectMainDisplay);
+ if (mouse_mode == MOUSE_MODE_VISIBLE || mouse_mode == MOUSE_MODE_CONFINED) {
+ CGDisplayHideCursor(kCGDirectMainDisplay);
+ }
CGAssociateMouseAndMouseCursorPosition(true);
} else {
CGDisplayShowCursor(kCGDirectMainDisplay);
diff --git a/platform/osx/export/export.cpp b/platform/osx/export/export.cpp
index c9b01ebbb4..9af7c02351 100644
--- a/platform/osx/export/export.cpp
+++ b/platform/osx/export/export.cpp
@@ -145,7 +145,7 @@ void EditorExportPlatformOSX::get_export_options(List<ExportOption> *r_options)
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/name", PROPERTY_HINT_PLACEHOLDER_TEXT, "Game Name"), ""));
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/info"), "Made with Godot Engine"));
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/icon", PROPERTY_HINT_FILE, "*.png,*.icns"), ""));
- r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/identifier", PROPERTY_HINT_PLACEHOLDER_TEXT, "com.example.game"), ""));
+ r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/bundle_identifier", PROPERTY_HINT_PLACEHOLDER_TEXT, "com.example.game"), ""));
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/signature"), ""));
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/short_version"), "1.0"));
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/version"), "1.0"));
@@ -354,8 +354,8 @@ void EditorExportPlatformOSX::_fix_plist(const Ref<EditorExportPreset> &p_preset
strnew += lines[i].replace("$name", p_binary) + "\n";
} else if (lines[i].find("$info") != -1) {
strnew += lines[i].replace("$info", p_preset->get("application/info")) + "\n";
- } else if (lines[i].find("$identifier") != -1) {
- strnew += lines[i].replace("$identifier", p_preset->get("application/identifier")) + "\n";
+ } else if (lines[i].find("$bundle_identifier") != -1) {
+ strnew += lines[i].replace("$bundle_identifier", p_preset->get("application/bundle_identifier")) + "\n";
} else if (lines[i].find("$short_version") != -1) {
strnew += lines[i].replace("$short_version", p_preset->get("application/short_version")) + "\n";
} else if (lines[i].find("$version") != -1) {
@@ -399,7 +399,7 @@ Error EditorExportPlatformOSX::_notarize(const Ref<EditorExportPreset> &p_preset
args.push_back("--notarize-app");
args.push_back("--primary-bundle-id");
- args.push_back(p_preset->get("application/identifier"));
+ args.push_back(p_preset->get("application/bundle_identifier"));
args.push_back("--username");
args.push_back(p_preset->get("notarization/apple_id_name"));
@@ -829,7 +829,10 @@ void EditorExportPlatformOSX::_zip_folder_recursive(zipFile &p_zip, const String
zipfi.tmz_date.tm_sec = time.sec;
zipfi.tmz_date.tm_year = date.year;
zipfi.dosDate = 0;
- zipfi.external_fa = (is_executable ? 0755 : 0644) << 16L;
+ // 0100000: regular file type
+ // 0000755: permissions rwxr-xr-x
+ // 0000644: permissions rw-r--r--
+ zipfi.external_fa = (is_executable ? 0100755 : 0100644) << 16L;
zipfi.internal_fa = 0;
zipOpenNewFileInZip4(p_zip,
@@ -885,7 +888,7 @@ bool EditorExportPlatformOSX::can_export(const Ref<EditorExportPreset> &p_preset
valid = dvalid || rvalid;
r_missing_templates = !valid;
- String identifier = p_preset->get("application/identifier");
+ String identifier = p_preset->get("application/bundle_identifier");
String pn_err;
if (!is_package_name_valid(identifier, &pn_err)) {
err += TTR("Invalid bundle identifier:") + " " + pn_err + "\n";
diff --git a/platform/uwp/export/export.cpp b/platform/uwp/export/export.cpp
index cb4716bd65..0fd017f96e 100644
--- a/platform/uwp/export/export.cpp
+++ b/platform/uwp/export/export.cpp
@@ -970,7 +970,7 @@ class EditorExportPlatformUWP : public EditorExportPlatform {
public:
virtual String get_name() const {
- return "Windows Universal";
+ return "UWP";
}
virtual String get_os_name() const {
return "UWP";
@@ -1180,7 +1180,7 @@ public:
virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags = 0) {
String src_appx;
- EditorProgress ep("export", "Exporting for Windows Universal", 7, true);
+ EditorProgress ep("export", "Exporting for UWP", 7, true);
if (p_debug) {
src_appx = p_preset->get("custom_template/debug");
diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp
index 0b7130db74..f47afcc4e5 100644
--- a/platform/windows/display_server_windows.cpp
+++ b/platform/windows/display_server_windows.cpp
@@ -103,7 +103,11 @@ void DisplayServerWindows::_set_mouse_mode_impl(MouseMode p_mode) {
}
if (p_mode == MOUSE_MODE_CAPTURED || p_mode == MOUSE_MODE_HIDDEN) {
- hCursor = SetCursor(nullptr);
+ if (hCursor == nullptr) {
+ hCursor = SetCursor(nullptr);
+ } else {
+ SetCursor(nullptr);
+ }
} else {
CursorShape c = cursor_shape;
cursor_shape = CURSOR_MAX;
@@ -117,9 +121,9 @@ void DisplayServerWindows::mouse_set_mode(MouseMode p_mode) {
if (mouse_mode == p_mode)
return;
- _set_mouse_mode_impl(p_mode);
-
mouse_mode = p_mode;
+
+ _set_mouse_mode_impl(p_mode);
}
DisplayServer::MouseMode DisplayServerWindows::mouse_get_mode() const {
@@ -2565,9 +2569,9 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
case WM_KEYUP:
case WM_KEYDOWN: {
if (wParam == VK_SHIFT)
- shift_mem = uMsg == WM_KEYDOWN;
+ shift_mem = (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN);
if (wParam == VK_CONTROL)
- control_mem = uMsg == WM_KEYDOWN;
+ control_mem = (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN);
if (wParam == VK_MENU) {
alt_mem = (uMsg == WM_KEYDOWN || uMsg == WM_SYSKEYDOWN);
if (lParam & (1 << 24))
@@ -2654,10 +2658,11 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
if (LOWORD(lParam) == HTCLIENT) {
if (windows[window_id].window_has_focus && (mouse_mode == MOUSE_MODE_HIDDEN || mouse_mode == MOUSE_MODE_CAPTURED)) {
//Hide the cursor
- if (hCursor == nullptr)
+ if (hCursor == nullptr) {
hCursor = SetCursor(nullptr);
- else
+ } else {
SetCursor(nullptr);
+ }
} else {
if (hCursor != nullptr) {
CursorShape c = cursor_shape;
diff --git a/platform/windows/joypad_windows.cpp b/platform/windows/joypad_windows.cpp
index 271a4e41bc..65caee3035 100644
--- a/platform/windows/joypad_windows.cpp
+++ b/platform/windows/joypad_windows.cpp
@@ -172,6 +172,7 @@ bool JoypadWindows::setup_dinput_joypad(const DIDEVICEINSTANCE *instance) {
sprintf_s(uid, "%04x%04x%04x%04x%04x%04x%04x%04x", type, 0, vendor, 0, product, 0, version, 0);
id_to_change = joypad_count;
+ slider_count = 0;
joy->di_joy->SetDataFormat(&c_dfDIJoystick2);
joy->di_joy->SetCooperativeLevel(*hWnd, DISCL_FOREGROUND);
@@ -206,9 +207,14 @@ void JoypadWindows::setup_joypad_object(const DIDEVICEOBJECTINSTANCE *ob, int p_
ofs = DIJOFS_RY;
else if (ob->guidType == GUID_RzAxis)
ofs = DIJOFS_RZ;
- else if (ob->guidType == GUID_Slider)
- ofs = DIJOFS_SLIDER(0);
- else
+ else if (ob->guidType == GUID_Slider) {
+ if (slider_count < 2) {
+ ofs = DIJOFS_SLIDER(slider_count);
+ slider_count++;
+ } else {
+ return;
+ }
+ } else
return;
prop_range.diph.dwSize = sizeof(DIPROPRANGE);
prop_range.diph.dwHeaderSize = sizeof(DIPROPHEADER);
@@ -388,9 +394,9 @@ void JoypadWindows::process_joypads() {
}
// on mingw, these constants are not constants
- int count = 6;
- unsigned int axes[] = { DIJOFS_X, DIJOFS_Y, DIJOFS_Z, DIJOFS_RX, DIJOFS_RY, DIJOFS_RZ };
- int values[] = { js.lX, js.lY, js.lZ, js.lRx, js.lRy, js.lRz };
+ int count = 8;
+ unsigned int axes[] = { DIJOFS_X, DIJOFS_Y, DIJOFS_Z, DIJOFS_RX, DIJOFS_RY, DIJOFS_RZ, DIJOFS_SLIDER(0), DIJOFS_SLIDER(1) };
+ int values[] = { js.lX, js.lY, js.lZ, js.lRx, js.lRy, js.lRz, js.rglSlider[0], js.rglSlider[1] };
for (int j = 0; j < joy->joy_axis.size(); j++) {
for (int k = 0; k < count; k++) {
diff --git a/platform/windows/joypad_windows.h b/platform/windows/joypad_windows.h
index 6c06b3f6f0..c961abf0a5 100644
--- a/platform/windows/joypad_windows.h
+++ b/platform/windows/joypad_windows.h
@@ -118,6 +118,7 @@ private:
Input *input;
int id_to_change;
+ int slider_count;
int joypad_count;
bool attached_joypads[JOYPADS_MAX];
dinput_gamepad d_joypads[JOYPADS_MAX];
diff --git a/scene/3d/camera_3d.cpp b/scene/3d/camera_3d.cpp
index 8dc5cd4aba..7ffca4bd9e 100644
--- a/scene/3d/camera_3d.cpp
+++ b/scene/3d/camera_3d.cpp
@@ -754,9 +754,9 @@ void ClippedCamera3D::_notification(int p_what) {
xf.origin = ray_from;
xf.orthonormalize();
- float csafe, cunsafe;
- if (dspace->cast_motion(pyramid_shape, xf, cam_pos - ray_from, margin, csafe, cunsafe, exclude, collision_mask, clip_to_bodies, clip_to_areas)) {
- clip_offset = cam_pos.distance_to(ray_from + (cam_pos - ray_from) * csafe);
+ float closest_safe = 1.0f, closest_unsafe = 1.0f;
+ if (dspace->cast_motion(pyramid_shape, xf, cam_pos - ray_from, margin, closest_safe, closest_unsafe, exclude, collision_mask, clip_to_bodies, clip_to_areas)) {
+ clip_offset = cam_pos.distance_to(ray_from + (cam_pos - ray_from) * closest_safe);
}
_update_camera();
diff --git a/scene/3d/light_3d.cpp b/scene/3d/light_3d.cpp
index ef24676d69..9270b548b7 100644
--- a/scene/3d/light_3d.cpp
+++ b/scene/3d/light_3d.cpp
@@ -424,9 +424,11 @@ DirectionalLight3D::DirectionalLight3D() :
Light3D(RenderingServer::LIGHT_DIRECTIONAL) {
set_param(PARAM_SHADOW_MAX_DISTANCE, 100);
set_param(PARAM_SHADOW_FADE_START, 0.8);
+ // Increase the default shadow bias to better suit most scenes.
+ // Leave normal bias untouched as it doesn't benefit DirectionalLight3D as much as OmniLight3D.
+ set_param(PARAM_SHADOW_BIAS, 0.05);
set_shadow_mode(SHADOW_PARALLEL_4_SPLITS);
set_shadow_depth_range(SHADOW_DEPTH_RANGE_STABLE);
-
blend_splits = false;
}
@@ -468,6 +470,9 @@ void OmniLight3D::_bind_methods() {
OmniLight3D::OmniLight3D() :
Light3D(RenderingServer::LIGHT_OMNI) {
set_shadow_mode(SHADOW_CUBE);
+ // Increase the default shadow biases to better suit most scenes.
+ set_param(PARAM_SHADOW_BIAS, 0.1);
+ set_param(PARAM_SHADOW_NORMAL_BIAS, 2.0);
}
String SpotLight3D::get_configuration_warning() const {
diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp
index 84170a65d1..fafbb298b7 100644
--- a/scene/gui/color_picker.cpp
+++ b/scene/gui/color_picker.cpp
@@ -758,7 +758,8 @@ ColorPicker::ColorPicker() :
sample->set_h_size_flags(SIZE_EXPAND_FILL);
sample->connect("draw", callable_mp(this, &ColorPicker::_sample_draw));
- btn_pick = memnew(ToolButton);
+ btn_pick = memnew(Button);
+ btn_pick->set_flat(true);
hb_smpl->add_child(btn_pick);
btn_pick->set_toggle_mode(true);
btn_pick->set_tooltip(TTR("Pick a color from the editor window."));
diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h
index 31ae92f4e4..b2e8263e7f 100644
--- a/scene/gui/color_picker.h
+++ b/scene/gui/color_picker.h
@@ -41,7 +41,6 @@
#include "scene/gui/slider.h"
#include "scene/gui/spin_box.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
class ColorPicker : public BoxContainer {
GDCLASS(ColorPicker, BoxContainer);
@@ -57,7 +56,7 @@ private:
HSeparator *preset_separator;
Button *bt_add_preset;
List<Color> presets;
- ToolButton *btn_pick;
+ Button *btn_pick;
CheckButton *btn_hsv;
CheckButton *btn_raw;
HSlider *scroll[4];
diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp
index 630f3c8ff6..41ca6458af 100644
--- a/scene/gui/file_dialog.cpp
+++ b/scene/gui/file_dialog.cpp
@@ -45,9 +45,9 @@ VBoxContainer *FileDialog::get_vbox() {
}
void FileDialog::_theme_changed() {
- Color font_color = vbox->get_theme_color("font_color", "ToolButton");
- Color font_color_hover = vbox->get_theme_color("font_color_hover", "ToolButton");
- Color font_color_pressed = vbox->get_theme_color("font_color_pressed", "ToolButton");
+ Color font_color = vbox->get_theme_color("font_color", "Button");
+ Color font_color_hover = vbox->get_theme_color("font_color_hover", "Button");
+ Color font_color_pressed = vbox->get_theme_color("font_color_pressed", "Button");
dir_up->add_theme_color_override("icon_color_normal", font_color);
dir_up->add_theme_color_override("icon_color_hover", font_color_hover);
@@ -859,7 +859,8 @@ FileDialog::FileDialog() {
HBoxContainer *hbc = memnew(HBoxContainer);
- dir_up = memnew(ToolButton);
+ dir_up = memnew(Button);
+ dir_up->set_flat(true);
dir_up->set_tooltip(RTR("Go to parent folder."));
hbc->add_child(dir_up);
dir_up->connect("pressed", callable_mp(this, &FileDialog::_go_up));
@@ -877,12 +878,14 @@ FileDialog::FileDialog() {
hbc->add_child(dir);
dir->set_h_size_flags(Control::SIZE_EXPAND_FILL);
- refresh = memnew(ToolButton);
+ refresh = memnew(Button);
+ refresh->set_flat(true);
refresh->set_tooltip(RTR("Refresh files."));
refresh->connect("pressed", callable_mp(this, &FileDialog::update_file_list));
hbc->add_child(refresh);
- show_hidden = memnew(ToolButton);
+ show_hidden = memnew(Button);
+ show_hidden->set_flat(true);
show_hidden->set_toggle_mode(true);
show_hidden->set_pressed(is_showing_hidden_files());
show_hidden->set_tooltip(RTR("Toggle the visibility of hidden files."));
diff --git a/scene/gui/file_dialog.h b/scene/gui/file_dialog.h
index 8bc536d576..44050a2376 100644
--- a/scene/gui/file_dialog.h
+++ b/scene/gui/file_dialog.h
@@ -36,7 +36,6 @@
#include "scene/gui/dialogs.h"
#include "scene/gui/line_edit.h"
#include "scene/gui/option_button.h"
-#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
class FileDialog : public ConfirmationDialog {
@@ -87,10 +86,10 @@ private:
DirAccess *dir_access;
ConfirmationDialog *confirm_save;
- ToolButton *dir_up;
+ Button *dir_up;
- ToolButton *refresh;
- ToolButton *show_hidden;
+ Button *refresh;
+ Button *show_hidden;
Vector<String> filters;
diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp
index 5080ba74e2..2b0e084db4 100644
--- a/scene/gui/graph_edit.cpp
+++ b/scene/gui/graph_edit.cpp
@@ -33,6 +33,7 @@
#include "core/input/input.h"
#include "core/os/keyboard.h"
#include "scene/gui/box_container.h"
+#include "scene/gui/button.h"
#ifdef TOOLS_ENABLED
#include "editor/editor_scale.h"
@@ -1310,25 +1311,29 @@ GraphEdit::GraphEdit() {
top_layer->add_child(zoom_hb);
zoom_hb->set_position(Vector2(10, 10));
- zoom_minus = memnew(ToolButton);
+ zoom_minus = memnew(Button);
+ zoom_minus->set_flat(true);
zoom_hb->add_child(zoom_minus);
zoom_minus->set_tooltip(RTR("Zoom Out"));
zoom_minus->connect("pressed", callable_mp(this, &GraphEdit::_zoom_minus));
zoom_minus->set_focus_mode(FOCUS_NONE);
- zoom_reset = memnew(ToolButton);
+ zoom_reset = memnew(Button);
+ zoom_reset->set_flat(true);
zoom_hb->add_child(zoom_reset);
zoom_reset->set_tooltip(RTR("Zoom Reset"));
zoom_reset->connect("pressed", callable_mp(this, &GraphEdit::_zoom_reset));
zoom_reset->set_focus_mode(FOCUS_NONE);
- zoom_plus = memnew(ToolButton);
+ zoom_plus = memnew(Button);
+ zoom_plus->set_flat(true);
zoom_hb->add_child(zoom_plus);
zoom_plus->set_tooltip(RTR("Zoom In"));
zoom_plus->connect("pressed", callable_mp(this, &GraphEdit::_zoom_plus));
zoom_plus->set_focus_mode(FOCUS_NONE);
- snap_button = memnew(ToolButton);
+ snap_button = memnew(Button);
+ snap_button->set_flat(true);
snap_button->set_toggle_mode(true);
snap_button->set_tooltip(RTR("Enable snap and show grid."));
snap_button->connect("pressed", callable_mp(this, &GraphEdit::_snap_toggled));
diff --git a/scene/gui/graph_edit.h b/scene/gui/graph_edit.h
index c632490855..a627a8eec8 100644
--- a/scene/gui/graph_edit.h
+++ b/scene/gui/graph_edit.h
@@ -32,12 +32,12 @@
#define GRAPH_EDIT_H
#include "scene/gui/box_container.h"
+#include "scene/gui/button.h"
#include "scene/gui/graph_node.h"
#include "scene/gui/scroll_bar.h"
#include "scene/gui/slider.h"
#include "scene/gui/spin_box.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
class GraphEdit;
@@ -65,11 +65,11 @@ public:
};
private:
- ToolButton *zoom_minus;
- ToolButton *zoom_reset;
- ToolButton *zoom_plus;
+ Button *zoom_minus;
+ Button *zoom_reset;
+ Button *zoom_plus;
- ToolButton *snap_button;
+ Button *snap_button;
SpinBox *snap_amount;
void _zoom_minus();
diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp
index ee6783167a..ba55927980 100644
--- a/scene/gui/line_edit.cpp
+++ b/scene/gui/line_edit.cpp
@@ -274,6 +274,22 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) {
set_cursor_position(text.length());
shift_selection_check_post(k->get_shift());
} break;
+ case (KEY_BACKSPACE): {
+ if (!editable)
+ break;
+
+ // If selected, delete the selection
+ if (selection.enabled) {
+ selection_delete();
+ break;
+ }
+
+ // Otherwise delete from cursor to beginning of text edit
+ int current_pos = get_cursor_position();
+ if (current_pos != 0) {
+ delete_text(0, current_pos);
+ }
+ } break;
#endif
default: {
handled = false;
diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp
index 92508f7fd2..5ae27081ea 100644
--- a/scene/gui/rich_text_label.cpp
+++ b/scene/gui/rich_text_label.cpp
@@ -1570,6 +1570,10 @@ void RichTextLabel::_validate_line_caches(ItemFrame *p_frame) {
}
updating_scroll = false;
+
+ if (fit_content_height) {
+ minimum_size_changed();
+ }
}
void RichTextLabel::_invalidate_current_line(ItemFrame *p_frame) {
@@ -1989,6 +1993,17 @@ int RichTextLabel::get_tab_size() const {
return tab_size;
}
+void RichTextLabel::set_fit_content_height(bool p_enabled) {
+ if (p_enabled != fit_content_height) {
+ fit_content_height = p_enabled;
+ minimum_size_changed();
+ }
+}
+
+bool RichTextLabel::is_fit_content_height_enabled() const {
+ return fit_content_height;
+}
+
void RichTextLabel::set_meta_underline(bool p_underline) {
underline_meta = p_underline;
update();
@@ -2646,7 +2661,7 @@ void RichTextLabel::install_effect(const Variant effect) {
}
}
-int RichTextLabel::get_content_height() {
+int RichTextLabel::get_content_height() const {
int total_height = 0;
if (main->lines.size()) {
total_height = main->lines[main->lines.size() - 1].height_accum_cache + get_theme_stylebox("normal")->get_minimum_size().height;
@@ -2701,6 +2716,9 @@ void RichTextLabel::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_tab_size", "spaces"), &RichTextLabel::set_tab_size);
ClassDB::bind_method(D_METHOD("get_tab_size"), &RichTextLabel::get_tab_size);
+ ClassDB::bind_method(D_METHOD("set_fit_content_height", "enabled"), &RichTextLabel::set_fit_content_height);
+ ClassDB::bind_method(D_METHOD("is_fit_content_height_enabled"), &RichTextLabel::is_fit_content_height_enabled);
+
ClassDB::bind_method(D_METHOD("set_selection_enabled", "enabled"), &RichTextLabel::set_selection_enabled);
ClassDB::bind_method(D_METHOD("is_selection_enabled"), &RichTextLabel::is_selection_enabled);
@@ -2743,6 +2761,8 @@ void RichTextLabel::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::INT, "tab_size", PROPERTY_HINT_RANGE, "0,24,1"), "set_tab_size", "get_tab_size");
ADD_PROPERTY(PropertyInfo(Variant::STRING, "text", PROPERTY_HINT_MULTILINE_TEXT), "set_text", "get_text");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "fit_content_height"), "set_fit_content_height", "is_fit_content_height_enabled");
+
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "scroll_active"), "set_scroll_active", "is_scroll_active");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "scroll_following"), "set_scroll_follow", "is_scroll_following");
@@ -2809,12 +2829,17 @@ void RichTextLabel::set_fixed_size_to_width(int p_width) {
}
Size2 RichTextLabel::get_minimum_size() const {
+ Size2 size(0, 0);
if (fixed_width != -1) {
+ size.x = fixed_width;
+ }
+
+ if (fixed_width != -1 || fit_content_height) {
const_cast<RichTextLabel *>(this)->_validate_line_caches(main);
- return Size2(fixed_width, const_cast<RichTextLabel *>(this)->get_content_height());
+ size.y = get_content_height();
}
- return Size2();
+ return size;
}
Ref<RichTextEffect> RichTextLabel::_get_custom_effect_by_code(String p_bbcode_identifier) {
@@ -2934,6 +2959,8 @@ RichTextLabel::RichTextLabel() {
visible_line_count = 0;
fixed_width = -1;
+ fit_content_height = false;
+
set_clip_contents(true);
}
diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h
index 4cec435568..7eeb071cb5 100644
--- a/scene/gui/rich_text_label.h
+++ b/scene/gui/rich_text_label.h
@@ -403,6 +403,8 @@ private:
int fixed_width;
+ bool fit_content_height;
+
protected:
void _notification(int p_what);
@@ -456,13 +458,16 @@ public:
void set_tab_size(int p_spaces);
int get_tab_size() const;
+ void set_fit_content_height(bool p_enabled);
+ bool is_fit_content_height_enabled() const;
+
bool search(const String &p_string, bool p_from_selection = false, bool p_search_previous = false);
void scroll_to_line(int p_line);
int get_line_count() const;
int get_visible_line_count() const;
- int get_content_height();
+ int get_content_height() const;
VScrollBar *get_v_scroll() { return vscroll; }
diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp
index e050b3f174..c7fc8dbe43 100644
--- a/scene/gui/text_edit.cpp
+++ b/scene/gui/text_edit.cpp
@@ -366,26 +366,9 @@ void TextEdit::_update_scrollbars() {
total_width += cache.minimap_width;
}
- bool use_hscroll = true;
- bool use_vscroll = true;
-
- // Thanks yessopie for this clever bit of logic.
- if (total_rows <= visible_rows && total_width <= visible_width) {
- use_hscroll = false;
- use_vscroll = false;
- } else {
- if (total_rows > visible_rows && total_width <= visible_width) {
- use_hscroll = false;
- }
-
- if (total_rows <= visible_rows && total_width > visible_width) {
- use_vscroll = false;
- }
- }
-
updating_scrolls = true;
- if (use_vscroll) {
+ if (total_rows > visible_rows) {
v_scroll->show();
v_scroll->set_max(total_rows + get_visible_rows_offset());
v_scroll->set_page(visible_rows + get_visible_rows_offset());
@@ -403,7 +386,7 @@ void TextEdit::_update_scrollbars() {
v_scroll->hide();
}
- if (use_hscroll && !is_wrap_enabled()) {
+ if (total_width > visible_width && !is_wrap_enabled()) {
h_scroll->show();
h_scroll->set_max(total_width);
h_scroll->set_page(visible_width);
@@ -2274,14 +2257,14 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) {
if (mb->get_button_index() == BUTTON_WHEEL_UP && !mb->get_command()) {
if (mb->get_shift()) {
h_scroll->set_value(h_scroll->get_value() - (100 * mb->get_factor()));
- } else {
+ } else if (v_scroll->is_visible()) {
_scroll_up(3 * mb->get_factor());
}
}
if (mb->get_button_index() == BUTTON_WHEEL_DOWN && !mb->get_command()) {
if (mb->get_shift()) {
h_scroll->set_value(h_scroll->get_value() + (100 * mb->get_factor()));
- } else {
+ } else if (v_scroll->is_visible()) {
_scroll_down(3 * mb->get_factor());
}
}
diff --git a/scene/gui/tool_button.cpp b/scene/gui/tool_button.cpp
deleted file mode 100644
index c9f87f0015..0000000000
--- a/scene/gui/tool_button.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-/*************************************************************************/
-/* tool_button.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#include "tool_button.h"
-
-ToolButton::ToolButton() {
- set_flat(true);
-}
diff --git a/scene/gui/tool_button.h b/scene/gui/tool_button.h
deleted file mode 100644
index 9848b21381..0000000000
--- a/scene/gui/tool_button.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*************************************************************************/
-/* tool_button.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be */
-/* included in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-/*************************************************************************/
-
-#ifndef TOOL_BUTTON_H
-#define TOOL_BUTTON_H
-
-#include "scene/gui/button.h"
-
-class ToolButton : public Button {
- GDCLASS(ToolButton, Button);
-
-public:
- ToolButton();
-};
-
-#endif // TOOL_BUTTON_H
diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp
index a0e10f30c0..3c3c7533a3 100644
--- a/scene/main/scene_tree.cpp
+++ b/scene/main/scene_tree.cpp
@@ -170,6 +170,7 @@ void SceneTree::_flush_ugc() {
v[i] = E->get()[i];
}
+ static_assert(VARIANT_ARG_MAX == 5, "This code needs to be updated if VARIANT_ARG_MAX != 5");
call_group_flags(GROUP_CALL_REALTIME, E->key().group, E->key().call, v[0], v[1], v[2], v[3], v[4]);
unique_group_calls.erase(E);
@@ -907,6 +908,7 @@ Variant SceneTree::_call_group_flags(const Variant **p_args, int p_argcount, Cal
v[i] = *p_args[i + 3];
}
+ static_assert(VARIANT_ARG_MAX == 5, "This code needs to be updated if VARIANT_ARG_MAX != 5");
call_group_flags(flags, group, method, v[0], v[1], v[2], v[3], v[4]);
return Variant();
}
@@ -926,6 +928,7 @@ Variant SceneTree::_call_group(const Variant **p_args, int p_argcount, Callable:
v[i] = *p_args[i + 2];
}
+ static_assert(VARIANT_ARG_MAX == 5, "This code needs to be updated if VARIANT_ARG_MAX != 5");
call_group_flags(0, group, method, v[0], v[1], v[2], v[3], v[4]);
return Variant();
}
diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp
index 2d0e2daf41..54112ef2bd 100644
--- a/scene/register_scene_types.cpp
+++ b/scene/register_scene_types.cpp
@@ -117,7 +117,6 @@
#include "scene/gui/texture_button.h"
#include "scene/gui/texture_progress.h"
#include "scene/gui/texture_rect.h"
-#include "scene/gui/tool_button.h"
#include "scene/gui/tree.h"
#include "scene/gui/video_player.h"
#include "scene/main/canvas_item.h"
@@ -306,7 +305,6 @@ void register_scene_types() {
ClassDB::register_class<MenuButton>();
ClassDB::register_class<CheckBox>();
ClassDB::register_class<CheckButton>();
- ClassDB::register_class<ToolButton>();
ClassDB::register_class<LinkButton>();
ClassDB::register_class<Panel>();
ClassDB::register_virtual_class<Range>();
@@ -541,6 +539,8 @@ void register_scene_types() {
ClassDB::register_class<VisualShaderNodeVectorDecompose>();
ClassDB::register_class<VisualShaderNodeTransformDecompose>();
ClassDB::register_class<VisualShaderNodeTexture>();
+ ClassDB::register_virtual_class<VisualShaderNodeSample3D>();
+ ClassDB::register_class<VisualShaderNodeTexture2DArray>();
ClassDB::register_class<VisualShaderNodeCubemap>();
ClassDB::register_virtual_class<VisualShaderNodeUniform>();
ClassDB::register_class<VisualShaderNodeFloatUniform>();
@@ -551,6 +551,7 @@ void register_scene_types() {
ClassDB::register_class<VisualShaderNodeTransformUniform>();
ClassDB::register_class<VisualShaderNodeTextureUniform>();
ClassDB::register_class<VisualShaderNodeTextureUniformTriplanar>();
+ ClassDB::register_class<VisualShaderNodeTexture2DArrayUniform>();
ClassDB::register_class<VisualShaderNodeCubemapUniform>();
ClassDB::register_class<VisualShaderNodeIf>();
ClassDB::register_class<VisualShaderNodeSwitch>();
@@ -764,6 +765,7 @@ void register_scene_types() {
#ifndef DISABLE_DEPRECATED
// Dropped in 4.0, near approximation.
ClassDB::add_compatibility_class("AnimationTreePlayer", "AnimationTree");
+ ClassDB::add_compatibility_class("ToolButton", "Button");
// Renamed in 4.0.
// Keep alphabetical ordering to easily locate classes and avoid duplicates.
diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp
index fd5c861eb5..aebb0d7ba4 100644
--- a/scene/resources/default_theme/default_theme.cpp
+++ b/scene/resources/default_theme/default_theme.cpp
@@ -219,21 +219,21 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const
theme->set_constant("hseparation", "ColorPickerButton", 2 * scale);
- // ToolButton
+ // Button
- theme->set_stylebox("normal", "ToolButton", make_empty_stylebox(6, 4, 6, 4));
- theme->set_stylebox("pressed", "ToolButton", make_stylebox(button_pressed_png, 4, 4, 4, 4, 6, 4, 6, 4));
- theme->set_stylebox("hover", "ToolButton", make_stylebox(button_normal_png, 4, 4, 4, 4, 6, 4, 6, 4));
- theme->set_stylebox("disabled", "ToolButton", make_empty_stylebox(6, 4, 6, 4));
- theme->set_stylebox("focus", "ToolButton", focus);
- theme->set_font("font", "ToolButton", default_font);
+ theme->set_stylebox("normal", "Button", make_empty_stylebox(6, 4, 6, 4));
+ theme->set_stylebox("pressed", "Button", make_stylebox(button_pressed_png, 4, 4, 4, 4, 6, 4, 6, 4));
+ theme->set_stylebox("hover", "Button", make_stylebox(button_normal_png, 4, 4, 4, 4, 6, 4, 6, 4));
+ theme->set_stylebox("disabled", "Button", make_empty_stylebox(6, 4, 6, 4));
+ theme->set_stylebox("focus", "Button", focus);
+ theme->set_font("font", "Button", default_font);
- theme->set_color("font_color", "ToolButton", control_font_color);
- theme->set_color("font_color_pressed", "ToolButton", control_font_color_pressed);
- theme->set_color("font_color_hover", "ToolButton", control_font_color_hover);
- theme->set_color("font_color_disabled", "ToolButton", Color(0.9, 0.95, 1, 0.3));
+ theme->set_color("font_color", "Button", control_font_color);
+ theme->set_color("font_color_pressed", "Button", control_font_color_pressed);
+ theme->set_color("font_color_hover", "Button", control_font_color_hover);
+ theme->set_color("font_color_disabled", "Button", Color(0.9, 0.95, 1, 0.3));
- theme->set_constant("hseparation", "ToolButton", 3);
+ theme->set_constant("hseparation", "Button", 3);
// OptionButton
diff --git a/scene/resources/visual_shader_nodes.cpp b/scene/resources/visual_shader_nodes.cpp
index 87720cf110..5c6b13a527 100644
--- a/scene/resources/visual_shader_nodes.cpp
+++ b/scene/resources/visual_shader_nodes.cpp
@@ -781,6 +781,183 @@ VisualShaderNodeTexture::VisualShaderNodeTexture() {
source = SOURCE_TEXTURE;
}
+////////////// Sample3D
+
+int VisualShaderNodeSample3D::get_input_port_count() const {
+ return 3;
+}
+
+VisualShaderNodeSample3D::PortType VisualShaderNodeSample3D::get_input_port_type(int p_port) const {
+ switch (p_port) {
+ case 0:
+ return PORT_TYPE_VECTOR;
+ case 1:
+ return PORT_TYPE_SCALAR;
+ case 2:
+ return PORT_TYPE_SAMPLER;
+ default:
+ return PORT_TYPE_SCALAR;
+ }
+}
+
+String VisualShaderNodeSample3D::get_input_port_name(int p_port) const {
+ switch (p_port) {
+ case 0:
+ return "uvw";
+ case 1:
+ return "lod";
+ default:
+ return "";
+ }
+}
+
+int VisualShaderNodeSample3D::get_output_port_count() const {
+ return 2;
+}
+
+VisualShaderNodeSample3D::PortType VisualShaderNodeSample3D::get_output_port_type(int p_port) const {
+ return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR;
+}
+
+String VisualShaderNodeSample3D::get_output_port_name(int p_port) const {
+ return p_port == 0 ? "rgb" : "alpha";
+}
+
+String VisualShaderNodeSample3D::get_input_port_default_hint(int p_port) const {
+ if (p_port == 0) {
+ return "vec3(UV.xy, 0.0)";
+ }
+ return "";
+}
+
+String VisualShaderNodeSample3D::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
+ String code;
+ if (source == SOURCE_TEXTURE || source == SOURCE_PORT) {
+ String id;
+ code += "\t{\n";
+ if (source == SOURCE_TEXTURE) {
+ id = make_unique_id(p_type, p_id, "tex3d");
+ } else {
+ id = p_input_vars[2];
+ }
+ if (id != String()) {
+ if (p_input_vars[0] == String()) { // Use UV by default.
+ if (p_input_vars[1] == String()) {
+ code += "\t\tvec4 " + id + "_tex_read = texture(" + id + ", vec3(UV.xy, 0.0));\n";
+ } else {
+ code += "\t\tvec4 " + id + "_tex_read = textureLod(" + id + ", vec3(UV.xy, 0.0), " + p_input_vars[1] + ");\n";
+ }
+ } else if (p_input_vars[1] == String()) {
+ //no lod
+ code += "\t\tvec4 " + id + "_tex_read = texture(" + id + ", " + p_input_vars[0] + ");\n";
+ } else {
+ code += "\t\tvec4 " + id + "_tex_read = textureLod(" + id + ", " + p_input_vars[0] + ", " + p_input_vars[1] + ");\n";
+ }
+ } else {
+ code += "\t\tvec4 " + id + "_tex_read = vec4(0.0);\n";
+ }
+
+ code += "\t\t" + p_output_vars[0] + " = " + id + "_tex_read.rgb;\n";
+ code += "\t\t" + p_output_vars[1] + " = " + id + "_tex_read.a;\n";
+ code += "\t}\n";
+ return code;
+ }
+ code += "\t" + p_output_vars[0] + " = vec3(0.0);\n";
+ code += "\t" + p_output_vars[1] + " = 1.0;\n";
+ return code;
+}
+
+void VisualShaderNodeSample3D::set_source(Source p_source) {
+ source = p_source;
+ emit_changed();
+ emit_signal("editor_refresh_request");
+}
+
+VisualShaderNodeSample3D::Source VisualShaderNodeSample3D::get_source() const {
+ return source;
+}
+
+void VisualShaderNodeSample3D::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("set_source", "value"), &VisualShaderNodeSample3D::set_source);
+ ClassDB::bind_method(D_METHOD("get_source"), &VisualShaderNodeSample3D::get_source);
+
+ ADD_PROPERTY(PropertyInfo(Variant::INT, "source", PROPERTY_HINT_ENUM, "Texture,SamplerPort"), "set_source", "get_source");
+
+ BIND_ENUM_CONSTANT(SOURCE_TEXTURE);
+ BIND_ENUM_CONSTANT(SOURCE_PORT);
+}
+
+String VisualShaderNodeSample3D::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const {
+ if (source == SOURCE_TEXTURE) {
+ return String(); // all good
+ }
+ if (source == SOURCE_PORT) {
+ return String(); // all good
+ }
+ return TTR("Invalid source for shader.");
+}
+
+VisualShaderNodeSample3D::VisualShaderNodeSample3D() {
+ source = SOURCE_TEXTURE;
+ simple_decl = false;
+}
+
+////////////// Texture2DArray
+
+String VisualShaderNodeTexture2DArray::get_caption() const {
+ return "Texture2DArray";
+}
+
+String VisualShaderNodeTexture2DArray::get_input_port_name(int p_port) const {
+ if (p_port == 2) {
+ return "sampler2DArray";
+ }
+ return VisualShaderNodeSample3D::get_input_port_name(p_port);
+}
+
+Vector<VisualShader::DefaultTextureParam> VisualShaderNodeTexture2DArray::get_default_texture_parameters(VisualShader::Type p_type, int p_id) const {
+ VisualShader::DefaultTextureParam dtp;
+ dtp.name = make_unique_id(p_type, p_id, "tex3d");
+ dtp.param = texture;
+ Vector<VisualShader::DefaultTextureParam> ret;
+ ret.push_back(dtp);
+ return ret;
+}
+
+String VisualShaderNodeTexture2DArray::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
+ if (source == SOURCE_TEXTURE) {
+ return "uniform sampler2DArray " + make_unique_id(p_type, p_id, "tex3d") + ";\n";
+ }
+ return String();
+}
+
+void VisualShaderNodeTexture2DArray::set_texture_array(Ref<Texture2DArray> p_value) {
+ texture = p_value;
+ emit_changed();
+}
+
+Ref<Texture2DArray> VisualShaderNodeTexture2DArray::get_texture_array() const {
+ return texture;
+}
+
+Vector<StringName> VisualShaderNodeTexture2DArray::get_editable_properties() const {
+ Vector<StringName> props;
+ props.push_back("source");
+ if (source == SOURCE_TEXTURE) {
+ props.push_back("texture_array");
+ }
+ return props;
+}
+
+void VisualShaderNodeTexture2DArray::_bind_methods() {
+ ClassDB::bind_method(D_METHOD("set_texture_array", "value"), &VisualShaderNodeTexture2DArray::set_texture_array);
+ ClassDB::bind_method(D_METHOD("get_texture_array"), &VisualShaderNodeTexture2DArray::get_texture_array);
+
+ ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture_array", PROPERTY_HINT_RESOURCE_TYPE, "Texture2DArray"), "set_texture_array", "get_texture_array");
+}
+
+VisualShaderNodeTexture2DArray::VisualShaderNodeTexture2DArray() {
+}
////////////// Cubemap
String VisualShaderNodeCubemap::get_caption() const {
@@ -3926,6 +4103,74 @@ String VisualShaderNodeTextureUniformTriplanar::get_input_port_default_hint(int
VisualShaderNodeTextureUniformTriplanar::VisualShaderNodeTextureUniformTriplanar() {
}
+////////////// Texture2DArray Uniform
+
+String VisualShaderNodeTexture2DArrayUniform::get_caption() const {
+ return "Texture2DArrayUniform";
+}
+
+int VisualShaderNodeTexture2DArrayUniform::get_output_port_count() const {
+ return 1;
+}
+
+VisualShaderNodeTexture2DArrayUniform::PortType VisualShaderNodeTexture2DArrayUniform::get_output_port_type(int p_port) const {
+ return PORT_TYPE_SAMPLER;
+}
+
+String VisualShaderNodeTexture2DArrayUniform::get_output_port_name(int p_port) const {
+ return "sampler2DArray";
+}
+
+int VisualShaderNodeTexture2DArrayUniform::get_input_port_count() const {
+ return 0;
+}
+
+VisualShaderNodeTexture2DArrayUniform::PortType VisualShaderNodeTexture2DArrayUniform::get_input_port_type(int p_port) const {
+ return PORT_TYPE_SCALAR;
+}
+
+String VisualShaderNodeTexture2DArrayUniform::get_input_port_name(int p_port) const {
+ return "";
+}
+
+String VisualShaderNodeTexture2DArrayUniform::get_input_port_default_hint(int p_port) const {
+ return "";
+}
+
+String VisualShaderNodeTexture2DArrayUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const {
+ String code = _get_qual_str() + "uniform sampler2DArray " + get_uniform_name();
+
+ switch (texture_type) {
+ case TYPE_DATA:
+ if (color_default == COLOR_DEFAULT_BLACK)
+ code += " : hint_black;\n";
+ else
+ code += ";\n";
+ break;
+ case TYPE_COLOR:
+ if (color_default == COLOR_DEFAULT_BLACK)
+ code += " : hint_black_albedo;\n";
+ else
+ code += " : hint_albedo;\n";
+ break;
+ case TYPE_NORMALMAP:
+ code += " : hint_normal;\n";
+ break;
+ case TYPE_ANISO:
+ code += " : hint_aniso;\n";
+ break;
+ }
+
+ return code;
+}
+
+String VisualShaderNodeTexture2DArrayUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const {
+ return String();
+}
+
+VisualShaderNodeTexture2DArrayUniform::VisualShaderNodeTexture2DArrayUniform() {
+}
+
////////////// Cubemap Uniform
String VisualShaderNodeCubemapUniform::get_caption() const {
diff --git a/scene/resources/visual_shader_nodes.h b/scene/resources/visual_shader_nodes.h
index 69f42f621a..28a9de6819 100644
--- a/scene/resources/visual_shader_nodes.h
+++ b/scene/resources/visual_shader_nodes.h
@@ -236,7 +236,7 @@ public:
enum TextureType {
TYPE_DATA,
TYPE_COLOR,
- TYPE_NORMALMAP
+ TYPE_NORMALMAP,
};
private:
@@ -284,6 +284,68 @@ VARIANT_ENUM_CAST(VisualShaderNodeTexture::Source)
///////////////////////////////////////
+class VisualShaderNodeSample3D : public VisualShaderNode {
+ GDCLASS(VisualShaderNodeSample3D, VisualShaderNode);
+
+public:
+ enum Source {
+ SOURCE_TEXTURE,
+ SOURCE_PORT,
+ };
+
+protected:
+ Source source;
+
+ static void _bind_methods();
+
+public:
+ virtual String get_caption() const = 0;
+
+ virtual int get_input_port_count() const;
+ virtual PortType get_input_port_type(int p_port) const;
+ virtual String get_input_port_name(int p_port) const;
+ virtual String get_input_port_default_hint(int p_port) const;
+
+ virtual int get_output_port_count() const;
+ virtual PortType get_output_port_type(int p_port) const;
+ virtual String get_output_port_name(int p_port) const;
+
+ virtual String generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const = 0;
+ virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const; //if no output is connected, the output var passed will be empty. if no input is connected and input is NIL, the input var passed will be empty
+
+ void set_source(Source p_source);
+ Source get_source() const;
+
+ virtual String get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const;
+
+ VisualShaderNodeSample3D();
+};
+
+VARIANT_ENUM_CAST(VisualShaderNodeSample3D::Source)
+
+class VisualShaderNodeTexture2DArray : public VisualShaderNodeSample3D {
+ GDCLASS(VisualShaderNodeTexture2DArray, VisualShaderNodeSample3D);
+ Ref<Texture2DArray> texture;
+
+protected:
+ static void _bind_methods();
+
+public:
+ virtual String get_caption() const;
+
+ virtual String get_input_port_name(int p_port) const;
+
+ virtual Vector<VisualShader::DefaultTextureParam> get_default_texture_parameters(VisualShader::Type p_type, int p_id) const;
+ virtual String generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const;
+
+ void set_texture_array(Ref<Texture2DArray> p_value);
+ Ref<Texture2DArray> get_texture_array() const;
+
+ virtual Vector<StringName> get_editable_properties() const;
+
+ VisualShaderNodeTexture2DArray();
+};
+
class VisualShaderNodeCubemap : public VisualShaderNode {
GDCLASS(VisualShaderNodeCubemap, VisualShaderNode);
Ref<Cubemap> cube_map;
@@ -1695,6 +1757,29 @@ public:
///////////////////////////////////////
+class VisualShaderNodeTexture2DArrayUniform : public VisualShaderNodeTextureUniform {
+ GDCLASS(VisualShaderNodeTexture2DArrayUniform, VisualShaderNodeTextureUniform);
+
+public:
+ virtual String get_caption() const;
+
+ virtual int get_input_port_count() const;
+ virtual PortType get_input_port_type(int p_port) const;
+ virtual String get_input_port_name(int p_port) const;
+
+ virtual int get_output_port_count() const;
+ virtual PortType get_output_port_type(int p_port) const;
+ virtual String get_output_port_name(int p_port) const;
+
+ virtual String get_input_port_default_hint(int p_port) const;
+ virtual String generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const;
+ virtual String generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview = false) const; //if no output is connected, the output var passed will be empty. if no input is connected and input is NIL, the input var passed will be empty
+
+ VisualShaderNodeTexture2DArrayUniform();
+};
+
+///////////////////////////////////////
+
class VisualShaderNodeCubemapUniform : public VisualShaderNodeTextureUniform {
GDCLASS(VisualShaderNodeCubemapUniform, VisualShaderNodeTextureUniform);
diff --git a/servers/physics_server_3d.cpp b/servers/physics_server_3d.cpp
index 2dd8ea3edb..9668358710 100644
--- a/servers/physics_server_3d.cpp
+++ b/servers/physics_server_3d.cpp
@@ -295,7 +295,7 @@ Array PhysicsDirectSpaceState3D::_intersect_shape(const Ref<PhysicsShapeQueryPar
Array PhysicsDirectSpaceState3D::_cast_motion(const Ref<PhysicsShapeQueryParameters3D> &p_shape_query, const Vector3 &p_motion) {
ERR_FAIL_COND_V(!p_shape_query.is_valid(), Array());
- float closest_safe, closest_unsafe;
+ float closest_safe = 1.0f, closest_unsafe = 1.0f;
bool res = cast_motion(p_shape_query->shape, p_shape_query->transform, p_motion, p_shape_query->margin, closest_safe, closest_unsafe, p_shape_query->exclude, p_shape_query->collision_mask, p_shape_query->collide_with_bodies, p_shape_query->collide_with_areas);
if (!res) {
return Array();
diff --git a/servers/rendering/rasterizer_rd/shader_compiler_rd.cpp b/servers/rendering/rasterizer_rd/shader_compiler_rd.cpp
index 32321164a1..79bb990649 100644
--- a/servers/rendering/rasterizer_rd/shader_compiler_rd.cpp
+++ b/servers/rendering/rasterizer_rd/shader_compiler_rd.cpp
@@ -711,6 +711,11 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge
gcode += _typestr(cnode.type);
}
gcode += " " + _mkid(String(cnode.name));
+ if (cnode.array_size > 0) {
+ gcode += "[";
+ gcode += itos(cnode.array_size);
+ gcode += "]";
+ }
gcode += "=";
gcode += _dump_node_code(cnode.initializer, p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
gcode += ";\n";
@@ -988,7 +993,29 @@ String ShaderCompilerRD::_dump_node_code(const SL::Node *p_node, int p_level, Ge
} break;
case SL::Node::TYPE_CONSTANT: {
SL::ConstantNode *cnode = (SL::ConstantNode *)p_node;
- return get_constant_text(cnode->datatype, cnode->values);
+
+ if (cnode->array_size == 0) {
+ return get_constant_text(cnode->datatype, cnode->values);
+ } else {
+ if (cnode->get_datatype() == SL::TYPE_STRUCT) {
+ code += _mkid(cnode->struct_name);
+ } else {
+ code += _typestr(cnode->datatype);
+ }
+ code += "[";
+ code += itos(cnode->array_size);
+ code += "]";
+ code += "(";
+ for (int i = 0; i < cnode->array_size; i++) {
+ if (i > 0) {
+ code += ",";
+ } else {
+ code += "";
+ }
+ code += _dump_node_code(cnode->array_declarations[0].initializer[i], p_level, r_gen_code, p_actions, p_default_actions, p_assigning);
+ }
+ code += ")";
+ }
} break;
case SL::Node::TYPE_OPERATOR: {
diff --git a/servers/rendering/shader_language.cpp b/servers/rendering/shader_language.cpp
index 2ec65b7ea8..a3fef10cc0 100644
--- a/servers/rendering/shader_language.cpp
+++ b/servers/rendering/shader_language.cpp
@@ -1014,6 +1014,9 @@ bool ShaderLanguage::_find_identifier(const BlockNode *p_block, bool p_allow_rea
if (r_data_type) {
*r_data_type = shader->constants[p_identifier].type;
}
+ if (r_array_size) {
+ *r_array_size = shader->constants[p_identifier].array_size;
+ }
if (r_type) {
*r_type = IDENTIFIER_CONSTANT;
}
@@ -3064,7 +3067,7 @@ bool ShaderLanguage::_validate_assign(Node *p_node, const Map<StringName, BuiltI
} else if (p_node->type == Node::TYPE_ARRAY) {
ArrayNode *arr = static_cast<ArrayNode *>(p_node);
- if (arr->is_const) {
+ if (shader->constants.has(arr->name) || arr->is_const) {
if (r_message) {
*r_message = RTR("Constants cannot be modified.");
}
@@ -4976,7 +4979,7 @@ Error ShaderLanguage::_parse_block(BlockNode *p_block, const Map<StringName, Bui
}
DataType type2;
- String struct_name2 = "";
+ StringName struct_name2 = "";
if (shader->structs.has(tk.text)) {
type2 = TYPE_STRUCT;
@@ -6445,38 +6448,253 @@ Error ShaderLanguage::_parse_shader(const Map<StringName, FunctionInfo> &p_funct
constant.type_str = struct_name;
constant.precision = precision;
constant.initializer = nullptr;
+ constant.array_size = 0;
- if (tk.type == TK_OP_ASSIGN) {
- if (!is_constant) {
- _set_error("Expected 'const' keyword before constant definition");
+ bool unknown_size = false;
+
+ if (tk.type == TK_BRACKET_OPEN) {
+ if (RenderingServer::get_singleton()->is_low_end()) {
+ _set_error("Global const arrays are supported only on high-end platform!");
return ERR_PARSE_ERROR;
}
- //variable created with assignment! must parse an expression
- Node *expr = _parse_and_reduce_expression(nullptr, Map<StringName, BuiltInInfo>());
- if (!expr) {
+ tk = _get_token();
+ if (tk.type == TK_BRACKET_CLOSE) {
+ unknown_size = true;
+ tk = _get_token();
+ } else if (tk.type == TK_INT_CONSTANT && ((int)tk.constant) > 0) {
+ constant.array_size = (int)tk.constant;
+ tk = _get_token();
+ if (tk.type != TK_BRACKET_CLOSE) {
+ _set_error("Expected ']'");
+ return ERR_PARSE_ERROR;
+ }
+ tk = _get_token();
+ } else {
+ _set_error("Expected integer constant > 0 or ']'");
return ERR_PARSE_ERROR;
}
- if (expr->type == Node::TYPE_OPERATOR && ((OperatorNode *)expr)->op == OP_CALL) {
- _set_error("Expected constant expression after '='");
+ }
+
+ if (tk.type == TK_OP_ASSIGN) {
+ if (!is_constant) {
+ _set_error("Expected 'const' keyword before constant definition");
return ERR_PARSE_ERROR;
}
- constant.initializer = static_cast<ConstantNode *>(expr);
+ if (constant.array_size > 0 || unknown_size) {
+ bool full_def = false;
+
+ ArrayDeclarationNode::Declaration decl;
+ decl.name = name;
+ decl.size = constant.array_size;
- if (is_struct) {
- if (expr->get_datatype_name() != struct_name) {
- _set_error("Invalid assignment of '" + (expr->get_datatype() == TYPE_STRUCT ? expr->get_datatype_name() : get_datatype_name(expr->get_datatype())) + "' to '" + struct_name + "'");
+ tk = _get_token();
+
+ if (tk.type != TK_CURLY_BRACKET_OPEN) {
+ if (unknown_size) {
+ _set_error("Expected '{'");
+ return ERR_PARSE_ERROR;
+ }
+
+ full_def = true;
+
+ DataPrecision precision2 = PRECISION_DEFAULT;
+ if (is_token_precision(tk.type)) {
+ precision2 = get_token_precision(tk.type);
+ tk = _get_token();
+ if (!is_token_nonvoid_datatype(tk.type)) {
+ _set_error("Expected datatype after precision");
+ return ERR_PARSE_ERROR;
+ }
+ }
+
+ StringName struct_name2;
+ DataType type2;
+
+ if (shader->structs.has(tk.text)) {
+ type2 = TYPE_STRUCT;
+ struct_name2 = tk.text;
+ } else {
+ if (!is_token_variable_datatype(tk.type)) {
+ _set_error("Invalid data type for array");
+ return ERR_PARSE_ERROR;
+ }
+ type2 = get_token_datatype(tk.type);
+ }
+
+ int array_size2 = 0;
+
+ tk = _get_token();
+ if (tk.type == TK_BRACKET_OPEN) {
+ TkPos pos2 = _get_tkpos();
+ tk = _get_token();
+ if (tk.type == TK_BRACKET_CLOSE) {
+ array_size2 = constant.array_size;
+ tk = _get_token();
+ } else {
+ _set_tkpos(pos2);
+
+ Node *n = _parse_and_reduce_expression(NULL, Map<StringName, BuiltInInfo>());
+ if (!n || n->type != Node::TYPE_CONSTANT || n->get_datatype() != TYPE_INT) {
+ _set_error("Expected single integer constant > 0");
+ return ERR_PARSE_ERROR;
+ }
+
+ ConstantNode *cnode = (ConstantNode *)n;
+ if (cnode->values.size() == 1) {
+ array_size2 = cnode->values[0].sint;
+ if (array_size2 <= 0) {
+ _set_error("Expected single integer constant > 0");
+ return ERR_PARSE_ERROR;
+ }
+ } else {
+ _set_error("Expected single integer constant > 0");
+ return ERR_PARSE_ERROR;
+ }
+
+ tk = _get_token();
+ if (tk.type != TK_BRACKET_CLOSE) {
+ _set_error("Expected ']");
+ return ERR_PARSE_ERROR;
+ } else {
+ tk = _get_token();
+ }
+ }
+ } else {
+ _set_error("Expected '[");
+ return ERR_PARSE_ERROR;
+ }
+
+ if (constant.precision != precision2 || constant.type != type2 || struct_name != struct_name2 || constant.array_size != array_size2) {
+ String error_str = "Cannot convert from '";
+ if (type2 == TYPE_STRUCT) {
+ error_str += struct_name2;
+ } else {
+ if (precision2 != PRECISION_DEFAULT) {
+ error_str += get_precision_name(precision2);
+ error_str += " ";
+ }
+ error_str += get_datatype_name(type2);
+ }
+ error_str += "[";
+ error_str += itos(array_size2);
+ error_str += "]'";
+ error_str += " to '";
+ if (type == TYPE_STRUCT) {
+ error_str += struct_name;
+ } else {
+ if (precision != PRECISION_DEFAULT) {
+ error_str += get_precision_name(precision);
+ error_str += " ";
+ }
+ error_str += get_datatype_name(type);
+ }
+ error_str += "[";
+ error_str += itos(constant.array_size);
+ error_str += "]'";
+ _set_error(error_str);
+ return ERR_PARSE_ERROR;
+ }
+ }
+
+ bool curly = tk.type == TK_CURLY_BRACKET_OPEN;
+
+ if (unknown_size) {
+ if (!curly) {
+ _set_error("Expected '{'");
+ return ERR_PARSE_ERROR;
+ }
+ } else {
+ if (full_def) {
+ if (curly) {
+ _set_error("Expected '('");
+ return ERR_PARSE_ERROR;
+ }
+ }
+ }
+
+ if (tk.type == TK_PARENTHESIS_OPEN || curly) { // initialization
+ while (true) {
+ Node *n = _parse_and_reduce_expression(NULL, Map<StringName, BuiltInInfo>());
+ if (!n) {
+ return ERR_PARSE_ERROR;
+ }
+
+ if (n->type == Node::TYPE_OPERATOR && ((OperatorNode *)n)->op == OP_CALL) {
+ _set_error("Expected constant expression");
+ return ERR_PARSE_ERROR;
+ }
+
+ if (constant.type != n->get_datatype() || n->get_datatype_name() != struct_name) {
+ _set_error("Invalid assignment of '" + (n->get_datatype() == TYPE_STRUCT ? n->get_datatype_name() : get_datatype_name(n->get_datatype())) + "' to '" + (is_struct ? String(struct_name) : get_datatype_name(constant.type)) + "'");
+ return ERR_PARSE_ERROR;
+ }
+
+ tk = _get_token();
+ if (tk.type == TK_COMMA) {
+ decl.initializer.push_back(n);
+ continue;
+ } else if (!curly && tk.type == TK_PARENTHESIS_CLOSE) {
+ decl.initializer.push_back(n);
+ break;
+ } else if (curly && tk.type == TK_CURLY_BRACKET_CLOSE) {
+ decl.initializer.push_back(n);
+ break;
+ } else {
+ if (curly)
+ _set_error("Expected '}' or ','");
+ else
+ _set_error("Expected ')' or ','");
+ return ERR_PARSE_ERROR;
+ }
+ }
+ if (unknown_size) {
+ decl.size = decl.initializer.size();
+ constant.array_size = decl.initializer.size();
+ } else if (decl.initializer.size() != constant.array_size) {
+ _set_error("Array size mismatch");
+ return ERR_PARSE_ERROR;
+ }
+ }
+
+ ConstantNode *expr = memnew(ConstantNode);
+
+ expr->datatype = constant.type;
+
+ expr->struct_name = constant.type_str;
+
+ expr->array_size = constant.array_size;
+
+ expr->array_declarations.push_back(decl);
+
+ constant.initializer = static_cast<ConstantNode *>(expr);
+ } else {
+ //variable created with assignment! must parse an expression
+ Node *expr = _parse_and_reduce_expression(NULL, Map<StringName, BuiltInInfo>());
+ if (!expr)
+ return ERR_PARSE_ERROR;
+ if (expr->type == Node::TYPE_OPERATOR && ((OperatorNode *)expr)->op == OP_CALL) {
+ _set_error("Expected constant expression after '='");
+ return ERR_PARSE_ERROR;
+ }
+
+ constant.initializer = static_cast<ConstantNode *>(expr);
+
+ if (type != expr->get_datatype() || expr->get_datatype_name() != struct_name) {
+ _set_error("Invalid assignment of '" + (expr->get_datatype() == TYPE_STRUCT ? expr->get_datatype_name() : get_datatype_name(expr->get_datatype())) + "' to '" + (is_struct ? String(struct_name) : get_datatype_name(type)) + "'");
return ERR_PARSE_ERROR;
}
- } else if (type != expr->get_datatype()) {
- _set_error("Invalid assignment of '" + get_datatype_name(expr->get_datatype()) + "' to '" + get_datatype_name(type) + "'");
- return ERR_PARSE_ERROR;
}
tk = _get_token();
} else {
- _set_error("Expected initialization of constant");
- return ERR_PARSE_ERROR;
+ if (constant.array_size > 0 || unknown_size) {
+ _set_error("Expected array initialization");
+ return ERR_PARSE_ERROR;
+ } else {
+ _set_error("Expected initialization of constant");
+ return ERR_PARSE_ERROR;
+ }
}
shader->constants[name] = constant;
diff --git a/servers/rendering/shader_language.h b/servers/rendering/shader_language.h
index 020a5e3e6f..bc8f03774a 100644
--- a/servers/rendering/shader_language.h
+++ b/servers/rendering/shader_language.h
@@ -453,6 +453,8 @@ public:
struct ConstantNode : public Node {
DataType datatype = TYPE_VOID;
+ String struct_name = "";
+ int array_size = 0;
union Value {
bool boolean;
@@ -462,7 +464,9 @@ public:
};
Vector<Value> values;
+ Vector<ArrayDeclarationNode::Declaration> array_declarations;
virtual DataType get_datatype() const { return datatype; }
+ virtual String get_datatype_name() const { return struct_name; }
ConstantNode() :
Node(TYPE_CONSTANT) {}
@@ -573,6 +577,7 @@ public:
StringName type_str;
DataPrecision precision;
ConstantNode *initializer;
+ int array_size;
};
struct Function {