PopupMenu upgrade: Hide on item selection (#7306)

* Added the option to set hide on item selection. Usable in GDScript and from within the source code when you want to specify popup menus you don't want to close immediately when selecting an item

* Renamed getter from get_ to is_, fixed parent/child behavior, renamed bool variable to match most code and added ADD_PROPERTYNO to save some memory

(cherry picked from commit da950cd0f2)
This commit is contained in:
Ivan P. Skodje 2016-12-23 15:43:45 +01:00 committed by Rémi Verschelde
parent 2fbae72d14
commit 0701e7c2d8
4 changed files with 50 additions and 4 deletions

View file

@ -899,11 +899,24 @@ void PopupMenu::activate_item(int p_item) {
Node *next = get_parent();
PopupMenu *pop = next->cast_to<PopupMenu>();
while (pop) {
pop->hide();
next = next->get_parent();
pop = next->cast_to<PopupMenu>();
// We close all parents that are chained together,
// with hide_on_item_selection enabled
if(hide_on_item_selection && pop->is_hide_on_item_selection()) {
pop->hide();
next = next->get_parent();
pop = next->cast_to<PopupMenu>();
}
else {
// Break out of loop when the next parent has
// hide_on_item_selection disabled
break;
}
}
// Hides popup by default; unless otherwise specified
// by using set_hide_on_item_selection
if (hide_on_item_selection) {
hide();
}
hide();
}
@ -1019,6 +1032,16 @@ void PopupMenu::_set_items(const Array& p_items){
}
// Hide on item selection determines whether or not the popup will close after item selection
void PopupMenu::set_hide_on_item_selection(bool p_enabled) {
hide_on_item_selection=p_enabled;
}
bool PopupMenu::is_hide_on_item_selection() {
return hide_on_item_selection;
}
String PopupMenu::get_tooltip(const Point2& p_pos) const {
@ -1107,9 +1130,13 @@ void PopupMenu::_bind_methods() {
ObjectTypeDB::bind_method(_MD("_set_items"),&PopupMenu::_set_items);
ObjectTypeDB::bind_method(_MD("_get_items"),&PopupMenu::_get_items);
ObjectTypeDB::bind_method(_MD("set_hide_on_item_selection","enable"),&PopupMenu::set_hide_on_item_selection);
ObjectTypeDB::bind_method(_MD("is_hide_on_item_selection"),&PopupMenu::is_hide_on_item_selection);
ObjectTypeDB::bind_method(_MD("_submenu_timeout"),&PopupMenu::_submenu_timeout);
ADD_PROPERTY( PropertyInfo(Variant::ARRAY,"items",PROPERTY_HINT_NONE,"",PROPERTY_USAGE_NOEDITOR), _SCS("_set_items"),_SCS("_get_items") );
ADD_PROPERTYNO( PropertyInfo(Variant::BOOL, "hide_on_item_selection" ), _SCS("set_hide_on_item_selection"), _SCS("is_hide_on_item_selection") );
ADD_SIGNAL( MethodInfo("item_pressed", PropertyInfo( Variant::INT,"ID") ) );
@ -1128,6 +1155,7 @@ PopupMenu::PopupMenu() {
set_focus_mode(FOCUS_ALL);
set_as_toplevel(true);
set_hide_on_item_selection(true);
submenu_timer = memnew( Timer );
submenu_timer->set_wait_time(0.3);

View file

@ -74,6 +74,7 @@ class PopupMenu : public Popup {
void _submenu_timeout();
bool invalidated_click;
bool hide_on_item_selection;
Vector2 moved;
Array _get_items() const;
@ -153,6 +154,8 @@ public:
void clear_autohide_areas();
void set_invalidate_click_until_motion();
void set_hide_on_item_selection(bool p_enabled);
bool is_hide_on_item_selection();
PopupMenu();
~PopupMenu();