1
0
mirror of https://github.com/moparisthebest/Simba synced 2024-11-25 02:32:19 -05:00

Added settings to the extensions.. Should work allright, however there is some bug in Pascalscript that makes it fail, for now..

Renamed all the setting methods..
This commit is contained in:
Raymond 2010-04-01 00:22:46 +02:00
parent bd27789eb2
commit 001a593789
11 changed files with 318 additions and 167 deletions

View File

@ -12,6 +12,7 @@ end;
procedure Attach;
begin;
Settings.SetKeyValue('TestSetting','1337');
Writeln('Your extension has been enabled, do stuff here');
end;

View File

@ -28,7 +28,7 @@ type
StartDisabled : boolean;
property OnChange : TNotifyEvent read FOnChange write SetOnchange;
function GetExtensionIndex(Filename : string) : integer;
function LoadPSExtension(Filename : string) : boolean;
function LoadPSExtension(Filename : string; enabled : boolean=false) : boolean;
function LoadPSExtensionsDir(Directory,ext : string) : boolean;
function HandleHook(HookName: String; Args: Array of Variant): Variant;
end;
@ -38,7 +38,7 @@ var
implementation
uses
TestUnit;
TestUnit, settingssandbox,simbasettings;
procedure TExtensionManager.SetOnchange(const AValue: TNotifyEvent);
var
@ -76,7 +76,7 @@ begin
result := -1;
end;
function TExtensionManager.LoadPSExtension(Filename: string): boolean;
function TExtensionManager.LoadPSExtension(Filename: string; enabled: boolean): boolean;
var
Ext : TExtension;
begin
@ -84,12 +84,17 @@ begin
exit(true);
Result := False;
try
Ext := TSimbaPSExtension.Create(filename,startdisabled);
result := TSimbaPSExtension(ext).Working;
Ext := TSimbaPSExtension.Create(filename,True);
// result := TSimbaPSExtension(ext).Working;
Extensions.Add(ext);
ext.Settings := TMMLSettingsSandbox.Create(SettingsForm.Settings);
ext.Settings.Prefix := format('Extensions/Extension%d/Settings/',[Extensions.Count - 1]);
if enabled then
ext.Enabled := true;
ext.OnChange:= FOnChange;
if assigned(FOnChange) then
FOnChange(Self);
Result := True;
except
on e : exception do
formWritelnex(format('Error in LoadPSExtension(%s): %s',[FileName, e.message]));
@ -98,22 +103,22 @@ end;
function GetFiles(Path, Ext: string): TstringArray;
var
SearchRec : TSearchRec;
c : integer;
SearchRec : TSearchRec;
c : integer;
begin
c := 0;
if FindFirst(Path + '*.' + ext, faAnyFile, SearchRec) = 0 then
begin
repeat
inc(c);
SetLength(Result,c);
Result[c-1] := SearchRec.Name;
until FindNext(SearchRec) <> 0;
SysUtils.FindClose(SearchRec);
end;
c := 0;
if FindFirst(Path + '*.' + ext, faAnyFile, SearchRec) = 0 then
begin
repeat
inc(c);
SetLength(Result,c);
Result[c-1] := SearchRec.Name;
until FindNext(SearchRec) <> 0;
SysUtils.FindClose(SearchRec);
end;
end;
function TExtensionManager.LoadPSExtensionsDir(Directory,ext: string): boolean;
function TExtensionManager.LoadPSExtensionsDir(Directory, ext: string): boolean;
var
Files : TstringArray;
i : integer;
@ -127,7 +132,7 @@ begin
Directory := IncludeTrailingPathDelimiter(directory);
Files := GetFiles(Directory,ext);
for i := 0 to high(Files) do
result := result or LoadPSExtension(Directory + files[i]);
result := LoadPSExtension(Directory + files[i],not StartDisabled) or result;
FOnChange := Tempevent;
if Assigned(FOnChange) then
FOnChange(self);

View File

