improvements to Unreal Engine plugin and UI

This commit is contained in:
Michael Becker 2021-04-29 23:08:42 -04:00
parent 358d78880c
commit 76a7664044
No known key found for this signature in database
GPG Key ID: 98C333A81F18C22C
6 changed files with 225 additions and 46 deletions

View File

@ -4,17 +4,24 @@
<Commands>
<Command ID="UnrealPackageEditor_ExportTreeViewContextMenu">
<Items>
<CommandReference CommandID="UnrealPackageEditor_ExportTreeViewContextMenu_Add_Existing" />
<Separator />
<CommandReference CommandID="UnrealPackageEditor_ExportTreeViewContextMenu_Export" />
<CommandReference CommandID="FileProperties" />
</Items>
</Command>
<Command ID="UnrealPackageEditor_ImportTreeViewContextMenu">
<Items>
<CommandReference CommandID="UnrealPackageEditor_ImportTreeViewContextMenu_Add_Existing" />
<Separator />
<CommandReference CommandID="FileProperties" />
</Items>
</Command>
<Command ID="UnrealPackageEditor_ExportTreeViewContextMenu_Export" Title="Export..." />
<Command ID="UnrealPackageEditor_ExportTreeViewContextMenu_Add_Existing" Title="Add E_xisting Item..." />
<Command ID="UnrealPackageEditor_ImportTreeViewContextMenu_Add_Existing" Title="Add E_xisting Item..." />
<Command ID="UnrealPackageEditor_ExportTreeViewContextMenu_Export" Title="_Export..." />
</Commands>
</Editor>
</Editors>

View File

@ -24,12 +24,15 @@
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton">
<object class="GtkButton" id="cmdOK">
<property name="label">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<style>
<class name="suggested-action"/>
</style>
</object>
<packing>
<property name="expand">True</property>
@ -38,7 +41,7 @@
</packing>
</child>
<child>
<object class="GtkButton">
<object class="GtkButton" id="cmdCancel">
<property name="label">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@ -114,7 +117,7 @@
</packing>
</child>
<child>
<object class="GtkLabel">
<object class="GtkLabel" id="lblSourceData">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Source data</property>

View File

