代码拉取完成,页面将自动刷新
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;
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;
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 FormShow(Sender: TObject);
procedure ListView1DblClick(Sender: TObject);
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;
public
{ Public declarations }
property memrec: TMemoryRecord read fmemrec write SetMemrec;
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';
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;
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.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.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);
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.registerkeys;
end
else
hk:=memrec.Addhotkey(keys, getHotkeyAction, edtFreezeValue.text, edtDescription.text );
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];
end
else
begin
onpossible:=cbFreezeDirection.itemindex in [0,1,2,3,5,6,7];
offpossible:=cbFreezeDirection.itemindex in [0,1,2,4];
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.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.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.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。