Skip to content
This repository has been archived by the owner on Jan 5, 2023. It is now read-only.

Commit

Permalink
Added Refresh method to work around crash caused by RecreateMenu
Browse files Browse the repository at this point in the history
  • Loading branch information
DelphiWorlds committed May 5, 2020
1 parent f00af08 commit 6b2ffe1
Showing 1 changed file with 41 additions and 3 deletions.
44 changes: 41 additions & 3 deletions Core/DW.StatusBarMenu.Mac.pas
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ TMacOSMenuItem = class(TOCLocal)
procedure CreateMenuItem(const AMenu: NSMenu; const AItem: TMenuItem);
function GetSubMenu: NSMenu;
protected
procedure Refresh;
property FMXItem: TMenuItem read FFMXItem;
property StatusBarMenu: TStatusBarMenu read FStatusBarMenu;
property SubMenu: NSMenu read GetSubMenu;
Expand Down Expand Up @@ -66,6 +67,7 @@ TStatusBarMenu = class(TComponent)
procedure ClearMenuItems;
procedure RemoveStatusItem;
procedure SetPopupMenu(const Value: TPopupMenu);
procedure UpdateMenuItem(const AItem: TMenuItem);
protected
class function StatusBar: NSStatusBar;
protected
Expand All @@ -76,6 +78,7 @@ TStatusBarMenu = class(TComponent)
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure RecreateMenu;
procedure Refresh;
property PopupMenu: TPopupMenu read FPopupMenu write SetPopupMenu;
end;

Expand Down Expand Up @@ -205,9 +208,12 @@ destructor TMacOSMenuItem.Destroy;
begin
FFMXItem := nil;
FStatusBarMenu := nil;
if FNSMenuItem.menu <> nil then
FNSMenuItem.menu.removeItem(FNSMenuItem);
FNSMenuItem.release;
if FNSMenuItem <> nil then
begin
if FNSMenuItem.menu <> nil then
FNSMenuItem.menu.removeItem(FNSMenuItem);
FNSMenuItem.release;
end;
FNSMenuItem := nil;
inherited;
end;
Expand All @@ -222,6 +228,15 @@ function TMacOSMenuItem.GetSubMenu: NSMenu;
Result := FSubMenu;
end;

procedure TMacOSMenuItem.Refresh;
begin
if not FFMXItem.Text.Equals('-') then
begin
FNSMenuItem.setTitle(StrToNSStr(FFMXItem.Text));
UpdateNSMenuItemImage(FNSMenuItem, FFMXItem);
end;
end;

function TMacOSMenuItem.GetObjectiveCClass: PTypeInfo;
begin
Result := TypeInfo(IMacOSMenuItem);
Expand Down Expand Up @@ -297,6 +312,29 @@ procedure TStatusBarMenu.RecreateMenu;
end;
end;

procedure TStatusBarMenu.Refresh;
var
I: Integer;
begin
if (FPopupMenu <> nil) and (FPopupMenu.VisibleItemCount > 0) then
begin
UpdateNSStatusItemImage(FStatusItem, FPopupMenu.Items[0]);
for I := 1 to FPopupMenu.ItemsCount - 1 do
UpdateMenuItem(FPopupMenu.Items[I]);
end;
end;

procedure TStatusBarMenu.UpdateMenuItem(const AItem: TMenuItem);
var
I, LIndex: Integer;
begin
LIndex := FMenuItems.IndexOfFMXItem(AItem);
if LIndex > -1 then
MenuItems.Items[LIndex].Refresh;
for I := 0 to AItem.ItemsCount - 1 do
UpdateMenuItem(AItem.Items[I]);
end;

procedure TStatusBarMenu.AddMenuItem(const AItem: TMenuItem);
var
I: Integer;
Expand Down

0 comments on commit 6b2ffe1

Please sign in to comment.