mirror of
https://github.com/cheat-engine/cheat-engine
synced 2026-08-15 02:26:08 -04:00
862 lines
23 KiB
ObjectPascal
Executable file
862 lines
23 KiB
ObjectPascal
Executable file
unit HotKeys;
|
|
|
|
{$MODE Delphi}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$ifdef darwin}
|
|
macport, LCLType, math, machotkeys,
|
|
{$endif}
|
|
{$ifdef windows}
|
|
windows,
|
|
{$endif}
|
|
LCLIntf, Messages, SysUtils, Classes, Graphics, Controls, Forms,
|
|
Dialogs, StdCtrls, Buttons, registry, CEFuncProc, ExtCtrls, LResources,
|
|
comCtrls, menus, hotkeyhandler, MemoryRecordUnit, commonTypeDefs, strutils, betterControls, LMessages;
|
|
|
|
type
|
|
|
|
{ THotKeyForm }
|
|
|
|
THotKeyForm = class(TForm)
|
|
btnApply: TButton;
|
|
btnCreateHotkey: TButton;
|
|
btnEditHotkey: TButton;
|
|
btnCancel: TButton;
|
|
btnOK: TButton;
|
|
Button2: TButton;
|
|
cbActivateSound: TComboBox;
|
|
cbDeactivateSound: TComboBox;
|
|
cbFreezedirection: TComboBox;
|
|
cbForceEnglishActivate: TCheckBox;
|
|
cbForceEnglishDeactivate: TCheckBox;
|
|
cbOnlyWhileDown: TCheckBox;
|
|
edtActivateText: TEdit;
|
|
edtDeactivateText: TEdit;
|
|
edtDescription: TEdit;
|
|
edtFreezeValue: TEdit;
|
|
edtHotkey: TEdit;
|
|
schImageList: TImageList;
|
|
Label1: TLabel;
|
|
Label2: TLabel;
|
|
lblActivateSound: TLabel;
|
|
lblDeactivateSound: TLabel;
|
|
lblID: TLabel;
|
|
ListView1: TListView;
|
|
miAddSound: TMenuItem;
|
|
miDelete: TMenuItem;
|
|
odWave: TOpenDialog;
|
|
PageControl1: TPageControl;
|
|
Panel1: TPanel;
|
|
Panel2: TPanel;
|
|
Panel3: TPanel;
|
|
pmHotkeylist: TPopupMenu;
|
|
pmAddSound: TPopupMenu;
|
|
sbPlayActivate: TSpeedButton;
|
|
sbPlayDeactivate: TSpeedButton;
|
|
TabSheet1: TTabSheet;
|
|
TabSheet2: TTabSheet;
|
|
procedure btnCreateHotkeyClick(Sender: TObject);
|
|
procedure btnEditHotkeyClick(Sender: TObject);
|
|
procedure btnApplyClick(Sender: TObject);
|
|
procedure btnCancelClick(Sender: TObject);
|
|
procedure btnOKClick(Sender: TObject);
|
|
procedure Button2Click(Sender: TObject);
|
|
procedure cbActivateSoundChange(Sender: TObject);
|
|
procedure cbDeactivateSoundChange(Sender: TObject);
|
|
procedure cbForceEnglishActivateChange(Sender: TObject);
|
|
procedure cbFreezedirectionSelect(Sender: TObject);
|
|
procedure cbPlaySoundChange(Sender: TObject);
|
|
procedure edtHotkeyKeyDown(Sender: TObject; var Key: Word;
|
|
Shift: TShiftState);
|
|
procedure edtHotkeyMouseDown(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormShortCut(var Msg: TLMKey; var Handled: Boolean);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure ListView1DblClick(Sender: TObject);
|
|
procedure ListView1ItemChecked(Sender: TObject; Item: TListItem);
|
|
procedure ListView1SelectItem(Sender: TObject; Item: TListItem;
|
|
Selected: Boolean);
|
|
procedure miAddSoundClick(Sender: TObject);
|
|
procedure miDeleteClick(Sender: TObject);
|
|
procedure Panel2Resize(Sender: TObject);
|
|
procedure pmHotkeylistPopup(Sender: TObject);
|
|
procedure sbPlayActivateClick(Sender: TObject);
|
|
procedure sbPlayDeactivateClick(Sender: TObject);
|
|
private
|
|
{ Private declarations }
|
|
keys: tkeycombo;
|
|
editHotkey: boolean;
|
|
fmemrec: TMemoryRecord;
|
|
procedure SpeakText(s:string; forceEnglish: boolean=false);
|
|
procedure SetMemrec(x: TMemoryRecord);
|
|
function HotkeyActionToText(a: TMemrecHotkeyAction): string;
|
|
function getHotkeyAction: TMemrecHotkeyAction;
|
|
function getBtnOKCustomButton: TCustomButton;
|
|
public
|
|
{ Public declarations }
|
|
published
|
|
property memrec: TMemoryRecord read fmemrec write SetMemrec;
|
|
property BitBtn1: TCustomButton read getBtnOKCustomButton; //compatibility with older versions
|
|
end;
|
|
|
|
|
|
implementation
|
|
|
|
uses MainUnit, {$ifdef windows}trainergenerator,{$endif} luafile, LuaHandler, DPIHelper;
|
|
|
|
resourcestring
|
|
rsHotkeyID = 'Hotkey ID=%s';
|
|
rsToggleScript = 'Toggle script';
|
|
rsEnableScript = 'Enable script';
|
|
rsDisableScript = 'Disable script';
|
|
rsToggleFreeze = 'Toggle freeze';
|
|
rsToggleFreezeAndAllowIncrease = 'Toggle freeze and allow increase';
|
|
rsToggleFreezeAndAllowDecrease = 'Toggle freeze and allow decrease';
|
|
rsFreeze = 'Freeze';
|
|
rsUnfreeze = 'Unfreeze';
|
|
rsSetValueTo = 'Set value to:';
|
|
rsDecreaseValueWith = 'Decrease value with:';
|
|
rsIncreaseValueWith = 'Increase value with:';
|
|
rsSpeakText = 'Speak Text';
|
|
|
|
rsTextToSpeechHint = 'The text to speak'#13#10'{Description} = The description of the hotkey'#13#10'{MRDescription} = The description field of the memory record'#13#10'{MRValue} = The value of the memory record';
|
|
rsDefaultActivated = '%s Activated';
|
|
rsDefaultDeactivated = '%s Deactivated';
|
|
rsDeactivateOnRelease = 'Deactivate on release';
|
|
rsRestoreToOriginalOnRelease = 'Restore to original on release';
|
|
|
|
|
|
function THotkeyform.getBtnOKCustomButton: TCustomButton;
|
|
begin
|
|
result:=btnOK as TCustomButton;
|
|
end;
|
|
|
|
function THotkeyform.getHotkeyAction: TMemrecHotkeyAction;
|
|
begin
|
|
result:=mrhToggleActivation;
|
|
if fmemrec.vartype=vtAutoAssembler then
|
|
begin
|
|
case cbFreezedirection.ItemIndex of
|
|
0: result:=mrhToggleActivation;
|
|
1: result:=mrhActivate;
|
|
2: result:=mrhDeactivate;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
case cbFreezedirection.ItemIndex of
|
|
0: result:=mrhToggleActivation;
|
|
1: result:=mrhToggleActivationAllowIncrease;
|
|
2: result:=mrhToggleActivationAllowDecrease;
|
|
3: result:=mrhActivate;
|
|
4: result:=mrhDeactivate;
|
|
5: result:=mrhSetValue;
|
|
6: result:=mrhDecreaseValue;
|
|
7: result:=mrhIncreaseValue;
|
|
end;
|
|
end;
|
|
|
|
end;
|
|
|
|
function THotkeyform.HotkeyActionToText(a: TMemrecHotkeyAction): string;
|
|
begin
|
|
{
|
|
Toggle freeze/Toggle activated
|
|
Toggle freeze and allow increase
|
|
Toggle freeze and allow decrease
|
|
Set value to:
|
|
Decrease value with:
|
|
Increase value with:
|
|
|
|
}
|
|
result:='';
|
|
if memrec.VarType=vtAutoAssembler then
|
|
begin
|
|
case a of
|
|
mrhToggleActivation: result:=cbFreezedirection.Items[0];
|
|
mrhActivate: result:=cbFreezedirection.items[1];
|
|
mrhDeactivate: result:=cbFreezedirection.items[2];
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
case a of
|
|
mrhToggleActivation: result:=cbFreezedirection.Items[0];
|
|
mrhToggleActivationAllowIncrease: result:=cbFreezedirection.Items[1];
|
|
mrhToggleActivationAllowDecrease: result:=cbFreezedirection.Items[2];
|
|
mrhActivate: result:=cbFreezedirection.items[3];
|
|
mrhDeactivate: result:=cbFreezedirection.items[4];
|
|
mrhSetValue: result:=cbFreezedirection.Items[5];
|
|
mrhDecreaseValue: result:=cbFreezedirection.Items[6];
|
|
mrhIncreaseValue: result:=cbFreezedirection.Items[7];
|
|
end;
|
|
|
|
end;
|
|
end;
|
|
|
|
procedure THotkeyform.SetMemrec(x: TMemoryRecord);
|
|
var i: integer;
|
|
li: TListItem;
|
|
hk: TMemoryRecordHotkey;
|
|
begin
|
|
if x<>nil then
|
|
begin
|
|
if x.VarType=vtAutoAssembler then
|
|
begin
|
|
cbFreezedirection.Clear;
|
|
cbFreezedirection.Items.add(rsToggleScript);
|
|
cbFreezedirection.items.add(rsEnableScript);
|
|
cbFreezedirection.items.add(rsDisableScript);
|
|
cbFreezedirection.ItemIndex:=0;
|
|
edtFreezeValue.enabled:=false;
|
|
end;
|
|
|
|
listview1.clear;
|
|
fmemrec:=x;
|
|
|
|
caption:=caption+' : '+memrec.Description;
|
|
|
|
for i:=0 to memrec.HotkeyCount-1 do
|
|
begin
|
|
hk:=memrec.Hotkey[i];
|
|
|
|
begin
|
|
li:=listview1.Items.Add;
|
|
|
|
|
|
li.caption:=ConvertKeyComboToString(hk.keys);
|
|
li.SubItems.Add(HotkeyActionToText(hk.action));
|
|
li.SubItems.Add(hk.value);
|
|
li.SubItems.Add(hk.description);
|
|
|
|
lblid.caption:=inttostr(hk.id);
|
|
|
|
li.checked:=hk.Active;
|
|
|
|
li.Data:=hk;
|
|
end;
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
procedure THotKeyForm.btnCreateHotkeyClick(Sender: TObject);
|
|
var li: TListitem;
|
|
i: integer;
|
|
begin
|
|
for i:=0 to length(keys)-1 do
|
|
keys[i]:=0;
|
|
|
|
pagecontrol1.ActivePage:=tabsheet2;
|
|
li:=listview1.items.add;
|
|
li.Checked:=true;
|
|
li.SubItems.add(''); //on hotkey
|
|
li.SubItems.add(''); //value
|
|
li.SubItems.add(''); //description
|
|
li.Data:=nil;
|
|
li.selected:=true;
|
|
|
|
edtHotkey.text:='';
|
|
cbFreezedirection.ItemIndex:=0;
|
|
edtFreezeValue.text:='';
|
|
|
|
editHotkey:=true;
|
|
listview1.Enabled:=false;
|
|
|
|
if visible then
|
|
edtHotkey.SetFocus;
|
|
|
|
cbFreezedirectionSelect(cbFreezedirection);
|
|
|
|
cbActivateSound.itemindex:=-1;
|
|
cbActivateSoundChange(cbActivateSound);
|
|
cbDeactivateSound.itemindex:=-1;
|
|
cbDeactivateSoundChange(cbDeactivateSound);
|
|
end;
|
|
|
|
|
|
procedure THotKeyForm.btnEditHotkeyClick(Sender: TObject);
|
|
var
|
|
s: TListitem;
|
|
i: integer;
|
|
hk: TMemoryRecordHotkey;
|
|
begin
|
|
s:=listview1.selected;
|
|
|
|
if s=nil then
|
|
begin
|
|
i:=listview1.itemindex;
|
|
if i=-1 then exit;
|
|
|
|
s:=listview1.items[i];
|
|
end;
|
|
|
|
if s=nil then exit;
|
|
|
|
pagecontrol1.ActivePage:=tabsheet2;
|
|
listview1.Enabled:=false;
|
|
|
|
keys:=TMemoryRecordHotkey(listview1.selected.data).keys;
|
|
edtHotkey.text:=ConvertKeyComboToString(keys);
|
|
|
|
cbFreezedirection.ItemIndex:=cbFreezedirection.Items.IndexOf(listview1.selected.SubItems[0]);
|
|
edtFreezeValue.text:=listview1.selected.subitems[1];
|
|
edtDescription.text:=listview1.selected.subitems[2];
|
|
|
|
if visible then
|
|
edtHotkey.SetFocus;
|
|
|
|
editHotkey:=true;
|
|
|
|
hk:=TMemoryRecordHotkey(listview1.Selected.data);
|
|
|
|
if hk.ActivateSoundFlag=hksPlaySound then
|
|
cbActivateSound.ItemIndex:=cbActivateSound.Items.IndexOf(hk.activateSound)
|
|
else
|
|
begin
|
|
cbActivateSound.ItemIndex:=cbActivateSound.items.count-1;
|
|
cbForceEnglishActivate.checked:=hk.ActivateSoundFlag=hksSpeakTextEnglish;
|
|
edtActivateText.Text:=hk.activateSound;
|
|
end;
|
|
|
|
if hk.DeactivateSoundFlag=hksPlaySound then
|
|
cbDeactivateSound.ItemIndex:=cbDeactivateSound.Items.IndexOf(hk.deactivateSound)
|
|
else
|
|
begin
|
|
cbDeactivateSound.ItemIndex:=cbActivateSound.items.count-1;
|
|
cbForceEnglishDeactivate.checked:=hk.DeactivateSoundFlag=hksSpeakTextEnglish;
|
|
edtDeactivateText.Text:=hk.deactivateSound;
|
|
end;
|
|
|
|
|
|
cbActivateSoundChange(cbActivateSound);
|
|
cbDeactivateSoundChange(cbDeactivateSound);
|
|
|
|
cbFreezedirection.OnSelect(cbFreezedirection);
|
|
|
|
cbOnlyWhileDown.checked:=hk.OnlyWhileDown;
|
|
end;
|
|
|
|
procedure THotKeyForm.btnApplyClick(Sender: TObject);
|
|
var hk: TMemoryRecordHotkey;
|
|
begin
|
|
if editHotkey and (listview1.Selected.data<>nil) then
|
|
begin
|
|
hk:=TMemoryRecordHotkey(listview1.Selected.data);
|
|
hk.keys:=keys;
|
|
hk.action:=getHotkeyAction;
|
|
hk.value:=edtFreezeValue.text;
|
|
hk.fdescription:=edtDescription.text;
|
|
hk.fOnlyWhileDown:=cbOnlyWhileDown.checked;
|
|
hk.registerkeys;
|
|
end
|
|
else
|
|
hk:=memrec.Addhotkey(keys, getHotkeyAction, edtFreezeValue.text, edtDescription.text, cbOnlyWhileDown.checked );
|
|
|
|
|
|
|
|
if cbActivateSound.ItemIndex=cbActivateSound.items.count-1 then
|
|
begin
|
|
if cbForceEnglishActivate.Checked then
|
|
hk.ActivateSoundFlag:=hksSpeakTextEnglish
|
|
else
|
|
hk.ActivateSoundFlag:=hksSpeakText;
|
|
|
|
hk.activateSound:=edtActivateText.Text;
|
|
end
|
|
else
|
|
begin
|
|
hk.ActivateSoundFlag:=hksPlaySound;
|
|
hk.activateSound:=cbActivateSound.Text;
|
|
end;
|
|
|
|
if cbDeactivateSound.ItemIndex=cbDeactivateSound.items.count-1 then
|
|
begin
|
|
if cbForceEnglishDeactivate.Checked then
|
|
hk.DeactivateSoundFlag:=hksSpeakTextEnglish
|
|
else
|
|
hk.DeactivateSoundFlag:=hksSpeakText;
|
|
|
|
hk.deactivatesound:=edtDeactivateText.Text;
|
|
end
|
|
else
|
|
begin
|
|
hk.DeactivateSoundFlag:=hksPlaySound;
|
|
hk.deactivatesound:=cbDeactivateSound.Text;
|
|
end;
|
|
|
|
listview1.selected.Caption:=edtHotkey.Text;
|
|
listview1.Selected.SubItems[0]:=cbFreezedirection.Text;
|
|
listview1.selected.subitems[1]:=edtFreezeValue.text;
|
|
listview1.selected.subitems[2]:=edtDescription.text;
|
|
listview1.Selected.data:=hk;
|
|
|
|
pagecontrol1.ActivePage:=tabsheet1;
|
|
listview1.Enabled:=true;
|
|
|
|
edithotkey:=false;
|
|
end;
|
|
|
|
procedure THotKeyForm.btnCancelClick(Sender: TObject);
|
|
begin
|
|
editHotkey:=false;
|
|
if (listview1.Selected<>nil) and (listview1.selected.data=nil) then //created hotkey
|
|
listview1.selected.delete;
|
|
|
|
pagecontrol1.ActivePage:=tabsheet1;
|
|
listview1.Enabled:=true;
|
|
end;
|
|
|
|
procedure THotKeyForm.btnOKClick(Sender: TObject);
|
|
begin
|
|
if edithotkey then
|
|
btnApply.click;
|
|
|
|
close;
|
|
end;
|
|
|
|
procedure THotKeyForm.Button2Click(Sender: TObject);
|
|
begin
|
|
zeromemory(@keys,sizeof(TKeyCombo));
|
|
edtHotkey.Text:=ConvertKeyComboToString(keys);
|
|
edtHotkey.SetFocus;
|
|
end;
|
|
|
|
procedure THotKeyForm.cbActivateSoundChange(Sender: TObject);
|
|
begin
|
|
edtActivateText.visible:=cbActivateSound.ItemIndex=cbActivateSound.Items.Count-1;
|
|
cbForceEnglishActivate.visible:=edtActivateText.visible;
|
|
end;
|
|
|
|
procedure THotKeyForm.cbDeactivateSoundChange(Sender: TObject);
|
|
begin
|
|
edtDeactivateText.visible:=cbDeactivateSound.ItemIndex=cbDeactivateSound.Items.Count-1;
|
|
cbForceEnglishDeactivate.visible:=edtDeactivateText.Visible;
|
|
end;
|
|
|
|
procedure THotKeyForm.cbForceEnglishActivateChange(Sender: TObject);
|
|
begin
|
|
|
|
end;
|
|
|
|
procedure THotKeyForm.cbFreezedirectionSelect(Sender: TObject);
|
|
var
|
|
onpossible: boolean;
|
|
offpossible: boolean;
|
|
|
|
begin
|
|
edtFreezeValue.enabled:=(memrec.VarType<>vtAutoAssembler) and (cbFreezeDirection.itemindex >=5); //set value, increase by and decrease by
|
|
|
|
if (memrec.VarType=vtAutoAssembler) then
|
|
begin
|
|
onpossible:=cbFreezeDirection.itemindex in [0,1];
|
|
offpossible:=cbFreezeDirection.itemindex in [0,2];
|
|
|
|
if onpossible then
|
|
begin
|
|
cbOnlyWhileDown.Caption:=rsDeactivateOnRelease;
|
|
cbOnlyWhileDown.visible:=true;
|
|
end
|
|
else
|
|
cbOnlyWhileDown.visible:=false;
|
|
end
|
|
else
|
|
begin
|
|
onpossible:=cbFreezeDirection.itemindex in [0,1,2,3,5,6,7];
|
|
offpossible:=cbFreezeDirection.itemindex in [0,1,2,4];
|
|
|
|
if cbFreezeDirection.itemindex in [0,1,2,3,5] then
|
|
begin
|
|
case cbFreezeDirection.itemindex of
|
|
0, 1, 2, 3: cbOnlyWhileDown.Caption:=rsDeactivateOnRelease;
|
|
5: cbOnlyWhileDown.Caption:=rsRestoreToOriginalOnRelease;
|
|
end;
|
|
cbOnlyWhileDown.visible:=true;
|
|
end
|
|
else
|
|
cbOnlyWhileDown.visible:=false;
|
|
end;
|
|
|
|
lblActivateSound.enabled:=onpossible;
|
|
cbActivateSound.enabled:=onpossible;
|
|
sbPlayActivate.enabled:=onpossible;
|
|
|
|
lblDeactivateSound.enabled:=offpossible;
|
|
cbDeactivateSound.enabled:=offpossible;
|
|
sbPlayDeactivate.enabled:=offpossible;
|
|
|
|
|
|
|
|
end;
|
|
|
|
procedure THotKeyForm.cbPlaySoundChange(Sender: TObject);
|
|
begin
|
|
cbFreezedirectionSelect(cbFreezedirection);
|
|
end;
|
|
|
|
function isModifier(k: word): boolean;
|
|
begin
|
|
result:=false;
|
|
case k of
|
|
vk_lwin, vk_rwin, vk_shift,vk_lshift,
|
|
vk_rshift, VK_CAPITAL, VK_MENU, vk_LMENU,
|
|
vk_RMENU, VK_CONTROL, VK_LCONTROL, VK_RCONTROL:
|
|
result:=true;
|
|
|
|
end;
|
|
end;
|
|
|
|
procedure THotKeyForm.edtHotkeyKeyDown(Sender: TObject; var Key: Word;
|
|
Shift: TShiftState);
|
|
var
|
|
i: integer;
|
|
begin
|
|
{$ifdef darwin}
|
|
|
|
if not isModifier(key) then
|
|
begin
|
|
//there can be only one non-modifier
|
|
for i:=0 to 4 do
|
|
begin
|
|
if keys[i]=0 then break;
|
|
|
|
if not isModifier(keys[i]) then
|
|
begin
|
|
key:=0; //do not add
|
|
break;
|
|
end;
|
|
end;
|
|
end;
|
|
{$endif}
|
|
|
|
|
|
|
|
if keys[4]=0 then
|
|
begin
|
|
for i:=0 to 4 do
|
|
if keys[i]=0 then
|
|
begin
|
|
keys[i]:=key;
|
|
break;
|
|
end else
|
|
if keys[i]=key then break;
|
|
end;
|
|
|
|
edtHotkey.Text:=ConvertKeyComboToString(keys);
|
|
|
|
key:=0;
|
|
end;
|
|
|
|
procedure THotKeyForm.edtHotkeyMouseDown(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
var key: word;
|
|
begin
|
|
key:=0;
|
|
case button of
|
|
mbMiddle: key:=VK_MBUTTON;
|
|
mbExtra1: key:=VK_XBUTTON1;
|
|
mbExtra2: key:=VK_XBUTTON2;
|
|
end;
|
|
|
|
if key<>0 then
|
|
edtHotkeyKeyDown(edtHotkey, key, shift);
|
|
end;
|
|
|
|
procedure THotKeyForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
|
|
begin
|
|
fmemrec.endEdit;
|
|
CloseAction:=caFree;
|
|
end;
|
|
|
|
|
|
|
|
procedure THotKeyForm.FormCreate(Sender: TObject);
|
|
var lblLimiteHotkeySupport: tlabel;
|
|
begin
|
|
{$ifdef darwin}
|
|
if loadMacHotkeyFunctions=false then
|
|
begin
|
|
lblLimiteHotkeySupport:=tlabel.create(self);
|
|
lblLimiteHotkeySupport.caption:='Limited hotkey support. No character keys supported';
|
|
lblLimiteHotkeySupport.font.color:=clRed;
|
|
lblLimiteHotkeySupport.align:=alBottom;
|
|
lblLimiteHotkeySupport.parent:=self;
|
|
end;
|
|
{$endif}
|
|
|
|
|
|
edtActivateText.Hint:=rsTextToSpeechHint; //make it easier for translators
|
|
edtDeactivateText.Hint:=edtActivateText.Hint;
|
|
|
|
edtActivateText.Text:=format(rsDefaultActivated, ['{MRDescription}']);
|
|
edtDeactivateText.Text:=format(rsDefaultDeactivated, ['{MRDescription}']);
|
|
|
|
edtActivateText.ShowHint:=true;
|
|
edtDeactivateText.ShowHint:=true;
|
|
|
|
|
|
pagecontrol1.ActivePage:=tabsheet1;
|
|
|
|
|
|
with cbFreezedirection.Items do
|
|
begin
|
|
clear;
|
|
add(rsToggleFreeze);
|
|
add(rsToggleFreezeAndAllowIncrease);
|
|
add(rsToggleFreezeAndAllowDecrease);
|
|
add(rsFreeze);
|
|
add(rsUnfreeze);
|
|
add(rsSetValueTo);
|
|
add(rsDecreaseValueWith);
|
|
add(rsIncreaseValueWith);
|
|
end;
|
|
|
|
cbFreezedirection.itemindex:=0;
|
|
|
|
|
|
cbActivateSound.Items.Clear;
|
|
cbDeactivateSound.Items.Clear;
|
|
|
|
cbActivateSound.Items.add('');
|
|
cbDeactivateSound.Items.add('');
|
|
|
|
{$ifdef windows}
|
|
FillSoundList(cbActivateSound.Items);
|
|
FillSoundList(cbDeactivateSound.Items);
|
|
|
|
|
|
cbActivateSound.Items.Add(rsSpeakText);
|
|
cbDeactivateSound.Items.Add(rsSpeakText);
|
|
{$else}
|
|
cbActivateSound.Enabled:=false;
|
|
cbDeactivateSound.Enabled:=false;
|
|
sbPlayActivate.enabled:=false;
|
|
sbPlayDeactivate.enabled:=false;
|
|
{$endif}
|
|
end;
|
|
|
|
procedure THotKeyForm.FormShortCut(var Msg: TLMKey; var Handled: Boolean);
|
|
begin
|
|
if (pagecontrol1.ActivePage<>tabsheet2) and (Msg.CharCode=VK_ESCAPE) then
|
|
begin
|
|
handled:=true;
|
|
close;
|
|
end;
|
|
end;
|
|
|
|
procedure THotKeyForm.FormShow(Sender: TObject);
|
|
var
|
|
i, maxwidth: integer;
|
|
s: string;
|
|
{$ifdef windows}
|
|
cbi: TComboboxInfo;
|
|
{$endif}
|
|
begin
|
|
PageControl1.PageIndex:=1;
|
|
|
|
cbActivateSound.Top:=edtHotkey.Top;
|
|
|
|
AdjustSpeedButtonSize(sbPlayActivate);
|
|
AdjustSpeedButtonSize(sbPlayDeactivate);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
maxwidth:=0;
|
|
for i:=0 to cbFreezedirection.Items.Count-1 do
|
|
begin
|
|
s:=cbFreezedirection.Items[i];
|
|
maxwidth:=max(maxwidth, Canvas.TextWidth(s));
|
|
end;
|
|
|
|
{$ifdef windows}
|
|
cbi.cbSize:=sizeof(cbi);
|
|
if GetComboBoxInfo(cbFreezedirection.Handle, @cbi) then
|
|
begin
|
|
i:=maxwidth-(cbi.rcItem.Right-cbi.rcItem.Left)+4;
|
|
|
|
cbFreezedirection.width:=cbFreezedirection.width+i;
|
|
end
|
|
else
|
|
{$endif}
|
|
cbFreezedirection.width:=maxwidth+16;
|
|
|
|
maxwidth:=0;
|
|
for i:=0 to cbActivateSound.Items.Count-1 do
|
|
begin
|
|
s:=cbActivateSound.Items[i];
|
|
maxwidth:=max(maxwidth, Canvas.TextWidth(s));
|
|
end;
|
|
|
|
maxwidth:=max(maxwidth, canvas.TextWidth(edtActivateText.Text));
|
|
|
|
|
|
{$ifdef windows}
|
|
cbi.cbSize:=sizeof(cbi);
|
|
if GetComboBoxInfo(cbActivateSound.Handle, @cbi) then
|
|
begin
|
|
i:=maxwidth-(cbi.rcItem.Right-cbi.rcItem.Left)+4;
|
|
|
|
cbActivateSound.width:=cbActivateSound.width+i;
|
|
end
|
|
else
|
|
{$endif}
|
|
cbActivateSound.width:=maxwidth+16;
|
|
|
|
if cbFreezedirection.width>edtHotkey.Width then
|
|
edtHotkey.Width:=cbFreezedirection.width;
|
|
|
|
constraints.MinWidth:=width;
|
|
Constraints.MinHeight:=height; //panel2.height+panel1.Height+3*edtDescription.Height;
|
|
|
|
cbActivateSoundChange(cbActivateSound);
|
|
cbDeactivateSoundChange(cbDeactivateSound);
|
|
|
|
|
|
PageControl1.PageIndex:=0;
|
|
// autosize:=false;
|
|
|
|
if editHotkey then
|
|
begin
|
|
PageControl1.PageIndex:=1;
|
|
edtHotkey.SetFocus;
|
|
end;
|
|
|
|
|
|
// panel1.Constraints.MinHeight:=btnCancel.Top+btnCancel.Height+2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end;
|
|
|
|
procedure THotKeyForm.ListView1DblClick(Sender: TObject);
|
|
begin
|
|
if btnEditHotkey.enabled then
|
|
btnEditHotkey.click;
|
|
end;
|
|
|
|
procedure THotKeyForm.ListView1ItemChecked(Sender: TObject; Item: TListItem);
|
|
var hk: TMemoryRecordHotkey;
|
|
begin
|
|
hk:=TMemoryRecordHotkey(item.data);
|
|
if hk<>nil then
|
|
hk.active:=item.checked;
|
|
end;
|
|
|
|
procedure THotKeyForm.ListView1SelectItem(Sender: TObject; Item: TListItem;
|
|
Selected: Boolean);
|
|
begin
|
|
btnEditHotkey.enabled:=selected;
|
|
|
|
|
|
if (listview1.selected<>nil) and (listview1.selected.data<>nil) then
|
|
lblid.caption:=Format(rsHotkeyID, [inttostr(TMemoryRecordHotkey(listview1.selected.data).id)])
|
|
else
|
|
lblid.caption:='';
|
|
end;
|
|
|
|
procedure THotKeyForm.miAddSoundClick(Sender: TObject);
|
|
var
|
|
i: integer;
|
|
s: tmemorystream;
|
|
lf: TLuafile;
|
|
|
|
oldactivate, olddeactivate: string;
|
|
begin
|
|
odwave.InitialDir:=GetCEdir;
|
|
if odwave.execute then
|
|
begin
|
|
for i:=0 to odwave.Files.Count-1 do
|
|
begin
|
|
s := TMemorystream.Create;
|
|
try
|
|
s.LoadFromFile(odwave.files[i]);
|
|
lf := TLuaFile.Create(extractfilename(odwave.files[i]), s);
|
|
|
|
MainForm.LuaFiles.Add(lf);
|
|
finally
|
|
s.free;
|
|
end;
|
|
end;
|
|
|
|
oldactivate:=cbActivateSound.text;
|
|
olddeactivate:=cbDeactivateSound.Text;
|
|
|
|
{$ifdef windows}
|
|
FillSoundList(cbActivateSound.Items);
|
|
FillSoundList(cbDeactivateSound.Items);
|
|
{$endif}
|
|
|
|
cbActivateSound.Items.Add(rsSpeakText);
|
|
cbDeactivateSound.Items.Add(rsSpeakText);
|
|
|
|
cbActivateSound.Itemindex:=cbActivateSound.Items.IndexOf(oldactivate);
|
|
cbDeactivateSound.Itemindex:=cbActivateSound.Items.IndexOf(olddeactivate);
|
|
end;
|
|
end;
|
|
|
|
procedure THotKeyForm.miDeleteClick(Sender: TObject);
|
|
var hk: TMemoryRecordHotkey;
|
|
begin
|
|
if listview1.enabled and (listview1.Selected<>nil) then
|
|
begin
|
|
hk:=TMemoryRecordHotkey(listview1.selected.data);
|
|
hk.free;
|
|
|
|
listview1.selected.delete;
|
|
end;
|
|
end;
|
|
|
|
procedure THotKeyForm.Panel2Resize(Sender: TObject);
|
|
begin
|
|
|
|
end;
|
|
|
|
procedure THotKeyForm.pmHotkeylistPopup(Sender: TObject);
|
|
begin
|
|
midelete.visible:=listview1.enabled and (listview1.Selected<>nil);
|
|
end;
|
|
|
|
procedure THotKeyForm.SpeakText(s:string; forceEnglish: boolean=false);
|
|
begin
|
|
s:=StringReplace(s,'{MRDescription}', memrec.Description,[rfIgnoreCase, rfReplaceAll]);
|
|
s:=StringReplace(s,'{Description}', edtDescription.Text, [rfIgnoreCase, rfReplaceAll]);
|
|
|
|
if forceEnglish then
|
|
LUA_DoScript('speakEnglish([['+s+']])')
|
|
else
|
|
LUA_DoScript('speak([['+s+']])');
|
|
end;
|
|
|
|
procedure THotKeyForm.sbPlayActivateClick(Sender: TObject);
|
|
begin
|
|
if cbActivateSound.ItemIndex=cbActivateSound.Items.Count-1 then
|
|
SpeakText(edtActivateText.text, cbForceEnglishActivate.Checked)
|
|
else
|
|
LUA_DoScript('playSound(findTableFile([['+cbActivateSound.Text+']]))');
|
|
end;
|
|
|
|
procedure THotKeyForm.sbPlayDeactivateClick(Sender: TObject);
|
|
begin
|
|
if cbDeactivateSound.ItemIndex=cbDeactivateSound.Items.Count-1 then
|
|
SpeakText(edtDeactivateText.text, cbForceEnglishDeactivate.Checked)
|
|
else
|
|
LUA_DoScript('playSound(findTableFile([['+cbDeactivateSound.Text+']]))');
|
|
end;
|
|
|
|
initialization
|
|
{$i HotKeys.lrs}
|
|
|
|
end.
|