diff --git a/IDE/src/Commands.bf b/IDE/src/Commands.bf index 6732447c..56ae1094 100644 --- a/IDE/src/Commands.bf +++ b/IDE/src/Commands.bf @@ -33,9 +33,9 @@ namespace IDE mKeyCode.ToString(strBuffer); } - public static void ToString(List keyStates, String strBuffer) + public static void ToString(Span keyStates, String strBuffer) { - for (int i < keyStates.Count) + for (int i < keyStates.Length) { if (i > 0) strBuffer.Append(", "); @@ -105,10 +105,28 @@ namespace IDE { public enum ContextFlags { - None = 0, - MainWindow = 1, - WorkWindow = 2, - Editor = 4, + case None = 0, + MainWindow = 1, + WorkWindow = 2, + Editor = 4; + + public void ContextToString(String str) + { + bool isFirst = true; + + void AddFlagStr(StringView flagStr) + { + if (isFirst) + { + str.Append(", "); + isFirst = false; + } + str.Append(flagStr); + } + + if (this.HasFlag(.Editor)) + AddFlagStr("Editor"); + } } public String mName ~ delete _; diff --git a/IDE/src/Settings.bf b/IDE/src/Settings.bf index 10d2944c..48949f76 100644 --- a/IDE/src/Settings.bf +++ b/IDE/src/Settings.bf @@ -1095,6 +1095,35 @@ namespace IDE List allocatedStrs = scope .(); defer { ClearAndDeleteItems(allocatedStrs); } + Dictionary mappedEntries = scope .(); + + void AddEntry(List newEntries, Entry entry, bool isNew) + { + newEntries.Add(entry); + + // Delete previous command bindings when we are adding new entries + let keyEntryStr = scope String(); + KeyState.ToString(entry.mKeys, keyEntryStr); + //keyEntryStr.Append(" "); + //entry.mContextFlags.To keyEntryStr); + + String* keyPtr; + Entry* valuePtr; + if (mappedEntries.TryAdd(keyEntryStr, out keyPtr, out valuePtr)) + { + *keyPtr = new String(keyEntryStr); + *valuePtr = entry; + } + else + { + if (isNew) + { + newEntries.Remove(*valuePtr); + delete *valuePtr; + } + } + } + List newEntries = new .(); for (let cmdStr in sd.Enumerate()) { @@ -1123,20 +1152,23 @@ namespace IDE keyList.CopyTo(keyArr); entry.mKeys = keyArr; - newEntries.Add(entry); usedCommands.Add(entry.mCommand); + AddEntry(newEntries, entry, false); } for (var entry in mEntries) { if (usedCommands.Contains(entry.mCommand)) continue; - newEntries.Add(entry); mEntries[@entry.Index] = null; + AddEntry(newEntries, entry, true); } DeleteContainerAndItems!(mEntries); mEntries = newEntries; + + for (let keyEntryStr in mappedEntries.Keys) + delete keyEntryStr; } } diff --git a/IDE/src/ui/SettingsDialog.bf b/IDE/src/ui/SettingsDialog.bf index f2799664..c906c71a 100644 --- a/IDE/src/ui/SettingsDialog.bf +++ b/IDE/src/ui/SettingsDialog.bf @@ -186,24 +186,6 @@ namespace IDE.ui category.Open(true, true); } - void CommandContextToString(IDECommand.ContextFlags contextFlags, String str) - { - bool isFirst = true; - - void AddFlagStr(StringView flagStr) - { - if (isFirst) - { - str.Append(", "); - isFirst = false; - } - str.Append(flagStr); - } - - if (contextFlags.HasFlag(.Editor)) - AddFlagStr("Editor"); - } - void UpdateKeyStates() { Debug.Assert((CategoryType)mPropPage.mCategoryType == .Keys); @@ -223,7 +205,7 @@ namespace IDE.ui let keyEntryStr = new String(); KeyState.ToString(keys, keyEntryStr); keyEntryStr.Append(" "); - CommandContextToString(keyEntry.mContextFlags, keyEntryStr); + keyEntry.mContextFlags.ContextToString(keyEntryStr); String* keyPtr; KeyEntry* valuePtr; @@ -253,7 +235,7 @@ namespace IDE.ui let keyEntryStr = scope String(); KeyState.ToString(keys, keyEntryStr); keyEntryStr.Append(" "); - CommandContextToString(keyEntry.mContextFlags, keyEntryStr); + keyEntry.mContextFlags.ContextToString(keyEntryStr); if (mappedEntries.TryGet(keyEntryStr, var keyPtr, var valuePtr)) { diff --git a/IDE/src/ui/SourceViewPanel.bf b/IDE/src/ui/SourceViewPanel.bf index eb389149..0ada31b3 100644 --- a/IDE/src/ui/SourceViewPanel.bf +++ b/IDE/src/ui/SourceViewPanel.bf @@ -193,7 +193,7 @@ namespace IDE.ui { if (keyEvent.mKeyCode == .Escape) { - if (mPanel.mQuickFind.mWidgetWindow != null) + if (mPanel.mQuickFind?.mWidgetWindow != null) { mPanel.mQuickFind.Close(); return;