fix drawing panel alignment in frame #325

Add wxEXPAND spacers to frame wxBoxSizer on the top and bottom around
the drawing panel so that panel is correctly centered if maximum zoom is
set.

Set proportion to 1 on the spacers and 0 on the panel so that both
centering with maximum zoom and full expansion work correctly.

Refactor frame OnSize event: pass a dummy userdata pointer to
distinguish resizing the frame from resizing the panel, and call
Layout() when the frame is resized.

Signed-off-by: Rafael Kitover <rkitover@gmail.com>
This commit is contained in:
Rafael Kitover 2019-01-31 14:59:41 -08:00
parent c6fa7246de
commit f8c6953151
1 changed files with 16 additions and 3 deletions

View File

@ -1019,7 +1019,10 @@ void GameArea::OnIdle(wxIdleEvent& event)
w->Connect(wxEVT_KEY_UP, wxKeyEventHandler(GameArea::OnKeyUp), NULL, this);
w->Connect(wxEVT_PAINT, wxPaintEventHandler(GameArea::PaintEv), NULL, this);
w->Connect(wxEVT_ERASE_BACKGROUND, wxEraseEventHandler(GameArea::EraseBackground), NULL, this);
w->Connect(wxEVT_SIZE, wxSizeEventHandler(GameArea::OnSize), NULL, this);
// set userdata so we know it's the panel and not the frame being resized
// the userdata is freed on disconnect/destruction
w->Connect(wxEVT_SIZE, wxSizeEventHandler(GameArea::OnSize), new wxObject, this);
this->Connect(wxEVT_SIZE, wxSizeEventHandler(GameArea::OnSize), NULL, this);
w->SetBackgroundStyle(wxBG_STYLE_CUSTOM);
@ -1033,7 +1036,10 @@ void GameArea::OnIdle(wxIdleEvent& event)
AdjustMinSize();
AdjustSize(false);
GetSizer()->Add(w, 1, gopts.retain_aspect ? (wxSHAPED | wxALIGN_CENTER) : wxEXPAND);
// add spacers on top and bottom to center panel vertically
GetSizer()->Add(0, 0, 1, wxEXPAND);
GetSizer()->Add(w, 0, gopts.retain_aspect ? (wxSHAPED | wxALIGN_CENTER | wxEXPAND) : wxEXPAND);
GetSizer()->Add(0, 0, 1, wxEXPAND);
Layout();
if (pointer_blanked)
@ -1269,9 +1275,16 @@ void GameArea::EraseBackground(wxEraseEvent& ev)
void GameArea::OnSize(wxSizeEvent& ev)
{
if (!ev.GetEventUserData()) { // is frame
draw_black_background(this);
Layout();
}
// panel may resize
if (panel)
panel->OnSize(ev);
ev.Skip(true);
}
void GameArea::OnSDLJoy(wxSDLJoyEvent& ev)