diff --git a/src/gui/widgets/spacer.cpp b/src/gui/widgets/spacer.cpp index 42d9eee0f016..ce165123ea88 100644 --- a/src/gui/widgets/spacer.cpp +++ b/src/gui/widgets/spacer.cpp @@ -28,6 +28,24 @@ namespace gui2 REGISTER_WIDGET(spacer) +void spacer::request_reduce_width(const unsigned maximum_width) +{ + if(best_size_ != point()) { + // This spacer is of fixed size, do nothing. + } else { + styled_widget::request_reduce_width(maximum_width); + } +} + +void spacer::request_reduce_height(const unsigned maximum_height) +{ + if(best_size_ != point()) { + // This spacer is of fixed size, do nothing. + } else { + styled_widget::request_reduce_height(maximum_height); + } +} + point spacer::calculate_best_size() const { return best_size_ != point() ? best_size_ diff --git a/src/gui/widgets/spacer.hpp b/src/gui/widgets/spacer.hpp index 7bf0d1c9a978..f069982488f3 100644 --- a/src/gui/widgets/spacer.hpp +++ b/src/gui/widgets/spacer.hpp @@ -44,6 +44,12 @@ class spacer : public styled_widget /***** ***** ***** ***** layout functions ***** ***** ***** *****/ + /** See @ref widget::request_reduce_width. */ + virtual void request_reduce_width(const unsigned maximum_width) override; + + /** See @ref widget::request_reduce_height. */ + virtual void request_reduce_height(const unsigned maximum_height) override; + private: /** See @ref widget::calculate_best_size. */ virtual point calculate_best_size() const override; diff --git a/src/gui/widgets/styled_widget.cpp b/src/gui/widgets/styled_widget.cpp index 375f4386b61f..bc84eff78042 100644 --- a/src/gui/widgets/styled_widget.cpp +++ b/src/gui/widgets/styled_widget.cpp @@ -31,6 +31,7 @@ #include "utils/functional.hpp" +#include #include #define LOG_SCOPE_HEADER \ @@ -218,12 +219,37 @@ void styled_widget::request_reduce_width(const unsigned maximum_width) << "' maximum_width " << maximum_width << " result " << size << ".\n"; + } else if(label_.empty()) { + point size = get_best_size(); + point min_size = get_config_minimum_size(); + size.x = std::min(size.x, std::max(maximum_width, min_size.x)); + set_layout_size(size); + + DBG_GUI_L << LOG_HEADER << " styled_widget " << id() + << " maximum_width " << maximum_width << " result " << size + << ".\n"; } else { DBG_GUI_L << LOG_HEADER << " label '" << debug_truncate(label_) << "' failed; either no label or wrapping not allowed.\n"; } } +void styled_widget::request_reduce_height(const unsigned maximum_height) +{ + if(!label_.empty()) { + // Do nothing + } else { + point size = get_best_size(); + point min_size = get_config_minimum_size(); + size.y = std::min(size.y, std::max(maximum_height, min_size.y)); + set_layout_size(size); + + DBG_GUI_L << LOG_HEADER << " styled_widget " << id() + << " maximum_height " << maximum_height << " result " << size + << ".\n"; + } +} + point styled_widget::calculate_best_size() const { assert(config_); diff --git a/src/gui/widgets/styled_widget.hpp b/src/gui/widgets/styled_widget.hpp index 9bdbb4ec49cf..63613c7b51bf 100644 --- a/src/gui/widgets/styled_widget.hpp +++ b/src/gui/widgets/styled_widget.hpp @@ -176,6 +176,9 @@ class styled_widget : public widget /** See @ref widget::request_reduce_width. */ virtual void request_reduce_width(const unsigned maximum_width) override; + /** See @ref widget::request_reduce_height. */ + virtual void request_reduce_height(const unsigned maximum_height) override; + protected: /** See @ref widget::calculate_best_size. */ virtual point calculate_best_size() const override;