void MoveToCenter() { const PixelSize window_size = GetSize(); const PixelSize parent_size = GetParentClientRect().GetSize(); PixelScalar dialog_x = (parent_size.cx - window_size.cx) / 2; PixelScalar dialog_y = (parent_size.cy - window_size.cy) / 2; Move(dialog_x, dialog_y); }
bool Window::IsMaximised() const { const PixelRect this_rc = GetPosition(); const PixelRect parent_rc = GetParentClientRect(); return (this_rc.right - this_rc.left) >= (parent_rc.right - parent_rc.left) && (this_rc.bottom - this_rc.top) >= (parent_rc.bottom - parent_rc.top); }
void WidgetDialog::AutoSize() { const PixelRect parent_rc = GetParentClientRect(); const PixelSize parent_size = parent_rc.GetSize(); widget.Prepare(); PixelSize min_size = widget.Get()->GetMinimumSize(); min_size.cy += GetTitleHeight(); PixelSize max_size = widget.Get()->GetMaximumSize(); max_size.cy += GetTitleHeight(); const PixelScalar min_height_with_buttons = min_size.cy + Layout::GetMaximumControlHeight(); const PixelScalar max_height_with_buttons = max_size.cy + Layout::GetMaximumControlHeight(); if (/* need full dialog height even for minimum widget height? */ min_height_with_buttons >= parent_size.cy || /* try to avoid putting buttons left on portrait screens; try to comply with maximum widget height only on landscape screens */ (parent_size.cx > parent_size.cy && max_height_with_buttons >= parent_size.cy)) { /* need full height, buttons must be left */ PixelRect rc = parent_rc; if (max_size.cy < parent_size.cy) rc.bottom = rc.top + max_size.cy; PixelRect remaining = buttons.LeftLayout(rc); PixelSize remaining_size = remaining.GetSize(); if (remaining_size.cx > max_size.cx) rc.right -= remaining_size.cx - max_size.cx; Move(rc); widget.Move(buttons.LeftLayout()); return; } /* see if buttons fit at the bottom */ PixelRect rc = parent_rc; if (max_size.cx < parent_size.cx) rc.right = rc.left + max_size.cx; PixelRect remaining = buttons.BottomLayout(rc); PixelSize remaining_size = remaining.GetSize(); if (remaining_size.cy > max_size.cy) rc.bottom -= remaining_size.cy - max_size.cy; Move(rc); widget.Move(buttons.BottomLayout()); }
bool WndForm::OnMouseMove(PixelScalar x, PixelScalar y, unsigned keys) { if (ContainerWindow::OnMouseMove(x, y, keys)) return true; if (dragging) { const PixelRect position = GetPosition(); const int dx = position.left + x - last_drag.x; const int dy = position.top + y - last_drag.y; last_drag.x = position.left + x; last_drag.y = position.top + y; PixelRect parent = GetParentClientRect(); parent.Grow(-client_rect.top); PixelRect new_position = position; new_position.Offset(dx, dy); if (new_position.right < parent.left) new_position.Offset(parent.left - new_position.right, 0); if (new_position.left > parent.right) new_position.Offset(parent.right - new_position.left, 0); if (new_position.top > parent.bottom) new_position.Offset(0, parent.bottom - new_position.top); if (new_position.top < 0) new_position.Offset(0, -new_position.top); #ifdef USE_MEMORY_CANVAS /* the RasterCanvas class doesn't clip negative window positions properly, therefore we avoid this problem at this stage */ if (new_position.left < 0) new_position.left = 0; if (new_position.top < 0) new_position.top = 0; #endif Move(new_position.left, new_position.top); return true; } return false; }
bool WndForm::OnMouseMove(PixelScalar x, PixelScalar y, unsigned keys) { if (ContainerWindow::OnMouseMove(x, y, keys)) return true; if (dragging) { const PixelRect position = GetPosition(); const int dx = position.left + x - last_drag.x; const int dy = position.top + y - last_drag.y; last_drag.x = position.left + x; last_drag.y = position.top + y; PixelRect parent = GetParentClientRect(); parent.Grow(-client_rect.top); PixelRect new_position = position; new_position.Offset(dx, dy); if (new_position.right < parent.left) new_position.Offset(parent.left - new_position.right, 0); if (new_position.left > parent.right) new_position.Offset(parent.right - new_position.left, 0); if (new_position.top > parent.bottom) new_position.Offset(0, parent.bottom - new_position.top); if (new_position.top < 0) new_position.Offset(0, -new_position.top); Move(new_position.left, new_position.top); return true; } return false; }