Skip to content

Commit

Permalink
Implement platform-specific behaviour for highlighting files in file …
Browse files Browse the repository at this point in the history
…managers (#106)
  • Loading branch information
lighterowl authored Sep 24, 2024
1 parent b371e5a commit d986f67
Show file tree
Hide file tree
Showing 5 changed files with 214 additions and 11 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
build-linux:

runs-on: ubuntu-latest
container: lighterowl/transgui-sdk:1.0
container: lighterowl/transgui-sdk:1.1

steps:
- uses: actions/checkout@v1
Expand Down
168 changes: 168 additions & 0 deletions localfilemanager.pas
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
{*************************************************************************************
This file is part of Transmission Remote GUI.
Copyright (c) 2008-2019 by Yury Sidorov and Transmission Remote GUI working group.
Copyright (c) 2023-2024 by Daniel Kamil Kozar
Transmission Remote GUI 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.
Transmission Remote GUI 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 Transmission Remote GUI; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
In addition, as a special exception, the copyright holders give permission to
link the code of portions of this program with the
OpenSSL library under certain conditions as described in each individual
source file, and distribute linked combinations including the two.
You must obey the GNU General Public License in all respects for all of the
code used other than OpenSSL. If you modify file(s) with this exception, you
may extend this exception to your version of the file(s), but you are not
obligated to do so. If you do not wish to do so, delete this exception
statement from your version. If you delete this exception statement from all
source files in the program, then also delete it here.
*************************************************************************************}

unit LocalFileManager;

{$mode ObjFPC}{$H+}{$J-}
{$ifdef darwin}
{$modeswitch objectivec1}
{$endif}

interface

uses SysUtils, Dialogs, LazLoggerBase, lclintf
{$if defined(linux)}
, dbus
{$elseif defined(darwin)}
, CocoaAll
{$elseif defined(windows)}
, Process
{$endif}
;

procedure ShowFile(Path: string);

implementation

type
EFileManagerError = class(Exception);

{$if defined(linux)}

procedure ShowFile_impl(Path : string);
var
err: DBusError;
conn: PDBusConnection;
msg, replymsg: PDBusMessage;
args: DBusMessageIter;
array_iter: DBusMessageIter;
uri_p, startupId: PChar;
uri: UTF8String;
dbus_rv: dbus_bool_t;

procedure Cleanup;
begin
dbus_error_free(@err);
if replymsg <> nil then dbus_message_unref(replymsg);
if msg <> nil then dbus_message_unref(msg);
if conn <> nil then dbus_connection_unref(conn);
end;

procedure ReportCustomError(customMsg : string);
begin
Cleanup;
raise EFileManagerError.Create(customMsg);
end;

procedure ReportDBusError;
begin
ReportCustomError(err.message);
end;

begin
uri := 'file://' + path;
uri_p := PChar(uri);
startupId := '';
conn := nil;
msg := nil;
replymsg := nil;

dbus_error_init(@err);

conn := dbus_bus_get(DBUS_BUS_SESSION, @err);
if conn = nil then ReportDBusError;

msg := dbus_message_new_method_call('org.freedesktop.FileManager1',
'/org/freedesktop/FileManager1', 'org.freedesktop.FileManager1', 'ShowItems');
if msg = nil then ReportDBusError;

dbus_message_iter_init_append(msg, @args);

dbus_rv := dbus_message_iter_open_container(@args, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING_AS_STRING, @array_iter);
if dbus_rv <> 1 then ReportCustomError('iter_open_container returned false');

dbus_rv := dbus_message_iter_append_basic(@array_iter, DBUS_TYPE_STRING, @uri_p);
if dbus_rv <> 1 then ReportCustomError('iter_append_basic returned false');

dbus_rv := dbus_message_iter_close_container(@args, @array_iter);
if dbus_rv <> 1 then ReportCustomError('iter_close_container returned false');

dbus_rv := dbus_message_iter_append_basic(@args, DBUS_TYPE_STRING, @startupId);
if dbus_rv <> 1 then ReportCustomError('iter_append_basic returned false');

replymsg := dbus_connection_send_with_reply_and_block(conn, msg, 1000, @err);
if replymsg = nil then ReportDBusError;

Cleanup;
end;

{$elseif defined(darwin)}
procedure ShowFile_impl(Path : string);
var
u8path: UTF8String;
begin
u8path := Path;
NSWorkspace.sharedWorkspace.activateFileViewerSelectingURLs(
NSArray.arrayWithObject(
NSURL.fileURLWithPath(
NSString.stringWithUTF8String(PChar(u8path)))));
end;

{$elseif defined(windows)}

procedure ShowFile_impl(Path : string);
var
output: string;
begin
if Process.RunCommand('explorer.exe', [TProcessString.Format('/select,"%s"', [Path])], output) <> True then
raise EFileManagerError.Create('failed to launch explorer.exe /select');
end;

{$endif}

procedure ShowFile(Path: string);
begin
try
if Length(Path) = 0 then exit;

ShowFile_impl(Path);
except
on e: EFileManagerError do begin
DebugLn('error while trying to show %s : %s', [Path, e.Message]);

{ try to do _anything_ at this point }
OpenDocument(ExtractFileDir(Path));
end;
end;
end;

end.
44 changes: 37 additions & 7 deletions main.pas
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ interface
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
fileinfo, winpeimagereader, elfreader, machoreader;
fileinfo, winpeimagereader, elfreader, machoreader, LocalFileManager;

resourcestring
sAll = 'All torrents';
Expand Down Expand Up @@ -2162,17 +2162,47 @@ procedure TMainForm.acNewConnectionExecute(Sender: TObject);
end;

procedure TMainForm.acOpenContainingFolderExecute(Sender: TObject);

function GetCurrentTorrentPath : string;
var
name, downloadDir: variant;
info : TJSONObject;
begin
name := gTorrents.Items[torcolName, gTorrents.Row];
downloadDir := gTorrents.Items[torcolPath, gTorrents.Row];
if (downloadDir <> nil) and (name <> nil) then
Result := string(downloadDir) + '/' + string(name)
else begin
AppBusy;

info := RpcObj.RequestInfo(gTorrents.Items[torcolTorrentId, gTorrents.Row], ['name', 'downloadDir']);
if info <> nil then begin
info := info.Arrays['torrents'].Objects[0];
Result := info.Strings['downloadDir'] + '/' + info.Strings['name'];
end
else
CheckStatus(False);

AppNormal;
end;
end;

var
mapped : string;
begin
if gTorrents.Items.Count = 0 then
exit;
Application.ProcessMessages;
if lvFiles.Focused and (lvFiles.Items.Count > 0) then begin
AppBusy;
ExecRemoteFile(FFilesTree.GetFullPath(lvFiles.Row), not FFilesTree.IsFolder(lvFiles.Row));
AppNormal;
end
if lvFiles.Focused and (lvFiles.Items.Count > 0) then
mapped := MapRemoteToLocal(FFilesTree.GetFullPath(lvFiles.Row))
else
OpenCurrentTorrent(True);
mapped := MapRemoteToLocal(GetCurrentTorrentPath());

if (mapped <> '') and (FileExistsUTF8(mapped) or DirectoryExistsUTF8(mapped)) then
LocalFileManager.ShowFile(mapped)
else if mapped = '' then
MessageDlg(sNoPathMapping, mtInformation, [mbOK], 0);

end;

procedure TMainForm.acOpenFileExecute(Sender: TObject);
Expand Down
7 changes: 6 additions & 1 deletion transgui.lpi
Original file line number Diff line number Diff line change
Expand Up @@ -526,6 +526,11 @@
<IsPartOfProject Value="True"/>
<UnitName Value="ConnOptionsFrames"/>
</Unit>
<Unit>
<Filename Value="localfilemanager.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="LocalFileManager"/>
</Unit>
</Units>
</ProjectOptions>
<CompilerOptions>
Expand Down Expand Up @@ -557,7 +562,7 @@
</CodeGeneration>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf3"/>
<DebugInfoType Value="dsDwarf2"/>
<TrashVariables Value="True"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
Expand Down
4 changes: 2 additions & 2 deletions transgui.lpr
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,11 @@
clocale,
{$endif}
{$endif}
Interfaces, Forms, Main, rpc, AddTorrent,
Interfaces, Forms, Main, rpc, AddTorrent, LazLogger,
ConnOptions, varlist, TorrProps, DaemonOptions, About, IpResolver, download,
ColSetup, utils, ResTranslator, AddLink, MoveTorrent, AddTracker, Options,
passwcon, ConnOptionsTransmissionFrame, ConnOptionsProxyFrame,
ConnOptionsPathsFrame, ConnOptionsMiscFrame, ConnOptionsFrames;
ConnOptionsPathsFrame, ConnOptionsMiscFrame, ConnOptionsFrames, LocalFileManager;

{$R *.res}

Expand Down

0 comments on commit d986f67

Please sign in to comment.