mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
ADD: split terminal window layout option and smart terminal-panel synchronization
This commit is contained in:
parent
27ca1b3be0
commit
e8ad445cdf
8 changed files with 529 additions and 32 deletions
2
build.sh
2
build.sh
|
|
@ -10,7 +10,7 @@ set -e
|
|||
# release - compile in release mode (using by default)
|
||||
|
||||
# path to lazbuild
|
||||
export lazbuild=$(which lazbuild)
|
||||
export lazbuild="$(which lazbuild) --pcp=$(pwd)/.lazarus --lazarusdir=/usr/lib/lazarus"
|
||||
|
||||
# Set up widgetset: gtk2 or qt or qt5 or cocoa
|
||||
# Set up processor architecture: i386 or x86_64
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ type
|
|||
function WriteStr(const Str: string): Integer; override;
|
||||
function SetCurrentDir(const Path: String): Boolean; override;
|
||||
function SetScreenSize(aCols, aRows: Integer): Boolean; override;
|
||||
function GetChildPid: THandle; override;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
|
@ -217,5 +218,10 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function TPtyDevice.GetChildPid: THandle;
|
||||
begin
|
||||
Result := FChildPid;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
|
|
|||
|
|
@ -43,6 +43,8 @@ type
|
|||
function WriteStr(const Str: string): Integer; virtual; abstract;
|
||||
function SetCurrentDir(const Path: String): Boolean; virtual; abstract;
|
||||
function SetScreenSize(aCols, aRows: Integer): Boolean; virtual; abstract;
|
||||
function GetChildPid: THandle; virtual; abstract;
|
||||
property ChildPid: THandle read GetChildPid;
|
||||
property OnRxBuf: TOnRxBuf read FOnRxBuf write FOnRxBuf;
|
||||
property Connected: Boolean read FConnected write SetConnected default False;
|
||||
end;
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ type
|
|||
function WriteStr(const Str: string): Integer; override;
|
||||
function SetCurrentDir(const Path: String): Boolean; override;
|
||||
function SetScreenSize(aCols, aRows: Integer): Boolean; override;
|
||||
function GetChildPid: THandle; override;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
|
@ -470,5 +471,10 @@ end;
|
|||
initialization
|
||||
Initialize;
|
||||
|
||||
function TPtyDevice.GetChildPid: THandle;
|
||||
begin
|
||||
Result := 0; // Not fully implemented for Windows pseudo console here
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
|
|
|
|||
507
src/fmain.pas
507
src/fmain.pas
|
|
@ -1,4 +1,4 @@
|
|||
{
|
||||
{
|
||||
Double Commander
|
||||
-------------------------------------------------------------------------
|
||||
Licence : GNU GPL v 2.0
|
||||
|
|
@ -723,6 +723,15 @@ type
|
|||
HidingTrayIcon: Boolean; // @true if the icon is in the process of hiding
|
||||
nbLeft, nbRight: TFileViewNotebook;
|
||||
cmdConsole: TVirtualTerminal;
|
||||
pnlTermContainerLeft, pnlTermContainerRight: TPanel;
|
||||
tlbTermLeft, tlbTermRight: TPanel;
|
||||
cmdConsoleLeft, cmdConsoleRight: TVirtualTerminal;
|
||||
splitTermLeft, splitTermRight: TSplitter;
|
||||
btnTermLinkLeft, btnTermDirLeft: TSpeedButton;
|
||||
btnTermLinkRight, btnTermDirRight: TSpeedButton;
|
||||
FTerminalSyncTimer: TTimer;
|
||||
FLastTermCwdLeft: String;
|
||||
FLastTermCwdRight: String;
|
||||
FCommands: TMainCommands;
|
||||
FInitializedView: Boolean;
|
||||
{en
|
||||
|
|
@ -756,6 +765,12 @@ type
|
|||
FDelayedEventCtr: Integer;
|
||||
FDelayedWMMove, FDelayedWMSize: Boolean;
|
||||
|
||||
function GetActivePtyDevice: TCustomPtyDevice;
|
||||
function GetActiveConsole: TVirtualTerminal;
|
||||
procedure TerminalSyncTimerTimer(Sender: TObject);
|
||||
procedure TermLinkButtonClick(Sender: TObject);
|
||||
procedure TermDirButtonClick(Sender: TObject);
|
||||
procedure UpdateTermSyncButtons(AIsLeft: Boolean);
|
||||
procedure DelayedEvent(Data: PtrInt);
|
||||
|
||||
procedure CheckCommandLine(ShiftEx: TShiftState; var Key: Word);
|
||||
|
|
@ -952,6 +967,8 @@ var
|
|||
frmMain: TfrmMain;
|
||||
onFileViewUpdated: TFileViewUpdatedHandler;
|
||||
Cons: TCustomPtyDevice = nil;
|
||||
ConsLeft: TCustomPtyDevice = nil;
|
||||
ConsRight: TCustomPtyDevice = nil;
|
||||
|
||||
implementation
|
||||
|
||||
|
|
@ -972,6 +989,9 @@ uses
|
|||
uColumnsFileView, dmHigh, uFileSourceOperationMisc
|
||||
{$IFDEF MSWINDOWS}
|
||||
, uShellFileSource, uNetworkThread
|
||||
{$ENDIF}
|
||||
{$IF DEFINED(UNIX) and not DEFINED(DARWIN)}
|
||||
, BaseUnix
|
||||
{$ENDIF}
|
||||
;
|
||||
|
||||
|
|
@ -4871,11 +4891,22 @@ begin
|
|||
if Assigned(onFileViewUpdated) then
|
||||
onFileViewUpdated(FileView);
|
||||
|
||||
{if (fspDirectAccess in FileView.FileSource.GetProperties) then
|
||||
if (fspDirectAccess in FileView.FileSource.GetProperties) then
|
||||
begin
|
||||
if gTermWindow and gTermWindowSplit then
|
||||
begin
|
||||
if gTermWindow and Assigned(Cons) then
|
||||
Cons.Terminal.SetCurrentDir(FileView.CurrentPath);
|
||||
end;}
|
||||
if (TFileViewPage(FileView.NotebookPage).Notebook = nbLeft) and Assigned(ConsLeft) then
|
||||
begin
|
||||
if gTermSyncModeLeft = 1 then
|
||||
ConsLeft.SetCurrentDir(FileView.CurrentPath);
|
||||
end
|
||||
else if (TFileViewPage(FileView.NotebookPage).Notebook = nbRight) and Assigned(ConsRight) then
|
||||
begin
|
||||
if gTermSyncModeRight = 1 then
|
||||
ConsRight.SetCurrentDir(FileView.CurrentPath);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
|
@ -4919,7 +4950,20 @@ begin
|
|||
FileView.SetFocus;
|
||||
if (fspDirectAccess in FileView.FileSource.GetProperties) then
|
||||
begin
|
||||
if gTermWindow and Assigned(Cons) then
|
||||
if gTermWindow and gTermWindowSplit then
|
||||
begin
|
||||
if (TFileViewPage(FileView.NotebookPage).Notebook = nbLeft) and Assigned(ConsLeft) then
|
||||
begin
|
||||
if gTermSyncModeLeft = 1 then
|
||||
ConsLeft.SetCurrentDir(FileView.CurrentPath);
|
||||
end
|
||||
else if (TFileViewPage(FileView.NotebookPage).Notebook = nbRight) and Assigned(ConsRight) then
|
||||
begin
|
||||
if gTermSyncModeRight = 1 then
|
||||
ConsRight.SetCurrentDir(FileView.CurrentPath);
|
||||
end;
|
||||
end
|
||||
else if gTermWindow and Assigned(Cons) then
|
||||
Cons.SetCurrentDir(FileView.CurrentPath);
|
||||
end;
|
||||
end;
|
||||
|
|
@ -5461,37 +5505,434 @@ begin
|
|||
end; // if Destination<>tclNone then
|
||||
end;
|
||||
|
||||
procedure TfrmMain.TerminalSyncTimerTimer(Sender: TObject);
|
||||
var
|
||||
Target: AnsiString;
|
||||
begin
|
||||
if not gTermWindowSplit then Exit;
|
||||
|
||||
if Assigned(ConsLeft) and (gTermSyncModeLeft = 2) then
|
||||
begin
|
||||
{$IF DEFINED(UNIX) and not DEFINED(DARWIN)}
|
||||
Target := fpReadLink('/proc/' + IntToStr(ConsLeft.ChildPid) + '/cwd');
|
||||
if Target <> FLastTermCwdLeft then
|
||||
begin
|
||||
FLastTermCwdLeft := Target;
|
||||
if (Target <> '') and (Target <> nbLeft.ActivePage.FileView.CurrentPath) then
|
||||
begin
|
||||
nbLeft.ActivePage.FileView.CurrentPath := Target;
|
||||
end;
|
||||
end;
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
if Assigned(ConsRight) and (gTermSyncModeRight = 2) then
|
||||
begin
|
||||
{$IF DEFINED(UNIX) and not DEFINED(DARWIN)}
|
||||
Target := fpReadLink('/proc/' + IntToStr(ConsRight.ChildPid) + '/cwd');
|
||||
if Target <> FLastTermCwdRight then
|
||||
begin
|
||||
FLastTermCwdRight := Target;
|
||||
if (Target <> '') and (Target <> nbRight.ActivePage.FileView.CurrentPath) then
|
||||
begin
|
||||
nbRight.ActivePage.FileView.CurrentPath := Target;
|
||||
end;
|
||||
end;
|
||||
{$ENDIF}
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.UpdateTermSyncButtons(AIsLeft: Boolean);
|
||||
var
|
||||
BtnLink, BtnDir: TSpeedButton;
|
||||
SyncMode: Integer;
|
||||
begin
|
||||
if AIsLeft then
|
||||
begin
|
||||
BtnLink := btnTermLinkLeft;
|
||||
BtnDir := btnTermDirLeft;
|
||||
SyncMode := gTermSyncModeLeft;
|
||||
end
|
||||
else
|
||||
begin
|
||||
BtnLink := btnTermLinkRight;
|
||||
BtnDir := btnTermDirRight;
|
||||
SyncMode := gTermSyncModeRight;
|
||||
end;
|
||||
|
||||
if not Assigned(BtnLink) or not Assigned(BtnDir) then Exit;
|
||||
|
||||
// Set Down states based on SyncMode
|
||||
case SyncMode of
|
||||
1: // Panel to Terminal
|
||||
begin
|
||||
BtnLink.Down := True;
|
||||
BtnDir.Down := False;
|
||||
end;
|
||||
2: // Terminal to Panel
|
||||
begin
|
||||
BtnLink.Down := True;
|
||||
BtnDir.Down := True;
|
||||
end;
|
||||
else // Detached
|
||||
begin
|
||||
BtnLink.Down := False;
|
||||
end;
|
||||
end;
|
||||
|
||||
// Update Captions and Hints
|
||||
if BtnLink.Down then
|
||||
begin
|
||||
BtnLink.Caption := #$F0#$9F#$94#$97; // '🔗' (Link)
|
||||
BtnLink.Hint := 'Link Enabled (Click to Unlink)';
|
||||
end
|
||||
else
|
||||
begin
|
||||
BtnLink.Caption := #$E2#$9B#$93#$EF#$B8#$8F#$E2#$80#$8D#$F0#$9F#$92#$A5; // '⛓️💥' (Broken Chain / Unlink)
|
||||
BtnLink.Hint := 'Link Disabled (Click to Link)';
|
||||
end;
|
||||
|
||||
if BtnDir.Down then
|
||||
begin
|
||||
BtnDir.Caption := #$F0#$9F#$A1#$85; // '🡅' (Arrow Up)
|
||||
BtnDir.Hint := 'Sync Direction: Terminal to Panel (Click to change)';
|
||||
end
|
||||
else
|
||||
begin
|
||||
BtnDir.Caption := #$F0#$9F#$A1#$87; // '🡇' (Arrow Down)
|
||||
BtnDir.Hint := 'Sync Direction: Panel to Terminal (Click to change)';
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.TermLinkButtonClick(Sender: TObject);
|
||||
var
|
||||
IsLeft: Boolean;
|
||||
BtnLink, BtnDir: TSpeedButton;
|
||||
begin
|
||||
IsLeft := (Sender = btnTermLinkLeft);
|
||||
if IsLeft then
|
||||
begin
|
||||
BtnLink := btnTermLinkLeft;
|
||||
BtnDir := btnTermDirLeft;
|
||||
end
|
||||
else
|
||||
begin
|
||||
BtnLink := btnTermLinkRight;
|
||||
BtnDir := btnTermDirRight;
|
||||
end;
|
||||
|
||||
if BtnLink.Down then
|
||||
begin
|
||||
// If Link was turned ON, determine state from Direction button
|
||||
if BtnDir.Down then
|
||||
begin
|
||||
if IsLeft then gTermSyncModeLeft := 2 else gTermSyncModeRight := 2;
|
||||
end
|
||||
else
|
||||
begin
|
||||
if IsLeft then gTermSyncModeLeft := 1 else gTermSyncModeRight := 1;
|
||||
end;
|
||||
|
||||
// Initialize/sync immediately when turned on
|
||||
if IsLeft then
|
||||
begin
|
||||
if (gTermSyncModeLeft = 1) and Assigned(ConsLeft) then
|
||||
ConsLeft.SetCurrentDir(nbLeft.ActivePage.FileView.CurrentPath)
|
||||
else if (gTermSyncModeLeft = 2) and Assigned(ConsLeft) then
|
||||
FLastTermCwdLeft := ''; // Force polling timer to sync CWD immediately
|
||||
end
|
||||
else
|
||||
begin
|
||||
if (gTermSyncModeRight = 1) and Assigned(ConsRight) then
|
||||
ConsRight.SetCurrentDir(nbRight.ActivePage.FileView.CurrentPath)
|
||||
else if (gTermSyncModeRight = 2) and Assigned(ConsRight) then
|
||||
FLastTermCwdRight := '';
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
// Link turned OFF
|
||||
if IsLeft then gTermSyncModeLeft := 0 else gTermSyncModeRight := 0;
|
||||
end;
|
||||
|
||||
UpdateTermSyncButtons(IsLeft);
|
||||
end;
|
||||
|
||||
procedure TfrmMain.TermDirButtonClick(Sender: TObject);
|
||||
var
|
||||
IsLeft: Boolean;
|
||||
BtnLink, BtnDir: TSpeedButton;
|
||||
begin
|
||||
IsLeft := (Sender = btnTermDirLeft);
|
||||
if IsLeft then
|
||||
begin
|
||||
BtnLink := btnTermLinkLeft;
|
||||
BtnDir := btnTermDirLeft;
|
||||
end
|
||||
else
|
||||
begin
|
||||
BtnLink := btnTermLinkRight;
|
||||
BtnDir := btnTermDirRight;
|
||||
end;
|
||||
|
||||
// If Link is ON, update sync mode and trigger immediate sync
|
||||
if BtnLink.Down then
|
||||
begin
|
||||
if BtnDir.Down then
|
||||
begin
|
||||
if IsLeft then gTermSyncModeLeft := 2 else gTermSyncModeRight := 2;
|
||||
// Sync immediately: Terminal to Panel
|
||||
if IsLeft then FLastTermCwdLeft := '' else FLastTermCwdRight := '';
|
||||
end
|
||||
else
|
||||
begin
|
||||
if IsLeft then gTermSyncModeLeft := 1 else gTermSyncModeRight := 1;
|
||||
// Sync immediately: Panel to Terminal
|
||||
if IsLeft then
|
||||
begin
|
||||
if Assigned(ConsLeft) then
|
||||
ConsLeft.SetCurrentDir(nbLeft.ActivePage.FileView.CurrentPath);
|
||||
end
|
||||
else
|
||||
begin
|
||||
if Assigned(ConsRight) then
|
||||
ConsRight.SetCurrentDir(nbRight.ActivePage.FileView.CurrentPath);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
UpdateTermSyncButtons(IsLeft);
|
||||
end;
|
||||
|
||||
function TfrmMain.GetActivePtyDevice: TCustomPtyDevice;
|
||||
begin
|
||||
if gTermWindow and gTermWindowSplit then
|
||||
begin
|
||||
if TFileViewPage(ActiveFrame.NotebookPage).Notebook = nbLeft then
|
||||
Result := ConsLeft
|
||||
else
|
||||
Result := ConsRight;
|
||||
end
|
||||
else if gTermWindow then
|
||||
Result := Cons
|
||||
else
|
||||
Result := nil;
|
||||
end;
|
||||
|
||||
function TfrmMain.GetActiveConsole: TVirtualTerminal;
|
||||
begin
|
||||
if gTermWindow and gTermWindowSplit then
|
||||
begin
|
||||
if TFileViewPage(ActiveFrame.NotebookPage).Notebook = nbLeft then
|
||||
Result := cmdConsoleLeft
|
||||
else
|
||||
Result := cmdConsoleRight;
|
||||
end
|
||||
else if gTermWindow then
|
||||
Result := cmdConsole
|
||||
else
|
||||
Result := nil;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.ToggleConsole;
|
||||
begin
|
||||
if gTermWindow then
|
||||
if gTermWindow and gTermWindowSplit then
|
||||
begin
|
||||
// Split terminals enabled
|
||||
if not Assigned(pnlTermContainerLeft) then
|
||||
begin
|
||||
if not Assigned(cmdConsole) then
|
||||
begin
|
||||
cmdConsole:= TVirtualTerminal.Create(pgConsole);
|
||||
cmdConsole.Parent:= pgConsole;
|
||||
cmdConsole.Align:= alClient;
|
||||
cmdConsole.ShowHint:= False;
|
||||
end;
|
||||
FontOptionsToFont(gFonts[dcfConsole], cmdConsole.Font); //We set the font here because if we're coming back from configuration the font in options, we'll later pass here to affect that font if ever displayed.
|
||||
if not Assigned(Cons) then
|
||||
begin
|
||||
Cons:= TPtyDevice.Create(Self);
|
||||
cmdConsole.PtyDevice:= Cons;
|
||||
Cons.Connected:= True;
|
||||
end;
|
||||
end
|
||||
else
|
||||
pnlTermContainerLeft := TPanel.Create(Self);
|
||||
pnlTermContainerLeft.Parent := pnlLeft;
|
||||
pnlTermContainerLeft.Align := alBottom;
|
||||
pnlTermContainerLeft.Height := 200;
|
||||
pnlTermContainerLeft.BevelOuter := bvNone;
|
||||
|
||||
splitTermLeft := TSplitter.Create(Self);
|
||||
splitTermLeft.Parent := pnlLeft;
|
||||
splitTermLeft.Align := alBottom;
|
||||
splitTermLeft.Height := 5;
|
||||
splitTermLeft.ResizeAnchor := akBottom;
|
||||
|
||||
tlbTermLeft := TPanel.Create(Self);
|
||||
tlbTermLeft.Parent := pnlTermContainerLeft;
|
||||
tlbTermLeft.Align := alTop;
|
||||
tlbTermLeft.Height := 24;
|
||||
tlbTermLeft.BevelOuter := bvNone;
|
||||
|
||||
btnTermLinkLeft := TSpeedButton.Create(Self);
|
||||
btnTermLinkLeft.Parent := tlbTermLeft;
|
||||
btnTermLinkLeft.Align := alLeft;
|
||||
btnTermLinkLeft.Width := 36;
|
||||
btnTermLinkLeft.ShowHint := True;
|
||||
btnTermLinkLeft.GroupIndex := 10;
|
||||
btnTermLinkLeft.AllowAllUp := True;
|
||||
btnTermLinkLeft.Flat := gInterfaceFlat;
|
||||
btnTermLinkLeft.OnClick := @TermLinkButtonClick;
|
||||
|
||||
btnTermDirLeft := TSpeedButton.Create(Self);
|
||||
btnTermDirLeft.Parent := tlbTermLeft;
|
||||
btnTermDirLeft.Align := alLeft;
|
||||
btnTermDirLeft.Width := 36;
|
||||
btnTermDirLeft.ShowHint := True;
|
||||
btnTermDirLeft.GroupIndex := 11;
|
||||
btnTermDirLeft.AllowAllUp := True;
|
||||
btnTermDirLeft.Flat := gInterfaceFlat;
|
||||
btnTermDirLeft.OnClick := @TermDirButtonClick;
|
||||
|
||||
// Initialize the button states and captions/hints based on the loaded sync mode
|
||||
UpdateTermSyncButtons(True);
|
||||
|
||||
cmdConsoleLeft := TVirtualTerminal.Create(pnlTermContainerLeft);
|
||||
cmdConsoleLeft.Parent := pnlTermContainerLeft;
|
||||
cmdConsoleLeft.Align := alClient;
|
||||
cmdConsoleLeft.ShowHint := False;
|
||||
end;
|
||||
FontOptionsToFont(gFonts[dcfConsole], cmdConsoleLeft.Font);
|
||||
if not Assigned(ConsLeft) then
|
||||
begin
|
||||
if Assigned(cmdConsole) then
|
||||
begin
|
||||
cmdConsole.Hide;
|
||||
FreeAndNil(cmdConsole);
|
||||
end;
|
||||
FreeAndNil(Cons);
|
||||
ConsLeft := TPtyDevice.Create(Self);
|
||||
cmdConsoleLeft.PtyDevice := ConsLeft;
|
||||
ConsLeft.Connected := True;
|
||||
end;
|
||||
|
||||
nbConsole.Visible:= gTermWindow;
|
||||
ConsoleSplitter.Visible:= gTermWindow;
|
||||
if not Assigned(pnlTermContainerRight) then
|
||||
begin
|
||||
pnlTermContainerRight := TPanel.Create(Self);
|
||||
pnlTermContainerRight.Parent := pnlRight;
|
||||
pnlTermContainerRight.Align := alBottom;
|
||||
pnlTermContainerRight.Height := 200;
|
||||
pnlTermContainerRight.BevelOuter := bvNone;
|
||||
|
||||
splitTermRight := TSplitter.Create(Self);
|
||||
splitTermRight.Parent := pnlRight;
|
||||
splitTermRight.Align := alBottom;
|
||||
splitTermRight.Height := 5;
|
||||
splitTermRight.ResizeAnchor := akBottom;
|
||||
|
||||
tlbTermRight := TPanel.Create(Self);
|
||||
tlbTermRight.Parent := pnlTermContainerRight;
|
||||
tlbTermRight.Align := alTop;
|
||||
tlbTermRight.Height := 24;
|
||||
tlbTermRight.BevelOuter := bvNone;
|
||||
|
||||
btnTermLinkRight := TSpeedButton.Create(Self);
|
||||
btnTermLinkRight.Parent := tlbTermRight;
|
||||
btnTermLinkRight.Align := alLeft;
|
||||
btnTermLinkRight.Width := 36;
|
||||
btnTermLinkRight.ShowHint := True;
|
||||
btnTermLinkRight.GroupIndex := 20;
|
||||
btnTermLinkRight.AllowAllUp := True;
|
||||
btnTermLinkRight.Flat := gInterfaceFlat;
|
||||
btnTermLinkRight.OnClick := @TermLinkButtonClick;
|
||||
|
||||
btnTermDirRight := TSpeedButton.Create(Self);
|
||||
btnTermDirRight.Parent := tlbTermRight;
|
||||
btnTermDirRight.Align := alLeft;
|
||||
btnTermDirRight.Width := 36;
|
||||
btnTermDirRight.ShowHint := True;
|
||||
btnTermDirRight.GroupIndex := 21;
|
||||
btnTermDirRight.AllowAllUp := True;
|
||||
btnTermDirRight.Flat := gInterfaceFlat;
|
||||
btnTermDirRight.OnClick := @TermDirButtonClick;
|
||||
|
||||
// Initialize the button states and captions/hints based on the loaded sync mode
|
||||
UpdateTermSyncButtons(False);
|
||||
|
||||
cmdConsoleRight := TVirtualTerminal.Create(pnlTermContainerRight);
|
||||
cmdConsoleRight.Parent := pnlTermContainerRight;
|
||||
cmdConsoleRight.Align := alClient;
|
||||
cmdConsoleRight.ShowHint := False;
|
||||
end;
|
||||
FontOptionsToFont(gFonts[dcfConsole], cmdConsoleRight.Font);
|
||||
if not Assigned(ConsRight) then
|
||||
begin
|
||||
ConsRight := TPtyDevice.Create(Self);
|
||||
cmdConsoleRight.PtyDevice := ConsRight;
|
||||
ConsRight.Connected := True;
|
||||
end;
|
||||
|
||||
pnlTermContainerLeft.Visible := True;
|
||||
splitTermLeft.Visible := True;
|
||||
pnlTermContainerRight.Visible := True;
|
||||
splitTermRight.Visible := True;
|
||||
|
||||
// Start polling timer for terminal-to-panel sync
|
||||
if not Assigned(FTerminalSyncTimer) then
|
||||
begin
|
||||
FTerminalSyncTimer := TTimer.Create(Self);
|
||||
FTerminalSyncTimer.Interval := 1000;
|
||||
FTerminalSyncTimer.OnTimer := @TerminalSyncTimerTimer;
|
||||
end;
|
||||
FTerminalSyncTimer.Enabled := True;
|
||||
|
||||
// Destroy single terminal if it exists
|
||||
if Assigned(cmdConsole) then
|
||||
begin
|
||||
cmdConsole.Hide;
|
||||
FreeAndNil(cmdConsole);
|
||||
end;
|
||||
FreeAndNil(Cons);
|
||||
nbConsole.Visible := False;
|
||||
ConsoleSplitter.Visible := False;
|
||||
end
|
||||
else if gTermWindow and not gTermWindowSplit then
|
||||
begin
|
||||
// Single terminal enabled
|
||||
if not Assigned(cmdConsole) then
|
||||
begin
|
||||
cmdConsole:= TVirtualTerminal.Create(pgConsole);
|
||||
cmdConsole.Parent:= pgConsole;
|
||||
cmdConsole.Align:= alClient;
|
||||
cmdConsole.ShowHint:= False;
|
||||
end;
|
||||
FontOptionsToFont(gFonts[dcfConsole], cmdConsole.Font); //We set the font here because if we're coming back from configuration the font in options, we'll later pass here to affect that font if ever displayed.
|
||||
if not Assigned(Cons) then
|
||||
begin
|
||||
Cons:= TPtyDevice.Create(Self);
|
||||
cmdConsole.PtyDevice:= Cons;
|
||||
Cons.Connected:= True;
|
||||
end;
|
||||
nbConsole.Visible := True;
|
||||
ConsoleSplitter.Visible := True;
|
||||
|
||||
// Stop polling timer when using single terminal
|
||||
if Assigned(FTerminalSyncTimer) then
|
||||
FTerminalSyncTimer.Enabled := False;
|
||||
|
||||
// Hide/destroy split terminals
|
||||
if Assigned(pnlTermContainerLeft) then
|
||||
begin
|
||||
pnlTermContainerLeft.Visible := False;
|
||||
splitTermLeft.Visible := False;
|
||||
pnlTermContainerRight.Visible := False;
|
||||
splitTermRight.Visible := False;
|
||||
end;
|
||||
if Assigned(FTerminalSyncTimer) then
|
||||
FTerminalSyncTimer.Enabled := False;
|
||||
end
|
||||
else
|
||||
begin
|
||||
// No terminal enabled
|
||||
if Assigned(cmdConsole) then
|
||||
begin
|
||||
cmdConsole.Hide;
|
||||
FreeAndNil(cmdConsole);
|
||||
end;
|
||||
FreeAndNil(Cons);
|
||||
nbConsole.Visible := False;
|
||||
ConsoleSplitter.Visible := False;
|
||||
|
||||
// Hide split terminals
|
||||
if Assigned(pnlTermContainerLeft) then
|
||||
begin
|
||||
pnlTermContainerLeft.Visible := False;
|
||||
splitTermLeft.Visible := False;
|
||||
pnlTermContainerRight.Visible := False;
|
||||
splitTermRight.Visible := False;
|
||||
end;
|
||||
if Assigned(FTerminalSyncTimer) then
|
||||
FTerminalSyncTimer.Enabled := False;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.ShowOptionsLayout(Data: PtrInt);
|
||||
|
|
@ -5506,6 +5947,10 @@ begin
|
|||
if MessageDlg(rsMsgTerminalDisabled, mtWarning, [mbYes, mbNo], 0, mbYes) = mrYes then
|
||||
Application.QueueAsyncCall(@ShowOptionsLayout, 0);
|
||||
end
|
||||
else if gTermWindowSplit then
|
||||
begin
|
||||
// Fullscreen toggle not currently supported for split terminals
|
||||
end
|
||||
else if nbConsole.Height < (nbConsole.Height + pnlNotebooks.Height - 1) then
|
||||
begin
|
||||
nbConsole.Height := nbConsole.Height + pnlNotebooks.Height;
|
||||
|
|
|
|||
|
|
@ -190,8 +190,22 @@ inherited frmOptionsLayout: TfrmOptionsLayout
|
|||
Width = 152
|
||||
BorderSpacing.Top = 2
|
||||
Caption = 'Show te&rminal window'
|
||||
OnChange = cbTermWindowChange
|
||||
TabOrder = 18
|
||||
end
|
||||
object cbTermSplit: TCheckBox
|
||||
AnchorSideLeft.Control = cbTermWindow
|
||||
AnchorSideTop.Control = cbTermWindow
|
||||
AnchorSideTop.Side = asrBottom
|
||||
Left = 28
|
||||
Height = 22
|
||||
Top = 460
|
||||
Width = 320
|
||||
BorderSpacing.Left = 16
|
||||
BorderSpacing.Top = 2
|
||||
Caption = 'Show separate terminal under each file panel'
|
||||
TabOrder = 19
|
||||
end
|
||||
object cbFreespaceInd: TCheckBox
|
||||
AnchorSideTop.Control = cbShowShortDriveFreeSpace
|
||||
AnchorSideTop.Side = asrBottom
|
||||
|
|
@ -204,26 +218,26 @@ inherited frmOptionsLayout: TfrmOptionsLayout
|
|||
TabOrder = 9
|
||||
end
|
||||
object cbProgInMenuBar: TCheckBox
|
||||
AnchorSideTop.Control = cbTermWindow
|
||||
AnchorSideTop.Control = cbTermSplit
|
||||
AnchorSideTop.Side = asrBottom
|
||||
Left = 12
|
||||
Height = 22
|
||||
Top = 460
|
||||
Top = 484
|
||||
Width = 236
|
||||
BorderSpacing.Top = 2
|
||||
Caption = 'Show common progress in menu bar'
|
||||
TabOrder = 19
|
||||
TabOrder = 20
|
||||
end
|
||||
object cbPanelOfOperations: TCheckBox
|
||||
AnchorSideTop.Control = cbProgInMenuBar
|
||||
AnchorSideTop.Side = asrBottom
|
||||
Left = 12
|
||||
Height = 22
|
||||
Top = 484
|
||||
Top = 508
|
||||
Width = 248
|
||||
BorderSpacing.Top = 2
|
||||
Caption = 'Show panel of operation in background'
|
||||
TabOrder = 20
|
||||
TabOrder = 21
|
||||
end
|
||||
object cbShowDriveFreeSpace: TCheckBox
|
||||
AnchorSideTop.Control = cbShowDrivesListButton
|
||||
|
|
|
|||
|
|
@ -53,12 +53,14 @@ type
|
|||
cbShowTabHeader: TCheckBox;
|
||||
cbShowTabs: TCheckBox;
|
||||
cbTermWindow: TCheckBox;
|
||||
cbTermSplit: TCheckBox;
|
||||
cbTwoDiskPanels: TCheckBox;
|
||||
cbShowShortDriveFreeSpace: TCheckBox;
|
||||
chkShowMiddleToolBar: TCheckBox;
|
||||
gbScreenLayout: TGroupBox;
|
||||
procedure cbShowDiskPanelChange(Sender: TObject);
|
||||
procedure cbShowDriveFreeSpaceChange(Sender: TObject);
|
||||
procedure cbTermWindowChange(Sender: TObject);
|
||||
protected
|
||||
procedure Load; override;
|
||||
function Save: TOptionsEditorSaveFlags; override;
|
||||
|
|
@ -88,6 +90,12 @@ begin
|
|||
if not(cbShowDriveFreeSpace.Checked) then cbShowShortDriveFreeSpace.Checked:= false;
|
||||
end;
|
||||
|
||||
procedure TfrmOptionsLayout.cbTermWindowChange(Sender: TObject);
|
||||
begin
|
||||
cbTermSplit.Enabled := cbTermWindow.Checked;
|
||||
if not(cbTermWindow.Checked) then cbTermSplit.Checked := False;
|
||||
end;
|
||||
|
||||
class function TfrmOptionsLayout.GetIconIndex: Integer;
|
||||
begin
|
||||
Result := 7;
|
||||
|
|
@ -116,6 +124,8 @@ begin
|
|||
cbFlatInterface.Checked := gInterfaceFlat;
|
||||
cbLogWindow.Checked := gLogWindow;
|
||||
cbTermWindow.Checked := gTermWindow;
|
||||
cbTermSplit.Checked := gTermWindowSplit;
|
||||
cbTermSplit.Enabled := gTermWindow;
|
||||
cbShowDriveFreeSpace.Checked := gDriveFreeSpace;
|
||||
cbFreespaceInd.Checked := gDriveInd;
|
||||
cbProgInMenuBar.Checked := gProgInMenuBar;
|
||||
|
|
@ -143,6 +153,7 @@ begin
|
|||
gInterfaceFlat := cbFlatInterface.Checked;
|
||||
gLogWindow := cbLogWindow.Checked;
|
||||
gTermWindow := cbTermWindow.Checked;
|
||||
gTermWindowSplit := cbTermSplit.Checked;
|
||||
gDriveFreeSpace := cbShowDriveFreeSpace.Checked;
|
||||
gDriveInd := cbFreespaceInd.Checked;
|
||||
gProgInMenuBar := cbProgInMenuBar.Checked;
|
||||
|
|
|
|||
|
|
@ -298,6 +298,7 @@ var
|
|||
gCmdLine,
|
||||
gLogWindow,
|
||||
gTermWindow,
|
||||
gTermWindowSplit,
|
||||
gKeyButtons,
|
||||
gInterfaceFlat,
|
||||
gDriveInd,
|
||||
|
|
@ -310,6 +311,9 @@ var
|
|||
gShortFormatDriveInfo: Boolean;
|
||||
gDrivesListButtonOptions: TDrivesListButtonOptions;
|
||||
gSeparateTree: Boolean;
|
||||
// 0 = Detach, 1 = Sync Panel->Terminal, 2 = Sync Terminal->Panel
|
||||
gTermSyncModeLeft: Integer;
|
||||
gTermSyncModeRight: Integer;
|
||||
|
||||
{ Toolbar }
|
||||
gMiddleToolBarFlat,
|
||||
|
|
@ -2023,6 +2027,9 @@ begin
|
|||
gCmdLine := True;
|
||||
gLogWindow := False;
|
||||
gTermWindow := False;
|
||||
gTermWindowSplit := False;
|
||||
gTermSyncModeLeft := 0; // Detach
|
||||
gTermSyncModeRight := 0; // Detach
|
||||
gKeyButtons := True;
|
||||
gInterfaceFlat := True;
|
||||
gDriveInd := False;
|
||||
|
|
@ -2958,6 +2965,9 @@ begin
|
|||
gCmdLine := GetValue(Node, 'CmdLine', gCmdLine);
|
||||
gLogWindow := GetValue(Node, 'LogWindow', gLogWindow);
|
||||
gTermWindow := GetValue(Node, 'TermWindow', gTermWindow);
|
||||
gTermWindowSplit := GetValue(Node, 'TermWindowSplit', gTermWindowSplit);
|
||||
gTermSyncModeLeft := GetValue(Node, 'TermSyncModeLeft', gTermSyncModeLeft);
|
||||
gTermSyncModeRight := GetValue(Node, 'TermSyncModeRight', gTermSyncModeRight);
|
||||
gKeyButtons := GetValue(Node, 'KeyButtons', gKeyButtons);
|
||||
gInterfaceFlat := GetValue(Node, 'InterfaceFlat', gInterfaceFlat);
|
||||
gDriveFreeSpace := GetValue(Node, 'DriveFreeSpace', gDriveFreeSpace);
|
||||
|
|
@ -3675,6 +3685,9 @@ begin
|
|||
SetValue(Node, 'CmdLine', gCmdLine);
|
||||
SetValue(Node, 'LogWindow', gLogWindow);
|
||||
SetValue(Node, 'TermWindow', gTermWindow);
|
||||
SetValue(Node, 'TermWindowSplit', gTermWindowSplit);
|
||||
SetValue(Node, 'TermSyncModeLeft', gTermSyncModeLeft);
|
||||
SetValue(Node, 'TermSyncModeRight', gTermSyncModeRight);
|
||||
SetValue(Node, 'KeyButtons', gKeyButtons);
|
||||
SetValue(Node, 'InterfaceFlat', gInterfaceFlat);
|
||||
SetValue(Node, 'DriveFreeSpace', gDriveFreeSpace);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue