More tweaks to the hotkeys screen, should now behave much better than before.

Originally committed to SVN as r1618.
This commit is contained in:
Rodrigo Braz Monteiro 2007-10-21 01:13:26 +00:00
parent 045583c190
commit 41f3dcc35d
4 changed files with 78 additions and 8 deletions

View File

@ -72,7 +72,8 @@ enum {
HOTKEY_LIST, HOTKEY_LIST,
BUTTON_HOTKEY_SET, BUTTON_HOTKEY_SET,
BUTTON_HOTKEY_CLEAR, BUTTON_HOTKEY_CLEAR,
BUTTON_HOTKEY_DEFAULT BUTTON_HOTKEY_DEFAULT,
BUTTON_HOTKEY_DEFAULT_ALL
}; };
@ -597,8 +598,9 @@ DialogOptions::DialogOptions(wxWindow *parent)
// Create buttons // Create buttons
wxSizer *buttons = new wxBoxSizer(wxHORIZONTAL); wxSizer *buttons = new wxBoxSizer(wxHORIZONTAL);
buttons->Add(new wxButton(hotkeysPage,BUTTON_HOTKEY_SET,_("Set Hotkey...")),1,wxEXPAND|wxRIGHT,5); buttons->Add(new wxButton(hotkeysPage,BUTTON_HOTKEY_SET,_("Set Hotkey...")),1,wxEXPAND|wxRIGHT,5);
buttons->Add(new wxButton(hotkeysPage,BUTTON_HOTKEY_CLEAR,_("Clear Hotkey")),1,wxEXPAND|wxRIGHT,5); buttons->Add(new wxButton(hotkeysPage,BUTTON_HOTKEY_CLEAR,_("Clear Hotkey")),0,wxEXPAND|wxRIGHT,5);
buttons->Add(new wxButton(hotkeysPage,BUTTON_HOTKEY_DEFAULT,_("Default")),1,wxEXPAND|wxRIGHT,0); buttons->Add(new wxButton(hotkeysPage,BUTTON_HOTKEY_DEFAULT,_("Default")),0,wxEXPAND|wxRIGHT,5);
buttons->Add(new wxButton(hotkeysPage,BUTTON_HOTKEY_DEFAULT_ALL,_("Default All")),0,wxEXPAND|wxRIGHT,0);
// Main sizer // Main sizer
wxSizer *hotkeysSizer = new wxBoxSizer(wxVERTICAL); wxSizer *hotkeysSizer = new wxBoxSizer(wxVERTICAL);
@ -704,6 +706,7 @@ BEGIN_EVENT_TABLE(DialogOptions,wxDialog)
EVT_BUTTON(BUTTON_HOTKEY_SET,DialogOptions::OnEditHotkey) EVT_BUTTON(BUTTON_HOTKEY_SET,DialogOptions::OnEditHotkey)
EVT_BUTTON(BUTTON_HOTKEY_CLEAR,DialogOptions::OnClearHotkey) EVT_BUTTON(BUTTON_HOTKEY_CLEAR,DialogOptions::OnClearHotkey)
EVT_BUTTON(BUTTON_HOTKEY_DEFAULT,DialogOptions::OnDefaultHotkey) EVT_BUTTON(BUTTON_HOTKEY_DEFAULT,DialogOptions::OnDefaultHotkey)
EVT_BUTTON(BUTTON_HOTKEY_DEFAULT_ALL,DialogOptions::OnDefaultAllHotkey)
END_EVENT_TABLE() END_EVENT_TABLE()
@ -1003,7 +1006,7 @@ void DialogOptions::OnEditHotkey(wxCommandEvent &event) {
int oldFlags = curKey->flags; int oldFlags = curKey->flags;
// Open dialog // Open dialog
DialogInputHotkey input(curKey,Shortcuts->GetItemText(sel)); DialogInputHotkey input(curKey,Shortcuts->GetItemText(sel),Shortcuts);
input.ShowModal(); input.ShowModal();
// Update stuff if it changed // Update stuff if it changed
@ -1051,18 +1054,51 @@ void DialogOptions::OnDefaultHotkey(wxCommandEvent &event) {
curKey->keycode = origKey->keycode; curKey->keycode = origKey->keycode;
curKey->flags = origKey->flags; curKey->flags = origKey->flags;
Shortcuts->SetItem(item,1,curKey->GetText()); Shortcuts->SetItem(item,1,curKey->GetText());
// Unmap duplicate
HotkeyType *dup = Hotkeys.Find(origKey->keycode,origKey->flags);
if (dup) {
dup->keycode = 0;
dup->flags = 0;
int item = Shortcuts->FindItem(-1,(wxUIntPtr)dup);
if (item != -1) Shortcuts->SetItem(item,1,dup->GetText());
} }
} }
} }
}
////////////////////////////////
// Reset all hotkeys to default
void DialogOptions::OnDefaultAllHotkey(wxCommandEvent &event) {
Hotkeys.LoadDefaults();
Shortcuts->Freeze();
Shortcuts->ClearAll();
Shortcuts->InsertColumn(0,_("Function"),wxLIST_FORMAT_LEFT,200);
Shortcuts->InsertColumn(1,_("Key"),wxLIST_FORMAT_LEFT,120);
// Populate list
std::map<wxString,HotkeyType>::iterator cur;
for (cur = Hotkeys.key.end();cur-- != Hotkeys.key.begin();) {
wxListItem item;
item.SetText(wxGetTranslation(cur->second.origName));
item.SetData(&cur->second);
int pos = Shortcuts->InsertItem(item);
Shortcuts->SetItem(pos,1,cur->second.GetText());
}
hotkeysModified = true;
Shortcuts->Thaw();
}
///////////////////// /////////////////////
// Input constructor // Input constructor
DialogInputHotkey::DialogInputHotkey(HotkeyType *_key,wxString name) DialogInputHotkey::DialogInputHotkey(HotkeyType *_key,wxString name,wxListView *shorts)
: wxDialog(NULL, -1, _("Press Key"), wxDefaultPosition, wxSize(200,50), wxCAPTION | wxWANTS_CHARS , _T("Press key")) : wxDialog(NULL, -1, _("Press Key"), wxDefaultPosition, wxSize(200,50), wxCAPTION | wxWANTS_CHARS , _T("Press key"))
{ {
// Key // Key
key = _key; key = _key;
shortcuts = shorts;
// Text // Text
wxStaticText *text = new wxStaticText(this,-1,wxString::Format(_("Press key to bind to \"%s\" or Esc to cancel."), name.c_str())); wxStaticText *text = new wxStaticText(this,-1,wxString::Format(_("Press key to bind to \"%s\" or Esc to cancel."), name.c_str()));
@ -1099,11 +1135,11 @@ END_EVENT_TABLE()
/////////////// ///////////////
// On key down // On key down
void CaptureKey::OnKeyDown(wxKeyEvent &event) { void CaptureKey::OnKeyDown(wxKeyEvent &event) {
// Get key
int keycode = event.GetKeyCode(); int keycode = event.GetKeyCode();
if (keycode == WXK_ESCAPE) parent->EndModal(0); if (keycode == WXK_ESCAPE) parent->EndModal(0);
else if (keycode != WXK_SHIFT && keycode != WXK_CONTROL && keycode != WXK_ALT) { else if (keycode != WXK_SHIFT && keycode != WXK_CONTROL && keycode != WXK_ALT) {
parent->key->keycode = keycode; // Get modifier
int mod = 0; int mod = 0;
if (event.m_altDown) mod |= wxACCEL_ALT; if (event.m_altDown) mod |= wxACCEL_ALT;
#ifdef __APPLE__ #ifdef __APPLE__
@ -1112,7 +1148,26 @@ void CaptureKey::OnKeyDown(wxKeyEvent &event) {
if (event.m_controlDown) mod |= wxACCEL_CTRL; if (event.m_controlDown) mod |= wxACCEL_CTRL;
#endif #endif
if (event.m_shiftDown) mod |= wxACCEL_SHIFT; if (event.m_shiftDown) mod |= wxACCEL_SHIFT;
// Check if keycode is free
HotkeyType *dup = Hotkeys.Find(keycode,mod);
if (dup) {
int result = wxMessageBox(wxString::Format(_("The hotkey %s is already mapped to %s. If you proceed, that hotkey will be cleared. Proceed?"),dup->GetText().c_str(),dup->origName.c_str()),_("Hotkey conflict"),wxYES_NO | wxICON_EXCLAMATION);
if (result == wxNO) {
parent->EndModal(0);
return;
}
dup->keycode = 0;
dup->flags = 0;
int item = parent->shortcuts->FindItem(-1,(wxUIntPtr)dup);
if (item != -1) parent->shortcuts->SetItem(item,1,dup->GetText());
}
// Set keycode
parent->key->keycode = keycode;
parent->key->flags = mod; parent->key->flags = mod;
// End dialogue
parent->EndModal(0); parent->EndModal(0);
} }
else event.Skip(); else event.Skip();

View File

@ -110,6 +110,7 @@ private:
void OnEditHotkey(wxCommandEvent &event); void OnEditHotkey(wxCommandEvent &event);
void OnClearHotkey(wxCommandEvent &event); void OnClearHotkey(wxCommandEvent &event);
void OnDefaultHotkey(wxCommandEvent &event); void OnDefaultHotkey(wxCommandEvent &event);
void OnDefaultAllHotkey(wxCommandEvent &event);
public: public:
DialogOptions(wxWindow *parent); DialogOptions(wxWindow *parent);
@ -142,7 +143,8 @@ class DialogInputHotkey : public wxDialog {
private: private:
CaptureKey *capture; CaptureKey *capture;
HotkeyType *key; HotkeyType *key;
wxListView *shortcuts;
public: public:
DialogInputHotkey(HotkeyType *key,wxString name); DialogInputHotkey(HotkeyType *key,wxString name,wxListView *Shortcuts);
}; };

View File

@ -505,3 +505,15 @@ bool HotkeyManager::IsPressed(wxString function) {
else throw _T("Hotkey not defined"); else throw _T("Hotkey not defined");
} }
///////////////////////
// Search for a hotkey
HotkeyType *HotkeyManager::Find(int keycode,int mod) {
for (std::map<wxString,HotkeyType>::iterator cur = key.begin();cur != key.end();cur++) {
if (cur->second.keycode == keycode && cur->second.flags == mod) {
return &(cur->second);
}
}
return NULL;
}

View File

@ -94,6 +94,7 @@ public:
void Save(); void Save();
void Load(); void Load();
void LoadDefaults(); void LoadDefaults();
HotkeyType *Find(int keycode,int mod);
wxString GetText(wxString function); wxString GetText(wxString function);
wxAcceleratorEntry GetAccelerator(wxString function,int id); wxAcceleratorEntry GetAccelerator(wxString function,int id);