mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
ADD: Simple exif-wdx plugin
This commit is contained in:
parent
1b5e87ee85
commit
e796b5a02c
3 changed files with 322 additions and 84 deletions
159
src/uexifwdx.pas
Normal file
159
src/uexifwdx.pas
Normal file
|
|
@ -0,0 +1,159 @@
|
|||
{
|
||||
Double Commander
|
||||
-------------------------------------------------------------------------
|
||||
Simple exif-wdx plugin.
|
||||
|
||||
Copyright (C) 2016-2017 Alexander Koblov (alexx2000@mail.ru)
|
||||
|
||||
This program 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 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
}
|
||||
|
||||
unit uExifWdx;
|
||||
|
||||
{$mode delphi}
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, WdxPlugin, uWDXModule, uExifReader;
|
||||
|
||||
type
|
||||
|
||||
{ TExifWdx }
|
||||
|
||||
TExifWdx = class(TEmbeddedWDX)
|
||||
private
|
||||
FFileName: String;
|
||||
FExif: TExifReader;
|
||||
procedure GetData(const FileName: String);
|
||||
protected
|
||||
function GetAName: String; override;
|
||||
function GetADetectStr: String; override;
|
||||
public
|
||||
//---------------------
|
||||
constructor Create; override;
|
||||
destructor Destroy; override;
|
||||
//------------------------------------------------------
|
||||
procedure CallContentGetSupportedField; override;
|
||||
procedure CallContentSetDefaultParams; override;
|
||||
procedure CallContentStopGetValue(FileName: String); override;
|
||||
//---------------------
|
||||
function CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean; override;
|
||||
function CallContentGetDetectString: String; override;
|
||||
function CallContentGetValueV(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): Variant; overload; override;
|
||||
function CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String; overload; override;
|
||||
function CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer; override;
|
||||
//------------------------------------------------------
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
{ TExifWdx }
|
||||
|
||||
procedure TExifWdx.GetData(const FileName: String);
|
||||
begin
|
||||
if (FFileName <> FileName) then
|
||||
begin
|
||||
FFileName:= FileName;
|
||||
FExif.LoadFromFile(FileName);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TExifWdx.GetAName: String;
|
||||
begin
|
||||
Result:= '< Exif >';
|
||||
end;
|
||||
|
||||
function TExifWdx.GetADetectStr: String;
|
||||
begin
|
||||
Result:= CallContentGetDetectString;
|
||||
end;
|
||||
|
||||
constructor TExifWdx.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
FExif:= TExifReader.Create;
|
||||
end;
|
||||
|
||||
destructor TExifWdx.Destroy;
|
||||
begin
|
||||
FExif.Free;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TExifWdx.CallContentGetSupportedField;
|
||||
begin
|
||||
AddField(rsMake, ft_string);
|
||||
AddField(rsModel, ft_string);
|
||||
AddField(rsImageWidth, ft_numeric_32);
|
||||
AddField(rsImageHeight, ft_numeric_32);
|
||||
AddField(rsOrientation, ft_numeric_32);
|
||||
AddField(rsDateTimeOriginal, ft_string);
|
||||
end;
|
||||
|
||||
procedure TExifWdx.CallContentSetDefaultParams;
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
procedure TExifWdx.CallContentStopGetValue(FileName: String);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
function TExifWdx.CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean;
|
||||
begin
|
||||
Result:= False;
|
||||
end;
|
||||
|
||||
function TExifWdx.CallContentGetDetectString: String;
|
||||
begin
|
||||
Result:= '(EXT="JPG") | (EXT="JPEG")';
|
||||
end;
|
||||
|
||||
function TExifWdx.CallContentGetValueV(FileName: String; FieldIndex,
|
||||
UnitIndex: Integer; flags: Integer): Variant;
|
||||
begin
|
||||
GetData(FileName);
|
||||
case FieldIndex of
|
||||
0: Result:= FExif.Make;
|
||||
1: Result:= FExif.Model;
|
||||
2: Result:= FExif.ImageWidth;
|
||||
3: Result:= FExif.ImageHeight;
|
||||
4: Result:= FExif.Orientation;
|
||||
5: Result:= FExif.DateTimeOriginal;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TExifWdx.CallContentGetValue(FileName: String; FieldIndex,
|
||||
UnitIndex: Integer; flags: Integer): String;
|
||||
begin
|
||||
GetData(FileName);
|
||||
case FieldIndex of
|
||||
0: Result:= FExif.Make;
|
||||
1: Result:= FExif.Model;
|
||||
2: Result:= IntToStr(FExif.ImageWidth);
|
||||
3: Result:= IntToStr(FExif.ImageHeight);
|
||||
4: Result:= IntToStr(FExif.Orientation);
|
||||
5: Result:= FExif.DateTimeOriginal;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TExifWdx.CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer;
|
||||
begin
|
||||
Result:= 0;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
|
@ -595,7 +595,7 @@ var
|
|||
implementation
|
||||
|
||||
uses
|
||||
LCLProc, LCLType, Dialogs, Laz2_XMLRead, LazUTF8,
|
||||
LCLProc, LCLType, Dialogs, Laz2_XMLRead, LazUTF8, uExifWdx,
|
||||
uGlobsPaths, uLng, uShowMsg, uFileProcs, uOSUtils, uFindFiles,
|
||||
uDCUtils, fMultiRename, uFile, uDCVersion, uDebug, uFileFunctions,
|
||||
uDefaultPlugins, Lua, uKeyboard, DCOSUtils, DCStrUtils, uPixMapManager
|
||||
|
|
@ -2682,6 +2682,7 @@ begin
|
|||
gWFXPlugins.Load(gConfig, Node);
|
||||
gWLXPlugins.Load(gConfig, Node);
|
||||
end;
|
||||
gWDXPlugins.Add(TExifWdx.Create);
|
||||
|
||||
{ Load content plugins used in search templates }
|
||||
LoadContentPlugins;
|
||||
|
|
|
|||
|
|
@ -84,9 +84,9 @@ type
|
|||
//---------------------
|
||||
function CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean; virtual; abstract;
|
||||
function CallContentGetDetectString: String; virtual; abstract;
|
||||
function CallContentGetValueV(FileName: String; FieldName: String; UnitName: String; flags: Integer): Variant; overload; virtual; abstract;
|
||||
function CallContentGetValueV(FileName: String; FieldName: String; UnitName: String; flags: Integer): Variant; overload; virtual;
|
||||
function CallContentGetValueV(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): Variant; overload; virtual; abstract;
|
||||
function CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String; overload; virtual; abstract;
|
||||
function CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String; overload; virtual;
|
||||
function CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String; overload; virtual; abstract;
|
||||
function CallContentGetValue(FileName: String; FieldIndex: Integer; var UnitIndex: Integer): String; overload; virtual; abstract;
|
||||
function CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer; virtual; abstract;
|
||||
|
|
@ -158,9 +158,7 @@ type
|
|||
//---------------------
|
||||
function CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean; override;
|
||||
function CallContentGetDetectString: String; override;
|
||||
function CallContentGetValueV(FileName: String; FieldName: String; UnitName: String; flags: Integer): Variant; overload; override;
|
||||
function CallContentGetValueV(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): Variant; overload; override;
|
||||
function CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String; overload; override;
|
||||
function CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String; overload; override;
|
||||
function CallContentGetValue(FileName: String; FieldIndex: Integer; var UnitIndex: Integer): String; overload; override;
|
||||
function CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer; override;
|
||||
|
|
@ -218,9 +216,7 @@ type
|
|||
//---------------------
|
||||
function CallContentGetDefaultSortOrder(FieldIndex: Integer): Boolean; override;
|
||||
function CallContentGetDetectString: String; override;
|
||||
function CallContentGetValueV(FileName: String; FieldName: String; UnitName: String; flags: Integer): Variant; overload; override;
|
||||
function CallContentGetValueV(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): Variant; overload; override;
|
||||
function CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String; overload; override;
|
||||
function CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String; overload; override;
|
||||
function CallContentGetValue(FileName: String; FieldIndex: Integer; var UnitIndex: Integer): String; overload; override;
|
||||
function CallContentGetSupportedFieldFlags(FieldIndex: Integer): Integer; override;
|
||||
|
|
@ -233,6 +229,35 @@ type
|
|||
|
||||
end;
|
||||
|
||||
{ TEmbeddedWDX }
|
||||
|
||||
TEmbeddedWDX = class(TWDXModule)
|
||||
private
|
||||
FFieldsList: TStringList;
|
||||
FParser: TParserControl;
|
||||
protected
|
||||
function GetAName: String; override;
|
||||
function GetAFileName: String; override;
|
||||
function GetADetectStr: String; override;
|
||||
procedure SetAName(AValue: String); override;
|
||||
procedure SetAFileName(AValue: String); override;
|
||||
procedure SetADetectStr(const AValue: String); override;
|
||||
protected
|
||||
procedure AddField(const AName: String; AType: Integer);
|
||||
public
|
||||
//---------------------
|
||||
constructor Create; override;
|
||||
destructor Destroy; override;
|
||||
//---------------------
|
||||
function LoadModule: Boolean; override;
|
||||
procedure UnloadModule; override;
|
||||
function IsLoaded: Boolean; override;
|
||||
//---------------------
|
||||
function FieldList: TStringList; override;
|
||||
function GetFieldIndex(FieldName: String): Integer; override;
|
||||
function FileParamVSDetectStr(const aFile: TFile): Boolean; override;
|
||||
//------------------------------------------------------
|
||||
end;
|
||||
|
||||
{ TWDXModuleList }
|
||||
|
||||
|
|
@ -409,10 +434,13 @@ begin
|
|||
|
||||
For i := 0 to Flist.Count - 1 do
|
||||
begin
|
||||
SubNode := AConfig.AddNode(ANode, 'WdxPlugin');
|
||||
AConfig.AddValue(SubNode, 'Name', TWDXModule(Flist.Objects[I]).Name);
|
||||
AConfig.AddValue(SubNode, 'Path', SetCmdDirAsEnvVar(TWDXModule(Flist.Objects[I]).FileName));
|
||||
AConfig.AddValue(SubNode, 'DetectString', TWDXModule(Flist.Objects[I]).DetectStr);
|
||||
if not (Flist.Objects[I] is TEmbeddedWDX) then
|
||||
begin
|
||||
SubNode := AConfig.AddNode(ANode, 'WdxPlugin');
|
||||
AConfig.AddValue(SubNode, 'Name', TWDXModule(Flist.Objects[I]).Name);
|
||||
AConfig.AddValue(SubNode, 'Path', SetCmdDirAsEnvVar(TWDXModule(Flist.Objects[I]).FileName));
|
||||
AConfig.AddValue(SubNode, 'DetectString', TWDXModule(Flist.Objects[I]).DetectStr);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
|
@ -502,11 +530,7 @@ end;
|
|||
|
||||
function TWDXModuleList.GetWdxModule(Index: Integer): TWDXModule;
|
||||
begin
|
||||
if (Flist.Objects[Index] is TPluginWDX) then
|
||||
Result := TPluginWDX(Flist.Objects[Index])
|
||||
else
|
||||
if (Flist.Objects[Index] is TLuaWdx) then
|
||||
Result := TLuaWdx(Flist.Objects[Index]);
|
||||
Result := TWDXModule(Flist.Objects[Index]);
|
||||
end;
|
||||
|
||||
function TWDXModuleList.GetWdxModule(AName: String): TWDXModule;
|
||||
|
|
@ -515,12 +539,7 @@ var
|
|||
begin
|
||||
tmp := Flist.IndexOf(upcase(AName));
|
||||
if tmp < 0 then Exit(nil);
|
||||
|
||||
if (Flist.Objects[tmp] is TPluginWDX) then
|
||||
Result := TPluginWDX(Flist.Objects[tmp])
|
||||
else
|
||||
if (Flist.Objects[tmp] is TLuaWdx) then
|
||||
Result := TLuaWdx(Flist.Objects[tmp]);
|
||||
Result := TWDXModule(Flist.Objects[tmp])
|
||||
end;
|
||||
|
||||
{ TPluginWDX }
|
||||
|
|
@ -738,22 +757,6 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function TPluginWDX.CallContentGetValueV(FileName: String; FieldName: String;
|
||||
UnitName: String; flags: Integer): Variant;
|
||||
var
|
||||
FieldIndex,
|
||||
UnitIndex: Integer;
|
||||
begin
|
||||
FieldIndex := GetFieldIndex(FieldName);
|
||||
if FieldIndex <> -1 then
|
||||
begin
|
||||
UnitIndex := TWdxField(FieldList.Objects[FieldIndex]).GetUnitIndex(UnitName);
|
||||
Result := CallContentGetValuev(FileName, FieldIndex, UnitIndex, flags);
|
||||
end
|
||||
else
|
||||
Result := Unassigned;
|
||||
end;
|
||||
|
||||
function TPluginWDX.CallContentGetValueV(FileName: String; FieldIndex,
|
||||
UnitIndex: Integer; flags: Integer): Variant;
|
||||
var
|
||||
|
|
@ -796,21 +799,6 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function TPluginWDX.CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String;
|
||||
var
|
||||
FieldIndex,
|
||||
UnitIndex: Integer;
|
||||
begin
|
||||
FieldIndex := GetFieldIndex(FieldName);
|
||||
if FieldIndex <> -1 then
|
||||
begin
|
||||
UnitIndex := TWdxField(FieldList.Objects[FieldIndex]).GetUnitIndex(UnitName);
|
||||
Result := CallContentGetValue(FileName, FieldIndex, UnitIndex, flags);
|
||||
end
|
||||
else
|
||||
Result := EmptyStr;
|
||||
end;
|
||||
|
||||
function TPluginWDX.CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String;
|
||||
var
|
||||
Rez: Integer;
|
||||
|
|
@ -1152,22 +1140,6 @@ begin
|
|||
lua_pop(L, 1);
|
||||
end;
|
||||
|
||||
function TLuaWdx.CallContentGetValueV(FileName: String; FieldName: String;
|
||||
UnitName: String; flags: Integer): Variant;
|
||||
var
|
||||
FieldIndex,
|
||||
UnitIndex: Integer;
|
||||
begin
|
||||
FieldIndex := GetFieldIndex(FieldName);
|
||||
if FieldIndex <> -1 then
|
||||
begin
|
||||
UnitIndex := TWdxField(FieldList.Objects[FieldIndex]).GetUnitIndex(UnitName);
|
||||
Result := CallContentGetValueV(FileName, FieldIndex, UnitIndex, flags);
|
||||
end
|
||||
else
|
||||
Result := Unassigned;
|
||||
end;
|
||||
|
||||
function TLuaWdx.CallContentGetValueV(FileName: String; FieldIndex,
|
||||
UnitIndex: Integer; flags: Integer): Variant;
|
||||
begin
|
||||
|
|
@ -1210,21 +1182,6 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function TLuaWdx.CallContentGetValue(FileName: String; FieldName: String; UnitName: String; flags: Integer): String;
|
||||
var
|
||||
FieldIndex,
|
||||
UnitIndex: Integer;
|
||||
begin
|
||||
FieldIndex := GetFieldIndex(FieldName);
|
||||
if FieldIndex <> -1 then
|
||||
begin
|
||||
UnitIndex := TWdxField(FieldList.Objects[FieldIndex]).GetUnitIndex(UnitName);
|
||||
Result := CallContentGetValue(FileName, FieldIndex, UnitIndex, flags);
|
||||
end
|
||||
else
|
||||
Result := EmptyStr;
|
||||
end;
|
||||
|
||||
function TLuaWdx.CallContentGetValue(FileName: String; FieldIndex, UnitIndex: Integer; flags: Integer): String;
|
||||
begin
|
||||
EnterCriticalSection(FMutex);
|
||||
|
|
@ -1313,6 +1270,95 @@ begin
|
|||
|
||||
end;
|
||||
|
||||
{ TEmbeddedWDX }
|
||||
|
||||
function TEmbeddedWDX.GetAName: String;
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
function TEmbeddedWDX.GetAFileName: String;
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
function TEmbeddedWDX.GetADetectStr: String;
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
procedure TEmbeddedWDX.SetAName(AValue: String);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
procedure TEmbeddedWDX.SetAFileName(AValue: String);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
procedure TEmbeddedWDX.SetADetectStr(const AValue: String);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
procedure TEmbeddedWDX.AddField(const AName: String; AType: Integer);
|
||||
var
|
||||
I: Integer;
|
||||
begin
|
||||
I := FFieldsList.AddObject(AName, TWdxField.Create);
|
||||
with TWdxField(FFieldsList.Objects[I]) do
|
||||
begin
|
||||
FName := AName;
|
||||
FType := AType;
|
||||
end;
|
||||
end;
|
||||
|
||||
constructor TEmbeddedWDX.Create;
|
||||
begin
|
||||
inherited Create;
|
||||
FParser:= TParserControl.Create;
|
||||
FFieldsList:= TStringList.Create;
|
||||
CallContentGetSupportedField;
|
||||
end;
|
||||
|
||||
destructor TEmbeddedWDX.Destroy;
|
||||
begin
|
||||
FParser.Free;
|
||||
FFieldsList.Free;
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
function TEmbeddedWDX.LoadModule: Boolean;
|
||||
begin
|
||||
Result:= True;
|
||||
end;
|
||||
|
||||
procedure TEmbeddedWDX.UnloadModule;
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
function TEmbeddedWDX.IsLoaded: Boolean;
|
||||
begin
|
||||
Result:= True;
|
||||
end;
|
||||
|
||||
function TEmbeddedWDX.FieldList: TStringList;
|
||||
begin
|
||||
Result:= FFieldsList;
|
||||
end;
|
||||
|
||||
function TEmbeddedWDX.GetFieldIndex(FieldName: String): Integer;
|
||||
begin
|
||||
Result := FFieldsList.IndexOf(FieldName);
|
||||
end;
|
||||
|
||||
function TEmbeddedWDX.FileParamVSDetectStr(const aFile: TFile): Boolean;
|
||||
begin
|
||||
FParser.DetectStr := Self.DetectStr;
|
||||
Result := FParser.TestFileResult(aFile);
|
||||
end;
|
||||
|
||||
{ TWDXModule }
|
||||
|
||||
|
|
@ -1349,6 +1395,38 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function TWDXModule.CallContentGetValueV(FileName: String; FieldName: String;
|
||||
UnitName: String; flags: Integer): Variant;
|
||||
var
|
||||
FieldIndex,
|
||||
UnitIndex: Integer;
|
||||
begin
|
||||
FieldIndex := GetFieldIndex(FieldName);
|
||||
if FieldIndex <> -1 then
|
||||
begin
|
||||
UnitIndex := TWdxField(FieldList.Objects[FieldIndex]).GetUnitIndex(UnitName);
|
||||
Result := CallContentGetValueV(FileName, FieldIndex, UnitIndex, flags);
|
||||
end
|
||||
else
|
||||
Result := Unassigned;
|
||||
end;
|
||||
|
||||
function TWDXModule.CallContentGetValue(FileName: String; FieldName: String;
|
||||
UnitName: String; flags: Integer): String;
|
||||
var
|
||||
FieldIndex,
|
||||
UnitIndex: Integer;
|
||||
begin
|
||||
FieldIndex := GetFieldIndex(FieldName);
|
||||
if FieldIndex <> -1 then
|
||||
begin
|
||||
UnitIndex := TWdxField(FieldList.Objects[FieldIndex]).GetUnitIndex(UnitName);
|
||||
Result := CallContentGetValue(FileName, FieldIndex, UnitIndex, flags);
|
||||
end
|
||||
else
|
||||
Result := EmptyStr;
|
||||
end;
|
||||
|
||||
{ TWdxField }
|
||||
|
||||
function TWdxField.GetUnitIndex(UnitName: String): Integer;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue