Issue #744: Shortcut settings: Let user know whether a wanted shortcut is assigned to another action, and prompt for confirmation in such cases.

This commit is contained in:
Ansgar Becker
2020-12-21 21:12:04 +01:00
parent 9c45f973d8
commit 172c9aeec8
3 changed files with 71 additions and 14 deletions

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: HeidiSQL\n"
"POT-Creation-Date: 2012-11-05 21:40\n"
"PO-Revision-Date: 2020-12-02 17:29+0100\n"
"PO-Revision-Date: 2020-12-21 21:08+0100\n"
"Last-Translator: Ansgar Becker <anse@heidisql.com>\n"
"Language-Team: English (http://www.transifex.com/projects/p/heidisql/language/en/)\n"
"MIME-Version: 1.0\n"
@ -6610,3 +6610,11 @@ msgstr "Current query is empty"
msgid "Please move the cursor inside the query you want to use."
msgstr "Please move the cursor inside the query you want to use."
#. Keyboard shortcut settings
msgid "Keyboard shortcut [%s] is already assigned to \"%s\"."
msgstr "Keyboard shortcut [%s] is already assigned to \"%s\"."
#. Keyboard shortcut settings
msgid "Remove it there and assign to \"%s\" instead?"
msgstr "Remove it there and assign to \"%s\" instead?"

View File

@ -1256,7 +1256,7 @@ object optionsform: Toptionsform
HotKey = 0
Modifiers = []
TabOrder = 1
OnChange = HotKey1Change
OnChange = HotKeyChange
OnEnter = HotKeyEnter
OnExit = HotKeyExit
end
@ -1270,7 +1270,7 @@ object optionsform: Toptionsform
InvalidKeys = []
Modifiers = []
TabOrder = 2
OnChange = HotKey2Change
OnChange = HotKeyChange
OnEnter = HotKeyEnter
OnExit = HotKeyExit
end

View File

@ -216,8 +216,7 @@ type
procedure FormDestroy(Sender: TObject);
procedure chkThemePreviewClick(Sender: TObject);
procedure chkCompletionProposalClick(Sender: TObject);
procedure HotKey1Change(Sender: TObject);
procedure HotKey2Change(Sender: TObject);
procedure HotKeyChange(Sender: TObject);
private
{ Private declarations }
FWasModified: Boolean;
@ -230,6 +229,7 @@ type
FThemePreview: TfrmThemePreview;
procedure InitLanguages;
procedure SelectDirectory(Sender: TObject; NewFolderButton: Boolean);
function EnsureShortcutIsUnused(RequestShortcut: TShortCut): Boolean;
public
{ Public declarations }
end;
@ -1222,25 +1222,74 @@ begin
end;
procedure Toptionsform.HotKey1Change(Sender: TObject);
function Toptionsform.EnsureShortcutIsUnused(RequestShortcut: TShortCut): Boolean;
var
Node, NodeWantsIt: PVirtualNode;
Data: PShortcutItemData;
Tree: TVirtualStringTree;
MsgFormat, Msg: String;
begin
// Shortcut 1 changed
Data := TreeShortcutItems.GetNodeData(TreeShortcutItems.FocusedNode);
Data.Shortcut1 := (Sender as THotKey).HotKey;
Modified(Sender);
Result := True;
if RequestShortcut = 0 then
Exit;
MsgFormat := _('Keyboard shortcut [%s] is already assigned to "%s".') + sLineBreak + sLineBreak +
_('Remove it there and assign to "%s" instead?');
Tree := TreeShortcutItems;
NodeWantsIt := Tree.FocusedNode;
Node := GetNextNode(Tree, nil, False);
while Assigned(Node) do begin
if Tree.GetNodeLevel(Node) = 1 then begin
Data := Tree.GetNodeData(Node);
Msg := Format(MsgFormat, [ShortCutToText(RequestShortcut), Tree.Text[Node, 0], Tree.Text[NodeWantsIt, 0]]);
if Node = NodeWantsIt then begin
// Ignore requesting node
end else begin
if Data.ShortCut1 = RequestShortcut then begin
if MessageDialog(Msg, mtConfirmation, [mbYes, mbNo]) = mrYes then
Data.ShortCut1 := 0 // Unassign shortcut 1
else
Result := False;
end;
if Data.ShortCut2 = RequestShortcut then begin
if MessageDialog(Msg, mtConfirmation, [mbYes, mbNo]) = mrYes then
Data.ShortCut2 := 0 // Unassign shortcut 2
else
Result := False;
end;
end;
end;
if Result = False then
Break;
Node := GetNextNode(Tree, Node, False);
end;
end;
procedure Toptionsform.HotKey2Change(Sender: TObject);
procedure Toptionsform.HotKeyChange(Sender: TObject);
var
Data: PShortcutItemData;
HotKeyEdit: THotKey;
EventHandler: TNotifyEvent;
begin
// Shortcut 2 changed
// Shortcut 1 or 2 changed
HotKeyEdit := Sender as THotKey;
Data := TreeShortcutItems.GetNodeData(TreeShortcutItems.FocusedNode);
Data.Shortcut2 := (Sender as THotKey).HotKey;
Modified(Sender);
if EnsureShortcutIsUnused(HotKeyEdit.HotKey) then begin
if HotKeyEdit = HotKey1 then
Data.Shortcut1 := HotKeyEdit.HotKey
else
Data.Shortcut2 := HotKeyEdit.HotKey;
Modified(Sender);
end else begin
// Undo change in hotkey editor, without triggering OnChange event
EventHandler := HotKeyEdit.OnChange;
if HotKeyEdit = HotKey1 then
HotKeyEdit.HotKey := Data.ShortCut1
else
HotKeyEdit.HotKey := Data.ShortCut2;
HotKeyEdit.OnChange := EventHandler;
end;
end;