void HotkeyConfigDialog::OnKeyDown(wxKeyEvent& event) { if (ClickedButton != nullptr) { // Save the key g_Pressed = event.GetKeyCode(); g_Modkey = event.GetModifiers(); // Don't allow modifier keys if (g_Pressed == WXK_CONTROL || g_Pressed == WXK_ALT || g_Pressed == WXK_SHIFT || g_Pressed == WXK_COMMAND) return; // Use the space key to set a blank key if (g_Pressed == WXK_SPACE) { SaveButtonMapping(ClickedButton->GetId(), -1, 0); SetButtonText(ClickedButton->GetId(), wxString()); } else { // Check if the hotkey combination was already applied to another button // and unapply it if necessary. for (wxButton* btn : m_Button_Hotkeys) { // We compare against this to see if we have a duplicate bind attempt. wxString existingHotkey = btn->GetLabel(); wxString tentativeModKey = WxUtils::WXKeymodToString(g_Modkey); wxString tentativePressedKey = WxUtils::WXKeyToString(g_Pressed); wxString tentativeHotkey(tentativeModKey + tentativePressedKey); // Found a button that already has this binding. Unbind it. if (tentativeHotkey == existingHotkey) { SaveButtonMapping(btn->GetId(), -1, 0); SetButtonText(btn->GetId(), wxString()); } } // Proceed to apply the binding to the selected button. SetButtonText(ClickedButton->GetId(), WxUtils::WXKeyToString(g_Pressed), WxUtils::WXKeymodToString(g_Modkey)); SaveButtonMapping(ClickedButton->GetId(), g_Pressed, g_Modkey); } EndGetButtons(); } }
void HotkeyConfigDialog::DoGetButtons(int _GetId) { // Values used in this function const int Seconds = 4; // Seconds to wait for const int TimesPerSecond = 40; // How often to run the check // If the Id has changed or the timer is not running we should start one if ( GetButtonWaitingID != _GetId || !m_ButtonMappingTimer->IsRunning() ) { if (m_ButtonMappingTimer->IsRunning()) m_ButtonMappingTimer->Stop(); // Save the button Id GetButtonWaitingID = _GetId; GetButtonWaitingTimer = 0; // Start the timer #if wxUSE_TIMER m_ButtonMappingTimer->Start(1000 / TimesPerSecond); #endif } // Process results // Count each time GetButtonWaitingTimer++; // This is run every second if (GetButtonWaitingTimer % TimesPerSecond == 0) { // Current time int TmpTime = Seconds - (GetButtonWaitingTimer / TimesPerSecond); // Update text SetButtonText(_GetId, wxString::Format("[ %d ]", TmpTime)); } // Time's up if (GetButtonWaitingTimer / TimesPerSecond >= Seconds) { // Revert back to old label SetButtonText(_GetId, OldLabel); EndGetButtons(); } }