Skip to content

Commit 1dc617a

Browse files
committed
EraseKeysInSection before save to the ini
1 parent b6046c3 commit 1dc617a

File tree

5 files changed

+104
-23
lines changed

5 files changed

+104
-23
lines changed

src/Settings/RipGrepper.Settings.FilePersister.pas

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ TMemIniPersister = class(TInterfacedObject, IPersister)
3939
public
4040
constructor Create(_ini : IShared<TMemIniFile>); overload;
4141
destructor Destroy(); override;
42+
procedure EraseKeysInSection(_section: string);
4243
property FilePath : string read GetFilePath write SetFilePath;
4344
property IniFile : TMemIniFile read GetIniFile;
4445
end;
@@ -279,11 +280,16 @@ procedure TMemIniStrArrayPersister.StoreValue(const _value : TArrayEx<string>);
279280
autoLock := TAutoLock.Create(TIniPersister.FIniFileLock);
280281
var
281282
dbgMsg := TDebugMsgBeginEnd.New('TMemIniStrArrayPersister.StoreValue');
282-
dbgMsg.Msg('Write Array');
283283

284+
dbgMsg.MsgFmt('Erase section: %s', [FIniSection]);
285+
EraseKeysInSection(FIniSection);
286+
287+
dbgMsg.Msg('Write Array');
284288
for var i := 0 to _value.MaxIndex do begin
285289
multiLineVal := _value[i];
286-
IniFile.WriteString(FIniSection, Format('%s%d', [FIniKey, i]), multiLineVal.GetLine(0));
290+
if not multiLineVal.GetLine(0).IsEmpty then begin
291+
IniFile.WriteString(FIniSection, Format('%s%d', [FIniKey, i]), multiLineVal.GetLine(0));
292+
end;
287293
end;
288294
end;
289295

@@ -508,6 +514,25 @@ procedure TMemIniPersister.checkWritenValue(const _section, _key, _valueShould
508514
{$ENDIF}
509515
end;
510516

517+
procedure TMemIniPersister.EraseKeysInSection(_section: string);
518+
var
519+
slKeys: TStrings;
520+
begin
521+
var
522+
dbgMsg := TDebugMsgBeginEnd.New('TMemIniPersister.EraseKeysInSection');
523+
dbgMsg.MsgFmt('Section %s', [_section]);
524+
slKeys := TStringList.Create;
525+
try
526+
FIniFile.ReadSection(FIniSection, slKeys);
527+
for var key in slKeys do begin
528+
dbgMsg.MsgFmt('Key %s', [key]);
529+
FIniFile.DeleteKey(FIniSection, key);
530+
end;
531+
finally
532+
slKeys.Free;
533+
end;
534+
end;
535+
511536
function TMemIniPersister.GetFilePath() : string;
512537
begin
513538
// Use the stored FIniFile if available, otherwise fall back to singleton

src/Settings/RipGrepper.Settings.RipGrepperSettings.pas

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ TRipGrepperSettings = class(TPersistableSettings)
5555
function GetSearchFormSettings : TSearchFormSettings;
5656
procedure LoadFirstNecessarySettings;
5757
procedure SetReplaceTextsHistory(const Value : IArraySetting);
58+
procedure StoreHistory(_arrSettings: IArraySetting);
5859

5960
protected
6061
function GetIsAlreadyRead : Boolean; override;
@@ -112,7 +113,8 @@ implementation
112113
RipGrepper.Settings.FilePersister,
113114
RipGrepper.Settings.SettingsDictionary,
114115
RipGrepper.Settings.Persister.Interfaces,
115-
Spring.DesignPatterns;
116+
Spring.DesignPatterns,
117+
ArrayEx;
116118

117119
function TRipGrepperSettings.GetLastHistorySearchText : string;
118120
begin
@@ -213,10 +215,10 @@ procedure TRipGrepperSettings.Copy(const _other : TPersistableSettings);
213215
FRipGrepParameters.Copy(s.RipGrepParameters);
214216
FSearchFormSettings.Copy(s.SearchFormSettings);
215217

216-
FSearchPathsHistory.Value.SetItems(s.SearchPathsHistory.Value.Items);
217-
FSearchTextsHistory.Value.SetItems(s.SearchTextsHistory.Value.Items);
218-
FReplaceTextsHistory.Value.SetItems(s.ReplaceTextsHistory.Value.Items);
219-
FExpertOptionHistory.Value.SetItems(s.ExpertOptionHistory.Value.Items);
218+
FSearchPathsHistory.Copy(s.SearchPathsHistory);
219+
FSearchTextsHistory.Copy(s.SearchTextsHistory);
220+
FReplaceTextsHistory.Copy(s.ReplaceTextsHistory);
221+
FExpertOptionHistory.Copy(s.ExpertOptionHistory);
220222
FRipGrepArguments.Assign(s.FRipGrepArguments());
221223
// inherited Copy(_other as TPersistableSettings);
222224
end;
@@ -376,11 +378,21 @@ procedure TRipGrepperSettings.StoreHistories;
376378
var
377379
dbgMsg := TDebugMsgBeginEnd.New('TRipGrepperSettings.StoreHistories');
378380

379-
SearchTextsHistory.StoreToPersister;
380-
ReplaceTextsHistory.StoreToPersister;
381-
SearchPathsHistory.StoreToPersister;
382-
FileMasksHistory.StoreToPersister;
383-
ExpertOptionHistory.StoreToPersister;
381+
StoreHistory(SearchTextsHistory);
382+
StoreHistory(ReplaceTextsHistory);
383+
StoreHistory(SearchPathsHistory);
384+
StoreHistory(FileMasksHistory);
385+
StoreHistory(ExpertOptionHistory);
386+
end;
387+
388+
procedure TRipGrepperSettings.StoreHistory(_arrSettings: IArraySetting);
389+
begin
390+
var
391+
dbgMsg := TDebugMsgBeginEnd.New('TRipGrepperSettings.StoreHistories');
392+
393+
_arrSettings.RemoveDuplicates;
394+
_arrSettings.SetNewLength(AppSettings.ComboHistoryCount);
395+
_arrSettings.StoreToPersister;
384396
end;
385397

386398
procedure TRipGrepperSettings.StoreViewSettings(const _s : string = '');

src/Settings/RipGrepper.Settings.SearchFormSettings.pas

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ procedure TSearchFormSettings.Copy(const _other : TSearchFormSettings);
143143
begin
144144
if Assigned(_other) then begin
145145
inherited Copy(_other as TPersistableSettings);
146-
FRegexTemplates.Value.SetItems(_other.RegexTemplates.Value.Items);
146+
FRegexTemplates.Copy(_other.RegexTemplates);
147147
FExtensionSettings.Copy(_other.ExtensionSettings);
148148
end;
149149
end;

src/Settings/RipGrepper.Settings.SettingVariant.pas

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ TSetting = class(TInterfacedObject, ISetting)
118118

119119
public
120120
constructor Create(const _name : string; { } _state : TSettingState = ssInitialized;
121-
{ } _saveBehaviour : TSettingStoreBehaviours = [ssbStoreIfModified]); overload;
121+
{ } _saveBehaviour : TSettingStoreBehaviours = [ssbStoreIfModified]); overload;
122122
procedure LoadFromPersister(); virtual; abstract;
123123
procedure StoreToPersister(const _section : string = ''); virtual; abstract;
124124