@ -27,6 +27,8 @@ type
function FreeScript: boolean;
function InitScript: Boolean;
procedure OutputMessages;
procedure SIRegister_Settings(Cl: TPSPascalCompiler);
procedure RIRegister_Settings(Cl: TPSRuntimeClassImporter);
public
function HookExists(HookName: String): Boolean;override;
@ -47,7 +49,7 @@ uses
uPSC_extctrls,uPSC_menus, //Compile libs
uPSR_std, uPSR_controls,uPSR_classes,uPSR_graphics,uPSR_stdctrls,uPSR_forms,
uPSR_extctrls,uPSR_menus, //Runtime-libs
testunit//Writeln
testunit,updateform,settingssandbox//Writeln
;
function TSimbaPSExtension.HookExists(HookName: String): Boolean;
@ -110,10 +112,13 @@ begin
result := ExecuteHook('Free',[],bla) = SExt_ok;
end;
{$I ../../Units/MMLAddon/PSInc/Wrappers/extensions.inc}
procedure TSimbaPSExtension.RegisterMyMethods(Sender: TPSScript);
begin
Sender.AddFunction(@formWritelnEx,'procedure Writeln(s : string)');
Sender.AddFunction(@ext_GetPage,'function GetPage(url : string) : string');
Sender.AddRegisteredPTRVariable('Settings','TMMLSettingsSandbox');
Sender.AddRegisteredVariable('Simba','TForm');
Sender.AddRegisteredVariable('Simba_MainMenu','TMainMenu');
end;
@ -122,6 +127,7 @@ procedure TSimbaPSExtension.OnPSExecute(Sender: TPSScript);
begin
Sender.SetVarToInstance('simba',Form1);
Sender.SetVarToInstance('Simba_MainMenu',Form1.MainMenu);
Sender.SetPointerToData('Settings',@Self.Settings,Sender.FindNamedType('TMMLSettingsSandbox'));
end;
procedure TSimbaPSExtension.SetEnabled(bool: boolean);
@ -148,6 +154,41 @@ begin
inherited SetEnabled(bool);
end;
procedure TSimbaPSExtension.SIRegister_Settings(Cl: TPSPascalCompiler);
begin
with cl.AddClassN(nil,'TMMLSettingsSandbox') do
begin;
RegisterMethod('function IsKey(KeyName: String): Boolean;');
RegisterMethod('function IsDirectory(KeyName: String): Boolean;');
RegisterMethod('function SetKeyValue(Keyname : string; Value : string) : boolean;');
RegisterMethod('function GetKeyValue(KeyName: String): String;');
RegisterMethod('function GetKeyValueDef(KeyName, defVal: String): String;');
RegisterMethod('function ListKeys(KeyName: String): TStringArray;');
RegisterMethod('function DeleteKey(KeyName: String): Boolean;');
RegisterMethod('function DeleteSubKeys(KeyName: String): Boolean;');
RegisterProperty('Prefix','String',iptR);
end;
end;
procedure SettingsPrefix(self : TMMLSettingsSandbox; var Prefix : String);
begin; Prefix := self.Prefix; end;
procedure TSimbaPSExtension.RIRegister_Settings(Cl: TPSRuntimeClassImporter);
begin
with cl.Add(TMMLSettingsSandbox) do
begin
RegisterMethod(@TMMLSettingsSandbox.IsKey,'ISKEY');
RegisterMethod(@TMMLSettingsSandbox.IsDirectory,'ISDIRECTORY');
RegisterMethod(@TMMLSettingsSandbox.SetKeyValue,'SETKEYVALUE');
RegisterMethod(@TMMLSettingsSandbox.GetKeyValue,'GETKEYVALUE');
RegisterMethod(@TMMLSettingsSandbox.GetKeyValueDef,'GETKEYVALUEDEF');
RegisterMethod(@TMMLSettingsSandbox.ListKeys,'LISTKEYS');
RegisterMethod(@TMMLSettingsSandbox.DeleteKey,'DELETEKEY');
RegisterMethod(@TMMLSettingsSandbox.DeleteSubKeys,'DELETESUBKEYS');
RegisterPropertyHelper(@SettingsPrefix,nil,'Prefix');
end;
end;
procedure TSimbaPSExtension.RegisterPSCComponents(Sender: TObject; x: TPSPascalCompiler);
begin
SIRegister_Std(x);
@ -158,6 +199,7 @@ begin
SIRegister_Forms(x);
SIRegister_ExtCtrls(x);
SIRegister_Menus(x);
SIRegister_Settings(x);
end;
procedure TSimbaPSExtension.RegisterPSRComponents(Sender: TObject; se: TPSExec; x: TPSRuntimeClassImporter);
@ -170,6 +212,7 @@ begin
RIRegister_Forms(x);
RIRegister_ExtCtrls(x);
RIRegister_Menus(x);
RIRegister_Settings(x);
end;
destructor TSimbaPSExtension.Destroy;
@ -224,6 +267,5 @@ begin
end;
end.

View File

