Switch-Toolbox/Switch_FileFormatsMain/GUI/TextureLoader.cs
2019-03-30 15:57:01 -04:00

360 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();
}
}
}