@@ -166,7 +166,7 @@ TSettingVariant<T> = class(TSetting, ISettingVariant<T>, ISetting, IStreamReade
166166

167167
public
168168
constructor Create(const _name : string; const _value : T; { } _state : TSettingState = ssInitialized;
169-
{ } _saveBehaviour : TSettingStoreBehaviours = [ssbStoreIfModified]); overload;
169+
{ } _saveBehaviour : TSettingStoreBehaviours = [ssbStoreIfModified]); overload;
170170
procedure Clear(); override;
171171
function CompareTo(Value : ISettingVariant<T>) : Integer;
172172
procedure Copy(_other : ISettingVariant<T>); reintroduce;
@@ -209,7 +209,9 @@ TIntegerSetting = class(TSettingVariant<integer>)
209209
function GetCount() : Integer;
210210
function GetItem(Index : Integer) : string;
211211
function GetSafeItem(index : Integer) : string;
212+
procedure RemoveDuplicates();
212213
procedure SetItem(Index : Integer; const Value : string);
214+
procedure SetNewLength(const _len: Integer);
213215
procedure SetSafeItem(index : Integer; const Value : string);
214216

215217
property Count : Integer read GetCount;
@@ -228,10 +230,14 @@ TArraySetting = class(TSettingVariant<TArrayEx<string>>, IArraySetting)
228230
public
229231
procedure Add(const AItem : string);
230232
function AddIfNotContains(const AItem : string) : Integer;
233+
procedure Clear; override;
234+
procedure RemoveDuplicates;
231235
procedure Copy(_other : IArraySetting);
236+
function Equals(_other : IArraySetting) : Boolean; reintroduce;
232237
function GetValueFromString(const _strValue : string) : TArrayEx<string>; override;
233238

234239
function GetSettingType() : TSettingType; override;
240+
procedure SetNewLength(const _len: Integer);
235241
property Count : Integer read GetCount;
236242
property Item[index : Integer] : string read GetItem write SetItem; default;
237243
property SafeItem[index : Integer] : string read GetSafeItem write SetSafeItem;
@@ -251,8 +257,8 @@ implementation
251257
RipGrepper.Helper.StreamReaderWriter;
252258