@ -337,7 +337,8 @@ type
procedure SetScriptState(const State: TScriptState);
function LoadSettingDef(Key : string; Def : string) : string;
function CreateSetting(Key : string; Value : string) : string;
procedure SetSetting(key : string; Value : string);
procedure SetSetting(key : string; Value : string; save : boolean = false);
function SettingExtists(key : string) : boolean;
procedure FontUpdate;
public
DebugStream: String;
@ -1004,6 +1005,7 @@ begin
{Creates the paths and returns the path}
PluginsPath := CreateSetting('Settings/Plugins/Path', ExpandFileName(MainDir+ DS+ 'Plugins' + DS));
extensionsPath := CreateSetting('Settings/Extensions/Path',ExpandFileName(MainDir +DS + 'Extensions' + DS));
CreateSetting('Extensions/ExtensionCount','0');
CreateSetting('LastConfig/MainForm/Position','');
CreateSetting('LastConfig/MainForm/State','Normal');
{$ifdef MSWindows}
@ -1025,6 +1027,41 @@ begin
end;
procedure TForm1.LoadFormSettings;
var
extCount : integer;
function LoadExtension(Number : integer) : boolean;
var
Path : string;
ExtPath : string;
ExtEnabled : boolean;
begin;
result := false;
if (number < 0) or (number >= extCount) then
exit;
path := 'Extensions/Extension' + inttostr(number);
if SettingExtists(Path) = false then
exit;
ExtPath := LoadSettingDef(Path + '/Path','');
if ExtPath = '' then
exit;
ExtEnabled := StrToBoolDef(LoadSettingDef(Path + '/Enabled','false'),false);
if ExtManager.LoadPSExtension(ExtPath,ExtEnabled) = false then
exit;
Result := true;
end;
procedure DeleteExtension(number : integer);
var
i : integer;
path : string;
begin;
path := 'Extensions/Extension';
SettingsForm.Settings.DeleteKey(path + inttostr(number));
for i := number + 1 to extCount - 1 do
SettingsForm.Settings.RenameKey(path + inttostr(i),'Extension' + inttostr(i-1));
SetSetting('Extensions/ExtensionCount',inttostr(extCount - 1),true);
dec(extCount);
end;
var
str,str2 : string;
Data : TStringArray;
@ -1068,65 +1105,58 @@ begin
else
ShowConsole(false);
{$endif}
extCount := StrToIntDef(LoadSettingDef('Extensions/ExtensionCount/','0'),0);
for i := 0 to extCount - 1 do
while (i < extCount) and not LoadExtension(i) do
DeleteExtension(i);
SetSetting('Extensions/ExtensionCount',inttostr(extCount));
str := LoadSettingDef('Settings/Extensions/Path',ExpandFileName(MainDir +DS + 'Extensions' + DS));
str2 := LoadSettingDef('Settings/Extensions/FileExtension','sex');
ExtManager.LoadPSExtensionsDir(str,str2);
str := LoadSettingDef('LastConfig/Extensions/EnabledExts','');
if str <> '' then
begin
data := Explode(';',str);
for i := 0 to high(data) do
for ii := 0 to ExtManager.Extensions.Count - 1 do
if data[i] = TVirtualSimbaExtension(ExtManager.Extensions[ii]).Filename then
TVirtualSimbaExtension(ExtManager.Extensions[ii]).Enabled := true;
end;
end;
procedure TForm1.SaveFormSettings;
var
Data : TStringArray;
path : string;
i : integer;
begin
with SettingsForm.Settings do
begin
if Self.WindowState = wsMaximized then
SetKeyValue('LastConfig/MainForm/State','maximized')
SetSetting('LastConfig/MainForm/State','maximized')
else
begin; //Only save the form position if its non maximized.
SetKeyValue('LastConfig/MainForm/State','normal');
SetSetting('LastConfig/MainForm/State','normal');
Data := ConvArr([inttostr(Self.left),inttostr(self.top),inttostr(self.width),inttostr(self.height)]);
SetKeyValue('LastConfig/MainForm/Position', Implode(':',Data ));
SetSetting('LastConfig/MainForm/Position', Implode(':',Data ));
end;
if RecentFiles.Count > 0 then
begin
SetLength(data,RecentFiles.Count);
for i := 0 to high(data) do //First entry should be the last-opened
data[high(data) - i] := RecentFiles[i];
SetKeyValue('LastConfig/MainForm/RecentFiles',implode(';',data));
SetSetting('LastConfig/MainForm/RecentFiles',implode(';',data));
end else
SetKeyValue('LastConfig/MainForm/RecentFiles','');
SetSetting('LastConfig/MainForm/RecentFiles','');
if MenuItemFunctionList.Checked then
SetKeyValue('LastConfig/MainForm/FunctionListShown','True')
SetSetting('LastConfig/MainForm/FunctionListShown','True')
else
SetKeyValue('LastConfig/MainForm/FunctionListShown','False');
SetSetting('LastConfig/MainForm/FunctionListShown','False');
{$ifdef MSWindows}
if ConsoleVisible then
SetKeyValue('LastConfig/Console/Visible','True')
SetSetting('LastConfig/Console/Visible','True')
else
SetKeyValue('LastConfig/Console/Visible','false');
SetSetting('LastConfig/Console/Visible','false');
{$endif}
if ExtManager.Extensions.Count > 0 then
begin
SetLength(data,0);
for i := 0 to ExtManager.Extensions.Count-1 do
if TVirtualSimbaExtension(ExtManager.Extensions[i]).Enabled then
begin
setlength(data,length(data)+1);
data[high(data)] := TVirtualSimbaExtension(ExtManager.Extensions[i]).FileName;
end;
SetKeyValue('LastConfig/Extensions/EnabledExts',Implode(';',data));
end else
SetKeyValue('LastConfig/Extensions/EnabledExts','');
SetSetting('Extensions/ExtensionCount',inttostr(ExtManager.Extensions.Count));
for i := 0 to ExtManager.Extensions.Count-1 do
begin;
path :='Extensions/Extension' + inttostr(I);
SetSetting(Path + '/Path',TVirtualSimbaExtension(ExtManager.Extensions[i]).Filename);
SetSetting(Path + '/Enabled',BoolToStr(TVirtualSimbaExtension(ExtManager.Extensions[i]).Enabled,True));
end;
SaveToXML(SimbaSettingsFile);
end;
end;
@ -1222,7 +1252,7 @@ begin
Thread.Client.MOCR.SetFonts(OCR_Fonts.GetFonts);
Se := TMMLSettingsSandbox.Create(SettingsForm.Settings);
Se.SetPrefix('Scripts/');
Se.Prefix := 'Scripts/';
Thread.SetSettings(Se);
end;
@ -2305,7 +2335,7 @@ end;
procedure TForm1.SetFontPath(const AValue: String);
begin
SetSetting('Settings/Fonts/Path',AValue);
SetSetting('Settings/Fonts/Path',AValue,true);
end;
function TForm1.GetFontPath: String;
@ -2320,7 +2350,7 @@ end;
procedure TForm1.SetIncludePath(const AValue: String);
begin
SetSetting('Settings/Includes/Path',AValue);
SetSetting('Settings/Includes/Path',AValue,true);
end;
procedure TForm1.SetScriptState(const State: TScriptState);
@ -2353,22 +2383,25 @@ end;
function TForm1.LoadSettingDef(Key: string; Def: string): string;
begin
result := SettingsForm.Settings.GetSetLoadSaveDefaultKeyValueIfNotExists(Key,def,SimbaSettingsFile);
result := SettingsForm.Settings.GetKeyValueDefLoad(Key,def,SimbaSettingsFile);
end;
function TForm1.CreateSetting(Key: string; Value: string): string;
begin
result := SettingsForm.Settings.GetSetDefaultKeyValue(Key,value);
result := SettingsForm.Settings.GetKeyValueDef(Key,value);
end;
procedure TForm1.SetSetting(key: string; Value: string);
procedure TForm1.SetSetting(key: string; Value: string; save : boolean);
begin
//Creates the setting if needed
if CreateSetting(key,value) <> value then //The setting already occurs, and has a different value.. Lets change it
begin;
SettingsForm.Settings.SetKeyValue(key,value);
//Creates the setting if needed
SettingsForm.Settings.SetKeyValue(key,value);
if save then
SettingsForm.Settings.SaveToXML(SimbaSettingsFile);
end;
end;
function TForm1.SettingExtists(key: string): boolean;
begin
result :=SettingsForm.Settings.KeyExists(key);
end;
procedure TForm1.FontUpdate;
@ -2401,7 +2434,7 @@ begin
if UnTar(decompressed, FontPath,true) then
begin;
FormWriteln('Succesfully installed the new fonts!');
SetSetting('Settings/Fonts/Version',IntToStr(LatestVersion));
SetSetting('Settings/Fonts/Version',IntToStr(LatestVersion),true);
if Assigned(self.OCR_Fonts) then
self.OCR_Fonts.Free;
Self.OCR_Fonts := TMOCR.Create(nil);

