summaryrefslogtreecommitdiff
path: root/Source/Core/DolphinWX/NetPlay/NetPlaySetupFrame.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/DolphinWX/NetPlay/NetPlaySetupFrame.cpp')
-rw-r--r--Source/Core/DolphinWX/NetPlay/NetPlaySetupFrame.cpp301
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()