diff --git a/Content/UniversalEditor.Content.PlatformIndependent/Editors/Unreal/Package/ContextMenus.uexml b/Content/UniversalEditor.Content.PlatformIndependent/Editors/Unreal/Package/ContextMenus.uexml index 46b4ee1d..d2c6c68e 100644 --- a/Content/UniversalEditor.Content.PlatformIndependent/Editors/Unreal/Package/ContextMenus.uexml +++ b/Content/UniversalEditor.Content.PlatformIndependent/Editors/Unreal/Package/ContextMenus.uexml @@ -4,17 +4,24 @@ + + + + - + + + + diff --git a/Content/UniversalEditor.Content.PlatformIndependent/Editors/Unreal/Package/Dialogs/UnrealPackageEntryPropertiesDialog.glade b/Content/UniversalEditor.Content.PlatformIndependent/Editors/Unreal/Package/Dialogs/UnrealPackageEntryPropertiesDialog.glade index e775f934..fa6c7623 100644 --- a/Content/UniversalEditor.Content.PlatformIndependent/Editors/Unreal/Package/Dialogs/UnrealPackageEntryPropertiesDialog.glade +++ b/Content/UniversalEditor.Content.PlatformIndependent/Editors/Unreal/Package/Dialogs/UnrealPackageEntryPropertiesDialog.glade @@ -24,12 +24,15 @@ False end - + gtk-ok True True True True + True @@ -38,7 +41,7 @@ - + gtk-cancel True True @@ -114,7 +117,7 @@ - + True False Source data diff --git a/Plugins.UserInterface/UniversalEditor.Plugins.UnrealEngine.UserInterface/Dialogs/Unreal/Package/UnrealPackageEntryPropertiesDialog.cs b/Plugins.UserInterface/UniversalEditor.Plugins.UnrealEngine.UserInterface/Dialogs/Unreal/Package/UnrealPackageEntryPropertiesDialog.cs index 086b2a35..f87af4d9 100644 --- a/Plugins.UserInterface/UniversalEditor.Plugins.UnrealEngine.UserInterface/Dialogs/Unreal/Package/UnrealPackageEntryPropertiesDialog.cs +++ b/Plugins.UserInterface/UniversalEditor.Plugins.UnrealEngine.UserInterface/Dialogs/Unreal/Package/UnrealPackageEntryPropertiesDialog.cs @@ -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(); + } } } diff --git a/Plugins.UserInterface/UniversalEditor.Plugins.UnrealEngine.UserInterface/Editors/Unreal/Package/UnrealPackageEditor.cs b/Plugins.UserInterface/UniversalEditor.Plugins.UnrealEngine.UserInterface/Editors/Unreal/Package/UnrealPackageEditor.cs index 40b3b4b9..af4b8958 100644 --- a/Plugins.UserInterface/UniversalEditor.Plugins.UnrealEngine.UserInterface/Editors/Unreal/Package/UnrealPackageEditor.cs +++ b/Plugins.UserInterface/UniversalEditor.Plugins.UnrealEngine.UserInterface/Editors/Unreal/Package/UnrealPackageEditor.cs @@ -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("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("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("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("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; + } } } diff --git a/Plugins/UniversalEditor.Plugins.UnrealEngine/Associations/Palette/UnrealPalette.uexml b/Plugins/UniversalEditor.Plugins.UnrealEngine/Associations/Palette/UnrealPalette.uexml new file mode 100644 index 00000000..b3d10e0d --- /dev/null +++ b/Plugins/UniversalEditor.Plugins.UnrealEngine/Associations/Palette/UnrealPalette.uexml @@ -0,0 +1,22 @@ + + + + + + + + + 0140 + + + + + + + + + + + + + \ No newline at end of file diff --git a/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ExportTableEntry.cs b/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ExportTableEntry.cs index 34a40e66..9897230d 100644 --- a/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ExportTableEntry.cs +++ b/Plugins/UniversalEditor.Plugins.UnrealEngine/ObjectModels/UnrealEngine/ExportTableEntry.cs @@ -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 /// /// The group of the object exported by this . public ObjectReference Group { get; set; } = null; + + public long GetDataLength() + { + if (_Data != null) + return _Data.Length; + return (GetData()?.Length).GetValueOrDefault(0); + } + /// /// Gets or sets the attributes for the object exported by this . ///