Fix Popup::popup_centered not centering at the first call

This commit is contained in:
Guilherme Felipe 2019-06-24 21:37:32 -03:00
parent ab932bb675
commit 54653565a4
2 changed files with 17 additions and 3 deletions

View file

@ -141,7 +141,7 @@ void Popup::popup_centered(const Size2 &p_size) {
rect.size = p_size == Size2() ? get_size() : p_size; rect.size = p_size == Size2() ? get_size() : p_size;
rect.position = ((window_size - rect.size) / 2.0).floor(); rect.position = ((window_size - rect.size) / 2.0).floor();
popup(rect); _popup(rect, true);
} }
void Popup::popup_centered_ratio(float p_screen_ratio) { void Popup::popup_centered_ratio(float p_screen_ratio) {
@ -151,18 +151,29 @@ void Popup::popup_centered_ratio(float p_screen_ratio) {
rect.size = (window_size * p_screen_ratio).floor(); rect.size = (window_size * p_screen_ratio).floor();
rect.position = ((window_size - rect.size) / 2.0).floor(); rect.position = ((window_size - rect.size) / 2.0).floor();
popup(rect); _popup(rect, true);
} }
void Popup::popup(const Rect2 &p_bounds) { void Popup::popup(const Rect2 &p_bounds) {
_popup(p_bounds);
}
void Popup::_popup(const Rect2 &p_bounds, const bool p_centered) {
emit_signal("about_to_show"); emit_signal("about_to_show");
show_modal(exclusive); show_modal(exclusive);
// Fit the popup into the optionally provided bounds. // Fit the popup into the optionally provided bounds.
if (!p_bounds.has_no_area()) { if (!p_bounds.has_no_area()) {
set_position(p_bounds.position);
set_size(p_bounds.size); set_size(p_bounds.size);
// check if p_bounds.size was using an outdated cached values
if (p_centered && p_bounds.size != get_size()) {
set_position(p_bounds.position - ((get_size() - p_bounds.size) / 2.0).floor());
} else {
set_position(p_bounds.position);
}
} }
_fix_size(); _fix_size();

View file

@ -43,6 +43,9 @@ class Popup : public Control {
bool exclusive; bool exclusive;
bool popped_up; bool popped_up;
private:
void _popup(const Rect2 &p_bounds = Rect2(), const bool p_centered = false);
protected: protected:
virtual void _post_popup() {} virtual void _post_popup() {}