void tgrid::reduce_width(const unsigned maximum_width) { /***** ***** ***** ***** INIT ***** ***** ***** *****/ log_scope2(log_gui_layout, LOG_SCOPE_HEADER); DBG_GUI_L << LOG_HEADER << " maximum width " << maximum_width << ".\n"; tpoint size = get_best_size(); if(size.x <= static_cast<int>(maximum_width)) { DBG_GUI_L << LOG_HEADER << " Already fits.\n"; return; } /***** ***** ***** ***** Request resize ***** ***** ***** *****/ request_reduce_width(maximum_width); size = get_best_size(); if(size.x <= static_cast<int>(maximum_width)) { DBG_GUI_L << LOG_HEADER << " Resize request honored.\n"; return; } /***** ***** ***** ***** Demand resize ***** ***** ***** *****/ /** @todo Implement. */ /***** ***** ***** ***** Acknowlegde failure ***** ***** ***** *****/ DBG_GUI_L << LOG_HEADER << " Resizing failed.\n"; throw tlayout_exception_width_resize_failed(); }
void grid::request_placement(dispatcher&, const event::ui_event, bool& handled, bool&) { if (get_window()->invalidate_layout_blocked()) { handled = true; return; } point size = get_size(); point best_size = calculate_best_size(); if(size.x >= best_size.x && size.y >= best_size.y) { place(get_origin(), size); handled = true; return; } recalculate_best_size(); if(size.y >= best_size.y) { // We have enough space in the Y direction, but not in the X direction. // Try wrapping the content. request_reduce_width(size.x); best_size = get_best_size(); if(size.x >= best_size.x && size.y >= best_size.y) { // Wrapping succeeded, we still fit vertically. place(get_origin(), size); handled = true; return; } else { // Wrapping failed, we no longer fit. // Reset the sizes of child widgets. layout_initialize(true); } } /* Not enough space. Let the event flow higher up. This is a pre-event handler, so the event flows upwards. */ }