Check for conflicts when reseting/undoing hotkey changes

It was possible to get conflicting hotkeys when undoing and resetting hotkeys
to defaults.

This uses the same logic as when setting hotkeys to avoid conflcits in these
other two cases.

Fixes: lp:1794730
* https://bugs.launchpad.net/kicad/+bug/1794730
This commit is contained in:
John Beard 2018-09-27 13:31:24 +01:00 committed by Wayne Stambaugh
parent 3283bd9fdc
commit a294e8d6c4
4 changed files with 55 additions and 27 deletions

View File

@ -321,6 +321,31 @@ void WIDGET_HOTKEY_LIST::UpdateFromClientData()
SetItemText( i, 1, key_text); 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 ) if( hkdata && key )
{ {
// See if this key code is handled in hotkeys names list changeHotkey( hkdata->GetChangedHotkey(), key );
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;
}
}
UpdateFromClientData(); 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 ) void WIDGET_HOTKEY_LIST::ResetItem( wxTreeListItem aItem )
{ {
WIDGET_HOTKEY_CLIENT_DATA* hkdata = GetHKClientData( 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(); UpdateFromClientData();
} }
@ -381,8 +388,10 @@ void WIDGET_HOTKEY_LIST::ResetItem( wxTreeListItem aItem )
void WIDGET_HOTKEY_LIST::ResetItemToDefault( wxTreeListItem aItem ) void WIDGET_HOTKEY_LIST::ResetItemToDefault( wxTreeListItem aItem )
{ {
WIDGET_HOTKEY_CLIENT_DATA* hkdata = GetHKClientData( 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(); UpdateFromClientData();
} }

View File

@ -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;
} }
/** /**

View File

@ -71,6 +71,11 @@ public:
EDA_HOTKEY( const wxChar* infomsg, int idcommand, int keycode, int idmenuevent = 0 ); EDA_HOTKEY( const wxChar* infomsg, int idcommand, int keycode, int idmenuevent = 0 );
EDA_HOTKEY( const EDA_HOTKEY* base); EDA_HOTKEY( const EDA_HOTKEY* base);
void ResetKeyCodeToDefault() { m_KeyCode = m_defaultKeyCode; } void ResetKeyCodeToDefault() { m_KeyCode = m_defaultKeyCode; }
int GetDefaultKeyCode() const
{
return m_defaultKeyCode;
}
}; };

View File

@ -76,6 +76,17 @@ class WIDGET_HOTKEY_LIST : public TWO_COLUMN_TREE_LIST
*/ */
void updateShownItems( const wxString& aFilterStr ); 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: protected:
/** /**