diff options
| author | shuffle2 <godisgovernment@gmail.com> | 2016-10-03 20:06:08 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-10-03 20:06:08 -0700 |
| commit | b8731eb8180d76b4663eaf4188f985b9c5fa6fb2 (patch) | |
| tree | 40f57e85be3073d528e9e5a5776a905170a3a7ac /Source/Core/DolphinWX/NetPlay/NetPlaySetupFrame.cpp | |
| parent | 4573cc89fa65a867f991c1e592ad47382f1ee0a5 (diff) | |
| parent | c4f5ced37ca9eff6a5c62c08f1cc7a9e6dc47f7d (diff) | |
Merge pull request #4068 from EmptyChaos/wx-hidpi
WX: Comprehensive HiDPI Patch
Diffstat (limited to 'Source/Core/DolphinWX/NetPlay/NetPlaySetupFrame.cpp')
| -rw-r--r-- | Source/Core/DolphinWX/NetPlay/NetPlaySetupFrame.cpp | 301 |
1 files changed, 168 insertions, 133 deletions
diff --git a/Source/Core/DolphinWX/NetPlay/NetPlaySetupFrame.cpp b/Source/Core/DolphinWX/NetPlay/NetPlaySetupFrame.cpp index c9f0e0f86b..21dbce3217 100644 --- a/Source/Core/DolphinWX/NetPlay/NetPlaySetupFrame.cpp +++ b/Source/Core/DolphinWX/NetPlay/NetPlaySetupFrame.cpp @@ -5,6 +5,7 @@ #include <wx/button.h> #include <wx/checkbox.h> #include <wx/choice.h> +#include <wx/gbsizer.h> #include <wx/listbox.h> #include <wx/notebook.h> #include <wx/panel.h> @@ -41,50 +42,50 @@ NetPlaySetupFrame::NetPlaySetupFrame(wxWindow* const parent, const CGameListCtrl inifile.Load(File::GetUserPath(F_DOLPHINCONFIG_IDX)); IniFile::Section& netplay_section = *inifile.GetOrCreateSection("NetPlay"); - wxPanel* const panel = new wxPanel(this); - panel->Bind(wxEVT_CHAR_HOOK, &NetPlaySetupFrame::OnKeyDown, this); + CreateGUI(); + SetIcons(WxUtils::GetDolphinIconBundle()); - // top row - wxBoxSizer* const trav_szr = new wxBoxSizer(wxHORIZONTAL); - wxBoxSizer* const nick_szr = new wxBoxSizer(wxHORIZONTAL); { - // Connection Config - wxStaticText* const connectiontype_lbl = new wxStaticText( - panel, wxID_ANY, _("Connection Type:"), wxDefaultPosition, wxSize(100, -1)); - - m_direct_traversal = new wxChoice(panel, wxID_ANY, wxDefaultPosition, wxSize(150, -1)); - m_direct_traversal->Bind(wxEVT_CHOICE, &NetPlaySetupFrame::OnDirectTraversalChoice, this); - m_direct_traversal->Append(_("Direct Connection")); - m_direct_traversal->Append(_("Traversal Server")); + std::string temp; + netplay_section.Get("Nickname", &temp, "Player"); + m_nickname_text->SetValue(StrToWxStr(temp)); - trav_szr->Add(connectiontype_lbl, 0, wxCENTER, 5); - trav_szr->AddSpacer(5); - trav_szr->Add(m_direct_traversal, 0, wxCENTER, 5); + temp.clear(); + netplay_section.Get("HostCode", &temp, "00000000"); + m_connect_hashcode_text->SetValue(StrToWxStr(temp)); - m_trav_reset_btn = new wxButton(panel, wxID_ANY, _("Reset Traversal Settings"), - wxDefaultPosition, wxSize(-1, 25)); - m_trav_reset_btn->Bind(wxEVT_BUTTON, &NetPlaySetupFrame::OnResetTraversal, this); + temp.clear(); + netplay_section.Get("Address", &temp, "127.0.0.1"); + m_connect_ip_text->SetValue(StrToWxStr(temp)); - trav_szr->AddSpacer(5); - - trav_szr->Add(m_trav_reset_btn, 0, wxRIGHT); + temp.clear(); + netplay_section.Get("ConnectPort", &temp, + std::to_string(NetPlayHostConfig::DEFAULT_LISTEN_PORT)); + m_connect_port_text->SetValue(StrToWxStr(temp)); - // Nickname - wxStaticText* const nick_lbl = - new wxStaticText(panel, wxID_ANY, _("Nickname:"), wxDefaultPosition, wxSize(100, -1)); + temp.clear(); + netplay_section.Get("HostPort", &temp, std::to_string(NetPlayHostConfig::DEFAULT_LISTEN_PORT)); + m_host_port_text->SetValue(StrToWxStr(temp)); - std::string nickname; - netplay_section.Get("Nickname", &nickname, "Player"); + temp.clear(); + if (netplay_section.Get("SelectedHostGame", &temp, "")) + m_game_lbox->SetStringSelection(StrToWxStr(temp)); - m_nickname_text = - new wxTextCtrl(panel, wxID_ANY, StrToWxStr(nickname), wxDefaultPosition, wxSize(150, -1)); +#ifdef USE_UPNP + bool use_upnp = false; + netplay_section.Get("UseUPNP", &use_upnp, false); + m_upnp_chk->SetValue(use_upnp); +#endif - nick_szr->Add(nick_lbl, 0, wxCENTER); - nick_szr->Add(m_nickname_text, 0, wxALL, 5); + unsigned int listen_port = 0; + netplay_section.Get("ListenPort", &listen_port, 0); + m_traversal_listen_port_enabled->SetValue(listen_port != 0); + m_traversal_listen_port->Enable(m_traversal_listen_port_enabled->IsChecked()); + m_traversal_listen_port->SetValue(listen_port); - std::string travChoice; - netplay_section.Get("TraversalChoice", &travChoice, "direct"); - if (travChoice == "traversal") + temp.clear(); + netplay_section.Get("TraversalChoice", &temp, "direct"); + if (temp == "traversal") { m_direct_traversal->Select(TRAVERSAL_CHOICE); } @@ -93,37 +94,96 @@ NetPlaySetupFrame::NetPlaySetupFrame(wxWindow* const parent, const CGameListCtrl m_direct_traversal->Select(DIRECT_CHOICE); } - m_traversal_lbl = new wxStaticText(panel, wxID_ANY, GetTraversalLabelText(netplay_section)); + m_traversal_lbl->SetLabelText(GetTraversalLabelText(netplay_section)); } - // tabs - m_notebook = new wxNotebook(panel, wxID_ANY); - wxPanel* const connect_tab = new wxPanel(m_notebook, wxID_ANY); - m_notebook->AddPage(connect_tab, _("Connect")); - wxPanel* const host_tab = new wxPanel(m_notebook, wxID_ANY); - m_notebook->AddPage(host_tab, _("Host")); + + Center(); + Show(); + + // Needs to be done last or it set up the spacing on the page correctly + wxCommandEvent ev; + OnDirectTraversalChoice(ev); +} + +void NetPlaySetupFrame::CreateGUI() +{ + const int space5 = FromDIP(5); + + wxPanel* const panel = new wxPanel(this); + panel->Bind(wxEVT_CHAR_HOOK, &NetPlaySetupFrame::OnKeyDown, this); + + // Connection Config + wxStaticText* const connectiontype_lbl = new wxStaticText(panel, wxID_ANY, _("Connection Type:")); + + m_direct_traversal = new wxChoice(panel, wxID_ANY); + m_direct_traversal->Bind(wxEVT_CHOICE, &NetPlaySetupFrame::OnDirectTraversalChoice, this); + m_direct_traversal->Append(_("Direct Connection")); + m_direct_traversal->Append(_("Traversal Server")); + + m_trav_reset_btn = new wxButton(panel, wxID_ANY, _("Reset Traversal Settings")); + m_trav_reset_btn->Bind(wxEVT_BUTTON, &NetPlaySetupFrame::OnResetTraversal, this); + + // Nickname + wxStaticText* const nick_lbl = new wxStaticText(panel, wxID_ANY, _("Nickname:")); + + m_nickname_text = new wxTextCtrl(panel, wxID_ANY, "Player"); + + m_traversal_lbl = new wxStaticText(panel, wxID_ANY, "Traversal Server"); + + wxButton* const quit_btn = new wxButton(panel, wxID_ANY, _("Quit")); + quit_btn->Bind(wxEVT_BUTTON, &NetPlaySetupFrame::OnQuit, this); + + wxGridBagSizer* top_sizer = new wxGridBagSizer(space5, space5); + top_sizer->Add(connectiontype_lbl, wxGBPosition(0, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); + top_sizer->Add(WxUtils::GiveMinSizeDIP(m_direct_traversal, wxSize(100, -1)), wxGBPosition(0, 1), + wxDefaultSpan, wxEXPAND); + top_sizer->Add(m_trav_reset_btn, wxGBPosition(0, 2), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); + top_sizer->Add(nick_lbl, wxGBPosition(1, 0), wxDefaultSpan, wxALIGN_CENTER_VERTICAL); + top_sizer->Add(WxUtils::GiveMinSizeDIP(m_nickname_text, wxSize(150, -1)), wxGBPosition(1, 1), + wxDefaultSpan, wxEXPAND); + + m_notebook = CreateNotebookGUI(panel); + m_notebook->Bind(wxEVT_NOTEBOOK_PAGE_CHANGED, &NetPlaySetupFrame::OnTabChanged, this); + + // main sizer + wxBoxSizer* const main_szr = new wxBoxSizer(wxVERTICAL); + main_szr->AddSpacer(space5); + main_szr->Add(top_sizer, 0, wxLEFT | wxRIGHT, space5); + main_szr->AddSpacer(space5); + main_szr->Add(m_traversal_lbl, 0, wxLEFT | wxRIGHT, space5); + main_szr->AddSpacer(space5); + main_szr->Add(m_notebook, 1, wxLEFT | wxRIGHT | wxEXPAND, space5); + main_szr->AddSpacer(space5); + main_szr->Add(quit_btn, 0, wxALIGN_RIGHT | wxLEFT | wxRIGHT, space5); + main_szr->AddSpacer(space5); + + panel->SetSizerAndFit(main_szr); + main_szr->SetSizeHints(this); +} + +wxNotebook* NetPlaySetupFrame::CreateNotebookGUI(wxWindow* parent) +{ + const int space5 = FromDIP(5); + + wxNotebook* const notebook = new wxNotebook(parent, wxID_ANY); + wxPanel* const connect_tab = new wxPanel(notebook, wxID_ANY); + notebook->AddPage(connect_tab, _("Connect")); + wxPanel* const host_tab = new wxPanel(notebook, wxID_ANY); + notebook->AddPage(host_tab, _("Host")); // connect tab { m_ip_lbl = new wxStaticText(connect_tab, wxID_ANY, _("Host Code :")); - - std::string last_hash_code; - netplay_section.Get("HostCode", &last_hash_code, "00000000"); - std::string last_ip_address; - netplay_section.Get("Address", &last_ip_address, "127.0.0.1"); - m_connect_ip_text = new wxTextCtrl(connect_tab, wxID_ANY, StrToWxStr(last_ip_address)); - m_connect_hashcode_text = new wxTextCtrl(connect_tab, wxID_ANY, StrToWxStr(last_hash_code)); + m_connect_ip_text = new wxTextCtrl(connect_tab, wxID_ANY, "127.0.0.1"); + m_connect_hashcode_text = new wxTextCtrl(connect_tab, wxID_ANY, "00000000"); // Will be overridden by OnDirectTraversalChoice, but is necessary // so that both inputs do not take up space m_connect_hashcode_text->Hide(); m_client_port_lbl = new wxStaticText(connect_tab, wxID_ANY, _("Port :")); - - // string? w/e - std::string port; - netplay_section.Get("ConnectPort", &port, - std::to_string(NetPlayHostConfig::DEFAULT_LISTEN_PORT)); - m_connect_port_text = new wxTextCtrl(connect_tab, wxID_ANY, StrToWxStr(port)); + m_connect_port_text = new wxTextCtrl(connect_tab, wxID_ANY, + std::to_string(NetPlayHostConfig::DEFAULT_LISTEN_PORT)); wxButton* const connect_btn = new wxButton(connect_tab, wxID_ANY, _("Connect")); connect_btn->Bind(wxEVT_BUTTON, &NetPlaySetupFrame::OnJoin, this); @@ -139,19 +199,22 @@ NetPlaySetupFrame::NetPlaySetupFrame(wxWindow* const parent, const CGameListCtrl "Wiimote netplay is experimental and should not be expected to work.\n")); wxBoxSizer* const top_szr = new wxBoxSizer(wxHORIZONTAL); - - top_szr->Add(m_ip_lbl, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 5); - top_szr->Add(m_connect_ip_text, 3); - top_szr->Add(m_connect_hashcode_text, 3); - top_szr->Add(m_client_port_lbl, 0, wxCENTER | wxRIGHT | wxLEFT, 5); - top_szr->Add(m_connect_port_text, 1); + top_szr->Add(m_ip_lbl, 0, wxALIGN_CENTER_VERTICAL); + top_szr->Add(m_connect_ip_text, 3, wxALIGN_CENTER_VERTICAL | wxLEFT, space5); + top_szr->Add(m_connect_hashcode_text, 3, wxALIGN_CENTER_VERTICAL | wxLEFT, space5); + top_szr->Add(m_client_port_lbl, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, space5); + top_szr->Add(m_connect_port_text, 1, wxALIGN_CENTER_VERTICAL | wxLEFT, space5); wxBoxSizer* const con_szr = new wxBoxSizer(wxVERTICAL); - con_szr->Add(top_szr, 0, wxALL | wxEXPAND, 5); + con_szr->AddSpacer(space5); + con_szr->Add(top_szr, 0, wxEXPAND | wxLEFT | wxRIGHT, space5); con_szr->AddStretchSpacer(1); - con_szr->Add(alert_lbl, 0, wxLEFT | wxRIGHT | wxEXPAND, 5); + con_szr->AddSpacer(space5); + con_szr->Add(alert_lbl, 0, wxEXPAND | wxLEFT | wxRIGHT, space5); con_szr->AddStretchSpacer(1); - con_szr->Add(connect_btn, 0, wxALL | wxALIGN_RIGHT, 5); + con_szr->AddSpacer(space5); + con_szr->Add(connect_btn, 0, wxALIGN_RIGHT | wxLEFT | wxRIGHT, space5); + con_szr->AddSpacer(space5); connect_tab->SetSizerAndFit(con_szr); } @@ -159,21 +222,13 @@ NetPlaySetupFrame::NetPlaySetupFrame(wxWindow* const parent, const CGameListCtrl // host tab { m_host_port_lbl = new wxStaticText(host_tab, wxID_ANY, _("Port :")); - - // string? w/e - std::string port; - netplay_section.Get("HostPort", &port, std::to_string(NetPlayHostConfig::DEFAULT_LISTEN_PORT)); - m_host_port_text = new wxTextCtrl(host_tab, wxID_ANY, StrToWxStr(port)); + m_host_port_text = + new wxTextCtrl(host_tab, wxID_ANY, std::to_string(NetPlayHostConfig::DEFAULT_LISTEN_PORT)); m_traversal_listen_port_enabled = new wxCheckBox(host_tab, wxID_ANY, _("Force Listen Port: ")); m_traversal_listen_port = new wxSpinCtrl(host_tab, wxID_ANY, "", wxDefaultPosition, - wxSize(80, -1), wxSP_ARROW_KEYS, 1, 65535); - - unsigned int listen_port; - netplay_section.Get("ListenPort", &listen_port, 0); - m_traversal_listen_port_enabled->SetValue(listen_port != 0); - m_traversal_listen_port->Enable(m_traversal_listen_port_enabled->IsChecked()); - m_traversal_listen_port->SetValue(listen_port); + wxDefaultSize, wxSP_ARROW_KEYS, 1, 65535); + m_traversal_listen_port->SetMinSize(WxUtils::GetTextWidgetMinSize(m_traversal_listen_port)); m_traversal_listen_port_enabled->Bind(wxEVT_CHECKBOX, &NetPlaySetupFrame::OnTraversalListenPortChanged, this); @@ -187,63 +242,35 @@ NetPlaySetupFrame::NetPlaySetupFrame(wxWindow* const parent, const CGameListCtrl new wxListBox(host_tab, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, nullptr, wxLB_SORT); m_game_lbox->Bind(wxEVT_LISTBOX_DCLICK, &NetPlaySetupFrame::OnHost, this); - NetPlayDialog::FillWithGameNames(m_game_lbox, *game_list); - - std::string last_hosted_game; - if (netplay_section.Get("SelectedHostGame", &last_hosted_game, "")) - m_game_lbox->SetStringSelection(last_hosted_game); + NetPlayDialog::FillWithGameNames(m_game_lbox, *m_game_list); wxBoxSizer* const top_szr = new wxBoxSizer(wxHORIZONTAL); - top_szr->Add(m_host_port_lbl, 0, wxCENTER | wxRIGHT, 5); - top_szr->Add(m_host_port_text, 0); + top_szr->Add(m_host_port_lbl, 0, wxALIGN_CENTER_VERTICAL); + top_szr->Add(m_host_port_text, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, space5); #ifdef USE_UPNP m_upnp_chk = new wxCheckBox(host_tab, wxID_ANY, _("Forward port (UPnP)")); - top_szr->Add(m_upnp_chk, 0, wxALL, 5); + top_szr->Add(m_upnp_chk, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, space5); #endif + wxBoxSizer* const bottom_szr = new wxBoxSizer(wxHORIZONTAL); - bottom_szr->Add(m_traversal_listen_port_enabled, 0, wxCENTER | wxLEFT, 5); - bottom_szr->Add(m_traversal_listen_port, 0, wxCENTER, 0); - wxBoxSizer* const host_btn_szr = new wxBoxSizer(wxVERTICAL); - host_btn_szr->Add(host_btn, 0, wxCENTER | wxALIGN_RIGHT, 0); - bottom_szr->Add(host_btn_szr, 1, wxALL, 5); + bottom_szr->Add(m_traversal_listen_port_enabled, 0, wxALIGN_CENTER_VERTICAL); + bottom_szr->Add(m_traversal_listen_port, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, space5); + bottom_szr->AddStretchSpacer(); + bottom_szr->Add(host_btn, 0, wxLEFT, space5); wxBoxSizer* const host_szr = new wxBoxSizer(wxVERTICAL); - host_szr->Add(top_szr, 0, wxALL | wxEXPAND, 5); - host_szr->Add(m_game_lbox, 1, wxLEFT | wxRIGHT | wxEXPAND, 5); - host_szr->Add(bottom_szr, 0, wxEXPAND, 0); + // NOTE: Top row can disappear entirely + host_szr->Add(top_szr, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, space5); + host_szr->AddSpacer(space5); + host_szr->Add(m_game_lbox, 1, wxEXPAND | wxLEFT | wxRIGHT, space5); + host_szr->AddSpacer(space5); + host_szr->Add(bottom_szr, 0, wxEXPAND | wxLEFT | wxRIGHT, space5); + host_szr->AddSpacer(space5); host_tab->SetSizerAndFit(host_szr); } - // bottom row - wxButton* const quit_btn = new wxButton(panel, wxID_ANY, _("Quit")); - quit_btn->Bind(wxEVT_BUTTON, &NetPlaySetupFrame::OnQuit, this); - - // main sizer - wxBoxSizer* const main_szr = new wxBoxSizer(wxVERTICAL); - main_szr->Add(trav_szr, 0, wxALL | wxALIGN_LEFT, 5); - main_szr->Add(nick_szr, 0, wxALL | wxALIGN_LEFT, 5); - main_szr->Add(m_traversal_lbl, 0, wxALL | wxALIGN_LEFT, 5); - main_szr->Add(m_notebook, 1, wxLEFT | wxRIGHT | wxEXPAND, 5); - main_szr->Add(quit_btn, 0, wxALL | wxALIGN_RIGHT, 5); - - panel->SetSizerAndFit(main_szr); - - // Handle focus on tab changes - panel->Bind(wxEVT_NOTEBOOK_PAGE_CHANGED, &NetPlaySetupFrame::OnTabChanged, this); - - // wxBoxSizer* const diag_szr = new wxBoxSizer(wxVERTICAL); - // diag_szr->Add(panel, 1, wxEXPAND); - // SetSizerAndFit(diag_szr); - - main_szr->SetSizeHints(this); - - Center(); - Show(); - - // Needs to be done last or it set up the spacing on the page correctly - wxCommandEvent ev; - OnDirectTraversalChoice(ev); + return notebook; } NetPlaySetupFrame::~NetPlaySetupFrame() @@ -278,6 +305,10 @@ NetPlaySetupFrame::~NetPlaySetupFrame() m_traversal_listen_port->GetValue() : 0); +#ifdef USE_UPNP + netplay_section.Set("UseUPNP", m_upnp_chk->GetValue(), false); +#endif + inifile.Save(dolphin_ini); main_frame->g_NetPlaySetupDiag = nullptr; } @@ -395,7 +426,7 @@ void NetPlaySetupFrame::OnDirectTraversalChoice(wxCommandEvent& event) if (sel == TRAVERSAL_CHOICE) { - m_traversal_lbl->Show(); + m_traversal_lbl->SetLabelText(m_traversal_string); m_trav_reset_btn->Show(); m_connect_hashcode_text->Show(); m_connect_ip_text->Hide(); @@ -420,7 +451,7 @@ void NetPlaySetupFrame::OnDirectTraversalChoice(wxCommandEvent& event) } else { - m_traversal_lbl->Hide(); + m_traversal_lbl->SetLabel(wxEmptyString); m_trav_reset_btn->Hide(); m_connect_hashcode_text->Hide(); m_connect_ip_text->Show(); @@ -446,7 +477,19 @@ void NetPlaySetupFrame::OnDirectTraversalChoice(wxCommandEvent& event) m_upnp_chk->Show(); #endif } - m_connect_ip_text->GetParent()->Layout(); + + // wxWidgets' layout engine sucks. It only updates when a size event occurs so we + // have to manually invoke the layout system. + // Caveat: This only works if the new layout is not substantially different from the + // old one because otherwise the minimum sizes assigned by SetSizerAndFit won't make + // sense and the layout will break (overlapping widgets). You can't just SetSizeHints + // because that will change the current sizes as well as the minimum sizes, it's a mess. + for (wxWindow* tab : m_notebook->GetChildren()) + tab->Layout(); + // Because this is a wxFrame, not a dialog, everything is inside a wxPanel which + // is the only direct child of the frame. + GetChildren()[0]->Layout(); + DispatchFocus(); } @@ -476,16 +519,8 @@ void NetPlaySetupFrame::OnTabChanged(wxCommandEvent& event) // Propagate event event.Skip(); - // Delaying action so the first tab order element doesn't override the focus - m_notebook->Bind(wxEVT_IDLE, &NetPlaySetupFrame::OnAfterTabChange, this); -} - -void NetPlaySetupFrame::OnAfterTabChange(wxIdleEvent&) -{ - // Unbinding so we don't hog the idle event - m_notebook->Unbind(wxEVT_IDLE, &NetPlaySetupFrame::OnAfterTabChange, this); - - DispatchFocus(); + // Let the base class fiddle with the focus first then correct it afterwards + CallAfter(&NetPlaySetupFrame::DispatchFocus); } void NetPlaySetupFrame::DispatchFocus() |