View File

@ -94,7 +94,7 @@ begin
if FontVersionThread = nil then//Create thread (only if no-other one is already running)
begin
FontVersionThread := TDownloadThread.Create(true);
FontVersionThread.InputURL := SettingsForm.Settings.GetSetLoadSaveDefaultKeyValueIfNotExists(
FontVersionThread.InputURL := SettingsForm.Settings.GetKeyValueDefLoad(
'Settings/Fonts/VersionLink',FontURL + 'Version',SimbaSettingsFile);
FontVersionThread.Resume;
while FontVersionThread.Done = false do//Wait till thread is done
@ -123,7 +123,7 @@ begin
begin
SimbaVersionThread := TDownloadThread.Create(true);
SimbaVersionThread.InputURL := SettingsForm.Settings.GetSetLoadSaveDefaultKeyValueIfNotExists(
SimbaVersionThread.InputURL := SettingsForm.Settings.GetKeyValueDefLoad(
'Settings/Updater/RemoteVersionLink',SimbaURL + 'Version',SimbaSettingsFile);
SimbaVersionThread.Resume;
while SimbaVersionThread.Done = false do//Wait till thread is done
@ -214,7 +214,7 @@ begin
FCancelling := False;
FCancelled := False;
Updater.FileURL := SettingsForm.Settings.GetSetLoadSaveDefaultKeyValueIfNotExists(
Updater.FileURL := SettingsForm.Settings.GetKeyValueDefLoad(
'Settings/Updater/RemoteLink',
SimbaURL + 'Simba'{$IFDEF WINDOWS} +'.exe'{$ENDIF},
SimbaSettingsFile

View File

@ -5,7 +5,7 @@ unit virtualextension;
interface
uses
Classes, SysUtils;
Classes, SysUtils,settingssandbox;
type
{ TVirtualSimbaExtension }
@ -16,6 +16,7 @@ type
FVersion : string;
FFilename : string;
FEnabled : boolean;
FSettings : TMMLSettingsSandbox;
procedure SetEnabled(bool : boolean); virtual;
public
OnChange : TNotifyEvent;
@ -27,6 +28,7 @@ type
function GetName : string;
function GetVersion : String;
property Settings : TMMLSettingsSandbox read FSettings write FSettings;
property Filename : string read FFilename write FFilename;
property Enabled : boolean read FEnabled write SetEnabled;
end;

View File

@ -0,0 +1,38 @@
{
This file is part of the Mufasa Macro Library (MML)
Copyright (c) 2009 by Raymond van Venetië and Merlijn Wajer
MML is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MML is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with MML. If not, see <http://www.gnu.org/licenses/>.
See the file COPYING, included in this distribution,
for details about the copyright.
extensions.inc for the Mufasa Macro Library
}
function ext_GetPage(url : string) : string;
var
t: TDownloadThread;
begin
t := TDownloadThread.Create(true);
t.InputURL:='url';
t.Resume;
while not t.done do
begin
Application.ProcessMessages;
Sleep(25);
end;
Exit(t.ResultStr);
end;

View File

@ -21,7 +21,7 @@
Settings.inc for the Mufasa Macro Library
}
function SettingsIsKey(KeyName: String): Boolean;
function KeyIsSetting(KeyName: String): Boolean;
begin
if CurrThread.Sett <> nil then
result:= CurrThread.Sett.IsKey(KeyName)
@ -29,7 +29,7 @@ begin
result:=false;
end;
function SettingsIsDirectory(KeyName: String): Boolean;
function KeyIsDirectory(KeyName: String): Boolean;
begin
if CurrThread.Sett <> nil then
result:= CurrThread.Sett.IsDirectory(KeyName)
@ -37,7 +37,7 @@ begin
result := false;
end;
function SettingsGetKeyValue(KeyName: String): String;
function GetSettingValue(KeyName: String): String;
begin
if CurrThread.Sett <> nil then
result:= CurrThread.Sett.GetKeyValue(KeyName)
@ -45,23 +45,23 @@ begin
result:='';
end;
function SettingsGetSetDefaultKeyValue(KeyName, defVal: String): String;
function GetSettingValueDef(KeyName, defVal: String): String;
begin
if CurrThread.Sett <> nil then
result:= CurrThread.Sett.GetSetDefaultKeyValue(KeyName, defVal)
result:= CurrThread.Sett.GetKeyValueDef(KeyName, defVal)
else
result:='';
end;
procedure SettingsListKeys(KeyName: String; var KeyReturn: TStringArray);
function ListSettings(KeyName: String; var KeyReturn: TStringArray) : boolean;
begin
if CurrThread.Sett <> nil then
KeyReturn := CurrThread.Sett.ListKeys(KeyName)
Result := CurrThread.Sett.ListKeys(KeyName,keyReturn)
else
setlength(KeyReturn, 0);
result := false;
end;
function SettingsDeleteKey(KeyName: String): Boolean;
function DeleteSetting(KeyName: String): Boolean;
begin
if CurrThread.Sett <> nil then
Result := CurrThread.Sett.DeleteKey(KeyName)
@ -69,7 +69,7 @@ begin
result := False;
end;
function SettingsDeleteSubKeys(KeyName: String): Boolean;
function DeleteSubSettings(KeyName: String): Boolean;
begin
if CurrThread.Sett <> nil then
Result := CurrThread.Sett.DeleteSubKeys(KeyName)

View File

@ -367,11 +367,10 @@ AddFunction(@SameTPA,'function SameTPA(aTPA, bTPA: TPointArray): Boolean;');
AddFunction(@TPAInATPA,'function TPAInATPA(TPA: TPointArray; InATPA: T2DPointArray; var Index: LongInt): Boolean;');
SetCurrSection('Settings');
AddFunction(@SettingsIsKey, 'function SettingsIsKey(KeyName: String): Boolean;');
AddFunction(@SettingsIsDirectory, 'function SettingsIsDirectory(KeyName: String): Boolean;');
AddFunction(@SettingsGetKeyValue, 'function SettingsGetKeyValue(KeyName: String): String;');
AddFunction(@SettingsGetSetDefaultKeyValue, 'function SettingsGetSetDefaultKeyValue(KeyName, defVal: String): String;');
AddFunction(@SettingsListKeys, 'procedure SettingsListKeys(KeyName: String; var KeyReturn: TStringArray);');
AddFunction(@SettingsDeleteKey, 'function SettingsDeleteKey(KeyName: String): Boolean;');
AddFunction(@SettingsDeleteSubKeys, 'function SettingsDeleteSubKeys(KeyName: String): Boolean;');
AddFunction(@KeyIsSetting, 'function KeyIsSetting(KeyName: String): Boolean;');
AddFunction(@KeyIsDirectory, 'function KeyIsDirectory(KeyName: String): Boolean;');
AddFunction(@GetSettingValue, 'function GetSettingValue(KeyName: String): String;');
AddFunction(@GetSettingValueDef, 'function GetSettingValueDef(KeyName, defVal: String): String;');
AddFunction(@ListSettings, 'function ListSettings(KeyName: String; var KeyReturn: TStringArray) : boolean;');
AddFunction(@DeleteSetting, 'function DeleteSetting(KeyName: String): Boolean;');
AddFunction(@DeleteSubSettings, 'function DeleteSubSettings(KeyName: String): Boolean;');

View File

@ -57,51 +57,40 @@ type
}
TMMLSettings = class(TObject)
private
Nodes: TTreeNodes;
function KeyNameToKeys(KeyName: String): TStringArray;
function WalkToNode(KeyName: String): TTreeNode;
public
constructor Create(aNodes: TTreeNodes);
destructor Destroy; override;
procedure InternalLoadFromXML(XMLDoc: TXMLDocument);
procedure WriteXMLData(n: TTreeNode;
XMLNode: TDOMNode; XMLDoc: TXMLDocument;
var XMLChild: TDOMNode; var C: Integer);
procedure WalkTree(Node: TTreeNode; XMLNode: TDOMNode; XMLDoc: TXMLDocument;
var C: Integer);
function GetKeyValueDefLoadFirst(KeyName, defVal, fileName: String): String;
public
constructor Create(aNodes: TTreeNodes);
destructor Destroy; override;
function GetNodePath(Node: TTreeNode): String;
function ListKeys(KeyName: String; out Keys :TStringArray) : boolean;
private
Nodes: TTreeNodes;
function KeyNameToKeys(KeyName: String): TStringArray;
function WalkToNode(KeyName: String): TTreeNode;
function KeyExists(KeyName: String): Boolean;
function IsKey(KeyName: String): Boolean;
function IsDirectory(KeyName: String): Boolean;
procedure InternalLoadFromXML(XMLDoc: TXMLDocument);
procedure WriteXMLData(n: TTreeNode;
XMLNode: TDOMNode; XMLDoc: TXMLDocument;
var XMLChild: TDOMNode; var C: Integer);
procedure WalkTree(Node: TTreeNode; XMLNode: TDOMNode; XMLDoc: TXMLDocument;
var C: Integer);
function DeleteKey(KeyName: String): Boolean;
function DeleteSubKeys(KeyName: String): Boolean;
public
function GetNodePath(Node: TTreeNode): String;
function ListKeys(KeyName: String): TStringArray;
function KeyExists(KeyName: String): Boolean;
function IsKey(KeyName: String): Boolean;
function IsDirectory(KeyName: String): Boolean;
function DeleteKey(KeyName: String): Boolean;
function DeleteSubKeys(KeyName: String): Boolean;
procedure SetKeyValue(KeyName: String; KeyValue: String);
function CreateKey(KeyName: String; CreatePath: Boolean = False): Boolean;
function GetKeyValue(KeyName: String): String;
// Horrible name
function GetSetDefaultKeyValue(KeyName, defVal: String): String;
private
// /facepalm
function GetSetLoadSaveDefaultKeyValue(KeyName, defVal, fileName: String): String;
public
// AAAAAAAAAAAHG??
function GetSetLoadSaveDefaultKeyValueIfNotExists(KeyName, defVal, fileName: String): String;
public
procedure LoadFromXML(fileName: String);
procedure SaveToXML(fileName: String);
function CreateKey(KeyName: String; CreatePath: Boolean = True): Boolean;
function SetKeyValue(KeyName: String; KeyValue: String; CreatePath : boolean = true) : boolean;
function GetKeyValue(KeyName: String): String;
function GetKeyValueDef(KeyName, defVal: String): String;
function RenameKey(oldKey,newKey : string) : boolean;
function GetKeyValueDefLoad(KeyName, defVal, fileName: String): String;
procedure LoadFromXML(fileName: String);
procedure SaveToXML(fileName: String);
end;
implementation
@ -255,19 +244,19 @@ end;
Equivalent to 'ls' or 'dir'. It lists the keys in a certain key (directory)
}
function TMMLSettings.ListKeys(KeyName: String): TStringArray;
function TMMLSettings.ListKeys(KeyName: String; out Keys: TStringArray): boolean;
var
N: TTreeNode;
begin
SetLength(Result, 0);
SetLength(Keys, 0);
N := WalkToNode(KeyName);
if N <> nil then
N := N.GetFirstChild;
result := n <> nil;
while N <> nil do
begin
setlength(result,length(result)+1);
result[high(result)] := N.Text;
setlength(Keys,length(Keys)+1);
Keys[high(Keys)] := N.Text;
N := N.GetNextSibling;
end;
end;
@ -345,13 +334,41 @@ begin
Exit('');
end;
function TMMLSettings.RenameKey(oldKey, newKey: string): boolean;
var
Node : TTreeNode;
Path : TstringArray;
newstr : string;
i : integer;
begin
result := false;
Path := KeyNameToKeys(OldKey);
if length(path) = 1 then
exit;
if pos('/',newKey) > 0 then
exit;
if not KeyExists(oldkey) then
exit;
for i := length(oldKey) downto 1 do
if oldkey[i] = '/' then
begin
newstr:= Copy(oldkey,1,i) + NewKey;
break;
end;
if KeyExists(NewKey) then
exit;
Node := WalkToNode(oldKey);
Node.Text:= NewKey;
result := true;
end;
{
If the key exists - return the value.
If it does not exist, create the key - with a possible path, set it to
defVal and return defVal.
}
function TMMLSettings.GetSetDefaultKeyValue(KeyName, defVal: String): String;
function TMMLSettings.GetKeyValueDef(KeyName, defVal: String): String;
var
Res: String;
begin
@ -421,26 +438,26 @@ begin
end;
{
Clear the entire tree. Load from fileName. call GetSetDefaultKeyValue.
Clear the entire tree. Load from fileName. call GetKeyValueDef.
}
function TMMLSettings.GetSetLoadSaveDefaultKeyValue(KeyName, defVal, fileName: String): String;
function TMMLSettings.GetKeyValueDefLoadFirst(KeyName, defVal, fileName: String): String;
begin
Nodes.Clear;
LoadFromXML(fileName);
Result := GetSetDefaultKeyValue(KeyName, defVal);
Result := GetKeyValueDef(KeyName, defVal);
SaveToXML(fileName);
end;
{
If Key exists, call getSetDefaultKeyValue, else call GetSetLoadSaveDefaultKeyValue
If Key exists, call GetKeyValueDef, else call GetSetLoadSaveDefaultKeyValue
}
function TMMLSettings.GetSetLoadSaveDefaultKeyValueIfNotExists(KeyName, defVal, fileName: String): String;
function TMMLSettings.GetKeyValueDefLoad(KeyName, defVal, fileName: String): String;
begin
if KeyExists(KeyName) then
Exit(GetSetDefaultKeyValue(KeyName, defVal))
Exit(GetKeyValueDef(KeyName, defVal))
else
Exit(GetSetLoadSaveDefaultKeyValue(KeyName, defVal, fileName));
Exit(GetKeyValueDefLoadFirst(KeyName, defVal, fileName));
end;
{
@ -449,7 +466,7 @@ end;
and CreatePath = True, then b,c,d and e are all created.
}
function TMMLSettings.CreateKey(KeyName: String; CreatePath: Boolean = False): Boolean;
function TMMLSettings.CreateKey(KeyName: String; CreatePath: Boolean = True): Boolean;
var
N, newN, nParent: TTreeNode;
Path: TStringArray;
@ -524,15 +541,18 @@ end;
Set the value of a key.
}
procedure TMMLSettings.SetKeyValue(KeyName: String; KeyValue: String);
function TMMLSettings.SetKeyValue(KeyName: String; KeyValue: String; CreatePath: boolean) : boolean;
var
N, NN: TTreeNode;
begin
if not KeyExists(KeyName) then
result := false;
if not KeyExists(KeyName) and not CreatePath then
begin
mDebugLn('SetKeyValue - Key does not exist');
Exit;
end;
end else
if not KeyExists(keyname) then
CreateKey(keyname);
if not IsKey(KeyName) then
begin
mDebugLn('SetKeyValue - IsKey returned false');
@ -558,6 +578,7 @@ begin
mDebugLn('Setting ' + KeyName + ' to ' + KeyValue);
N := N.GetNextSibling;
end;
result := true;
end;

