From 7ab53d7ef34e1ca3f9984c3d0cccd8c7110b7bf5 Mon Sep 17 00:00:00 2001 From: MaxED Date: Sat, 30 Apr 2016 22:46:56 +0000 Subject: [PATCH] Fixed, Script Editor: rewritten keyboard shortcut handling logic. Now it's (hopefully) no longer possible to insert unrelated characters when using keyboard shortcuts. Also "Duplicate line" (Ctrl-D) command was disabled for no reason. --- .../Controls/ScriptEditorControl.Designer.cs | 1 - Source/Core/Controls/ScriptEditorControl.cs | 203 ++++++++---------- 2 files changed, 91 insertions(+), 113 deletions(-) diff --git a/Source/Core/Controls/ScriptEditorControl.Designer.cs b/Source/Core/Controls/ScriptEditorControl.Designer.cs index bfb334d1..c232eba2 100644 --- a/Source/Core/Controls/ScriptEditorControl.Designer.cs +++ b/Source/Core/Controls/ScriptEditorControl.Designer.cs @@ -58,7 +58,6 @@ namespace CodeImp.DoomBuilder.Controls this.scriptedit.AutoCCompleted += new System.EventHandler(this.scriptedit_AutoCCompleted); this.scriptedit.InsertCheck += new System.EventHandler(this.scriptedit_InsertCheck); this.scriptedit.UpdateUI += new System.EventHandler(this.scriptedit_UpdateUI); - this.scriptedit.KeyDown += new System.Windows.Forms.KeyEventHandler(this.scriptedit_KeyDown); // // scriptpanel // diff --git a/Source/Core/Controls/ScriptEditorControl.cs b/Source/Core/Controls/ScriptEditorControl.cs index ca0188e7..94f71df2 100644 --- a/Source/Core/Controls/ScriptEditorControl.cs +++ b/Source/Core/Controls/ScriptEditorControl.cs @@ -108,7 +108,6 @@ namespace CodeImp.DoomBuilder.Controls private int linenumbercharlength; //mxd. Current max number of chars in the line number private int lastcaretpos; //mxd. Used in brace matching private int caretoffset; //mxd. Used to modify caret position after autogenerating stuff - private bool skiptextinsert; //mxd. Gross hacks private bool expandcodeblock; //mxd. More gross hacks private string highlightedword; //mxd private Encoding encoding; //mxd @@ -176,37 +175,38 @@ namespace CodeImp.DoomBuilder.Controls RegisterAutoCompleteImage(ImageIndex.ScriptProperty, Resources.ScriptProperty); //mxd RegisterMarkerImage(ImageIndex.ScriptError, Resources.ScriptError); - //mxd. These key combinations put odd characters in the script. Let's disable them + // These key combinations put odd characters in the script. Let's disable them scriptedit.AssignCmdKey(Keys.Control | Keys.Q, Command.Null); scriptedit.AssignCmdKey(Keys.Control | Keys.W, Command.Null); scriptedit.AssignCmdKey(Keys.Control | Keys.E, Command.Null); scriptedit.AssignCmdKey(Keys.Control | Keys.R, Command.Null); - scriptedit.AssignCmdKey(Keys.Control | Keys.Y, Command.Null); - scriptedit.AssignCmdKey(Keys.Control | Keys.U, Command.Null); scriptedit.AssignCmdKey(Keys.Control | Keys.I, Command.Null); scriptedit.AssignCmdKey(Keys.Control | Keys.P, Command.Null); - scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.A, Command.Null); - scriptedit.AssignCmdKey(Keys.Control | Keys.D, Command.Null); scriptedit.AssignCmdKey(Keys.Control | Keys.G, Command.Null); scriptedit.AssignCmdKey(Keys.Control | Keys.H, Command.Null); - scriptedit.AssignCmdKey(Keys.Control | Keys.J, Command.Null); scriptedit.AssignCmdKey(Keys.Control | Keys.K, Command.Null); - scriptedit.AssignCmdKey(Keys.Control | Keys.L, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.B, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.N, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.Q, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.W, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.E, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.R, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.Y, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.O, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.P, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.A, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.S, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.D, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.F, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.G, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.H, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.K, Command.Null); scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.Z, Command.Null); scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.X, Command.Null); scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.C, Command.Null); scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.V, Command.Null); - scriptedit.AssignCmdKey(Keys.Control | Keys.B, Command.Null); - scriptedit.AssignCmdKey(Keys.Control | Keys.N, Command.Null); - scriptedit.AssignCmdKey(Keys.Control | Keys.M, Command.Null); - - //mxd. These key combinations are used to perform special actions. Let's disable them - scriptedit.AssignCmdKey(Keys.F3, Command.Null); // F3 for Find Next - scriptedit.AssignCmdKey(Keys.F2, Command.Null); // F2 for Find Previous - scriptedit.AssignCmdKey(Keys.Control | Keys.F, Command.Null); // CTRL+F for find & replace - scriptedit.AssignCmdKey(Keys.Control | Keys.S, Command.Null); // CTRL+S for save - scriptedit.AssignCmdKey(Keys.Control | Keys.O, Command.Null); // CTRL+O for open - scriptedit.AssignCmdKey(Keys.Control | Keys.Space, Command.Null); // CTRL+Space to autocomplete <- TODO: this doesn't seem to work... + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.B, Command.Null); + scriptedit.AssignCmdKey(Keys.Control | Keys.Shift | Keys.N, Command.Null); } #endregion @@ -866,6 +866,77 @@ namespace CodeImp.DoomBuilder.Controls } } + //mxd. Handle keyboard shortcuts + protected override bool ProcessCmdKey(ref Message msg, Keys keydata) + { + // F3 for Find Next + if(keydata == Keys.F3) + { + if(OnFindNext != null) OnFindNext(); + return true; + } + + //mxd. F2 for Find Previous + if(keydata == Keys.F2) + { + if(OnFindPrevious != null) OnFindPrevious(); + return true; + } + + // CTRL+F for find & replace + if(keydata == (Keys.Control | Keys.F)) + { + if(OnOpenFindAndReplace != null) OnOpenFindAndReplace(); + return true; + } + + // CTRL+S for save + if(keydata == (Keys.Control | Keys.S)) + { + if(OnExplicitSaveTab != null) OnExplicitSaveTab(); + return true; + } + + // CTRL+O for open + if(keydata == (Keys.Control | Keys.O)) + { + if(OnOpenScriptBrowser != null) OnOpenScriptBrowser(); + return true; + } + + // CTRL+Space to autocomplete + if(keydata == (Keys.Control | Keys.Space)) + { + // Hide call tip if any + scriptedit.CallTipCancel(); + + // Show autocomplete + handler.ShowAutoCompletionList(); + return true; + } + + //mxd. Tab to expand code snippet. Do it only when the text cursor is at the end of a keyword. + if(keydata == Keys.Tab && !scriptedit.AutoCActive) + { + string curword = GetCurrentWord().ToLowerInvariant(); + if(scriptconfig.Snippets.Contains(curword) && scriptedit.CurrentPosition == scriptedit.WordEndPosition(scriptedit.CurrentPosition, true)) + { + InsertSnippet(scriptconfig.GetSnippet(curword)); + return true; + } + } + + //mxd. Skip text insert when "save screenshot" action keys are pressed + Actions.Action[] actions = General.Actions.GetActionsByKey((int)keydata); + foreach(Actions.Action action in actions) + { + if(action.ShortName == "savescreenshot" || action.ShortName == "saveeditareascreenshot") return true; + } + + // Pass to base + return base.ProcessCmdKey(ref msg, keydata); + } + #endregion #region ================== Events @@ -1032,14 +1103,8 @@ namespace CodeImp.DoomBuilder.Controls //mxd private void scriptedit_InsertCheck(object sender, InsertCheckEventArgs e) { - // Gross hacks... - if(skiptextinsert) - { - e.Text = string.Empty; - skiptextinsert = false; - } // Do we want auto-indentation? - else if(!expandcodeblock && General.Settings.ScriptAutoIndent && e.Text == "\r\n") + if(!expandcodeblock && General.Settings.ScriptAutoIndent && e.Text == "\r\n") { // Get current line indentation up to the cursor position string linetext = scriptedit.Lines[scriptedit.CurrentLine].Text; @@ -1120,92 +1185,6 @@ namespace CodeImp.DoomBuilder.Controls } } } - - // Key pressed down - private void scriptedit_KeyDown(object sender, KeyEventArgs e) - { - // F3 for Find Next - if((e.KeyCode == Keys.F3) && (e.Modifiers == Keys.None)) - { - if(OnFindNext != null) - { - OnFindNext(); - skiptextinsert = true; - } - } - // F2 for Find Previous (mxd) - else if((e.KeyCode == Keys.F2) && (e.Modifiers == Keys.None)) - { - if(OnFindPrevious != null) - { - OnFindPrevious(); - skiptextinsert = true; - } - } - // CTRL+F for find & replace - else if((e.KeyCode == Keys.F) && (e.Modifiers == Keys.Control)) - { - if(OnOpenFindAndReplace != null) - { - OnOpenFindAndReplace(); - skiptextinsert = true; - } - } - // CTRL+S for save - else if((e.KeyCode == Keys.S) && (e.Modifiers == Keys.Control)) - { - if(OnExplicitSaveTab != null) - { - OnExplicitSaveTab(); - skiptextinsert = true; - } - } - // CTRL+O for open - else if((e.KeyCode == Keys.O) && (e.Modifiers == Keys.Control)) - { - if(OnOpenScriptBrowser != null) - { - OnOpenScriptBrowser(); - skiptextinsert = true; - } - } - // CTRL+Space to autocomplete - else if((e.KeyCode == Keys.Space) && (e.Modifiers == Keys.Control)) - { - // Hide call tip if any - scriptedit.CallTipCancel(); - - // Show autocomplete - handler.ShowAutoCompletionList(); - skiptextinsert = true; - } - //mxd. Tab to expand code snippet. Do it only when the text cursor is at the end of a keyword. - else if(e.KeyCode == Keys.Tab) - { - if(!scriptedit.AutoCActive) - { - string curword = GetCurrentWord().ToLowerInvariant(); - if(scriptconfig.Snippets.Contains(curword) && scriptedit.CurrentPosition == scriptedit.WordEndPosition(scriptedit.CurrentPosition, true)) - { - InsertSnippet(scriptconfig.GetSnippet(curword)); - skiptextinsert = true; - } - } - } - else - { - //mxd. Skip text insert when "save screenshot" action's keys are pressed - Actions.Action[] actions = General.Actions.GetActionsByKey((int)e.KeyData); - foreach(Actions.Action action in actions) - { - if(action.ShortName == "savescreenshot" || action.ShortName == "saveeditareascreenshot") - { - skiptextinsert = true; - return; - } - } - } - } //mxd private void functionbar_SelectedIndexChanged(object sender, EventArgs e)