Allow windows to cover side panel if they do not otherwise fit
@@ -181,7 +181,19 @@ impl Context {
/// Constraint the position of a window/area
/// so it fits within the screen.
pub(crate) fn constrain_window_rect(&self, window: Rect) -> Rect {
- let screen = self.available_rect();
+ let mut screen = self.available_rect();
+
+ if window.width() > screen.width() {
+ // Allow overlapping side bars.
+ // This is important for small screens, e.g. mobiles running the web demo.
+ screen.max.x = self.input().screen_rect().max.x;
+ screen.min.x = self.input().screen_rect().min.x;
+ }
+ if window.height() > screen.height() {
+ // Allow overlapping top/bottom bars:
+ screen.max.y = self.input().screen_rect().max.y;
+ screen.min.y = self.input().screen_rect().min.y;
+ }
let mut pos = window.min;
@@ -189,10 +201,10 @@ impl Context {
let margin_x = (window.width() - screen.width()).at_least(0.0);
let margin_y = (window.height() - screen.height()).at_least(0.0);
- pos.x = pos.x.at_least(screen.left() - margin_x);
- pos.x = pos.x.at_most(screen.right() + margin_x - window.width());
- pos.y = pos.y.at_least(screen.top() - margin_y);
- pos.y = pos.y.at_most(screen.bottom() + margin_y - window.height());
+ pos.x = pos.x.at_most(screen.right() + margin_x - window.width()); // move left if needed
+ pos.x = pos.x.at_least(screen.left() - margin_x); // move right if needed
+ pos.y = pos.y.at_most(screen.bottom() + margin_y - window.height()); // move right if needed
+ pos.y = pos.y.at_least(screen.top() - margin_y); // move down if needed
pos = self.round_pos_to_pixels(pos);
