Implement editor-scoped menu items

This commit is contained in:
Michael Becker 2019-10-05 07:46:18 -04:00
parent 8caee50b50
commit 19e0dfaa90
4 changed files with 144 additions and 42 deletions

View File

@ -0,0 +1,74 @@
<UniversalEditor Version="5.0">
<Editors>
<Editor TypeName="UniversalEditor.Editors.Multimedia.Audio.Synthesized.PianoRoll.PianoRollEditor">
<Commands>
<Command ID="View">
<Items>
<CommandReference CommandID="ViewTrackOverlay" InsertBeforeID="ViewPanels" />
<Separator InsertBeforeID="ViewPanels" />
</Items>
</Command>
<Command ID="JobNormalizeNotes" Title="_Normalize Overlapping Notes..." />
<Command ID="JobInsertBars" Title="_Insert Measures..." />
<Command ID="JobDeleteBars" Title="_Delete Measures..." />
<Command ID="JobRandomize" Title="Insert _Random Notes..." />
<Command ID="JobConnect" Title="_Connect Notes..." />
<Command ID="JobInsertLyrics" Title="Insert _Lyrics..." />
<Command ID="Job" Title="_Job">
<Items>
<CommandReference CommandID="JobNormalizeNotes" />
<Separator />
<CommandReference CommandID="JobInsertBars" />
<CommandReference CommandID="JobDeleteBars" />
<Separator />
<CommandReference CommandID="JobRandomize" />
<CommandReference CommandID="JobConnect" />
<Separator />
<CommandReference CommandID="JobInsertLyrics" />
</Items>
</Command>
<Command ID="TrackEnable" Title="Enable Trac_k" />
<Command ID="TrackAdd" Title="_Add Track" />
<Command ID="TrackDuplicate" Title="Dupli_cate Track" />
<Command ID="TrackRename" Title="_Rename Track" />
<Command ID="TrackDelete" Title="_Delete Track" />
<Command ID="TrackRenderCurrent" Title="Render Current _Track" />
<Command ID="TrackRenderAll" Title="Render All Track_s" />
<Command ID="Track" Title="Trac_k">
<Items>
<CommandReference CommandID="TrackEnable" />
<Separator />
<CommandReference CommandID="TrackAdd" />
<CommandReference CommandID="TrackDuplicate" />
<CommandReference CommandID="TrackRename" />
<CommandReference CommandID="TrackDelete" />
<Separator />
<CommandReference CommandID="TrackRenderCurrent" />
<CommandReference CommandID="TrackRenderAll" />
</Items>
</Command>
<Command ID="Part" Title="Pa_rt" />
<Command ID="Lyrics" Title="_Lyrics" />
<Command ID="Transport" Title="Tra_nsport" />
</Commands>
<MenuBar>
<Items>
<CommandReference CommandID="Job" InsertAfterID="View" />
<CommandReference CommandID="Track" />
<CommandReference CommandID="Part" />
<CommandReference CommandID="Lyrics" />
<CommandReference CommandID="Transport" />
</Items>
</MenuBar>
</Editor>
</Editors>
</UniversalEditor>

View File

@ -642,6 +642,7 @@
<Content Include="Extensions\GraphicDesigner\Associations\Picture\PCX.uexml" />
<Content Include="Extensions\GraphicDesigner\Associations\Picture\PSD.uexml" />
<Content Include="Editors\UniversalEditor.Editors.FileSystem.FileSystemEditor\Commands.uexml" />
<Content Include="Editors\Multimedia\Audio\Synthesized\PianoRoll\MenuBar.uexml" />
</ItemGroup>
<ItemGroup>
<Content Include="Configuration\Application.upl" />
@ -658,6 +659,10 @@
<Folder Include="Extensions\FileSystem\Associations\Apogee\" />
<Folder Include="Accessors\" />
<Folder Include="Editors\UniversalEditor.Editors.FileSystem.FileSystemEditor\" />
<Folder Include="Editors\Multimedia\" />
<Folder Include="Editors\Multimedia\Audio\" />
<Folder Include="Editors\Multimedia\Audio\Synthesized\" />
<Folder Include="Editors\Multimedia\Audio\Synthesized\PianoRoll\" />
</ItemGroup>
<ItemGroup>
<Content Include="Extensions\SoftwareDeveloper\Templates\Project\Software Development\Arduino\Images\Blink.xcf" />

View File

