SpritePacker/SpritePacker-GUI/MainWindow.cs

139 lines
4.3 KiB
C#
Raw Normal View History

2016-08-01 18:54:47 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
using Gtk;
using Ext.SilentorBit;
using System.Drawing.Imaging;
2016-08-03 11:00:14 +00:00
using System.Runtime.ExceptionServices;
2016-08-01 18:54:47 +00:00
namespace SpritePacker.GUI
{
public class MainWindow : Window
{
private static bool initialised = false;
private SpriteListView spriteListDisplay;
2016-08-03 10:27:41 +00:00
private FileChooserDialog spriteListSelector;
private FileFilter spriteListSelectorFilter;
2016-08-01 18:54:47 +00:00
2016-08-03 10:27:41 +00:00
private Button openImageButton;
private Button removeImageButton;
2016-08-03 11:00:14 +00:00
private SpritePacker spritePacker = new SpritePacker();
2016-08-01 18:54:47 +00:00
public MainWindow() : base("SpritePacker GUI")
{
if (!initialised)
throw new InvalidOperationException("Error: Gtk hasn't been initialised yet, so you can't create a new window.");
SetDefaultSize(500, 300);
SetPosition(WindowPosition.Center);
// Quit when the close button is pressed
DeleteEvent += (object o, DeleteEventArgs args) => {
Application.Quit();
};
setupWidgets();
2016-08-01 18:54:47 +00:00
}
/// <summary>
/// Initilise GTK# to make it ready for use.
/// </summary>
public static void Init()
{
initialised = true;
Application.Init();
}
public void Start()
{
ShowAll();
Application.Run();
}
private void setupWidgets()
2016-08-01 18:54:47 +00:00
{
// Create the layout containers
2016-08-01 19:42:43 +00:00
HBox masterContainer = new HBox(false, 10);
2016-08-01 18:54:47 +00:00
VBox leftPanel = new VBox(false, 0) { MarginRight = 5 };
2016-08-03 10:27:41 +00:00
HBox controlButtonRow = new HBox();
2016-08-01 18:54:47 +00:00
VBox rightPanel = new VBox(false, 0) { MarginLeft = 5 };
Frame leftPanelFrame = new Frame("Sprites") { Child = leftPanel, Margin = 10, MarginRight = 5 };
Frame rightPanelFrame = new Frame("Preview") { Child = rightPanel, Margin = 10, MarginLeft = 5 };
// Create the file selector filter
spriteListSelectorFilter = new FileFilter() { Name = "Images" };
foreach (ImageCodecInfo currentDecoder in ImageCodecInfo.GetImageDecoders())
spriteListSelectorFilter.AddMimeType(currentDecoder.MimeType);
2016-08-03 10:27:41 +00:00
// Create the file selector dialog
spriteListSelector = new FileChooserDialog("Add Sprite", this, FileChooserAction.Open) {
Margin = 10,
PreviewWidgetActive = true,
Filter = spriteListSelectorFilter
};
2016-08-03 10:27:41 +00:00
spriteListSelector.SelectMultiple = true;
2016-08-03 11:00:14 +00:00
spriteListSelector.AddButton("Add Sprites", ResponseType.Ok);
spriteListSelector.AddButton("Cancel", ResponseType.Cancel);
// Create the ListView to display the added sprites
2016-08-03 10:27:41 +00:00
spriteListDisplay = new SpriteListView() { Margin = 10, MarginTop = 5 };
2016-08-03 11:15:23 +00:00
spriteListDisplay.EnableSearch = true;
2016-08-01 18:54:47 +00:00
2016-08-03 11:00:14 +00:00
openImageButton = new Button("Add Sprites") { Margin = 10, MarginTop = 0, MarginBottom = 0 };
removeImageButton = new Button("Remove Selected Sprites") { Margin = 10, MarginTop = 0, MarginBottom = 0 };
openImageButton.Released += (object sender, EventArgs e) => {
ResponseType response = (ResponseType)spriteListSelector.Run();
spriteListSelector.Hide();
switch(response)
{
case ResponseType.Ok:
Action_AddSprite(spriteListSelector.Filenames);
break;
case ResponseType.DeleteEvent:
case ResponseType.Cancel:
Console.Error.WriteLine("Ignoring sprite file chooser response {0}.", response);
break;
default:
throw new Exception($"Unknown sprite file chooser response type {response}.");
}
};
2016-08-03 11:15:23 +00:00
removeImageButton.Released += (object sender, EventArgs e) => {
foreach(Sprite currentSprite in spriteListDisplay.SelectedItems)
spritePacker.Remove(currentSprite);
spriteListDisplay.ClearItems();
foreach(Sprite currentSprite in spritePacker.CurrentSprites)
spriteListDisplay.AddItem(currentSprite);
};
2016-08-03 10:27:41 +00:00
// Populate the control button row
controlButtonRow.PackStart(openImageButton, true, false, 0);
2016-08-03 11:00:14 +00:00
controlButtonRow.PackStart(removeImageButton, true, false, 0);
2016-08-03 10:27:41 +00:00
// Populate the left panel
2016-08-03 10:27:41 +00:00
leftPanel.PackStart(controlButtonRow, false, false, 5);
2016-08-01 18:54:47 +00:00
leftPanel.PackStart(spriteListDisplay, true, true, 0);
// Pack the master container
2016-08-01 18:54:47 +00:00
masterContainer.PackStart(leftPanelFrame, true, true, 0);
masterContainer.PackStart(rightPanelFrame, true, true, 0);
// Add the master container to the window itself
2016-08-01 18:54:47 +00:00
Add(masterContainer);
}
2016-08-03 11:00:14 +00:00
void Action_AddSprite(string[] selectedFilenames)
{
foreach (string filename in selectedFilenames)
{
Sprite nextSprite = new Sprite(filename);
spritePacker.Add(nextSprite);
spriteListDisplay.AddItem(nextSprite);
}
}
2016-08-01 18:54:47 +00:00
}
}