mirror of
https://github.com/godotengine/godot.git
synced 2025-12-07 22:00:10 +00:00
Call PopupMenu min. size calculations after about_to_popup signal processing.
This commit is contained in:
parent
1bbfe637c6
commit
12d957e737
4 changed files with 18 additions and 11 deletions
|
|
@ -3211,21 +3211,24 @@ void PopupMenu::popup(const Rect2i &p_bounds) {
|
||||||
moved = Vector2();
|
moved = Vector2();
|
||||||
popup_time_msec = OS::get_singleton()->get_ticks_msec();
|
popup_time_msec = OS::get_singleton()->get_ticks_msec();
|
||||||
|
|
||||||
Size2 scale = get_parent_viewport()->get_popup_base_transform().get_scale();
|
|
||||||
CanvasItem *c = Object::cast_to<CanvasItem>(get_parent());
|
|
||||||
if (c) {
|
|
||||||
scale *= c->get_global_transform_with_canvas().get_scale();
|
|
||||||
}
|
|
||||||
real_t popup_scale = MIN(scale.x, scale.y);
|
|
||||||
set_content_scale_factor(popup_scale);
|
|
||||||
Size2 minsize = get_contents_minimum_size() * popup_scale;
|
|
||||||
minsize.height = Math::ceil(minsize.height); // Ensures enough height at fractional content scales to prevent the v_scroll_bar from showing.
|
|
||||||
set_min_size(minsize); // `height` is truncated here by the cast to Size2i for Window.min_size.
|
|
||||||
set_size(Vector2(0, 0)); // Shrinkwraps to min size.
|
|
||||||
Popup::popup(p_bounds);
|
Popup::popup(p_bounds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PopupMenu::_pre_popup() {
|
||||||
|
Size2 scale = get_parent_viewport()->get_popup_base_transform().get_scale();
|
||||||
|
CanvasItem *c = Object::cast_to<CanvasItem>(get_parent());
|
||||||
|
if (c) {
|
||||||
|
scale *= c->get_global_transform_with_canvas().get_scale();
|
||||||
|
}
|
||||||
|
real_t popup_scale = MIN(scale.x, scale.y);
|
||||||
|
set_content_scale_factor(popup_scale);
|
||||||
|
Size2 minsize = get_contents_minimum_size() * popup_scale;
|
||||||
|
minsize.height = Math::ceil(minsize.height); // Ensures enough height at fractional content scales to prevent the v_scroll_bar from showing.
|
||||||
|
set_min_size(minsize); // `height` is truncated here by the cast to Size2i for Window.min_size.
|
||||||
|
reset_size(); // Shrinkwraps to min size.
|
||||||
|
}
|
||||||
|
|
||||||
void PopupMenu::set_visible(bool p_visible) {
|
void PopupMenu::set_visible(bool p_visible) {
|
||||||
bool native = global_menu.is_valid();
|
bool native = global_menu.is_valid();
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
|
|
|
||||||
|
|
@ -226,6 +226,7 @@ class PopupMenu : public Popup {
|
||||||
String _atr(int p_idx, const String &p_text) const;
|
String _atr(int p_idx, const String &p_text) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
virtual void _pre_popup() override;
|
||||||
virtual Rect2i _popup_adjust_rect() const override;
|
virtual Rect2i _popup_adjust_rect() const override;
|
||||||
|
|
||||||
virtual void add_child_notify(Node *p_child) override;
|
virtual void add_child_notify(Node *p_child) override;
|
||||||
|
|
|
||||||
|
|
@ -1994,6 +1994,8 @@ void Window::popup(const Rect2i &p_screen_rect) {
|
||||||
ERR_MAIN_THREAD_GUARD;
|
ERR_MAIN_THREAD_GUARD;
|
||||||
emit_signal(SNAME("about_to_popup"));
|
emit_signal(SNAME("about_to_popup"));
|
||||||
|
|
||||||
|
_pre_popup();
|
||||||
|
|
||||||
if (!get_embedder() && get_flag(FLAG_POPUP)) {
|
if (!get_embedder() && get_flag(FLAG_POPUP)) {
|
||||||
// Send a focus-out notification when opening a Window Manager Popup.
|
// Send a focus-out notification when opening a Window Manager Popup.
|
||||||
SceneTree *scene_tree = get_tree();
|
SceneTree *scene_tree = get_tree();
|
||||||
|
|
|
||||||
|
|
@ -257,6 +257,7 @@ private:
|
||||||
static int root_layout_direction;
|
static int root_layout_direction;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
virtual void _pre_popup() {} // Called after "about_to_popup", but before window is shown.
|
||||||
virtual Rect2i _popup_adjust_rect() const { return Rect2i(); }
|
virtual Rect2i _popup_adjust_rect() const { return Rect2i(); }
|
||||||
virtual void _post_popup() {}
|
virtual void _post_popup() {}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue