FIX: Delete folder from trash

This commit is contained in:
Alexander Koblov 2022-06-08 22:45:40 +03:00
commit ec782edbeb
3 changed files with 76 additions and 11 deletions

View file

@ -0,0 +1,58 @@
unit uTrashDeleteOperation;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils,
uGioDeleteOperation,
uFileSource,
uFile;
type
{ TTrashDeleteOperation }
TTrashDeleteOperation = class(TGioDeleteOperation)
public
procedure Initialize; override;
procedure Finalize; override;
end;
implementation
procedure TTrashDeleteOperation.Initialize;
var
I: Integer;
aFile: TFile;
begin
// Get initialized statistics; then we change only what is needed.
FStatistics := RetrieveStatistics;
FFullFilesTreeToDelete:= FilesToDelete;
for I := 0 to FFullFilesTreeToDelete.Count - 1 do
begin
aFile := FFullFilesTreeToDelete[I];
with FStatistics do
begin
if aFile.IsDirectory and (not aFile.IsLinkToDirectory) then
Inc(TotalFiles)
else begin
Inc(TotalFiles);
Inc(TotalBytes, aFile.Size);
end;
end;
end;
end;
procedure TTrashDeleteOperation.Finalize;
begin
FFullFilesTreeToDelete:= nil;
inherited Finalize;
end;
end.

View file

@ -5,8 +5,8 @@ unit uTrashFileSource;
interface
uses
Classes, SysUtils, Menus, uGLib2, uGio2, uFile, uGioFileSource,
uFileSourceProperty, uFileSource, uFileProperty, uFileSourceOperationTypes;
Classes, SysUtils, Menus, uGLib2, uGio2, uFile, uFileSource, uGioFileSource,
uFileSourceProperty, uFileProperty, uFileSourceOperationTypes, uFileSourceOperation;
type
@ -33,12 +33,15 @@ type
function GetDefaultView(out DefaultView: TFileSourceFields): Boolean; override;
function QueryContextMenu(AFiles: TFiles; var AMenu: TPopupMenu): Boolean; override;
procedure RetrieveProperties(AFile: TFile; PropertiesToSet: TFilePropertiesTypes; AVariantProperties: array of String); override;
function CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation; override;
end;
implementation
uses
UITypes, Dialogs, DCStrUtils, uGObject2, uLng, uGio, uFileProcs, uGioFileSourceUtil;
UITypes, Dialogs, DCStrUtils, uGObject2, uLng, uGio, uFileProcs,
uGioFileSourceUtil, uTrashDeleteOperation;
const
G_FILE_ATTRIBUTE_TRASH_ORIG_PATH = 'trash::orig-path';
@ -210,5 +213,14 @@ begin
end;
end;
function TTrashFileSource.CreateDeleteOperation(var FilesToDelete: TFiles): TFileSourceOperation;
var
TargetFileSource: IFileSource;
begin
TargetFileSource := Self;
FilesToDelete.Path:= FCurrentAddress + FilesToDelete.Path;
Result := TTrashDeleteOperation.Create(TargetFileSource, FilesToDelete);
end;
end.

View file

@ -18,7 +18,7 @@ type
TGioDeleteOperation = class(TFileSourceDeleteOperation)
private
protected
FWfxPluginFileSource: IGioFileSource;
FFullFilesTreeToDelete: TFiles; // source files including all files/dirs in subdirectories
FStatistics: TFileSourceDeleteOperationStatistics; // local copy of statistics
@ -41,13 +41,12 @@ type
procedure Initialize; override;
procedure MainExecute; override;
procedure Finalize; override;
end;
implementation
uses
DCOSUtils, uLng, uGlib2, uGio2, uGObject2, uGio, uGioFileSourceUtil;
DCOSUtils, uLng, uGio2, uGObject2, uGio, uGioFileSourceUtil;
constructor TGioDeleteOperation.Create(aTargetFileSource: IFileSource;
var theFilesToDelete: TFiles);
@ -64,6 +63,7 @@ end;
destructor TGioDeleteOperation.Destroy;
begin
inherited Destroy;
FFullFilesTreeToDelete.Free;
end;
procedure TGioDeleteOperation.Initialize;
@ -103,11 +103,6 @@ begin
end;
end;
procedure TGioDeleteOperation.Finalize;
begin
end;
function TGioDeleteOperation.ProcessFile(aFile: TFile): Boolean;
var
AGFile: PGFile;