361 lines
11 KiB
C#
361 lines
11 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using System.Runtime.InteropServices;
|
|
using Switch_Toolbox.Library.Forms;
|
|
using Switch_Toolbox.Library;
|
|
using Bfres.Structs;
|
|
using System.Threading;
|
|
|
|
namespace FirstPlugin.Forms
|
|
{
|
|
|
|
public partial class TextureLoader : STUserControl
|
|
{
|
|
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
|
|
private static extern Int32 SendMessage(IntPtr hwnd, Int32 wMsg, Int32 wParam, Int32 lParam);
|
|
|
|
const int LVM_FIRST = 0x1000;
|
|
const int LVM_SETICONSPACING = LVM_FIRST + 53;
|
|
|
|
public static void SetControlSpacing(Control control, Int16 x, Int16 y)
|
|
{
|
|
SendMessage(control.Handle, LVM_SETICONSPACING, 0, x * 65536 + y);
|
|
control.Refresh();
|
|
}
|
|
|
|
BNTX activeBntx;
|
|
BFRESGroupNode activeFtexContainer;
|
|
|
|
ImageList imgList = new ImageList();
|
|
|
|
public TextureLoader()
|
|
{
|
|
InitializeComponent();
|
|
|
|
imgList = new ImageList()
|
|
{
|
|
ColorDepth = ColorDepth.Depth32Bit,
|
|
ImageSize = new Size(70, 70),
|
|
};
|
|
}
|
|
|
|
public void LoadTexture()
|
|
{
|
|
int imageIndex = 0;
|
|
|
|
imgList.Images.Clear();
|
|
|
|
listViewCustom1.LargeImageList = imgList;
|
|
listViewCustom1.Items.Clear();
|
|
listViewCustom1.View = View.LargeIcon;
|
|
SetControlSpacing(listViewCustom1, 75, 75);
|
|
|
|
if (activeBntx != null)
|
|
{
|
|
Thread Thread = new Thread((ThreadStart)(() =>
|
|
{
|
|
foreach (var tex in activeBntx.Textures.Values)
|
|
{
|
|
Bitmap temp = tex.GetBitmap();
|
|
|
|
if (listViewCustom1.InvokeRequired)
|
|
{
|
|
listViewCustom1.Invoke((MethodInvoker)delegate {
|
|
listViewCustom1.Items.Add(tex.Text, imageIndex++);
|
|
// Running on the UI thread
|
|
imgList.Images.Add(temp);
|
|
var dummy = imgList.Handle;
|
|
});
|
|
}
|
|
|
|
temp.Dispose();
|
|
}
|
|
}));
|
|
Thread.Start();
|
|
}
|
|
|
|
imageIndex = 0;
|
|
|
|
if (activeFtexContainer != null)
|
|
{
|
|
foreach (var tex in activeFtexContainer.ResourceNodes.Values)
|
|
{
|
|
FTEX ftex = (FTEX)tex;
|
|
|
|
listViewCustom1.Items.Add(ftex.Text, imageIndex++);
|
|
|
|
Bitmap temp = ftex.GetBitmap();
|
|
imgList.Images.Add(temp);
|
|
var dummy = imgList.Handle;
|
|
temp.Dispose();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void UpdateContainers()
|
|
{
|
|
//Check for new BNTX or FTEX containers
|
|
//If they are all loaded in the combo box, return to prevent clearing on switching everytime
|
|
int total = PluginRuntime.bntxContainers.Count + PluginRuntime.ftexContainers.Count;
|
|
if (stComboBox1.Items.Count == total)
|
|
return;
|
|
|
|
stComboBox1.Items.Clear();
|
|
|
|
int i = 0;
|
|
foreach (var tex in PluginRuntime.bntxContainers)
|
|
stComboBox1.Items.Add($"BNTX File {i++}");
|
|
|
|
i = 0;
|
|
foreach (var tex in PluginRuntime.ftexContainers)
|
|
stComboBox1.Items.Add($"FTEX Folder {i++}");
|
|
}
|
|
|
|
private void stComboBox1_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
int index = stComboBox1.SelectedIndex;
|
|
if (index < 0)
|
|
return;
|
|
|
|
if (PluginRuntime.bntxContainers.Count > 0)
|
|
{
|
|
activeBntx = PluginRuntime.bntxContainers[index];
|
|
|
|
LoadTexture();
|
|
}
|
|
if (PluginRuntime.ftexContainers.Count > 0)
|
|
{
|
|
activeFtexContainer = PluginRuntime.ftexContainers[index];
|
|
|
|
LoadTexture();
|
|
}
|
|
}
|
|
|
|
private void barSlider1_Scroll(object sender, ScrollEventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void barSlider1_ValueChanged(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private void btnRemove_Click(object sender, EventArgs e)
|
|
{
|
|
if (listViewCustom1.SelectedItems.Count > 0)
|
|
{
|
|
if (activeBntx != null)
|
|
{
|
|
foreach (ListViewItem item in listViewCustom1.SelectedItems)
|
|
{
|
|
string SelectedTexture = item.Text;
|
|
if (activeBntx.Textures.ContainsKey(SelectedTexture))
|
|
{
|
|
activeBntx.Nodes.Remove(activeBntx.Textures[SelectedTexture]);
|
|
activeBntx.Textures.Remove(SelectedTexture);
|
|
|
|
listViewCustom1.Items.Remove(item);
|
|
}
|
|
}
|
|
}
|
|
if (activeFtexContainer != null)
|
|
{
|
|
foreach (ListViewItem item in listViewCustom1.SelectedItems)
|
|
{
|
|
string SelectedTexture = item.Text;
|
|
if (activeFtexContainer.ResourceNodes.ContainsKey(SelectedTexture))
|
|
{
|
|
activeFtexContainer.Nodes.Remove(activeFtexContainer.ResourceNodes[SelectedTexture]);
|
|
activeFtexContainer.ResourceNodes.Remove(SelectedTexture);
|
|
|
|
listViewCustom1.Items.Remove(item);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void btnAdd_Click(object sender, EventArgs e)
|
|
{
|
|
if (activeBntx != null)
|
|
{
|
|
activeBntx.ImportTexture();
|
|
LoadTexture();
|
|
}
|
|
}
|
|
|
|
private void listViewCustom1_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
if (listViewCustom1.SelectedIndices != null &&
|
|
listViewCustom1.SelectedIndices.Count > 0)
|
|
{
|
|
btnRemove.Enabled = true;
|
|
}
|
|
else
|
|
{
|
|
btnRemove.Enabled = false;
|
|
}
|
|
}
|
|
|
|
|
|
ImageEditorForm imageEditorForm;
|
|
|
|
private TextureData GetSelectedBntxTexture()
|
|
{
|
|
if (activeBntx == null)
|
|
return null;
|
|
|
|
if (activeBntx.Textures.ContainsKey(listViewCustom1.SelectedItems[0].Text))
|
|
{
|
|
return activeBntx.Textures[listViewCustom1.SelectedItems[0].Text];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private FTEX GetSelectedFtexTexture()
|
|
{
|
|
if (activeFtexContainer == null)
|
|
return null;
|
|
|
|
if (activeFtexContainer.ResourceNodes.ContainsKey(listViewCustom1.SelectedItems[0].Text))
|
|
{
|
|
return (FTEX)activeFtexContainer.ResourceNodes[listViewCustom1.SelectedItems[0].Text];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private void textureListView_DoubleClick(object sender, EventArgs e)
|
|
{
|
|
if (activeBntx != null)
|
|
{
|
|
TextureData tex = GetSelectedBntxTexture();
|
|
|
|
if (tex != null)
|
|
LoadImageEditor(tex, tex.Texture);
|
|
}
|
|
if (activeFtexContainer != null)
|
|
{
|
|
FTEX tex = GetSelectedFtexTexture();
|
|
|
|
if (tex != null)
|
|
LoadImageEditor(tex, tex.texture);
|
|
}
|
|
}
|
|
|
|
private void LoadImageEditor(STGenericTexture texture, object Properties)
|
|
{
|
|
if (imageEditorForm == null || imageEditorForm.IsDisposed)
|
|
{
|
|
imageEditorForm = new ImageEditorForm(false);
|
|
imageEditorForm.Show(this);
|
|
}
|
|
|
|
imageEditorForm.editorBase.Text = Text;
|
|
imageEditorForm.editorBase.Dock = DockStyle.Fill;
|
|
imageEditorForm.editorBase.LoadProperties(Properties);
|
|
imageEditorForm.editorBase.LoadImage(texture);
|
|
}
|
|
|
|
public override void OnControlClosing()
|
|
{
|
|
imgList.Images.Clear();
|
|
listViewCustom1.Items.Clear();
|
|
imgList = null;
|
|
}
|
|
|
|
private void textureListView_MouseClick(object sender, MouseEventArgs e)
|
|
{
|
|
if (listViewCustom1.SelectedItems.Count <= 0)
|
|
return;
|
|
|
|
switch (e.Button)
|
|
{
|
|
case MouseButtons.Right:
|
|
{
|
|
Point p = new Point(e.X, e.Y);
|
|
textureContextMenuStrip1.Show(listViewCustom1, p);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void exportToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
if (activeBntx != null)
|
|
{
|
|
TextureData tex = GetSelectedBntxTexture();
|
|
|
|
SaveFileDialog sfd = new SaveFileDialog();
|
|
sfd.Filter = tex.ExportFilter;
|
|
|
|
if (sfd.ShowDialog() == DialogResult.OK)
|
|
{
|
|
tex.Export(sfd.FileName);
|
|
}
|
|
}
|
|
if (activeFtexContainer != null)
|
|
{
|
|
FTEX tex = GetSelectedFtexTexture();
|
|
|
|
SaveFileDialog sfd = new SaveFileDialog();
|
|
sfd.Filter = tex.ExportFilter;
|
|
|
|
if (sfd.ShowDialog() == DialogResult.OK)
|
|
{
|
|
tex.Export(sfd.FileName);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void replaceToolStripMenuItem_Click(object sender, EventArgs e)
|
|
{
|
|
if (activeBntx != null)
|
|
{
|
|
TextureData tex = GetSelectedBntxTexture();
|
|
|
|
OpenFileDialog ofd = new OpenFileDialog();
|
|
ofd.Filter = tex.ExportFilter;
|
|
|
|
ofd.Multiselect = false;
|
|
if (ofd.ShowDialog() == DialogResult.OK)
|
|
{
|
|
tex.Replace(ofd.FileName);
|
|
}
|
|
}
|
|
if (activeFtexContainer != null)
|
|
{
|
|
FTEX tex = GetSelectedFtexTexture();
|
|
|
|
OpenFileDialog ofd = new OpenFileDialog();
|
|
ofd.Filter = tex.ExportFilter;
|
|
|
|
ofd.Multiselect = false;
|
|
if (ofd.ShowDialog() == DialogResult.OK) {
|
|
tex.Replace(ofd.FileName);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void stComboBox1_Click(object sender, EventArgs e) {
|
|
UpdateContainers();
|
|
}
|
|
|
|
private void stComboBox1_MouseDown(object sender, MouseEventArgs e) {
|
|
UpdateContainers();
|
|
}
|
|
|
|
private void stComboBox1_KeyDown(object sender, KeyEventArgs e) {
|
|
UpdateContainers();
|
|
}
|
|
}
|
|
}
|