forked from mirrors/NBTExplorer
Added root node renaming and container manipulation capability
This commit is contained in:
parent
24c349ce50
commit
d27234e2cd
6 changed files with 143 additions and 7 deletions
|
@ -39,6 +39,7 @@ namespace NBTExplorer
|
||||||
}
|
}
|
||||||
|
|
||||||
public String Value { get; set; }
|
public String Value { get; set; }
|
||||||
|
public bool AllowEmpty { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class RestrictedStringFormData : StringFormData
|
public class RestrictedStringFormData : StringFormData
|
||||||
|
|
|
@ -3,6 +3,7 @@ using System.Text.RegularExpressions;
|
||||||
using Substrate.Core;
|
using Substrate.Core;
|
||||||
using Substrate.Nbt;
|
using Substrate.Nbt;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace NBTExplorer.Model
|
namespace NBTExplorer.Model
|
||||||
{
|
{
|
||||||
|
@ -59,7 +60,8 @@ namespace NBTExplorer.Model
|
||||||
return NodeCapabilities.CreateTag
|
return NodeCapabilities.CreateTag
|
||||||
| NodeCapabilities.PasteInto
|
| NodeCapabilities.PasteInto
|
||||||
| NodeCapabilities.Search
|
| NodeCapabilities.Search
|
||||||
| NodeCapabilities.Refresh;
|
| NodeCapabilities.Refresh
|
||||||
|
| NodeCapabilities.Rename;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +72,17 @@ namespace NBTExplorer.Model
|
||||||
|
|
||||||
public override string NodeDisplay
|
public override string NodeDisplay
|
||||||
{
|
{
|
||||||
get { return NodeName; }
|
get
|
||||||
|
{
|
||||||
|
if (_tree != null && _tree.Root != null) {
|
||||||
|
if (!string.IsNullOrEmpty(_tree.Name))
|
||||||
|
return NodeName + " [" + _tree.Name + ": " + _tree.Root.Count + " entries]";
|
||||||
|
else
|
||||||
|
return NodeName + " [" + _tree.Root.Count + " entries]";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return NodeName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool HasUnexpandedChildren
|
public override bool HasUnexpandedChildren
|
||||||
|
@ -78,6 +90,8 @@ namespace NBTExplorer.Model
|
||||||
get { return !IsExpanded; }
|
get { return !IsExpanded; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//private TagNodeCompound _metaRoot;
|
||||||
|
|
||||||
protected override void ExpandCore ()
|
protected override void ExpandCore ()
|
||||||
{
|
{
|
||||||
if (_tree == null) {
|
if (_tree == null) {
|
||||||
|
@ -85,10 +99,20 @@ namespace NBTExplorer.Model
|
||||||
_tree = new NbtTree();
|
_tree = new NbtTree();
|
||||||
_tree.ReadFrom(file.GetDataInputStream(_compressionType));
|
_tree.ReadFrom(file.GetDataInputStream(_compressionType));
|
||||||
|
|
||||||
if (_tree.Root != null)
|
//_metaRoot = new TagNodeCompound();
|
||||||
|
|
||||||
|
if (_tree.Root != null) {
|
||||||
|
//_metaRoot.Add(_tree.Name, _tree.Root);
|
||||||
_container = new CompoundTagContainer(_tree.Root);
|
_container = new CompoundTagContainer(_tree.Root);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*foreach (TagNode tag in _metaRoot.Values) {
|
||||||
|
TagDataNode node = TagDataNode.CreateFromTag(tag);
|
||||||
|
if (node != null)
|
||||||
|
Nodes.Add(node);
|
||||||
|
}*/
|
||||||
|
|
||||||
foreach (TagNode tag in _tree.Root.Values) {
|
foreach (TagNode tag in _tree.Root.Values) {
|
||||||
TagDataNode node = TagDataNode.CreateFromTag(tag);
|
TagDataNode node = TagDataNode.CreateFromTag(tag);
|
||||||
if (node != null)
|
if (node != null)
|
||||||
|
@ -119,6 +143,78 @@ namespace NBTExplorer.Model
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override bool CanRenameNode
|
||||||
|
{
|
||||||
|
get { return _tree != null; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool RenameNode ()
|
||||||
|
{
|
||||||
|
if (CanRenameNode && FormRegistry.EditString != null) {
|
||||||
|
RestrictedStringFormData data = new RestrictedStringFormData(_tree.Name ?? "") {
|
||||||
|
AllowEmpty = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (FormRegistry.RenameTag(data)) {
|
||||||
|
if (_tree.Name != data.Value) {
|
||||||
|
_tree.Name = data.Value;
|
||||||
|
IsDataModified = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool CanCreateTag (TagType type)
|
||||||
|
{
|
||||||
|
return _tree != null && _tree.Root != null && Enum.IsDefined(typeof(TagType), type) && type != TagType.TAG_END;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool CanPasteIntoNode
|
||||||
|
{
|
||||||
|
get { return _tree != null && _tree.Root != null && NbtClipboardController.ContainsData; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool CreateNode (TagType type)
|
||||||
|
{
|
||||||
|
if (!CanCreateTag(type))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (FormRegistry.CreateNode != null) {
|
||||||
|
CreateTagFormData data = new CreateTagFormData() {
|
||||||
|
TagType = type,
|
||||||
|
HasName = true,
|
||||||
|
};
|
||||||
|
data.RestrictedNames.AddRange(_container.TagNamesInUse);
|
||||||
|
|
||||||
|
if (FormRegistry.CreateNode(data)) {
|
||||||
|
AddTag(data.TagNode, data.TagName);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool PasteNode ()
|
||||||
|
{
|
||||||
|
if (!CanPasteIntoNode)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
NbtClipboardData clipboard = NbtClipboardController.CopyFromClipboard();
|
||||||
|
if (clipboard == null || clipboard.Node == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
string name = clipboard.Name;
|
||||||
|
if (String.IsNullOrEmpty(name))
|
||||||
|
name = "UNNAMED";
|
||||||
|
|
||||||
|
AddTag(clipboard.Node, MakeUniqueName(name));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsNamedContainer
|
public bool IsNamedContainer
|
||||||
{
|
{
|
||||||
get { return true; }
|
get { return true; }
|
||||||
|
@ -148,5 +244,35 @@ namespace NBTExplorer.Model
|
||||||
{
|
{
|
||||||
return _container.DeleteTag(tag);
|
return _container.DeleteTag(tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void AddTag (TagNode tag, string name)
|
||||||
|
{
|
||||||
|
_container.AddTag(tag, name);
|
||||||
|
IsDataModified = true;
|
||||||
|
|
||||||
|
if (IsExpanded) {
|
||||||
|
TagDataNode node = TagDataNode.CreateFromTag(tag);
|
||||||
|
if (node != null)
|
||||||
|
Nodes.Add(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private string MakeUniqueName (string name)
|
||||||
|
{
|
||||||
|
List<string> names = new List<string>(_container.TagNamesInUse);
|
||||||
|
if (!names.Contains(name))
|
||||||
|
return name;
|
||||||
|
|
||||||
|
int index = 1;
|
||||||
|
while (names.Contains(MakeCandidateName(name, index)))
|
||||||
|
index++;
|
||||||
|
|
||||||
|
return MakeCandidateName(name, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string MakeCandidateName (string name, int index)
|
||||||
|
{
|
||||||
|
return name + " (Copy " + index + ")";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,7 +91,7 @@ namespace NBTExplorer.Vendor.MultiSelectTreeView
|
||||||
TreeNode node = this.GetNodeAt( e.Location );
|
TreeNode node = this.GetNodeAt( e.Location );
|
||||||
if( node != null )
|
if( node != null )
|
||||||
{
|
{
|
||||||
int leftBound = node.Bounds.X; // - 20; // Allow user to click on image
|
int leftBound = node.Bounds.X - 20; // Allow user to click on image
|
||||||
int rightBound = node.Bounds.Right + 10; // Give a little extra room
|
int rightBound = node.Bounds.Right + 10; // Give a little extra room
|
||||||
if( e.Location.X > leftBound && e.Location.X < rightBound )
|
if( e.Location.X > leftBound && e.Location.X < rightBound )
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,6 +31,8 @@ namespace NBTExplorer.Windows
|
||||||
get { return _invalidNames; }
|
get { return _invalidNames; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool AllowEmpty { get; set; }
|
||||||
|
|
||||||
public bool IsModified
|
public bool IsModified
|
||||||
{
|
{
|
||||||
get { return _name != _originalName; }
|
get { return _name != _originalName; }
|
||||||
|
@ -52,7 +54,7 @@ namespace NBTExplorer.Windows
|
||||||
private bool ValidateNameInput ()
|
private bool ValidateNameInput ()
|
||||||
{
|
{
|
||||||
string text = _nameField.Text.Trim();
|
string text = _nameField.Text.Trim();
|
||||||
if (String.IsNullOrEmpty(text)) {
|
if (String.IsNullOrEmpty(text) && !AllowEmpty) {
|
||||||
MessageBox.Show("You must provide a nonempty name.");
|
MessageBox.Show("You must provide a nonempty name.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,9 @@ namespace NBTExplorer.Windows
|
||||||
|
|
||||||
public static bool RenameTagHandler (RestrictedStringFormData data)
|
public static bool RenameTagHandler (RestrictedStringFormData data)
|
||||||
{
|
{
|
||||||
EditName form = new EditName(data.Value);
|
EditName form = new EditName(data.Value) {
|
||||||
|
AllowEmpty = data.AllowEmpty,
|
||||||
|
};
|
||||||
form.InvalidNames.AddRange(data.RestrictedValues);
|
form.InvalidNames.AddRange(data.RestrictedValues);
|
||||||
|
|
||||||
if (form.ShowDialog() == DialogResult.OK && form.IsModified) {
|
if (form.ShowDialog() == DialogResult.OK && form.IsModified) {
|
||||||
|
|
|
@ -323,8 +323,11 @@ namespace NBTExplorer.Windows
|
||||||
node.Nodes.Clear();
|
node.Nodes.Clear();
|
||||||
|
|
||||||
DataNode backNode = node.Tag as DataNode;
|
DataNode backNode = node.Tag as DataNode;
|
||||||
if (!backNode.IsExpanded)
|
if (!backNode.IsExpanded) {
|
||||||
backNode.Expand();
|
backNode.Expand();
|
||||||
|
node.Text = backNode.NodeDisplay;
|
||||||
|
UpdateUI(backNode);
|
||||||
|
}
|
||||||
|
|
||||||
foreach (DataNode child in backNode.Nodes)
|
foreach (DataNode child in backNode.Nodes)
|
||||||
node.Nodes.Add(CreateUnexpandedNode(child));
|
node.Nodes.Add(CreateUnexpandedNode(child));
|
||||||
|
@ -340,6 +343,8 @@ namespace NBTExplorer.Windows
|
||||||
return;
|
return;
|
||||||
|
|
||||||
backNode.Collapse();
|
backNode.Collapse();
|
||||||
|
node.Text = backNode.NodeDisplay;
|
||||||
|
UpdateUI(backNode);
|
||||||
|
|
||||||
node.Nodes.Clear();
|
node.Nodes.Clear();
|
||||||
if (backNode.HasUnexpandedChildren)
|
if (backNode.HasUnexpandedChildren)
|
||||||
|
|
Loading…
Reference in a new issue