View File

@ -30,26 +30,28 @@ uses
Classes, SysUtils, settings, strutils, mufasatypes;
type
{ TMMLSettingsSandbox }
TMMLSettingsSandbox = class(TObject)
public
constructor Create(sett: TMMLSettings);
destructor Destroy; override;
function IsKey(KeyName: String): Boolean;
function IsDirectory(KeyName: String): Boolean;
function GetKeyValue(KeyName: String): String;
function GetSetDefaultKeyValue(KeyName, defVal: String): String;
function ListKeys(KeyName: String): TStringArray;
function DeleteKey(KeyName: String): Boolean;
function DeleteSubKeys(KeyName: String): Boolean;
public
function GetPrefix: String;
procedure SetPrefix(s: String);
private
ST: TMMLSettings;
Prefix: String;
private
ST: TMMLSettings;
FPrefix: String;
function GetPrefix: String;
procedure SetPrefix(s: String);
public
constructor Create(sett: TMMLSettings);
destructor Destroy; override;
function IsKey(KeyName: String): Boolean;
function IsDirectory(KeyName: String): Boolean;
function SetKeyValue(Keyname : string; Value : string) : boolean;
function GetKeyValue(KeyName: String): String;
function GetKeyValueDef(KeyName, defVal: String): String;
function ListKeys(KeyName: String; out Keys : TStringArray): boolean;
function DeleteKey(KeyName: String): Boolean;
function DeleteSubKeys(KeyName: String): Boolean;
property prefix : string read GetPrefix write SetPrefix;
end;
implementation
@ -70,17 +72,17 @@ end;
function TMMLSettingsSandbox.GetPrefix: String;
begin
result := Prefix;
result := FPrefix;
end;
procedure TMMLSettingsSandbox.SetPrefix(s: String);
begin
Prefix := s;
FPrefix := s;
end;
function TMMLSettingsSandbox.ListKeys(KeyName: String): TStringArray;
function TMMLSettingsSandbox.ListKeys(KeyName: String; out Keys :TStringArray): boolean;
begin
exit(ST.ListKeys(Prefix + KeyName))
exit(ST.ListKeys(Prefix + KeyName,keys))
end;
function TMMLSettingsSandbox.GetKeyValue(KeyName: String): String;
@ -88,9 +90,9 @@ begin
exit(ST.GetKeyValue(Prefix + KeyName))
end;
function TMMLSettingsSandbox.GetSetDefaultKeyValue(KeyName, defVal: String): String;
function TMMLSettingsSandbox.GetKeyValueDef(KeyName, defVal: String): String;
begin
exit(ST.GetSetDefaultKeyValue(Prefix + KeyName, defVal))
exit(ST.GetKeyValueDef(Prefix + KeyName, defVal))
end;
function TMMLSettingsSandbox.IsKey(KeyName: String): Boolean;
@ -103,6 +105,14 @@ begin
exit(ST.IsDirectory(Prefix + KeyName))
end;
function TMMLSettingsSandbox.SetKeyValue(Keyname: string; Value: string
): boolean;
begin
Writeln(KeyName);
Writeln(Value);
exit(ST.SetKeyValue(prefix + keyname,value,true));
end;
function TMMLSettingsSandbox.DeleteKey(KeyName: String): Boolean;
begin
exit(ST.DeleteKey(Prefix + KeyName));