@ -147,7 +147,32 @@ namespace UniversalEditor.UserInterface.Common
{
string id = tagCommand.Attributes["ID"]?.Value;
string title = tagCommand.Attributes["Title"]?.Value;
er.Commands.Add(new MBS.Framework.UserInterface.Command(id, title != null ? title : id));
MBS.Framework.UserInterface.Command cmd = new MBS.Framework.UserInterface.Command(id, title != null ? title : id);
MarkupTagElement tagItems = tagCommand.Elements["Items"] as MarkupTagElement;
if (tagItems != null)
{
foreach (MarkupElement elItem in tagItems.Elements)
{
MarkupTagElement tagItem = (elItem as MarkupTagElement);
if (tagItem == null) continue;
switch (tagItem.Name)
{
case "CommandReference":
{
MBS.Framework.UserInterface.CommandReferenceCommandItem crci = new MBS.Framework.UserInterface.CommandReferenceCommandItem(tagItem.Attributes["CommandID"]?.Value);
cmd.Items.Add(crci);
break;
}
case "Separator":
{
cmd.Items.Add(new MBS.Framework.UserInterface.SeparatorCommandItem());
break;
}
}
}
}
er.Commands.Add(cmd);
}
}
}
@ -165,7 +190,7 @@ namespace UniversalEditor.UserInterface.Common
{
case "CommandReference":
{
MBS.Framework.UserInterface.CommandReferenceCommandItem crci = new MBS.Framework.UserInterface.CommandReferenceCommandItem(tagItem.Attributes["ID"]?.Value);
MBS.Framework.UserInterface.CommandReferenceCommandItem crci = new MBS.Framework.UserInterface.CommandReferenceCommandItem(tagItem.Attributes["CommandID"]?.Value);
er.MenuBar.Items.Add(crci);
break;
}

View File

@ -27,6 +27,7 @@ using MBS.Framework.UserInterface.Printing;
using UniversalEditor.UserInterface.Pages;
using UniversalEditor.ObjectModels.Binary;
using UniversalEditor.DataFormats.Binary;
using System.Collections.Generic;
namespace UniversalEditor.UserInterface
{
@ -149,7 +150,7 @@ namespace UniversalEditor.UserInterface
foreach (CommandItem ci in Engine.CurrentEngine.MainMenu.Items)
{
MBS.Framework.UserInterface.MenuItem mi = LoadMenuItem(ci);
MBS.Framework.UserInterface.MenuItem mi = MBS.Framework.UserInterface.MenuItem.LoadMenuItem(ci, MainWindow_MenuBar_Item_Click);
if (mi == null)
continue;
@ -265,6 +266,10 @@ namespace UniversalEditor.UserInterface
}
}
private Editor _prevEditor = null;
private List<Command> _editorScopedCommands = new List<Command>();
private List<MBS.Framework.UserInterface.MenuItem> _editorScopedMenuItems = new List<MBS.Framework.UserInterface.MenuItem>();
private void dckContainer_SelectionChanged(object sender, EventArgs e)
{
Editor editor = null;
@ -276,11 +281,43 @@ namespace UniversalEditor.UserInterface
{
}
if (editor != _prevEditor)
{
foreach (MBS.Framework.UserInterface.MenuItem mi in _editorScopedMenuItems)
{
MenuBar.Items.Remove(mi);
}
_editorScopedMenuItems.Clear();
foreach (Command cmd in _editorScopedCommands)
{
Console.WriteLine("unregistering temporary (editor-scoped) command '{0}'", cmd.ID);
Application.Commands.Remove(cmd);
}
_editorScopedCommands.Clear();
}
if (editor == null) {
Console.WriteLine ("Editor is null");
} else {
Console.WriteLine ("Editor is NOT null");
EditorReference er = editor.MakeReference();
foreach (Command cmd in er.Commands)
{
Console.WriteLine("registering temporary (editor-scoped) command '{0}'", cmd.ID);
Application.Commands.Add(cmd);
_editorScopedCommands.Add(cmd);
}
foreach (CommandItem ci in er.MenuBar.Items)
{
MBS.Framework.UserInterface.MenuItem mi = MBS.Framework.UserInterface.MenuItem.LoadMenuItem(ci, MainWindow_MenuBar_Item_Click);
MenuBar.Items.Add(mi);
_editorScopedMenuItems.Add(mi);
}
}
_prevEditor = editor;
}
public void NewProject(bool combineObjects = false)
@ -489,45 +526,6 @@ namespace UniversalEditor.UserInterface
}, DragDropEffect.Copy, MouseButtons.Primary | MouseButtons.Secondary, KeyboardModifierKey.None);
}
private MBS.Framework.UserInterface.MenuItem LoadMenuItem(CommandItem ci)
{
if (ci is CommandReferenceCommandItem)
{
CommandReferenceCommandItem crci = (ci as CommandReferenceCommandItem);
Command cmd = Application.Commands[crci.CommandID];
if (cmd != null)
{
CommandMenuItem mi = new CommandMenuItem(cmd.Title);
mi.Name = cmd.ID;
mi.Shortcut = cmd.Shortcut;
if (cmd.Items.Count > 0)
{
foreach (CommandItem ci1 in cmd.Items)
{
MBS.Framework.UserInterface.MenuItem mi1 = LoadMenuItem(ci1);
mi.Items.Add(mi1);
}
}
else
{
mi.Click += MainWindow_MenuBar_Item_Click;
}
return mi;
}
else
{
Console.WriteLine("attempted to load unknown cmd '" + crci.CommandID + "'");
}
return null;
}
else if (ci is SeparatorCommandItem)
{
return new MBS.Framework.UserInterface.SeparatorMenuItem();
}
return null;
}
#region IHostApplicationWindow implementation
public void OpenFile()
{