Begin work on GUI with Gtk#.
This commit is contained in:
parent
57ebb57335
commit
c4ecc51245
8 changed files with 353 additions and 0 deletions
131
SpritePacker-GUI/ListView.cs
Normal file
131
SpritePacker-GUI/ListView.cs
Normal file
|
@ -0,0 +1,131 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Gtk;
|
||||
|
||||
namespace SilentorBit
|
||||
{
|
||||
/// <summary>
|
||||
/// <para>A single column list, text comes from object.ToString()</para>
|
||||
/// <para>For multicolumns, see ListView<ClassType></para>
|
||||
/// <para>By SilentorBit from https://silentorbit.com/notes/2011/05/gtk-sharp-listview/</para>
|
||||
/// </summary>
|
||||
public class ListView : ListView<object>
|
||||
{
|
||||
public ListView (string columnTitle) : base(columnTitle)
|
||||
{
|
||||
}
|
||||
|
||||
protected override void RenderCell (CellRendererText render, int index, object item)
|
||||
{
|
||||
render.Text = item.ToString ();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The list only contains one type of object.
|
||||
/// To get multiple columns, pass that number of parameters to the constructor
|
||||
/// and implement RenderCell accordingly.
|
||||
/// </summary>
|
||||
public abstract class ListView<T> : TreeView
|
||||
{
|
||||
/// <summary>
|
||||
/// List of all items selected
|
||||
/// </summary>
|
||||
public T[] SelectedItems { get; private set; }
|
||||
public event Action<T[]> ItemSelected;
|
||||
public event Action<T> ItemActivated;
|
||||
|
||||
protected abstract void RenderCell (CellRendererText render, int index, T item);
|
||||
|
||||
ListStore store = new ListStore (typeof(T));
|
||||
Dictionary<T, TreeIter> storeList = new Dictionary<T, TreeIter> ();
|
||||
List<TreeViewColumn> columns = new List<TreeViewColumn> ();
|
||||
|
||||
/// <summary>
|
||||
/// Pass one string parameter for every column
|
||||
/// </summary>
|
||||
/// <param name="columnNames">
|
||||
/// Column Titles, one parameter for each column.
|
||||
/// </param>
|
||||
public ListView (params string[] columnNames)
|
||||
{
|
||||
this.Model = store;
|
||||
foreach (string s in columnNames) {
|
||||
TreeViewColumn c = this.AppendColumn (s, new CellRendererText (), this.ColumnCellData);
|
||||
columns.Add (c);
|
||||
}
|
||||
|
||||
this.SelectedItems = new T[0];
|
||||
this.Selection.Changed += HandleSelectionChanged;
|
||||
}
|
||||
|
||||
private void ColumnCellData (TreeViewColumn column, CellRenderer renderer, ITreeModel model, TreeIter iter)
|
||||
{
|
||||
T item = (T)model.GetValue (iter, 0);
|
||||
CellRendererText textRender = (CellRendererText)renderer;
|
||||
int index = columns.IndexOf (column);
|
||||
RenderCell (textRender, index, item);
|
||||
}
|
||||
|
||||
#region Add, Remove and Clear Items
|
||||
|
||||
public void AddItem (T item)
|
||||
{
|
||||
var iter = store.AppendValues (item);
|
||||
storeList.Add (item, iter);
|
||||
}
|
||||
|
||||
public void ClearItems ()
|
||||
{
|
||||
store.Clear ();
|
||||
storeList.Clear ();
|
||||
}
|
||||
|
||||
public void RemoveItem (T item)
|
||||
{
|
||||
if (! storeList.ContainsKey (item))
|
||||
return;
|
||||
|
||||
TreeIter iter = storeList[item];
|
||||
store.Remove (ref iter);
|
||||
storeList.Remove (item);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Selection and Aktivation triggers
|
||||
|
||||
void HandleSelectionChanged (object sender, EventArgs e)
|
||||
{
|
||||
TreeSelection selection = (TreeSelection)sender;
|
||||
TreePath[] paths = selection.GetSelectedRows ();
|
||||
T[] items = new T[paths.Length];
|
||||
for (int n = 0; n < paths.Length; n++) {
|
||||
TreeIter iter;
|
||||
Model.GetIter (out iter, paths[n]);
|
||||
items[n] = (T)Model.GetValue (iter, 0);
|
||||
}
|
||||
|
||||
SelectedItems = items;
|
||||
|
||||
var itemEvent = ItemSelected;
|
||||
if (itemEvent != null)
|
||||
itemEvent (items);
|
||||
}
|
||||
|
||||
protected override void OnRowActivated (TreePath path, TreeViewColumn column)
|
||||
{
|
||||
TreeIter iter;
|
||||
Model.GetIter (out iter, path);
|
||||
T item = (T)Model.GetValue (iter, 0);
|
||||
|
||||
var e = ItemActivated;
|
||||
if (e != null)
|
||||
e (item);
|
||||
|
||||
base.OnRowActivated (path, column);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
68
SpritePacker-GUI/MainWindow.cs
Normal file
68
SpritePacker-GUI/MainWindow.cs
Normal file
|
@ -0,0 +1,68 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
using Gtk;
|
||||
using SilentorBit;
|
||||
|
||||
namespace SpritePacker.GUI
|
||||
{
|
||||
public class MainWindow : Window
|
||||
{
|
||||
private static bool initialised = false;
|
||||
|
||||
private SpriteListView spriteListDisplay;
|
||||
|
||||
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();
|
||||
};
|
||||
|
||||
setupLayout();
|
||||
}
|
||||
|
||||
/// <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 setupLayout()
|
||||
{
|
||||
HBox masterContainer = new HBox(true, 10);
|
||||
VBox leftPanel = new VBox(false, 0) { MarginRight = 5 };
|
||||
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 };
|
||||
|
||||
spriteListDisplay = new SpriteListView() { Margin = 10 };
|
||||
spriteListDisplay.AddItem(new Sprite("/home/sbrl/Pictures/Spaghetti.png"));
|
||||
|
||||
leftPanel.OverrideBackgroundColor(StateFlags.Normal, Gdk.RGBA.Zero);
|
||||
leftPanel.PackStart(spriteListDisplay, true, true, 0);
|
||||
|
||||
masterContainer.PackStart(leftPanelFrame, true, true, 0);
|
||||
masterContainer.PackStart(rightPanelFrame, true, true, 0);
|
||||
|
||||
Add(masterContainer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
14
SpritePacker-GUI/Program.cs
Normal file
14
SpritePacker-GUI/Program.cs
Normal file
|
@ -0,0 +1,14 @@
|
|||
using System;
|
||||
|
||||
namespace SpritePacker.GUI
|
||||
{
|
||||
class MainClass
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
MainWindow.Init();
|
||||
MainWindow mainWindow = new MainWindow();
|
||||
mainWindow.Start();
|
||||
}
|
||||
}
|
||||
}
|
27
SpritePacker-GUI/Properties/AssemblyInfo.cs
Normal file
27
SpritePacker-GUI/Properties/AssemblyInfo.cs
Normal file
|
@ -0,0 +1,27 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
// Information about this assembly is defined by the following attributes.
|
||||
// Change them to the values specific to your project.
|
||||
|
||||
[assembly: AssemblyTitle("SpritePacker-GUI")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("")]
|
||||
[assembly: AssemblyCopyright("Starbeamrainbowlabs")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
|
||||
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
|
||||
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
|
||||
|
||||
[assembly: AssemblyVersion("1.0.*")]
|
||||
|
||||
// The following attributes are used to specify the signing key for the assembly,
|
||||
// if desired. See the Mono documentation for more information about signing.
|
||||
|
||||
//[assembly: AssemblyDelaySign(false)]
|
||||
//[assembly: AssemblyKeyFile("")]
|
||||
|
29
SpritePacker-GUI/SpriteListView.cs
Normal file
29
SpritePacker-GUI/SpriteListView.cs
Normal file
|
@ -0,0 +1,29 @@
|
|||
using System;
|
||||
using SilentorBit;
|
||||
using System.IO;
|
||||
|
||||
namespace SpritePacker.GUI
|
||||
{
|
||||
public class SpriteListView : ListView<Sprite>
|
||||
{
|
||||
public SpriteListView() : base("Number", "Filepath")
|
||||
{
|
||||
}
|
||||
|
||||
protected override void RenderCell(Gtk.CellRendererText render, int index, Sprite item)
|
||||
{
|
||||
switch(index)
|
||||
{
|
||||
case 0:
|
||||
render.Text = index.ToString();
|
||||
break;
|
||||
case 1:
|
||||
render.Text = item.Filename;
|
||||
break;
|
||||
default:
|
||||
throw new InvalidDataException($"Invalid column index {index}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
74
SpritePacker-GUI/SpritePacker-GUI.csproj
Normal file
74
SpritePacker-GUI/SpritePacker-GUI.csproj
Normal file
|
@ -0,0 +1,74 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||
<ProjectGuid>{ECC09EBE-FE69-4DC2-B553-B92DF4992762}</ProjectGuid>
|
||||
<OutputType>Exe</OutputType>
|
||||
<RootNamespace>SpritePacker.GUI</RootNamespace>
|
||||
<AssemblyName>SpritePacker-GUI</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug</OutputPath>
|
||||
<DefineConstants>DEBUG;</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Externalconsole>true</Externalconsole>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release</OutputPath>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Externalconsole>true</Externalconsole>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="atk-sharp">
|
||||
<HintPath>..\packages\GtkSharp.3.1.3\lib\net45\atk-sharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="cairo-sharp">
|
||||
<HintPath>..\packages\GtkSharp.3.1.3\lib\net45\cairo-sharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="gdk-sharp">
|
||||
<HintPath>..\packages\GtkSharp.3.1.3\lib\net45\gdk-sharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="gio-sharp">
|
||||
<HintPath>..\packages\GtkSharp.3.1.3\lib\net45\gio-sharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="glib-sharp">
|
||||
<HintPath>..\packages\GtkSharp.3.1.3\lib\net45\glib-sharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="gtk-sharp">
|
||||
<HintPath>..\packages\GtkSharp.3.1.3\lib\net45\gtk-sharp.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="pango-sharp">
|
||||
<HintPath>..\packages\GtkSharp.3.1.3\lib\net45\pango-sharp.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="MainWindow.cs" />
|
||||
<Compile Include="ListView.cs" />
|
||||
<Compile Include="SpriteListView.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="..\packages\GtkSharp.3.1.3\build\net45\GtkSharp.targets" Condition="Exists('..\packages\GtkSharp.3.1.3\build\net45\GtkSharp.targets')" />
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\SpritePacker\SpritePacker.csproj">
|
||||
<Project>{2D3C4FAA-6D9C-4644-ABC0-361550A1884A}</Project>
|
||||
<Name>SpritePacker</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
</Project>
|
4
SpritePacker-GUI/packages.config
Normal file
4
SpritePacker-GUI/packages.config
Normal file
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="GtkSharp" version="3.1.3" targetFramework="net45" />
|
||||
</packages>
|
|
@ -11,6 +11,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
|
|||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SpritePacker", "SpritePacker\SpritePacker.csproj", "{2D3C4FAA-6D9C-4644-ABC0-361550A1884A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SpritePacker-GUI", "SpritePacker-GUI\SpritePacker-GUI.csproj", "{ECC09EBE-FE69-4DC2-B553-B92DF4992762}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x86 = Debug|x86
|
||||
|
@ -25,6 +27,10 @@ Global
|
|||
{6EF47B64-1920-4827-BEEF-B262D5A2D214}.Debug|x86.Build.0 = Debug|x86
|
||||
{6EF47B64-1920-4827-BEEF-B262D5A2D214}.Release|x86.ActiveCfg = Release|x86
|
||||
{6EF47B64-1920-4827-BEEF-B262D5A2D214}.Release|x86.Build.0 = Release|x86
|
||||
{ECC09EBE-FE69-4DC2-B553-B92DF4992762}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{ECC09EBE-FE69-4DC2-B553-B92DF4992762}.Debug|x86.Build.0 = Debug|x86
|
||||
{ECC09EBE-FE69-4DC2-B553-B92DF4992762}.Release|x86.ActiveCfg = Release|x86
|
||||
{ECC09EBE-FE69-4DC2-B553-B92DF4992762}.Release|x86.Build.0 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
EndGlobalSection
|
||||
|
|
Loading…
Reference in a new issue