253259
constructor TSettingVariant<T>.Create(const _name : string; const _value : T;
254-
{ } _state : TSettingState = ssInitialized;
255-
{ } _saveBehaviour : TSettingStoreBehaviours = [ssbStoreIfModified]);
260+
{ } _state : TSettingState = ssInitialized;
261+
{ } _saveBehaviour : TSettingStoreBehaviours = [ssbStoreIfModified]);
256262
begin
257263
inherited Create(_name, _state, _saveBehaviour);
258264
FValue := _value;
@@ -371,8 +377,8 @@ procedure TSettingVariant<T>.SetPersister(const Value : IFilePersister<T>);
371377
end;
372378

373379
constructor TSetting.Create(const _name : string;
374-
{ } _state : TSettingState = ssInitialized;
375-
{ } _saveBehaviour : TSettingStoreBehaviours = [ssbStoreIfModified]);
380+
{ } _state : TSettingState = ssInitialized;
381+
{ } _saveBehaviour : TSettingStoreBehaviours = [ssbStoreIfModified]);
376382
begin
377383
inherited Create();
378384
FName := _name;
@@ -591,12 +597,22 @@ function TArraySetting.AddIfNotContains(const AItem : string) : Integer;
591597
end;
592598
end;
593599

600+
procedure TArraySetting.Clear;
601+
begin
602+
inherited;
603+
FValue.Clear;
604+
end;
605+
594606
procedure TArraySetting.Copy(_other : IArraySetting);
595607
begin
596608
inherited Copy(_other);
597-
if Assigned(_other) then begin
598-
self.Value.SetItems(_other.Value.Items);
599-
end;
609+
Assert(_other.Equals(self));
610+
end;
611+
612+
function TArraySetting.Equals(_other : IArraySetting) : Boolean;
613+
begin
614+
Result := (FState = _other.State);
615+
Result := Result and (Value = _other.Value);
600616
end;
601617

602618
function TArraySetting.GetCount() : Integer;
@@ -624,11 +640,33 @@ function TArraySetting.GetValueFromString(const _strValue : string) : TArrayEx<s
624640
Result := _strValue.Split([ARRAY_SEPARATOR]);
625641
end;
626642

643+
procedure TArraySetting.RemoveDuplicates;
644+
var
645+
unique : TArrayEx<string>;
646+
arr : TArrayEx<string>;
647+
begin
648+
for var item in self.Value do begin
649+
unique.AddIfNotContains(item);
650+
end;
651+
arr.SetItems(unique.Items);
652+
if arr.Count = self.Value.Count then begin
653+
self.State := ssModified;
654+
end;
655+
self.Value := arr;
656+
end;
657+
627658
procedure TArraySetting.SetItem(Index : Integer; const Value : string);
628659
begin
629660
self.Value[index] := Value;
630661
end;
631662

663+
procedure TArraySetting.SetNewLength(const _len: Integer);
664+
begin
665+
var items := Value.Items;
666+
SetLength(items, _len);
667+
Value := items;
668+
end;
669+
632670
procedure TArraySetting.SetSafeItem(index : Integer; const Value : string);
633671
begin
634672
self.Value.SafeItem[index] := Value;

src/UI/RipGrepper.UI.SearchForm.pas

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1076,6 +1076,12 @@ procedure TRipGrepperSearchDialogForm.CopySettingsToCtrlProxy(var _ctrlProxy : T
10761076
var
10771077
dbgMsg := TDebugMsgBeginEnd.New('TRipGrepperSearchDialogForm.CopySettingsToCtrlProxy');
10781078

1079+
FSettings.SearchTextsHistory.RemoveDuplicates;
1080+
FSettings.ReplaceTextsHistory.RemoveDuplicates;
1081+
FSettings.SearchPathsHistory.RemoveDuplicates;
1082+
FSettings.FileMasksHistory.RemoveDuplicates;
1083+
FSettings.ExpertOptionHistory.RemoveDuplicates;
1084+
10791085
CopyItemsToProxy(_ctrlProxy.SearchTextHist, FSettings.SearchTextsHistory);
10801086
CopyItemsToProxy(_ctrlProxy.ReplaceTextHist, FSettings.ReplaceTextsHistory);
10811087
CopyItemsToProxy(_ctrlProxy.SearchPathHist, FSettings.SearchPathsHistory);
@@ -1752,7 +1758,7 @@ procedure TRipGrepperSearchDialogForm.CopySettingsToHistObj;
17521758

17531759
function TRipGrepperSearchDialogForm.GetMaxCountHistoryItems(const _arr : TArrayEx<string>) : TArrayEx<string>;
17541760
begin
1755-
Result := _arr.GetRange(0, MAX_HISTORY_COUNT); // .GetReversedRange();
1761+
Result := _arr.GetRange(0, FSettings.AppSettings.ComboHistoryCount); // .GetReversedRange();
17561762
end;
17571763

17581764
function TRipGrepperSearchDialogForm.getOptionsAndFiltersHeight(const _bWithLabel : Boolean) : integer;

0 commit comments

Comments
 (0)