@ -22,6 +22,7 @@
using System;
using MBS.Framework.UserInterface;
using MBS.Framework.UserInterface.Controls;
using MBS.Framework.UserInterface.Dialogs;
using UniversalEditor.ObjectModels.UnrealEngine;
namespace UniversalEditor.Plugins.UnrealEngine.UserInterface.Dialogs.Unreal.Package
@ -35,7 +36,11 @@ namespace UniversalEditor.Plugins.UnrealEngine.UserInterface.Dialogs.Unreal.Pack
private TextBox txtObjectName;
private ComboBox cboClassName;
private ComboBox cboPackageName;
private Label lblSourceData;
private TextBox txtSourceData;
private Button cmdOK;
private Button cmdSourceDataBrowse;
private GroupBox fraFlags;
@ -49,11 +54,16 @@ namespace UniversalEditor.Plugins.UnrealEngine.UserInterface.Dialogs.Unreal.Pack
{
base.OnCreated(e);
DefaultButton = cmdOK;
if (ImportTableEntry != null)
{
txtObjectName.Text = ImportTableEntry.ObjectName.Name;
cboClassName.Text = ImportTableEntry.ClassName.Name;
cboPackageName.Text = ImportTableEntry.PackageName.Name;
txtObjectName.Text = ImportTableEntry.ObjectName?.Name;
cboClassName.Text = ImportTableEntry.ClassName?.Name;
cboPackageName.Text = ImportTableEntry.PackageName?.Name;
lblSourceData.Visible = false;
txtSourceData.Visible = false;
cmdSourceDataBrowse.Visible = false;
fraFlags.Visible = false;
@ -65,6 +75,12 @@ namespace UniversalEditor.Plugins.UnrealEngine.UserInterface.Dialogs.Unreal.Pack
cboClassName.Text = ExportTableEntry.ObjectClass?.Name?.Name;
cboPackageName.Text = ExportTableEntry.ObjectParent?.Name?.Name;
lblSourceData.Visible = true;
txtSourceData.Visible = true;
cmdSourceDataBrowse.Visible = true;
txtSourceData.Text = String.Format("({0})", UniversalEditor.UserInterface.Common.FileInfo.FormatSize(ExportTableEntry.GetDataLength()));
fraFlags.Visible = true;
chkFlagTransactional.Checked = ((ExportTableEntry.Flags & ObjectFlags.Transactional) == ObjectFlags.Transactional);
chkFlagUnreachable.Checked = ((ExportTableEntry.Flags & ObjectFlags.Unreachable) == ObjectFlags.Unreachable);
@ -81,5 +97,58 @@ namespace UniversalEditor.Plugins.UnrealEngine.UserInterface.Dialogs.Unreal.Pack
Text = "Export Table Entry Properties";
}
}
[EventHandler(nameof(cmdSourceDataBrowse), nameof(Control.Click))]
private void cmdSourceDataBrowse_Click(object sender, EventArgs e)
{
FileDialog dlg = new FileDialog();
if (dlg.ShowDialog() == DialogResult.OK)
{
ExportTableEntry.SetData(System.IO.File.ReadAllBytes(dlg.SelectedFileName));
}
}
[EventHandler(nameof(cmdOK), nameof(Control.Click))]
private void cmdOK_Click(object sender, EventArgs e)
{
if (ImportTableEntry != null)
{
ImportTableEntry.ObjectName = new NameTableEntry();
ImportTableEntry.ObjectName.Name = txtObjectName.Text;
ImportTableEntry.ClassName = new NameTableEntry();
ImportTableEntry.ClassName.Name = cboClassName.Text;
ImportTableEntry.PackageName = new NameTableEntry();
ImportTableEntry.PackageName.Name = cboPackageName.Text;
}
else if (ExportTableEntry != null)
{
ExportTableEntry.Name = new NameTableEntry();
ExportTableEntry.Name.Name = txtObjectName.Text;
/*
ExportTableEntry.ObjectClass = new ObjectReference();
cboClassName.Text = ExportTableEntry.ObjectClass?.Name?.Name;
cboPackageName.Text = ExportTableEntry.ObjectParent?.Name?.Name;
*/
if (chkFlagTransactional.Checked) ExportTableEntry.Flags |= ObjectFlags.Transactional;
if (chkFlagUnreachable.Checked) ExportTableEntry.Flags |= ObjectFlags.Unreachable;
if (chkFlagPublic.Checked) ExportTableEntry.Flags |= ObjectFlags.Public;
if (chkFlagSourceModified.Checked) ExportTableEntry.Flags |= ObjectFlags.SourceModified;
if (chkFlagGarbageCollect.Checked) ExportTableEntry.Flags |= ObjectFlags.GarbageCollect;
if (chkFlagImporting.Checked) ExportTableEntry.Flags |= ObjectFlags.Importing;
if (chkFlagExporting.Checked) ExportTableEntry.Flags |= ObjectFlags.Exporting;
if (chkFlagRequireLoad.Checked) ExportTableEntry.Flags |= ObjectFlags.RequireLoad;
if (chkFlagHighlightNameEliminateObject.Checked) ExportTableEntry.Flags |= ObjectFlags.HighlightedName;
if (chkFlagRemappedNameSingularFunction.Checked) ExportTableEntry.Flags |= ObjectFlags.RemappedName;
if (chkFlagSuppressedStateChanged.Checked) ExportTableEntry.Flags |= ObjectFlags.Suppressed;
}
DialogResult = DialogResult.OK;
Close();
}
}
}

View File

