fix #107, Menu flickers when no custom tool is defined

This commit is contained in:
Basile Burg 2016-11-24 17:17:46 +01:00
parent a4cd64d58e
commit ca84dffb31
3 changed files with 26 additions and 7 deletions

View File

@ -172,6 +172,8 @@ type
procedure menuDeclare(item: TMenuItem); procedure menuDeclare(item: TMenuItem);
// item is the mainMenu entry declared previously. the sub items can be updated, deleted. // item is the mainMenu entry declared previously. the sub items can be updated, deleted.
procedure menuUpdate(item: TMenuItem); procedure menuUpdate(item: TMenuItem);
// indicates if menuDeclare should be called.
function menuHasItems: boolean;
end; end;
(** (**
* An implementer collects and updates its observers menus. * An implementer collects and updates its observers menus.

View File

@ -1894,31 +1894,42 @@ procedure TCEMainForm.updateMainMenuProviders;
var var
i, j: Integer; i, j: Integer;
itm: TMenuItem; itm: TMenuItem;
doneUpdate: boolean = false; hasItems: boolean;
doneUpdate: boolean;
begin begin
if not assigned(mainMenu.Images) then if not assigned(mainMenu.Images) then
exit; exit;
for j := 0 to fMainMenuSubj.observersCount-1 do for j := 0 to fMainMenuSubj.observersCount-1 do
begin begin
doneUpdate := false;
hasItems := (fMainMenuSubj.observers[j] as ICEMainMenuProvider).menuHasItems;
// try to update existing entry. // try to update existing entry.
for i := 0 to mainMenu.Items.Count-1 do for i := mainMenu.Items.Count-1 downto 0 do
if PtrInt(fMainMenuSubj.observers[j]) = mainMenu.Items[i].Tag then if PtrInt(fMainMenuSubj.observers[j]) = mainMenu.Items[i].Tag then
begin
if not hasItems then
begin
doneUpdate:=true;
mainMenu.Items[i].Clear;
mainMenu.Items.Delete(i);
break;
end
else
begin begin
(fMainMenuSubj.observers[j] as ICEMainMenuProvider).menuUpdate(mainMenu.Items[i]); (fMainMenuSubj.observers[j] as ICEMainMenuProvider).menuUpdate(mainMenu.Items[i]);
doneUpdate := true; doneUpdate := true;
break; break;
end; end;
if doneUpdate then end;
if doneUpdate or not hasItems then
continue; continue;
// otherwise propose to create a new entry // otherwise propose to create a new entry
itm := TMenuItem.Create(Self); itm := TMenuItem.Create(Self);
mainMenu.Items.Add(itm); mainMenu.Items.Add(itm);
(fMainMenuSubj.observers[j] as ICEMainMenuProvider).menuDeclare(itm); (fMainMenuSubj.observers[j] as ICEMainMenuProvider).menuDeclare(itm);
itm.Tag:= PtrInt(fMainMenuSubj.observers[j]); itm.Tag:= PtrInt(fMainMenuSubj.observers[j]);
case itm.Count > 0 of if itm.Count = 0 then
true: ; itm.Free;
false: itm.Free;
end;
end; end;
end; end;

View File

@ -76,6 +76,7 @@ type
// //
procedure menuDeclare(item: TMenuItem); procedure menuDeclare(item: TMenuItem);
procedure menuUpdate(item: TMenuItem); procedure menuUpdate(item: TMenuItem);
function menuHasItems: boolean;
procedure executeToolFromMenu(sender: TObject); procedure executeToolFromMenu(sender: TObject);
// //
procedure docNew(document: TCESynMemo); procedure docNew(document: TCESynMemo);
@ -339,6 +340,11 @@ begin
mnuitm.shortcut := colitm.shortcut; mnuitm.shortcut := colitm.shortcut;
end; end;
end; end;
function TCETools.menuHasItems: boolean;
begin
result := tools.Count <> 0;
end;
{$ENDREGION} {$ENDREGION}
{$REGION ICEEditableShortcut ---------------------------------------------------} {$REGION ICEEditableShortcut ---------------------------------------------------}