diff --git a/common/widgets/widget_hotkey_list.cpp b/common/widgets/widget_hotkey_list.cpp index 55cd903e1c..62f78f75fc 100644 --- a/common/widgets/widget_hotkey_list.cpp +++ b/common/widgets/widget_hotkey_list.cpp @@ -321,6 +321,31 @@ void WIDGET_HOTKEY_LIST::UpdateFromClientData() SetItemText( i, 1, key_text); } } + + // Trigger a resize in case column widths have changed + wxSizeEvent dummy_evt; + TWO_COLUMN_TREE_LIST::OnSize( dummy_evt ); +} + + +void WIDGET_HOTKEY_LIST::changeHotkey( CHANGED_HOTKEY& aHotkey, long aKey ) +{ + // See if this key code is handled in hotkeys names list + bool exists; + KeyNameFromKeyCode( aKey, &exists ); + + auto& curr_hk = aHotkey.GetCurrentValue(); + + if( exists && curr_hk.m_KeyCode != aKey ) + { + const auto& tag = aHotkey.GetSectionTag(); + bool can_update = ResolveKeyConflicts( aKey, tag ); + + if( can_update ) + { + curr_hk.m_KeyCode = aKey; + } + } } @@ -342,29 +367,8 @@ void WIDGET_HOTKEY_LIST::EditItem( wxTreeListItem aItem ) if( hkdata && key ) { - // See if this key code is handled in hotkeys names list - bool exists; - KeyNameFromKeyCode( key, &exists ); - - auto& changed_hk = hkdata->GetChangedHotkey(); - auto& curr_hk = changed_hk.GetCurrentValue(); - - if( exists && curr_hk.m_KeyCode != key ) - { - wxString tag = changed_hk.GetSectionTag(); - bool canUpdate = ResolveKeyConflicts( key, tag ); - - if( canUpdate ) - { - curr_hk.m_KeyCode = key; - } - } - + changeHotkey( hkdata->GetChangedHotkey(), key ); UpdateFromClientData(); - - // Trigger a resize in case column widths have changed - wxSizeEvent dummy_evt; - TWO_COLUMN_TREE_LIST::OnSize( dummy_evt ); } } @@ -372,8 +376,11 @@ void WIDGET_HOTKEY_LIST::EditItem( wxTreeListItem aItem ) void WIDGET_HOTKEY_LIST::ResetItem( wxTreeListItem aItem ) { WIDGET_HOTKEY_CLIENT_DATA* hkdata = GetHKClientData( aItem ); - hkdata->GetChangedHotkey().ResetHotkey(); + auto& changed_hk = hkdata->GetChangedHotkey(); + const auto& orig_hk = changed_hk.GetOriginalValue(); + + changeHotkey( changed_hk, orig_hk.m_KeyCode ); UpdateFromClientData(); } @@ -381,8 +388,10 @@ void WIDGET_HOTKEY_LIST::ResetItem( wxTreeListItem aItem ) void WIDGET_HOTKEY_LIST::ResetItemToDefault( wxTreeListItem aItem ) { WIDGET_HOTKEY_CLIENT_DATA* hkdata = GetHKClientData( aItem ); - hkdata->GetChangedHotkey().GetCurrentValue().ResetKeyCodeToDefault(); + auto& changed_hk = hkdata->GetChangedHotkey(); + + changeHotkey( changed_hk, changed_hk.GetCurrentValue().GetDefaultKeyCode() ); UpdateFromClientData(); } diff --git a/include/hotkey_store.h b/include/hotkey_store.h index b025ce8915..fd5b5ec908 100644 --- a/include/hotkey_store.h +++ b/include/hotkey_store.h @@ -56,11 +56,14 @@ public: } /** - * Reset the changed hotkey back to the original value. + * Gets the original value of the hotkey. This is what the hotkey used + * to be, and what it would be set to if reset. + * + * @return reference to the original hotkey. */ - void ResetHotkey() + const EDA_HOTKEY& GetOriginalValue() const { - m_changed = m_orig; + return m_orig; } /** diff --git a/include/hotkeys_basic.h b/include/hotkeys_basic.h index afccc55d7b..21e0dc5a8c 100644 --- a/include/hotkeys_basic.h +++ b/include/hotkeys_basic.h @@ -71,6 +71,11 @@ public: EDA_HOTKEY( const wxChar* infomsg, int idcommand, int keycode, int idmenuevent = 0 ); EDA_HOTKEY( const EDA_HOTKEY* base); void ResetKeyCodeToDefault() { m_KeyCode = m_defaultKeyCode; } + + int GetDefaultKeyCode() const + { + return m_defaultKeyCode; + } }; diff --git a/include/widgets/widget_hotkey_list.h b/include/widgets/widget_hotkey_list.h index 78a6216b17..a0f93a8614 100644 --- a/include/widgets/widget_hotkey_list.h +++ b/include/widgets/widget_hotkey_list.h @@ -76,6 +76,17 @@ class WIDGET_HOTKEY_LIST : public TWO_COLUMN_TREE_LIST */ void updateShownItems( const wxString& aFilterStr ); + /** + * Attempt to change the given hotkey to the given key code. + * + * If the hotkey conflicts, the user is prompted to change anyway (and + * in doing so, unset the conflicting key), or cancel the attempt. + * + * @param aHotkey the change-able hotkey to try to change + * @param aKey the key code to change it to + */ + void changeHotkey( CHANGED_HOTKEY& aHotkey, long aKey ); + protected: /**