ADD: actions to the GIF Modern ToolBar Items in ViewerForm on macOS 11+

This commit is contained in:
rich2014 2026-05-07 00:02:35 +08:00
commit 75954f00f6
2 changed files with 139 additions and 11 deletions

View file

@ -73,6 +73,8 @@ type
TViewerShowMode = (vsmText, vsmImage, vsmPlugin, vsmCode, vsmFolder);
TViewerGifStates = set of (vgsIsGif, vgsPlaying, vgsPrevFrame, vgsNextFrame);
{ TDrawGrid }
TDrawGrid = class(Grids.TDrawGrid)
@ -538,6 +540,9 @@ type
procedure onShowModeChanged(
const viewer: TfrmViewer;
const mode: TViewerShowMode ); virtual;
procedure onGifStateChanged(
const viewer: TfrmViewer;
const states: TViewerGifStates ); virtual;
end;
procedure ShowViewer(const FilesToView: TStringList; WaitData: TWaitData = nil); overload;
@ -2090,9 +2095,23 @@ begin
end;
procedure TfrmViewer.UpdateAnimState;
var
states: TViewerGifStates;
begin
states:= [vgsIsGif];
if NOT GifAnim.Paused then
Include( states, vgsPlaying );
btnPrevGifFrame.Enabled:= GifAnim.Paused and (GifAnim.CurrentFrameIndex > 0);
if btnPrevGifFrame.Enabled then
Include( states, vgsPrevFrame );
btnNextGifFrame.Enabled:= GifAnim.Paused and (GifAnim.CurrentFrameIndex < GifAnim.FrameCount - 1);
if btnNextGifFrame.Enabled then
Include( states, vgsNextFrame );
viewerFormHandler.onGifStateChanged( self, states );
end;
procedure TfrmViewer.btnPrevGifFrameClick(Sender: TObject);
@ -2530,9 +2549,9 @@ procedure TfrmViewer.btnGifToBmpClick(Sender: TObject);
begin
GifAnim.Pause;
btnGifMove.ImageIndex:= 12;
UpdateAnimState;
Image.Picture.Bitmap:= GifAnim.CurrentView;
cm_SaveAs(['']);
UpdateAnimState;
end;
procedure TfrmViewer.btnPaintHightlight(Sender: TObject);
@ -2942,6 +2961,8 @@ end;
function TfrmViewer.LoadGraphics(const sFileName:String): Boolean;
procedure UpdateToolbar(bImage: Boolean);
var
gifStates: TViewerGifStates;
begin
btnHightlight.Enabled:= bImage and (not miFullScreen.Checked);
btnPaint.Enabled:= bImage and (not miFullScreen.Checked);
@ -2957,6 +2978,12 @@ function TfrmViewer.LoadGraphics(const sFileName:String): Boolean;
btnGifSeparator.Enabled:= not bImage;
btnNextGifFrame.Enabled:= not bImage;
btnPrevGifFrame.Enabled:= not bImage;
if bImage then
gifStates:= []
else
gifStates:= [vgsIsGif];
viewerFormHandler.onGifStateChanged( self, gifStates );
end;
var
@ -4222,6 +4249,12 @@ procedure TViewerFormHandler.onShowModeChanged(
begin
end;
procedure TViewerFormHandler.onGifStateChanged(
const viewer: TfrmViewer;
const states: TViewerGifStates);
begin
end;
initialization
viewerFormHandler:= TViewerFormHandler.Create;
TFormCommands.RegisterCommandsForm(TfrmViewer, HotkeysCategory, @rsHotkeyCategoryViewer);

View file

@ -31,10 +31,15 @@ var
type
{ TCocoaViewerFormHandler }
TCocoaViewerFormHandler = class( TViewerFormHandler )
procedure onShowModeChanged(
const viewer: TfrmViewer;
const mode: TViewerShowMode ); override;
procedure onGifStateChanged(
const viewer: TfrmViewer;
const states: TViewerGifStates); override;
end;
function getCurrentViewerForm: TfrmViewer;
@ -180,6 +185,42 @@ begin
form.cm_MirrorHorz( [] );
end;
procedure viewerGifMoveAction( const Sender: id );
var
form: TfrmViewer;
begin
form:= getCurrentViewerForm;
if Assigned(form) then
form.btnGifMoveClick( nil );
end;
procedure viewerGifPrevAction( const Sender: id );
var
form: TfrmViewer;
begin
form:= getCurrentViewerForm;
if Assigned(form) then
form.btnPrevGifFrameClick( nil );
end;
procedure viewerGifNextAction( const Sender: id );
var
form: TfrmViewer;
begin
form:= getCurrentViewerForm;
if Assigned(form) then
form.btnNextGifFrameClick( nil );
end;
procedure viewerGifExportAction( const Sender: id );
var
form: TfrmViewer;
begin
form:= getCurrentViewerForm;
if Assigned(form) then
form.btnGifToBmpClick( nil );
end;
procedure onViewerGetPenWidthMenu( const menu: TMenu );
var
i: Integer;
@ -208,7 +249,7 @@ const
identifier: 'ViewerForm.Prev';
priority: NSToolbarItemVisibilityPriorityStandard;
navigational: True;
iconName: 'arrow.left';
iconName: 'chevron.left';
title: 'Prev';
tips: 'Prev';
bordered: True;
@ -219,7 +260,7 @@ const
identifier: 'ViewerForm.Next';
priority: NSToolbarItemVisibilityPriorityStandard;
navigational: True;
iconName: 'arrow.right';
iconName: 'chevron.right';
title: 'Next';
tips: 'Next';
bordered: True;
@ -319,44 +360,48 @@ const
identifier: 'ViewerForm.GifMove';
priority: NSToolbarItemVisibilityPriorityStandard;
navigational: False;
iconName: 'play.circle';
appValidates: True;
iconName: 'play.fill';
title: '';
tips: '';
bordered: True;
onAction: nil;
onAction: @viewerGifMoveAction;
);
viewerGifPrevItemConfig: TCocoaConfigToolBarItem = (
identifier: 'ViewerForm.GifPrev';
priority: NSToolbarItemVisibilityPriorityStandard;
navigational: False;
iconName: 'arrow.left.circle';
appValidates: True;
iconName: 'arrow.left';
title: 'GifPrev';
tips: 'GifPrev';
bordered: True;
onAction: nil;
onAction: @viewerGifPrevAction;
);
viewerGifNextItemConfig: TCocoaConfigToolBarItem = (
identifier: 'ViewerForm.GifNext';
priority: NSToolbarItemVisibilityPriorityStandard;
navigational: False;
iconName: 'arrow.right.circle';
appValidates: True;
iconName: 'arrow.right';
title: 'GifNext';
tips: 'GifNext';
bordered: True;
onAction: nil;
onAction: @viewerGifNextAction;
);
viewerGifExportItemConfig: TCocoaConfigToolBarItem = (
identifier: 'ViewerForm.GifExport';
priority: NSToolbarItemVisibilityPriorityStandard;
navigational: False;
iconName: 'arrow.down.circle';
appValidates: True;
iconName: 'arrow.down.circle.fill';
title: 'GifExport';
tips: 'GifExport';
bordered: True;
onAction: nil;
onAction: @viewerGifExportAction;
);
viewerHighLightItemConfig: TCocoaConfigToolBarItem = (
@ -612,3 +657,53 @@ begin
viewerDeattachImageToolBar( viewer )
end;
procedure TCocoaViewerFormHandler.onGifStateChanged(
const viewer: TfrmViewer;
const states: TViewerGifStates);
var
moveEnabled: Boolean;
prevEnabled: Boolean;
nextEnabled: Boolean;
exportEnabled: Boolean;
toolBar: NSToolBar;
item: NSToolBarItem;
moveImageName: String;
moveImage: NSImage;
begin
if vgsIsGif in states then begin
moveEnabled:= True;
prevEnabled:= vgsPrevFrame in states;
nextEnabled:= vgsNextFrame in states;
exportEnabled:= True;
end else begin
moveEnabled:= False;
prevEnabled:= False;
nextEnabled:= False;
exportEnabled:= False;
end;
viewerAttachImageToolBar( viewer );
toolBar:= TCocoaToolBarUtils.getToolBar( viewer );
if toolBar = nil then
Exit;
item:= TCocoaToolBarUtils.findItemByIdentifier( toolBar , 'ViewerForm.GifMove');
item.setEnabled( moveEnabled );
if vgsPlaying in states then
moveImageName:= 'pause.fill'
else
moveImageName:= 'play.fill';
moveImage:= NSImage.imageWithSystemSymbolName_accessibilityDescription(
StringToNSString(moveImageName), nil );
item.setImage( moveImage );
item:= TCocoaToolBarUtils.findItemByIdentifier( toolBar , 'ViewerForm.GifPrev');
item.setEnabled( prevEnabled );
item:= TCocoaToolBarUtils.findItemByIdentifier( toolBar , 'ViewerForm.GifNext');
item.setEnabled( nextEnabled );
item:= TCocoaToolBarUtils.findItemByIdentifier( toolBar , 'ViewerForm.GifExport');
item.setEnabled( exportEnabled );
end;