SpritePacker/SpritePacker/Program.cs

129 lines
3.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Windows.Markup;
using System.IO;
using System.Reflection;
namespace SpritePacker
{
enum ProgramMode
{
Normal,
DisplayHelpText,
DisplayVersionText
};
class Program
{
public static string Version = Utilities.GetEmbeddedResourceContent("SpritePacker.Version.txt").Trim();
private static ProgramMode programMode = ProgramMode.Normal;
private static string helpTextFilename = "SpritePacker.Resources.HelpText.txt";
private static string versionTextFilename = "SpritePacker.Resources.VersionText.txt";
private static string commitHashFilename = "SpritePacker.latest-commit-hash.txt";
private static Packer spritePacker = new Packer();
private static List<string> values = new List<string>();
public static bool Verbose = false;
public static int Main(string[] args)
{
string commitHash = Utilities.GetEmbeddedResourceContent(commitHashFilename).Trim();
Version += "-" + commitHash.Substring(commitHash.Length - 7);
for(int i = 0; i < args.Length; i++)
{
switch(args[i])
{
case "--help":
programMode = ProgramMode.DisplayHelpText;
break;
case "--version":
programMode = ProgramMode.DisplayVersionText;
break;
case "--verbose":
Verbose = true;
break;
default:
if(args[i].StartsWith("-"))
{
Console.Error.WriteLine("Error: Unrecognised flag '{0}'.", args[i]);
return 1;
}
values.Add(args[i]);
break;
}
}
switch(programMode)
{
case ProgramMode.Normal:
if(values.Count == 0)
{
Console.Error.WriteLine("Error: No filenames specified!");
return 1;
}
RunNormal();
break;
case ProgramMode.DisplayHelpText:
case ProgramMode.DisplayVersionText:
string textFileName = programMode == ProgramMode.DisplayHelpText ? helpTextFilename : versionTextFilename;
string helpText = Utilities.GetEmbeddedResourceContent(textFileName);
Dictionary<string, string> templateValues = new Dictionary<string, string>() {
{ "version", Version },
{ "build-date", Utilities.GetProgramBuildDate().ToString("dd/MM/yyyy h:mmtt") },
{ "commit-hash", commitHash.Substring(commitHash.Length - 7) },
{ "commit-url", string.Format("https://git.starbeamrainbowlabs.com/sbrl/SpritePacker/commit/{0}", commitHash) }
};
foreach (KeyValuePair<string, string> replacePair in templateValues)
helpText = helpText.Replace(string.Format("{{{0}}}", replacePair.Key), replacePair.Value);
Console.WriteLine(helpText);
break;
}
return 0;
}
public static void RunNormal()
{
addSprites(values);
spritePacker.Arrange();
Console.WriteLine(spritePacker.ToString());
}
private static void addSprites(List<string> filenames)
{
foreach(string filename in values)
{
// Make sure that the file actually exists (we don't want the packer to throw a tantrum)
if (File.Exists(filename))
{
try
{
spritePacker.Add(new Sprite(filename));
}
catch(Exception error)
{
Console.Error.WriteLine("Error reading {0}: {1}", filename, error.Message);
}
if ((File.GetAttributes(filename) & FileAttributes.Directory) == FileAttributes.Directory)
{
// This filename is a directory - recurse over all the files in the directory
string[] dirFiles = Directory.GetFiles(filename);
addSprites(new List<string>(dirFiles));
}
}
else
{
Console.Error.WriteLine("Warning: Ignoring non-existent file '{0}'.", filename);
}
}
}
}
}