Allow negative indexes in ItemList and PopupMenu
This commit is contained in:
@@ -176,7 +176,7 @@ void FileDialog::update_dir() {
|
||||
if (dir_access->get_current_dir().is_network_share_path()) {
|
||||
_update_drives(false);
|
||||
drives->add_item(RTR("Network"));
|
||||
drives->set_item_disabled(drives->get_item_count() - 1, true);
|
||||
drives->set_item_disabled(-1, true);
|
||||
drives->select(drives->get_item_count() - 1);
|
||||
} else {
|
||||
drives->select(dir_access->get_current_drive());
|
||||
|
||||
@@ -83,6 +83,9 @@ int ItemList::add_icon_item(const Ref<Texture2D> &p_item, bool p_selectable) {
|
||||
}
|
||||
|
||||
void ItemList::set_item_text(int p_idx, const String &p_text) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
|
||||
items.write[p_idx].text = p_text;
|
||||
@@ -97,6 +100,9 @@ String ItemList::get_item_text(int p_idx) const {
|
||||
}
|
||||
|
||||
void ItemList::set_item_text_direction(int p_idx, Control::TextDirection p_text_direction) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
ERR_FAIL_COND((int)p_text_direction < -1 || (int)p_text_direction > 3);
|
||||
if (items[p_idx].text_direction != p_text_direction) {
|
||||
@@ -119,6 +125,9 @@ void ItemList::clear_item_opentype_features(int p_idx) {
|
||||
}
|
||||
|
||||
void ItemList::set_item_opentype_feature(int p_idx, const String &p_name, int p_value) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
int32_t tag = TS->name_to_tag(p_name);
|
||||
if (!items[p_idx].opentype_features.has(tag) || (int)items[p_idx].opentype_features[tag] != p_value) {
|
||||
@@ -138,6 +147,9 @@ int ItemList::get_item_opentype_feature(int p_idx, const String &p_name) const {
|
||||
}
|
||||
|
||||
void ItemList::set_item_language(int p_idx, const String &p_language) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
if (items[p_idx].language != p_language) {
|
||||
items.write[p_idx].language = p_language;
|
||||
@@ -152,6 +164,9 @@ String ItemList::get_item_language(int p_idx) const {
|
||||
}
|
||||
|
||||
void ItemList::set_item_tooltip_enabled(int p_idx, const bool p_enabled) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].tooltip_enabled = p_enabled;
|
||||
}
|
||||
@@ -162,6 +177,9 @@ bool ItemList::is_item_tooltip_enabled(int p_idx) const {
|
||||
}
|
||||
|
||||
void ItemList::set_item_tooltip(int p_idx, const String &p_tooltip) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
|
||||
items.write[p_idx].tooltip = p_tooltip;
|
||||
@@ -175,6 +193,9 @@ String ItemList::get_item_tooltip(int p_idx) const {
|
||||
}
|
||||
|
||||
void ItemList::set_item_icon(int p_idx, const Ref<Texture2D> &p_icon) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
|
||||
items.write[p_idx].icon = p_icon;
|
||||
@@ -189,6 +210,9 @@ Ref<Texture2D> ItemList::get_item_icon(int p_idx) const {
|
||||
}
|
||||
|
||||
void ItemList::set_item_icon_transposed(int p_idx, const bool p_transposed) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
|
||||
items.write[p_idx].icon_transposed = p_transposed;
|
||||
@@ -203,6 +227,9 @@ bool ItemList::is_item_icon_transposed(int p_idx) const {
|
||||
}
|
||||
|
||||
void ItemList::set_item_icon_region(int p_idx, const Rect2 &p_region) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
|
||||
items.write[p_idx].icon_region = p_region;
|
||||
@@ -217,6 +244,9 @@ Rect2 ItemList::get_item_icon_region(int p_idx) const {
|
||||
}
|
||||
|
||||
void ItemList::set_item_icon_modulate(int p_idx, const Color &p_modulate) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
|
||||
items.write[p_idx].icon_modulate = p_modulate;
|
||||
@@ -230,6 +260,9 @@ Color ItemList::get_item_icon_modulate(int p_idx) const {
|
||||
}
|
||||
|
||||
void ItemList::set_item_custom_bg_color(int p_idx, const Color &p_custom_bg_color) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
|
||||
items.write[p_idx].custom_bg = p_custom_bg_color;
|
||||
@@ -243,6 +276,9 @@ Color ItemList::get_item_custom_bg_color(int p_idx) const {
|
||||
}
|
||||
|
||||
void ItemList::set_item_custom_fg_color(int p_idx, const Color &p_custom_fg_color) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
|
||||
items.write[p_idx].custom_fg = p_custom_fg_color;
|
||||
@@ -256,6 +292,9 @@ Color ItemList::get_item_custom_fg_color(int p_idx) const {
|
||||
}
|
||||
|
||||
void ItemList::set_item_tag_icon(int p_idx, const Ref<Texture2D> &p_tag_icon) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
|
||||
items.write[p_idx].tag_icon = p_tag_icon;
|
||||
@@ -270,6 +309,9 @@ Ref<Texture2D> ItemList::get_item_tag_icon(int p_idx) const {
|
||||
}
|
||||
|
||||
void ItemList::set_item_selectable(int p_idx, bool p_selectable) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
|
||||
items.write[p_idx].selectable = p_selectable;
|
||||
@@ -281,6 +323,9 @@ bool ItemList::is_item_selectable(int p_idx) const {
|
||||
}
|
||||
|
||||
void ItemList::set_item_disabled(int p_idx, bool p_disabled) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
|
||||
items.write[p_idx].disabled = p_disabled;
|
||||
@@ -293,6 +338,9 @@ bool ItemList::is_item_disabled(int p_idx) const {
|
||||
}
|
||||
|
||||
void ItemList::set_item_metadata(int p_idx, const Variant &p_metadata) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
|
||||
items.write[p_idx].metadata = p_metadata;
|
||||
|
||||
@@ -999,6 +999,9 @@ void PopupMenu::add_submenu_item(const String &p_label, const String &p_submenu,
|
||||
/* Methods to modify existing items. */
|
||||
|
||||
void PopupMenu::set_item_text(int p_idx, const String &p_text) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].text = p_text;
|
||||
items.write[p_idx].xl_text = atr(p_text);
|
||||
@@ -1009,6 +1012,9 @@ void PopupMenu::set_item_text(int p_idx, const String &p_text) {
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_text_direction(int p_item, Control::TextDirection p_text_direction) {
|
||||
if (p_item < 0) {
|
||||
p_item += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_item, items.size());
|
||||
ERR_FAIL_COND((int)p_text_direction < -1 || (int)p_text_direction > 3);
|
||||
if (items[p_item].text_direction != p_text_direction) {
|
||||
@@ -1019,6 +1025,9 @@ void PopupMenu::set_item_text_direction(int p_item, Control::TextDirection p_tex
|
||||
}
|
||||
|
||||
void PopupMenu::clear_item_opentype_features(int p_item) {
|
||||
if (p_item < 0) {
|
||||
p_item += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_item, items.size());
|
||||
items.write[p_item].opentype_features.clear();
|
||||
items.write[p_item].dirty = true;
|
||||
@@ -1026,6 +1035,9 @@ void PopupMenu::clear_item_opentype_features(int p_item) {
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_opentype_feature(int p_item, const String &p_name, int p_value) {
|
||||
if (p_item < 0) {
|
||||
p_item += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_item, items.size());
|
||||
int32_t tag = TS->name_to_tag(p_name);
|
||||
if (!items[p_item].opentype_features.has(tag) || (int)items[p_item].opentype_features[tag] != p_value) {
|
||||
@@ -1036,6 +1048,9 @@ void PopupMenu::set_item_opentype_feature(int p_item, const String &p_name, int
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_language(int p_item, const String &p_language) {
|
||||
if (p_item < 0) {
|
||||
p_item += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_item, items.size());
|
||||
if (items[p_item].language != p_language) {
|
||||
items.write[p_item].language = p_language;
|
||||
@@ -1045,6 +1060,9 @@ void PopupMenu::set_item_language(int p_item, const String &p_language) {
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_icon(int p_idx, const Ref<Texture2D> &p_icon) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].icon = p_icon;
|
||||
|
||||
@@ -1053,6 +1071,9 @@ void PopupMenu::set_item_icon(int p_idx, const Ref<Texture2D> &p_icon) {
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_checked(int p_idx, bool p_checked) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
|
||||
items.write[p_idx].checked = p_checked;
|
||||
@@ -1062,6 +1083,9 @@ void PopupMenu::set_item_checked(int p_idx, bool p_checked) {
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_id(int p_idx, int p_id) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].id = p_id;
|
||||
|
||||
@@ -1070,6 +1094,9 @@ void PopupMenu::set_item_id(int p_idx, int p_id) {
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_accelerator(int p_idx, Key p_accel) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].accel = p_accel;
|
||||
items.write[p_idx].dirty = true;
|
||||
@@ -1079,6 +1106,9 @@ void PopupMenu::set_item_accelerator(int p_idx, Key p_accel) {
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_metadata(int p_idx, const Variant &p_meta) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].metadata = p_meta;
|
||||
control->update();
|
||||
@@ -1086,6 +1116,9 @@ void PopupMenu::set_item_metadata(int p_idx, const Variant &p_meta) {
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_disabled(int p_idx, bool p_disabled) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].disabled = p_disabled;
|
||||
control->update();
|
||||
@@ -1093,6 +1126,9 @@ void PopupMenu::set_item_disabled(int p_idx, bool p_disabled) {
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_submenu(int p_idx, const String &p_submenu) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].submenu = p_submenu;
|
||||
control->update();
|
||||
@@ -1201,6 +1237,9 @@ int PopupMenu::get_item_state(int p_idx) const {
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_as_separator(int p_idx, bool p_separator) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].separator = p_separator;
|
||||
control->update();
|
||||
@@ -1212,24 +1251,36 @@ bool PopupMenu::is_item_separator(int p_idx) const {
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_as_checkable(int p_idx, bool p_checkable) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].checkable_type = p_checkable ? Item::CHECKABLE_TYPE_CHECK_BOX : Item::CHECKABLE_TYPE_NONE;
|
||||
control->update();
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_as_radio_checkable(int p_idx, bool p_radio_checkable) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].checkable_type = p_radio_checkable ? Item::CHECKABLE_TYPE_RADIO_BUTTON : Item::CHECKABLE_TYPE_NONE;
|
||||
control->update();
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_tooltip(int p_idx, const String &p_tooltip) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].tooltip = p_tooltip;
|
||||
control->update();
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_shortcut(int p_idx, const Ref<Shortcut> &p_shortcut, bool p_global) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
if (items[p_idx].shortcut.is_valid()) {
|
||||
_unref_shortcut(items[p_idx].shortcut);
|
||||
@@ -1246,6 +1297,9 @@ void PopupMenu::set_item_shortcut(int p_idx, const Ref<Shortcut> &p_shortcut, bo
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_h_offset(int p_idx, int p_offset) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].h_ofs = p_offset;
|
||||
control->update();
|
||||
@@ -1253,12 +1307,18 @@ void PopupMenu::set_item_h_offset(int p_idx, int p_offset) {
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_multistate(int p_idx, int p_state) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].state = p_state;
|
||||
control->update();
|
||||
}
|
||||
|
||||
void PopupMenu::set_item_shortcut_disabled(int p_idx, bool p_disabled) {
|
||||
if (p_idx < 0) {
|
||||
p_idx += get_item_count();
|
||||
}
|
||||
ERR_FAIL_INDEX(p_idx, items.size());
|
||||
items.write[p_idx].shortcut_is_disabled = p_disabled;
|
||||
control->update();
|
||||
|
||||
Reference in New Issue
Block a user