@ -71,6 +71,9 @@ namespace UniversalEditor.Plugins.UnrealEngine.UserInterface.Editors.Unreal.Pack
Context.AttachCommandEventHandler("UnrealPackageEditor_ExportTreeViewContextMenu_Export", UnrealPackageEditor_ExportTreeViewContextMenu_Export);
Context.AttachCommandEventHandler("UnrealPackageEditor_ImportTreeViewContextMenu_Add_Existing", UnrealPackageEditor_ImportTreeViewContextMenu_Add_Existing);
Context.AttachCommandEventHandler("UnrealPackageEditor_ExportTreeViewContextMenu_Add_Existing", UnrealPackageEditor_ExportTreeViewContextMenu_Add_Existing);
OnObjectModelChanged(e);
}
@ -92,6 +95,40 @@ namespace UniversalEditor.Plugins.UnrealEngine.UserInterface.Editors.Unreal.Pack
System.IO.File.WriteAllBytes(sfd.SelectedFileName, data);
}
}
private void UnrealPackageEditor_ExportTreeViewContextMenu_Add_Existing(object sender, EventArgs e)
{
ExportTableEntry item = new ExportTableEntry();
FileDialog ofd = new FileDialog
{
Mode = FileDialogMode.Open
};
if (ofd.ShowDialog() == DialogResult.OK)
{
item.Name = new NameTableEntry();
item.Name.Name = System.IO.Path.GetFileNameWithoutExtension(ofd.SelectedFileName);
item.SetData(System.IO.File.ReadAllBytes(ofd.SelectedFileName));
UnrealPackageEntryPropertiesDialog dlg = new UnrealPackageEntryPropertiesDialog();
dlg.ExportTableEntry = item;
if (dlg.ShowDialog() == DialogResult.OK)
{
UIAddExport(item);
}
}
}
private void UnrealPackageEditor_ImportTreeViewContextMenu_Add_Existing(object sender, EventArgs e)
{
ImportTableEntry item = new ImportTableEntry();
UnrealPackageEntryPropertiesDialog dlg = new UnrealPackageEntryPropertiesDialog();
dlg.ImportTableEntry = item;
if (dlg.ShowDialog() == DialogResult.OK)
{
UIAddImport(item);
}
}
[EventHandler(nameof(tvExports), "RowActivated")]
void tvExports_RowActivated(object sender, ListViewRowActivatedEventArgs e)
@ -102,6 +139,7 @@ namespace UniversalEditor.Plugins.UnrealEngine.UserInterface.Editors.Unreal.Pack
dlg.ExportTableEntry = item;
if (dlg.ShowDialog() == DialogResult.OK)
{
UIUpdateExport(item, e.Row);
}
}
@ -114,6 +152,7 @@ namespace UniversalEditor.Plugins.UnrealEngine.UserInterface.Editors.Unreal.Pack
dlg.ImportTableEntry = item;
if (dlg.ShowDialog() == DialogResult.OK)
{
UIUpdateImport(item, e.Row);
}
}
@ -123,17 +162,15 @@ namespace UniversalEditor.Plugins.UnrealEngine.UserInterface.Editors.Unreal.Pack
if (!IsCreated) return;
DefaultTreeModel tmExports = (tvExports.Model as DefaultTreeModel);
DefaultTreeModel tmImports = (tvImports.Model as DefaultTreeModel);
tmExports.Rows.Clear();
tmImports.Rows.Clear();
tvExports.Model.Rows.Clear();
tvImports.Model.Rows.Clear();
UnrealPackageObjectModel package = (ObjectModel as UnrealPackageObjectModel);
if (package == null) return;
for (int i = 0; i < package.ExportTableEntries.Count; i++)
{
UIAddExport(package.ExportTableEntries[i]);
/*
string rowName = package.ExportTableEntries[i].Group?.Name?.ToString() ?? String.Empty;
TreeModelRow rowParent = tmExports.Rows[rowName];
@ -159,44 +196,69 @@ namespace UniversalEditor.Plugins.UnrealEngine.UserInterface.Editors.Unreal.Pack
rowParent.Rows.Add(rowParent2);
}
*/
TreeModelRow row = new TreeModelRow(new TreeModelRowColumn[]
{
new TreeModelRowColumn(tmExports.Columns[0], package.ExportTableEntries[i].Group?.Name),
new TreeModelRowColumn(tmExports.Columns[1], package.ExportTableEntries[i].ObjectClass),
new TreeModelRowColumn(tmExports.Columns[2], package.ExportTableEntries[i].ObjectParent),
new TreeModelRowColumn(tmExports.Columns[3], package.ExportTableEntries[i].Name?.Name),
new TreeModelRowColumn(tmExports.Columns[4], package.ExportTableEntries[i].Flags),
new TreeModelRowColumn(tmExports.Columns[5], package.ExportTableEntries[i].Size),
new TreeModelRowColumn(tmExports.Columns[6], package.ExportTableEntries[i].Offset)
});
row.SetExtraData<ExportTableEntry>("item", package.ExportTableEntries[i]);
// rowParent2.Rows.Add(row);
tmExports.Rows.Add(row);
}
for (int i = 0; i < package.ImportTableEntries.Count; i++)
{
string rowName = package.ImportTableEntries[i].Package?.Name?.ToString() ?? String.Empty;
TreeModelRow rowParent = tmImports.Rows[rowName];
if (rowParent == null)
{
rowParent = new TreeModelRow(new TreeModelRowColumn[]
{
new TreeModelRowColumn(tmImports.Columns[0], rowName)
});
rowParent.Name = rowName;
tmImports.Rows.Add(rowParent);
}
TreeModelRow row = new TreeModelRow(new TreeModelRowColumn[]
{
new TreeModelRowColumn(tmImports.Columns[0], package.ImportTableEntries[i].Package),
new TreeModelRowColumn(tmImports.Columns[1], package.ImportTableEntries[i].ClassName),
new TreeModelRowColumn(tmImports.Columns[2], package.ImportTableEntries[i].PackageName),
new TreeModelRowColumn(tmImports.Columns[3], package.ImportTableEntries[i].ObjectName)
});
row.SetExtraData<ImportTableEntry>("item", package.ImportTableEntries[i]);
rowParent.Rows.Add(row);
UIAddImport(package.ImportTableEntries[i]);
}
}
private void UIAddImport(ImportTableEntry item)
{
string rowName = item.Package?.Name?.ToString() ?? String.Empty;
TreeModelRow rowParent = tvImports.Model.Rows[rowName];
if (rowParent == null)
{
rowParent = new TreeModelRow(new TreeModelRowColumn[]
{
new TreeModelRowColumn(tvImports.Model.Columns[0], rowName)
});
rowParent.Name = rowName;
tvImports.Model.Rows.Add(rowParent);
}
TreeModelRow row = new TreeModelRow(new TreeModelRowColumn[]
{
new TreeModelRowColumn(tvImports.Model.Columns[0], item.Package),
new TreeModelRowColumn(tvImports.Model.Columns[1], item.ClassName),
new TreeModelRowColumn(tvImports.Model.Columns[2], item.PackageName),
new TreeModelRowColumn(tvImports.Model.Columns[3], item.ObjectName)
});
row.SetExtraData<ImportTableEntry>("item", item);
rowParent.Rows.Add(row);
}
private void UIUpdateImport(ImportTableEntry item, TreeModelRow row)
{
row.RowColumns[0].Value = item.Package;
row.RowColumns[1].Value = item.ClassName;
row.RowColumns[2].Value = item.PackageName;
row.RowColumns[3].Value = item.ObjectName;
}
private void UIAddExport(ExportTableEntry item)
{
TreeModelRow row = new TreeModelRow(new TreeModelRowColumn[]
{
new TreeModelRowColumn(tvExports.Model.Columns[0], item.Group?.Name),
new TreeModelRowColumn(tvExports.Model.Columns[1], item.ObjectClass),
new TreeModelRowColumn(tvExports.Model.Columns[2], item.ObjectParent),
new TreeModelRowColumn(tvExports.Model.Columns[3], item.Name?.Name),
new TreeModelRowColumn(tvExports.Model.Columns[4], item.Flags),
new TreeModelRowColumn(tvExports.Model.Columns[5], item.Size),
new TreeModelRowColumn(tvExports.Model.Columns[6], item.Offset)
});
row.SetExtraData<ExportTableEntry>("item", item);
// rowParent2.Rows.Add(row);
tvExports.Model.Rows.Add(row);
}
private void UIUpdateExport(ExportTableEntry item, TreeModelRow row)
{
row.RowColumns[0].Value = item.Group?.Name;
row.RowColumns[1].Value = item.ObjectClass;
row.RowColumns[2].Value = item.ObjectParent;
row.RowColumns[3].Value = item.Name?.Name;
row.RowColumns[4].Value = item.Flags;
row.RowColumns[5].Value = item.Size;
row.RowColumns[6].Value = item.Offset;
}
}
}

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8" ?>
<UniversalEditor Version="4.0">
<Associations>
<Association>
<Filters>
<Filter Title="Unreal Engine color palette" ContentType="application/x-unreal-palette" IconName="gnome-color-manager">
<MagicByteSequences>
<MagicByteSequence>
<MagicByte Type="HexString">0140</MagicByte>
</MagicByteSequence>
</MagicByteSequences>
</Filter>
</Filters>
<ObjectModels>
<ObjectModel TypeName="UniversalEditor.ObjectModels.Multimedia.Palette.PaletteObjectModel" />
</ObjectModels>
<DataFormats>
<DataFormat TypeName="UniversalEditor.DataFormats.Multimedia.Palette.Unreal.UnrealPaletteDataFormat" />
</DataFormats>
</Association>
</Associations>
</UniversalEditor>

View File

@ -42,8 +42,16 @@ namespace UniversalEditor.ObjectModels.UnrealEngine
DataRequest?.Invoke(this, e);
}
private byte[] _Data = null;
public void SetData(byte[] data)
{
_Data = data;
}
public byte[] GetData()
{
if (_Data != null) return _Data;
FileSystem.DataRequestEventArgs e = new FileSystem.DataRequestEventArgs();
OnDataRequest(e);
return e.Data;
@ -69,6 +77,14 @@ namespace UniversalEditor.ObjectModels.UnrealEngine
/// </summary>
/// <value>The group of the object exported by this <see cref="ExportTableEntry" />.</value>
public ObjectReference Group { get; set; } = null;
public long GetDataLength()
{
if (_Data != null)
return _Data.Length;
return (GetData()?.Length).GetValueOrDefault(0);
}
/// <summary>
/// Gets or sets the attributes for the object exported by this <see cref="ExportTableEntry" />.
/// </summary>