void HotkeyConfigDialog::CreateHotkeyGUIControls() { const wxString pageNames[] = { _("General"), _("State Saves") }; const wxString hkText[] = { _("Open"), _("Change Disc"), _("Refresh List"), _("Play/Pause"), _("Stop"), _("Reset"), _("Frame Advance"), _("Start Recording"), _("Play Recording"), _("Export Recording"), _("Read-only mode"), _("Toggle Fullscreen"), _("Take Screenshot"), _("Exit"), _("Connect Wiimote 1"), _("Connect Wiimote 2"), _("Connect Wiimote 3"), _("Connect Wiimote 4"), _("Connect Balance Board"), _("Toggle IR"), _("Toggle Aspect Ratio"), _("Toggle EFB Copies"), _("Toggle Fog"), _("Toggle Frame limit"), _("Increase Frame limit"), _("Decrease Frame limit"), _("Load State Slot 1"), _("Load State Slot 2"), _("Load State Slot 3"), _("Load State Slot 4"), _("Load State Slot 5"), _("Load State Slot 6"), _("Load State Slot 7"), _("Load State Slot 8"), _("Load State Slot 9"), _("Load State Slot 10"), _("Save State Slot 1"), _("Save State Slot 2"), _("Save State Slot 3"), _("Save State Slot 4"), _("Save State Slot 5"), _("Save State Slot 6"), _("Save State Slot 7"), _("Save State Slot 8"), _("Save State Slot 9"), _("Save State Slot 10"), _("Select State Slot 1"), _("Select State Slot 2"), _("Select State Slot 3"), _("Select State Slot 4"), _("Select State Slot 5"), _("Select State Slot 6"), _("Select State Slot 7"), _("Select State Slot 8"), _("Select State Slot 9"), _("Select State Slot 10"), _("Save to selected slot"), _("Load from selected slot"), _("Load State Last 1"), _("Load State Last 2"), _("Load State Last 3"), _("Load State Last 4"), _("Load State Last 5"), _("Load State Last 6"), _("Load State Last 7"), _("Load State Last 8"), _("Save Oldest State"), _("Undo Load State"), _("Undo Save State"), _("Save State"), _("Load State"), }; const int page_breaks[3] = {HK_OPEN, HK_LOAD_STATE_SLOT_1, NUM_HOTKEYS}; // Configuration controls sizes wxSize size(100,20); // A small type font wxFont m_SmallFont(7, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL); wxNotebook *Notebook = new wxNotebook(this, wxID_ANY); for (int j = 0; j < 2; j++) { wxPanel *Page = new wxPanel(Notebook, wxID_ANY); Notebook->AddPage(Page, pageNames[j]); wxGridBagSizer *sHotkeys = new wxGridBagSizer(); // Header line for (int i = 0; i < HOTKEY_NUM_COLUMNS; i++) { wxBoxSizer *HeaderSizer = new wxBoxSizer(wxHORIZONTAL); wxStaticText *StaticTextHeader = new wxStaticText(Page, wxID_ANY, _("Action")); HeaderSizer->Add(StaticTextHeader, 1, wxALL, 2); StaticTextHeader = new wxStaticText(Page, wxID_ANY, _("Key"), wxDefaultPosition, size); HeaderSizer->Add(StaticTextHeader, 0, wxALL, 2); sHotkeys->Add(HeaderSizer, wxGBPosition(0, i), wxDefaultSpan, wxEXPAND | wxLEFT, (i > 0) ? 30 : 1); } int column_break = (page_breaks[j+1] + page_breaks[j] + 1) / 2; for (int i = page_breaks[j]; i < page_breaks[j+1]; i++) { // Text for the action wxStaticText *stHotkeys = new wxStaticText(Page, wxID_ANY, hkText[i]); // Key selection button m_Button_Hotkeys[i] = new wxButton(Page, i, wxEmptyString, wxDefaultPosition, size); m_Button_Hotkeys[i]->SetFont(m_SmallFont); m_Button_Hotkeys[i]->SetToolTip(_("Left click to detect hotkeys.\nEnter space to clear.")); SetButtonText(i, WxUtils::WXKeyToString(SConfig::GetInstance().m_LocalCoreStartupParameter.iHotkey[i]), WxUtils::WXKeymodToString( SConfig::GetInstance().m_LocalCoreStartupParameter.iHotkeyModifier[i])); wxBoxSizer *sHotkey = new wxBoxSizer(wxHORIZONTAL); sHotkey->Add(stHotkeys, 1, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL, 2); sHotkey->Add(m_Button_Hotkeys[i], 0, wxALL, 2); sHotkeys->Add(sHotkey, wxGBPosition((i < column_break) ? i - page_breaks[j] + 1 : i - column_break + 1, (i < column_break) ? 0 : 1), wxDefaultSpan, wxEXPAND | wxLEFT, (i < column_break) ? 1 : 30); } wxStaticBoxSizer *sHotkeyBox = new wxStaticBoxSizer(wxVERTICAL, Page, _("Hotkeys")); sHotkeyBox->Add(sHotkeys); wxBoxSizer* const sPage = new wxBoxSizer(wxVERTICAL); sPage->Add(sHotkeyBox, 0, wxEXPAND | wxALL, 5); Page->SetSizer(sPage); } wxBoxSizer *sMainSizer = new wxBoxSizer(wxVERTICAL); sMainSizer->Add(Notebook, 0, wxEXPAND | wxALL, 5); sMainSizer->Add(CreateButtonSizer(wxOK), 0, wxEXPAND | wxLEFT | wxRIGHT | wxDOWN, 5); SetSizerAndFit(sMainSizer); SetFocus(); }
ControlGroupBox::ControlGroupBox(ControllerEmu::ControlGroup* const group, wxWindow* const parent, wxWindow* const eventsink) : wxBoxSizer(wxVERTICAL) , control_group(group) { static_bitmap = NULL; wxFont m_SmallFont(7, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL); std::vector<ControllerEmu::ControlGroup::Control*>::iterator ci = group->controls.begin(), ce = group->controls.end(); for (; ci != ce; ++ci) { wxStaticText* const label = new wxStaticText(parent, -1, WXTSTR_FROM_CSTR((*ci)->name)); ControlButton* const control_button = new ControlButton(parent, (*ci)->control_ref, 80); control_button->SetFont(m_SmallFont); control_buttons.push_back(control_button); if ((*ci)->control_ref->is_input) { control_button->SetToolTip(_("Left-click to detect input.\nMiddle-click to clear.\nRight-click for more options.")); _connect_macro_(control_button, GamepadPage::DetectControl, wxEVT_COMMAND_BUTTON_CLICKED, eventsink); } else { control_button->SetToolTip(_("Left/Right-click for more options.\nMiddle-click to clear.")); _connect_macro_(control_button, GamepadPage::ConfigControl, wxEVT_COMMAND_BUTTON_CLICKED, eventsink); } _connect_macro_(control_button, GamepadPage::ClearControl, wxEVT_MIDDLE_DOWN, eventsink); _connect_macro_(control_button, GamepadPage::ConfigControl, wxEVT_RIGHT_UP, eventsink); wxBoxSizer* const control_sizer = new wxBoxSizer(wxHORIZONTAL); control_sizer->AddStretchSpacer(1); control_sizer->Add(label, 0, wxCENTER | wxRIGHT, 3); control_sizer->Add(control_button, 0, 0, 0); Add(control_sizer, 0, wxEXPAND|wxLEFT|wxRIGHT, 3); } wxMemoryDC dc; switch (group->type) { case GROUP_TYPE_STICK: case GROUP_TYPE_TILT: case GROUP_TYPE_CURSOR: case GROUP_TYPE_FORCE: { wxBitmap bitmap(64, 64); dc.SelectObject(bitmap); dc.Clear(); static_bitmap = new wxStaticBitmap(parent, -1, bitmap, wxDefaultPosition, wxDefaultSize, wxBITMAP_TYPE_BMP); std::vector< ControllerEmu::ControlGroup::Setting* >::const_iterator i = group->settings.begin(), e = group->settings.end(); wxBoxSizer* const szr = new wxBoxSizer(wxVERTICAL); for (; i!=e; ++i) { PadSettingSpin* setting = new PadSettingSpin(parent, *i); _connect_macro_(setting->wxcontrol, GamepadPage::AdjustSetting, wxEVT_COMMAND_SPINCTRL_UPDATED, eventsink); options.push_back(setting); szr->Add(new wxStaticText(parent, -1, WXTSTR_FROM_CSTR((*i)->name))); szr->Add(setting->wxcontrol, 0, wxLEFT, 0); } wxBoxSizer* const h_szr = new wxBoxSizer(wxHORIZONTAL); h_szr->Add(szr, 1, 0, 5); h_szr->Add(static_bitmap, 0, wxALL|wxCENTER, 3); Add(h_szr, 0, wxEXPAND|wxLEFT|wxCENTER|wxTOP, 3); } break; case GROUP_TYPE_BUTTONS: { wxBitmap bitmap(int(12*group->controls.size()+1), 12); dc.SelectObject(bitmap); dc.Clear(); static_bitmap = new wxStaticBitmap(parent, -1, bitmap, wxDefaultPosition, wxDefaultSize, wxBITMAP_TYPE_BMP); PadSettingSpin* const threshold_cbox = new PadSettingSpin(parent, group->settings[0]); _connect_macro_(threshold_cbox->wxcontrol, GamepadPage::AdjustSetting, wxEVT_COMMAND_SPINCTRL_UPDATED, eventsink); threshold_cbox->wxcontrol->SetToolTip(_("Adjust the analog control pressure required to activate buttons.")); options.push_back(threshold_cbox); wxBoxSizer* const szr = new wxBoxSizer(wxHORIZONTAL); szr->Add(new wxStaticText(parent, -1, WXTSTR_FROM_CSTR(group->settings[0]->name)), 0, wxCENTER|wxRIGHT, 3); szr->Add(threshold_cbox->wxcontrol, 0, wxRIGHT, 3); Add(szr, 0, wxALL|wxCENTER, 3); Add(static_bitmap, 0, wxALL|wxCENTER, 3); } break; case GROUP_TYPE_MIXED_TRIGGERS: case GROUP_TYPE_TRIGGERS: case GROUP_TYPE_SLIDER: { int height = (int)(12 * group->controls.size()); int width = 64; if (GROUP_TYPE_MIXED_TRIGGERS == group->type) width = 64+12+1; if (GROUP_TYPE_TRIGGERS != group->type) height /= 2; wxBitmap bitmap(width, height+1); dc.SelectObject(bitmap); dc.Clear(); static_bitmap = new wxStaticBitmap(parent, -1, bitmap, wxDefaultPosition, wxDefaultSize, wxBITMAP_TYPE_BMP); std::vector<ControllerEmu::ControlGroup::Setting*>::const_iterator i = group->settings.begin(), e = group->settings.end(); for (; i!=e; ++i) { PadSettingSpin* setting = new PadSettingSpin(parent, *i); _connect_macro_(setting->wxcontrol, GamepadPage::AdjustSetting, wxEVT_COMMAND_SPINCTRL_UPDATED, eventsink); options.push_back(setting); wxBoxSizer* const szr = new wxBoxSizer(wxHORIZONTAL); szr->Add(new wxStaticText(parent, -1, WXTSTR_FROM_CSTR((*i)->name)), 0, wxCENTER|wxRIGHT, 3); szr->Add(setting->wxcontrol, 0, wxRIGHT, 3); Add(szr, 0, wxALL|wxCENTER, 3); } Add(static_bitmap, 0, wxALL|wxCENTER, 3); } break; case GROUP_TYPE_EXTENSION: { PadSettingExtension* const attachments = new PadSettingExtension(parent, (ControllerEmu::Extension*)group); wxButton* const configure_btn = new ExtensionButton(parent, (ControllerEmu::Extension*)group); options.push_back(attachments); _connect_macro_(attachments->wxcontrol, GamepadPage::AdjustSetting, wxEVT_COMMAND_CHOICE_SELECTED, eventsink); _connect_macro_(configure_btn, GamepadPage::ConfigExtension, wxEVT_COMMAND_BUTTON_CLICKED, eventsink); Add(attachments->wxcontrol, 0, wxTOP|wxLEFT|wxRIGHT|wxEXPAND, 3); Add(configure_btn, 0, wxALL|wxEXPAND, 3); } break; case GROUP_TYPE_UDPWII: { wxButton* const btn = new UDPConfigButton(parent, (UDPWrapper*)group); _connect_macro_(btn, GamepadPage::ConfigUDPWii, wxEVT_COMMAND_BUTTON_CLICKED, eventsink); Add(btn, 0, wxALL|wxEXPAND, 3); } break; default: { //options std::vector<ControllerEmu::ControlGroup::Setting*>::const_iterator i = group->settings.begin(), e = group->settings.end(); for (; i!=e; ++i) { PadSettingCheckBox* setting_cbox = new PadSettingCheckBox(parent, (*i)->value, (*i)->name); _connect_macro_(setting_cbox->wxcontrol, GamepadPage::AdjustSetting, wxEVT_COMMAND_CHECKBOX_CLICKED, eventsink); options.push_back(setting_cbox); Add(setting_cbox->wxcontrol, 0, wxALL|wxLEFT, 5); } } break; } dc.SelectObject(wxNullBitmap); //AddStretchSpacer(0); }