diff options
| -rw-r--r-- | doc/classes/Input.xml | 2 | ||||
| -rw-r--r-- | doc/classes/TabBar.xml | 15 | ||||
| -rw-r--r-- | doc/classes/TabContainer.xml | 15 | ||||
| -rw-r--r-- | platform/android/java/app/config.gradle | 2 | ||||
| -rw-r--r-- | platform/linuxbsd/x11/display_server_x11.cpp | 5 | ||||
| -rw-r--r-- | platform/macos/display_server_macos.mm | 5 | ||||
| -rw-r--r-- | platform/web/display_server_web.cpp | 7 | ||||
| -rw-r--r-- | platform/windows/display_server_windows.cpp | 5 | ||||
| -rw-r--r-- | scene/gui/tab_bar.cpp | 17 | ||||
| -rw-r--r-- | scene/gui/tab_bar.h | 4 | ||||
| -rw-r--r-- | scene/gui/tab_container.cpp | 14 | ||||
| -rw-r--r-- | scene/gui/tab_container.h | 3 |
12 files changed, 91 insertions, 3 deletions
diff --git a/doc/classes/Input.xml b/doc/classes/Input.xml index d81812dc35..ecc9c3d89a 100644 --- a/doc/classes/Input.xml +++ b/doc/classes/Input.xml @@ -303,7 +303,7 @@ [param image]'s size must be lower than or equal to 256×256. To avoid rendering issues, sizes lower than or equal to 128×128 are recommended. [param hotspot] must be within [param image]'s size. [b]Note:[/b] [AnimatedTexture]s aren't supported as custom mouse cursors. If using an [AnimatedTexture], only the first frame will be displayed. - [b]Note:[/b] Only images imported with the [b]Lossless[/b], [b]Lossy[/b] or [b]Uncompressed[/b] compression modes are supported. The [b]Video RAM[/b] compression mode can't be used for custom cursors. + [b]Note:[/b] The [b]Lossless[/b], [b]Lossy[/b] or [b]Uncompressed[/b] compression modes are recommended. The [b]Video RAM[/b] compression mode can be used, but it will be decompressed on the CPU, which means loading times are slowed down and no memory is saved compared to lossless modes. [b]Note:[/b] On the web platform, the maximum allowed cursor image size is 128×128. Cursor images larger than 32×32 will also only be displayed if the mouse cursor image is entirely located within the page for [url=https://chromestatus.com/feature/5825971391299584]security reasons[/url]. </description> </method> diff --git a/doc/classes/TabBar.xml b/doc/classes/TabBar.xml index 4bbd74cd11..d5bb7e027f 100644 --- a/doc/classes/TabBar.xml +++ b/doc/classes/TabBar.xml @@ -77,6 +77,13 @@ Returns tab title language code. </description> </method> + <method name="get_tab_metadata" qualifiers="const"> + <return type="Variant" /> + <param index="0" name="tab_idx" type="int" /> + <description> + Returns the metadata value set to the tab at index [param tab_idx] using [method set_tab_metadata]. If no metadata was previously set, returns [code]null[/code] by default. + </description> + </method> <method name="get_tab_offset" qualifiers="const"> <return type="int" /> <description> @@ -181,6 +188,14 @@ Sets language code of tab title used for line-breaking and text shaping algorithms, if left empty current locale is used instead. </description> </method> + <method name="set_tab_metadata"> + <return type="void" /> + <param index="0" name="tab_idx" type="int" /> + <param index="1" name="metadata" type="Variant" /> + <description> + Sets the metadata value for the tab at index [param tab_idx], which can be retrieved later using [method get_tab_metadata]. + </description> + </method> <method name="set_tab_text_direction"> <return type="void" /> <param index="0" name="tab_idx" type="int" /> diff --git a/doc/classes/TabContainer.xml b/doc/classes/TabContainer.xml index b0dcb932dc..dbc769cfe9 100644 --- a/doc/classes/TabContainer.xml +++ b/doc/classes/TabContainer.xml @@ -72,6 +72,13 @@ Returns the index of the tab tied to the given [param control]. The control must be a child of the [TabContainer]. </description> </method> + <method name="get_tab_metadata" qualifiers="const"> + <return type="Variant" /> + <param index="0" name="tab_idx" type="int" /> + <description> + Returns the metadata value set to the tab at index [param tab_idx] using [method set_tab_metadata]. If no metadata was previously set, returns [code]null[/code] by default. + </description> + </method> <method name="get_tab_title" qualifiers="const"> <return type="String" /> <param index="0" name="tab_idx" type="int" /> @@ -132,6 +139,14 @@ Sets an icon for the tab at index [param tab_idx]. </description> </method> + <method name="set_tab_metadata"> + <return type="void" /> + <param index="0" name="tab_idx" type="int" /> + <param index="1" name="metadata" type="Variant" /> + <description> + Sets the metadata value for the tab at index [param tab_idx], which can be retrieved later using [method get_tab_metadata]. + </description> + </method> <method name="set_tab_title"> <return type="void" /> <param index="0" name="tab_idx" type="int" /> diff --git a/platform/android/java/app/config.gradle b/platform/android/java/app/config.gradle index a6fa2271ee..4bac6c814a 100644 --- a/platform/android/java/app/config.gradle +++ b/platform/android/java/app/config.gradle @@ -1,5 +1,5 @@ ext.versions = [ - androidGradlePlugin: '7.3.0', + androidGradlePlugin: '7.2.1', compileSdk : 33, // Also update 'platform/android/export/export_plugin.cpp#OPENGL_MIN_SDK_VERSION' minSdk : 21, diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp index 9d9d4ae43e..ac4fbe2068 100644 --- a/platform/linuxbsd/x11/display_server_x11.cpp +++ b/platform/linuxbsd/x11/display_server_x11.cpp @@ -2671,6 +2671,11 @@ void DisplayServerX11::cursor_set_custom_image(const Ref<Resource> &p_cursor, Cu Ref<Image> image = texture->get_image(); ERR_FAIL_COND(!image.is_valid()); + if (image->is_compressed()) { + image = image->duplicate(true); + Error err = image->decompress(); + ERR_FAIL_COND_MSG(err != OK, "Couldn't decompress VRAM-compressed custom mouse cursor image. Switch to a lossless compression mode in the Import dock."); + } // Create the cursor structure XcursorImage *cursor_image = XcursorImageCreate(texture_size.width, texture_size.height); diff --git a/platform/macos/display_server_macos.mm b/platform/macos/display_server_macos.mm index 1bff23f227..5a7c309448 100644 --- a/platform/macos/display_server_macos.mm +++ b/platform/macos/display_server_macos.mm @@ -3300,6 +3300,11 @@ void DisplayServerMacOS::cursor_set_custom_image(const Ref<Resource> &p_cursor, Ref<Image> image = texture->get_image(); ERR_FAIL_COND(!image.is_valid()); + if (image->is_compressed()) { + image = image->duplicate(true); + Error err = image->decompress(); + ERR_FAIL_COND_MSG(err != OK, "Couldn't decompress VRAM-compressed custom mouse cursor image. Switch to a lossless compression mode in the Import dock."); + } NSBitmapImageRep *imgrep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:nullptr diff --git a/platform/web/display_server_web.cpp b/platform/web/display_server_web.cpp index da55e8560a..28f1914c37 100644 --- a/platform/web/display_server_web.cpp +++ b/platform/web/display_server_web.cpp @@ -426,7 +426,12 @@ void DisplayServerWeb::cursor_set_custom_image(const Ref<Resource> &p_cursor, Cu ERR_FAIL_COND(!image.is_valid()); - image = image->duplicate(); + image = image->duplicate(true); + + if (image->is_compressed()) { + Error err = image->decompress(); + ERR_FAIL_COND_MSG(err != OK, "Couldn't decompress VRAM-compressed custom mouse cursor image. Switch to a lossless compression mode in the Import dock."); + } if (atlas_texture.is_valid()) { image->crop_from_point( diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index e910fd471f..02bb30ed38 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -1742,6 +1742,11 @@ void DisplayServerWindows::cursor_set_custom_image(const Ref<Resource> &p_cursor Ref<Image> image = texture->get_image(); ERR_FAIL_COND(!image.is_valid()); + if (image->is_compressed()) { + image = image->duplicate(true); + Error err = image->decompress(); + ERR_FAIL_COND_MSG(err != OK, "Couldn't decompress VRAM-compressed custom mouse cursor image. Switch to a lossless compression mode in the Import dock."); + } UINT image_size = texture_size.width * texture_size.height; diff --git a/scene/gui/tab_bar.cpp b/scene/gui/tab_bar.cpp index 5eb5a519ff..d664bea168 100644 --- a/scene/gui/tab_bar.cpp +++ b/scene/gui/tab_bar.cpp @@ -791,6 +791,21 @@ bool TabBar::is_tab_hidden(int p_tab) const { return tabs[p_tab].hidden; } +void TabBar::set_tab_metadata(int p_tab, const Variant &p_metadata) { + ERR_FAIL_INDEX(p_tab, tabs.size()); + + if (tabs[p_tab].metadata == p_metadata) { + return; + } + + tabs.write[p_tab].metadata = p_metadata; +} + +Variant TabBar::get_tab_metadata(int p_tab) const { + ERR_FAIL_INDEX_V(p_tab, tabs.size(), Variant()); + return tabs[p_tab].metadata; +} + void TabBar::set_tab_button_icon(int p_tab, const Ref<Texture2D> &p_icon) { ERR_FAIL_INDEX(p_tab, tabs.size()); @@ -1607,6 +1622,8 @@ void TabBar::_bind_methods() { ClassDB::bind_method(D_METHOD("is_tab_disabled", "tab_idx"), &TabBar::is_tab_disabled); ClassDB::bind_method(D_METHOD("set_tab_hidden", "tab_idx", "hidden"), &TabBar::set_tab_hidden); ClassDB::bind_method(D_METHOD("is_tab_hidden", "tab_idx"), &TabBar::is_tab_hidden); + ClassDB::bind_method(D_METHOD("set_tab_metadata", "tab_idx", "metadata"), &TabBar::set_tab_metadata); + ClassDB::bind_method(D_METHOD("get_tab_metadata", "tab_idx"), &TabBar::get_tab_metadata); ClassDB::bind_method(D_METHOD("remove_tab", "tab_idx"), &TabBar::remove_tab); ClassDB::bind_method(D_METHOD("add_tab", "title", "icon"), &TabBar::add_tab, DEFVAL(""), DEFVAL(Ref<Texture2D>())); ClassDB::bind_method(D_METHOD("get_tab_idx_at_point", "point"), &TabBar::get_tab_idx_at_point); diff --git a/scene/gui/tab_bar.h b/scene/gui/tab_bar.h index a232061b69..fa6aece827 100644 --- a/scene/gui/tab_bar.h +++ b/scene/gui/tab_bar.h @@ -66,6 +66,7 @@ private: bool disabled = false; bool hidden = false; + Variant metadata; int ofs_cache = 0; int size_cache = 0; int size_text = 0; @@ -184,6 +185,9 @@ public: void set_tab_hidden(int p_tab, bool p_hidden); bool is_tab_hidden(int p_tab) const; + void set_tab_metadata(int p_tab, const Variant &p_metadata); + Variant get_tab_metadata(int p_tab) const; + void set_tab_button_icon(int p_tab, const Ref<Texture2D> &p_icon); Ref<Texture2D> get_tab_button_icon(int p_tab) const; diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp index f4f7183475..0db2b905de 100644 --- a/scene/gui/tab_container.cpp +++ b/scene/gui/tab_container.cpp @@ -465,7 +465,9 @@ void TabContainer::_drop_data_fw(const Point2 &p_point, const Variant &p_data, C if (from_tabc && from_tabc->get_tabs_rearrange_group() == get_tabs_rearrange_group()) { // Get the tab properties before they get erased by the child removal. String tab_title = from_tabc->get_tab_title(tab_from_id); + Ref<Texture2D> tab_icon = from_tabc->get_tab_icon(tab_from_id); bool tab_disabled = from_tabc->is_tab_disabled(tab_from_id); + Variant tab_metadata = from_tabc->get_tab_metadata(tab_from_id); // Drop the new tab to the left or right depending on where the target tab is being hovered. if (hover_now != -1) { @@ -482,7 +484,9 @@ void TabContainer::_drop_data_fw(const Point2 &p_point, const Variant &p_data, C add_child(moving_tabc, true); set_tab_title(get_tab_count() - 1, tab_title); + set_tab_icon(get_tab_count() - 1, tab_icon); set_tab_disabled(get_tab_count() - 1, tab_disabled); + set_tab_metadata(get_tab_count() - 1, tab_metadata); move_child(moving_tabc, get_tab_control(hover_now)->get_index(false)); if (!is_tab_disabled(hover_now)) { @@ -794,6 +798,14 @@ bool TabContainer::is_tab_hidden(int p_tab) const { return tab_bar->is_tab_hidden(p_tab); } +void TabContainer::set_tab_metadata(int p_tab, const Variant &p_metadata) { + tab_bar->set_tab_metadata(p_tab, p_metadata); +} + +Variant TabContainer::get_tab_metadata(int p_tab) const { + return tab_bar->get_tab_metadata(p_tab); +} + void TabContainer::set_tab_button_icon(int p_tab, const Ref<Texture2D> &p_icon) { tab_bar->set_tab_button_icon(p_tab, p_icon); @@ -941,6 +953,8 @@ void TabContainer::_bind_methods() { ClassDB::bind_method(D_METHOD("is_tab_disabled", "tab_idx"), &TabContainer::is_tab_disabled); ClassDB::bind_method(D_METHOD("set_tab_hidden", "tab_idx", "hidden"), &TabContainer::set_tab_hidden); ClassDB::bind_method(D_METHOD("is_tab_hidden", "tab_idx"), &TabContainer::is_tab_hidden); + ClassDB::bind_method(D_METHOD("set_tab_metadata", "tab_idx", "metadata"), &TabContainer::set_tab_metadata); + ClassDB::bind_method(D_METHOD("get_tab_metadata", "tab_idx"), &TabContainer::get_tab_metadata); ClassDB::bind_method(D_METHOD("set_tab_button_icon", "tab_idx", "icon"), &TabContainer::set_tab_button_icon); ClassDB::bind_method(D_METHOD("get_tab_button_icon", "tab_idx"), &TabContainer::get_tab_button_icon); ClassDB::bind_method(D_METHOD("get_tab_idx_at_point", "point"), &TabContainer::get_tab_idx_at_point); diff --git a/scene/gui/tab_container.h b/scene/gui/tab_container.h index f64f1fe2a3..e2a77bf477 100644 --- a/scene/gui/tab_container.h +++ b/scene/gui/tab_container.h @@ -135,6 +135,9 @@ public: void set_tab_hidden(int p_tab, bool p_hidden); bool is_tab_hidden(int p_tab) const; + void set_tab_metadata(int p_tab, const Variant &p_metadata); + Variant get_tab_metadata(int p_tab) const; + void set_tab_button_icon(int p_tab, const Ref<Texture2D> &p_icon); Ref<Texture2D> get_tab_button_icon(int p_tab) const; |
