Ported: PopupMenu rework and enhancements

Many scrolling behaviour improvements and the ability to limit popup size.
- EricEzaM, rsubtil
6a5992c9f1
This commit is contained in:
Relintai 2023-02-07 01:59:27 +01:00
parent a2661adba8
commit 19baf2133a
3 changed files with 401 additions and 323 deletions

View File

@ -478,6 +478,9 @@
<member name="hide_on_state_item_selection" type="bool" setter="set_hide_on_state_item_selection" getter="is_hide_on_state_item_selection" default="false">
If [code]true[/code], hides the [PopupMenu] when a state item is selected.
</member>
<member name="max_height" type="float" setter="set_max_height" getter="get_max_height" default="0.0">
If non-zero, the [code]PopupMenu[/code] will be resized vertically to that maximum value, showing a scrollbar if the content doesn't fit.
</member>
<member name="submenu_popup_delay" type="float" setter="set_submenu_popup_delay" getter="get_submenu_popup_delay" default="0.3">
Sets the delay time in seconds for the submenu item to popup on mouse hovering. If the popup menu is added as a child of another (acting as a submenu), it will inherit the delay time of the parent menu item.
</member>

File diff suppressed because it is too large Load Diff

View File

@ -33,6 +33,8 @@
#include "scene/gui/popup.h"
class ShortCut;
class MarginContainer;
class ScrollContainer;
class PopupMenu : public Popup {
GDCLASS(PopupMenu, Popup);
@ -57,11 +59,17 @@ class PopupMenu : public Popup {
String tooltip;
uint32_t accel;
int _ofs_cache;
int _height_cache;
int h_ofs;
Ref<ShortCut> shortcut;
bool shortcut_is_global;
bool shortcut_is_disabled;
// Returns (0,0) if icon is null.
Size2 get_icon_size() const {
return icon.is_null() ? Size2() : icon->get_size();
}
Item();
~Item();
};
@ -79,7 +87,10 @@ class PopupMenu : public Popup {
String _get_accel_text(int p_item) const;
int _get_mouse_over(const Point2 &p_over) const;
virtual Size2 get_minimum_size() const;
void _scroll(float p_factor, const Point2 &p_over);
int _get_items_total_height() const;
void _scroll_to_item(int p_item);
void _gui_input(const Ref<InputEvent> &p_event);
void _activate_submenu(int over, bool p_by_keyboard = false);
void _submenu_timeout();
@ -103,6 +114,14 @@ class PopupMenu : public Popup {
uint64_t search_time_msec;
String search_string;
MarginContainer *margin_container;
ScrollContainer *scroll_container;
Control *control;
real_t max_height;
void _draw_items();
void _draw_background();
protected:
virtual bool has_point(const Point2 &p_point) const;
@ -205,6 +224,9 @@ public:
void set_allow_search(bool p_allow);
bool get_allow_search() const;
void set_max_height(real_t p_max_height);
real_t get_max_height() const;
virtual void popup(const Rect2 &p_bounds = Rect2());
void set_hide_on_window_lose_focus(bool p_enabled);