summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/classes/Input.xml2
-rw-r--r--doc/classes/TabBar.xml15
-rw-r--r--doc/classes/TabContainer.xml15
-rw-r--r--platform/android/java/app/config.gradle2
-rw-r--r--platform/linuxbsd/x11/display_server_x11.cpp5
-rw-r--r--platform/macos/display_server_macos.mm5
-rw-r--r--platform/web/display_server_web.cpp7
-rw-r--r--platform/windows/display_server_windows.cpp5
-rw-r--r--scene/gui/tab_bar.cpp17
-rw-r--r--scene/gui/tab_bar.h4
-rw-r--r--scene/gui/tab_container.cpp14
-rw-r--r--scene/gui/tab_container.h3
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;