mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/PCK-Studio.git
synced 2026-05-23 13:07:25 +00:00
224 lines
8.3 KiB
C#
224 lines
8.3 KiB
C#
using PckStudio.Classes.FileTypes;
|
|
using PckStudio.Classes.IO.GRF;
|
|
using PckStudio.Forms.Utilities.Grf;
|
|
using RichPresenceClient;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
|
|
namespace PckStudio.Forms.Editor
|
|
{
|
|
public partial class GRFEditor : MetroFramework.Forms.MetroForm
|
|
{
|
|
private PCKFile.FileData _pckfile;
|
|
private GRFFile _file;
|
|
|
|
|
|
private GRFEditor()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
public GRFEditor(PCKFile.FileData file) : this()
|
|
{
|
|
_pckfile = file;
|
|
using(var stream = new MemoryStream(file.data))
|
|
{
|
|
try
|
|
{
|
|
_file = GRFFileReader.Read(stream);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(ex.Message);
|
|
MessageBox.Show("Faild to open .grf/.grh file");
|
|
}
|
|
}
|
|
}
|
|
|
|
public GRFEditor(Stream stream) : this()
|
|
{
|
|
try
|
|
{
|
|
_file = GRFFileReader.Read(stream);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(ex.Message);
|
|
MessageBox.Show("Faild to open .grf/.grh file");
|
|
}
|
|
}
|
|
|
|
private void OnLoad(object sender, EventArgs e)
|
|
{
|
|
RPC.SetPresence("GRF Editor", "Editing a GRF File");
|
|
loadGRFTreeView(GrfTreeView.Nodes, _file.RootTag);
|
|
}
|
|
|
|
private void OnExit(object sender, FormClosingEventArgs e)
|
|
{
|
|
RPC.SetPresence("Sitting alone", "Program by PhoenixARC");
|
|
Dispose();
|
|
}
|
|
|
|
private void loadGRFTreeView(TreeNodeCollection root, GRFFile.GRFTag parentTag)
|
|
{
|
|
foreach (var tag in parentTag.Tags)
|
|
{
|
|
TreeNode node = new TreeNode(tag.Name);
|
|
node.Tag = tag;
|
|
root.Add(node);
|
|
loadGRFTreeView(node.Nodes, tag);
|
|
}
|
|
}
|
|
|
|
private void GrfTreeView_AfterSelect(object sender, TreeViewEventArgs e)
|
|
{
|
|
if (e.Node == null || !(e.Node.Tag is GRFFile.GRFTag)) return;
|
|
ReloadParameterTreeView();
|
|
}
|
|
|
|
private void ReloadParameterTreeView()
|
|
{
|
|
if (GrfTreeView.SelectedNode == null || !(GrfTreeView.SelectedNode.Tag is GRFFile.GRFTag)) return;
|
|
var grfTag = GrfTreeView.SelectedNode.Tag as GRFFile.GRFTag;
|
|
GrfParametersTreeView.Nodes.Clear();
|
|
foreach (var Pair in grfTag.Parameters)
|
|
{
|
|
GrfParametersTreeView.Nodes.Add(new TreeNode($"{Pair.Key}: {Pair.Value}") { Tag = Pair});
|
|
}
|
|
}
|
|
|
|
private void addDetailContextMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
if (GrfTreeView.SelectedNode == null || !(GrfTreeView.SelectedNode.Tag is GRFFile.GRFTag)) return;
|
|
var grfTag = GrfTreeView.SelectedNode.Tag as GRFFile.GRFTag;
|
|
AddParameter prompt = new AddParameter();
|
|
if (prompt.ShowDialog() == DialogResult.OK)
|
|
{
|
|
if (grfTag.Parameters.ContainsKey(prompt.ParameterName))
|
|
{
|
|
MessageBox.Show("Can't add detail that already exists.", "Error");
|
|
return;
|
|
}
|
|
grfTag.Parameters.Add(prompt.ParameterName, prompt.ParameterValue);
|
|
ReloadParameterTreeView();
|
|
}
|
|
}
|
|
|
|
private void removeToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
if (GrfTreeView.SelectedNode == null || !(GrfTreeView.SelectedNode.Tag is GRFFile.GRFTag) ||
|
|
GrfParametersTreeView.SelectedNode == null || !(GrfParametersTreeView.SelectedNode.Tag is KeyValuePair<string, string>))
|
|
{
|
|
MessageBox.Show("No Rule selected");
|
|
return;
|
|
}
|
|
var grfTag = GrfTreeView.SelectedNode.Tag as GRFFile.GRFTag;
|
|
var pair = (KeyValuePair<string, string>)GrfParametersTreeView.SelectedNode.Tag;
|
|
if (grfTag.Parameters.ContainsKey(pair.Key) && grfTag.Parameters.Remove(pair.Key))
|
|
ReloadParameterTreeView();
|
|
}
|
|
|
|
private void GrfDetailsTreeView_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
if (e.KeyCode == Keys.Delete)
|
|
removeToolStripMenuItem_Click(sender, e);
|
|
}
|
|
|
|
private void GrfDetailsTreeView_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
|
|
{
|
|
if (GrfTreeView.SelectedNode == null ||
|
|
!(GrfTreeView.SelectedNode.Tag is GRFFile.GRFTag) ||
|
|
GrfParametersTreeView.SelectedNode == null ||
|
|
!(GrfParametersTreeView.SelectedNode.Tag is KeyValuePair<string, string>)) return;
|
|
var grfTag = GrfTreeView.SelectedNode.Tag as GRFFile.GRFTag;
|
|
var param = (KeyValuePair<string, string>)GrfParametersTreeView.SelectedNode.Tag;
|
|
AddParameter prompt = new AddParameter(param.Key, param.Value, false);
|
|
if (prompt.ShowDialog() == DialogResult.OK)
|
|
{
|
|
grfTag.Parameters[prompt.ParameterName] = prompt.ParameterValue;
|
|
ReloadParameterTreeView();
|
|
}
|
|
}
|
|
|
|
private void addGameRuleToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
if(GrfTreeView.SelectedNode == null || !(GrfTreeView.SelectedNode.Tag is GRFFile.GRFTag)) return;
|
|
var parentTag = GrfTreeView.SelectedNode.Tag as GRFFile.GRFTag;
|
|
using (RenamePrompt prompt = new RenamePrompt(""))
|
|
{
|
|
prompt.OKButton.Text = "Add";
|
|
if (MessageBox.Show($"Add Game Rule to {parentTag.Name}", "Attention",
|
|
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes &&
|
|
prompt.ShowDialog() == DialogResult.OK &&
|
|
!string.IsNullOrWhiteSpace(prompt.NewText))
|
|
{
|
|
var tag = new GRFFile.GRFTag(prompt.NewText, parentTag);
|
|
parentTag.Tags.Add(tag);
|
|
TreeNode node = new TreeNode(tag.Name);
|
|
node.Tag = tag;
|
|
GrfTreeView.SelectedNode.Nodes.Add(node);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void removeGameRuleToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
if (GrfTreeView.SelectedNode == null || !(GrfTreeView.SelectedNode.Tag is GRFFile.GRFTag)) return;
|
|
var tag = GrfTreeView.SelectedNode.Tag as GRFFile.GRFTag;
|
|
if (removeTag(tag))
|
|
GrfTreeView.SelectedNode.Remove();
|
|
}
|
|
|
|
private bool removeTag(GRFFile.GRFTag tag)
|
|
{
|
|
foreach (var subTag in tag.Tags.ToList())
|
|
return removeTag(subTag);
|
|
return tag.Parent.Tags.Remove(tag);
|
|
}
|
|
|
|
private void GrfTreeView_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
if (e.KeyCode == Keys.Delete)
|
|
removeGameRuleToolStripMenuItem_Click(sender, e);
|
|
}
|
|
|
|
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
if (_file.IsWorld)
|
|
{
|
|
MessageBox.Show("World grf saving is currently unsupported");
|
|
return;
|
|
}
|
|
using (var stream = new MemoryStream())
|
|
{
|
|
try
|
|
{
|
|
GRFFileWriter.Write(stream, _file);
|
|
_pckfile?.SetData(stream.ToArray());
|
|
MessageBox.Show("Saved!");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(ex.Message);
|
|
MessageBox.Show("Failed to save grf file", "Save Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void metroPanel1_Resize(object sender, EventArgs e)
|
|
{
|
|
int padding = 2;
|
|
GrfTreeView.Size = new Size(metroPanel1.Size.Width / 2 - padding, metroPanel1.Size.Height);
|
|
GrfParametersTreeView.Size = new Size(metroPanel1.Size.Width / 2 - padding, metroPanel1.Size.Height);
|
|
// good enough
|
|
metroLabel2.Location = new Point(metroPanel1.Size.Width / 2 + 25, metroLabel2.Location.Y);
|
|
}
|
|
}
|
|
}
|