diff --git a/AppSettings.cs b/AppSettings.cs
new file mode 100644
--- /dev/null
+++ b/AppSettings.cs
@@ -0,0 +1,43 @@
+using System;
+
+namespace DesertPaintLab
+{
+ public class AppSettings
+ {
+ private AppSettings()
+ {
+ }
+
+ private static Settings _settings = new Settings();
+
+ public static void Get(string key, out int value)
+ {
+ _settings.Get(key, out value);
+ }
+ public static void Get(string key, out bool value)
+ {
+ _settings.Get(key, out value);
+ }
+ public static void Set(string key, int value)
+ {
+ _settings.Set(key, value);
+ }
+ public static void Set(string key, bool value)
+ {
+ _settings.Set(key, value);
+ }
+
+ public static void Save()
+ {
+ string settingsPath = System.IO.Path.Combine(FileUtils.AppDataPath, "settings");
+ _settings.Save(settingsPath);
+ }
+
+ public static bool Load()
+ {
+ string settingsPath = System.IO.Path.Combine(FileUtils.AppDataPath, "settings");
+ return _settings.Load(settingsPath);
+ }
+ }
+}
+
diff --git a/DesertPaintLab.csproj b/DesertPaintLab.csproj
--- a/DesertPaintLab.csproj
+++ b/DesertPaintLab.csproj
@@ -67,8 +67,6 @@
-
-
@@ -76,14 +74,20 @@
-
-
+
+
+
+
+
+
+
+
@@ -111,4 +115,7 @@
PreserveNewest
+
+
+
\ No newline at end of file
diff --git a/MainWindow.cs b/MainWindow.cs
--- a/MainWindow.cs
+++ b/MainWindow.cs
@@ -35,14 +35,14 @@ public partial class MainWindow : Gtk.Wi
bool shouldShutDown = false;
List profileList = new List();
PlayerProfile profile = null;
- PaintColor expectedColor = new PaintColor();
- PaintColor reactedColor = new PaintColor();
Gdk.Window rootWindow = null;
Gdk.Pixbuf screenBuffer = null;
- Reagent[] reagents = new Reagent[3];
- PaintRecipe recipe = new PaintRecipe();
+ // views
+ RecipeGeneratorView generatorView;
+ SimulatorView simulatorView;
+ CaptureView captureView;
public bool ShouldShutDown
{
@@ -52,7 +52,6 @@ public partial class MainWindow : Gtk.Wi
}
}
-
public MainWindow () : base(Gtk.WindowType.Toplevel)
{
string appDataPath = FileUtils.AppDataPath;
@@ -71,10 +70,6 @@ public partial class MainWindow : Gtk.Wi
}
}
- reagents[0] = null;
- reagents[1] = null;
- reagents[2] = null;
-
string colorsPath = FileUtils.FindApplicationResourceFile("colors.txt");
if (colorsPath == null)
{
@@ -107,15 +102,6 @@ public partial class MainWindow : Gtk.Wi
Build();
- if (unmodifiedSwatch != null)
- {
- unmodifiedSwatch.Clear();
- }
- if (reactionSwatch != null)
- {
- reactionSwatch.Clear();
- }
-
// get the root window
rootWindow = Gdk.Global.DefaultRootWindow;
@@ -125,15 +111,15 @@ public partial class MainWindow : Gtk.Wi
rootWindow.GetSize(out screenWidth, out screenHeight);
int pixelMultiplier = 1;
- if ( DesertPaintLab.Settings.Load() == true )
+ if ( DesertPaintLab.AppSettings.Load() == true )
{
- DesertPaintLab.Settings.Get("ScreenWidth", out screenWidth);
- DesertPaintLab.Settings.Get("ScreenHeight", out screenHeight);
- DesertPaintLab.Settings.Get("PixelMultiplier", out pixelMultiplier);
+ DesertPaintLab.AppSettings.Get("ScreenWidth", out screenWidth);
+ DesertPaintLab.AppSettings.Get("ScreenHeight", out screenHeight);
+ DesertPaintLab.AppSettings.Get("PixelMultiplier", out pixelMultiplier);
}
bool enableDebugMenu;
- DesertPaintLab.Settings.Get("EnableDebugMenu", out enableDebugMenu);
+ DesertPaintLab.AppSettings.Get("EnableDebugMenu", out enableDebugMenu);
this.DebugAction.Visible = enableDebugMenu;
ScreenCheckDialog screenCheckDialog = new ScreenCheckDialog();
@@ -146,10 +132,10 @@ public partial class MainWindow : Gtk.Wi
pixelMultiplier = screenCheckDialog.GamePixelWidth;
screenCheckDialog.Destroy();
- DesertPaintLab.Settings.Set("ScreenWidth", screenWidth);
- DesertPaintLab.Settings.Set("ScreenHeight", screenHeight);
- DesertPaintLab.Settings.Set("PixelMultiplier", pixelMultiplier);
- DesertPaintLab.Settings.Save();
+ DesertPaintLab.AppSettings.Set("ScreenWidth", screenWidth);
+ DesertPaintLab.AppSettings.Set("ScreenHeight", screenHeight);
+ DesertPaintLab.AppSettings.Set("PixelMultiplier", pixelMultiplier);
+ DesertPaintLab.AppSettings.Save();
screenBuffer = new Gdk.Pixbuf(Gdk.Colorspace.Rgb, false, 8, screenWidth, screenHeight);
@@ -159,6 +145,16 @@ public partial class MainWindow : Gtk.Wi
{
shouldShutDown = true;
}
+
+ captureView = new CaptureView(profile, screenBuffer);
+ generatorView = new RecipeGeneratorView(profile);
+ generatorView.SetStatus += OnStatusUpdate;
+ generatorView.Started += OnGeneratorRunning;
+ generatorView.Stopped += OnGeneratorStopped;
+ simulatorView = new SimulatorView(profile);
+
+ contentContainer.Add(captureView);
+ captureView.Show();
}
bool ConfirmedExit()
@@ -177,14 +173,59 @@ public partial class MainWindow : Gtk.Wi
}
return true;
}
+
+ protected void OnStatusUpdate(object sender, EventArgs args)
+ {
+ StatusUpdateEventArgs statusArgs = (StatusUpdateEventArgs)args;
+ statusBar.Push(0, statusArgs.Status);
+ }
+
+ protected void OnGeneratorRunning(object sender, EventArgs args)
+ {
+ NewProfileAction.Sensitive = false;
+ OpenProfileAction.Sensitive = false;
+ ImportProfileAction.Sensitive = false;
+ if (captureView != null)
+ {
+ captureView.DisableRecord();
+ }
+ }
+
+ protected void OnGeneratorStopped(object sender, EventArgs args)
+ {
+ NewProfileAction.Sensitive = true;
+ OpenProfileAction.Sensitive = true;
+ ImportProfileAction.Sensitive = true;
+ if (captureView != null)
+ {
+ captureView.EnableRecord();
+ }
+ }
void SetProfileName(string name)
{
profile = new PlayerProfile(name,
System.IO.Path.Combine(FileUtils.AppDataPath, name));
-
- statusBar.Push(0, name);
}
+
+ void ProfileChanged()
+ {
+ statusBar.Push(0, "Profile: " + profile.Name);
+ Title = "Desert Paint Lab - " + profile.Name;
+
+ if (generatorView != null)
+ {
+ generatorView.Profile = profile;
+ }
+ if (simulatorView != null)
+ {
+ simulatorView.Profile = profile;
+ }
+ if (captureView != null)
+ {
+ captureView.Profile = profile;
+ }
+ }
bool NewProfile()
{
@@ -197,7 +238,7 @@ public partial class MainWindow : Gtk.Wi
// Make sure profile doesn't already exist.
foreach (string profileName in profileList)
{
- if (profileName == newProfileDialog.ProfileName)
+ if (profileName.Equals(newProfileDialog.ProfileName))
{
MessageDialog md = new MessageDialog(this,
DialogFlags.DestroyWithParent,
@@ -226,6 +267,7 @@ public partial class MainWindow : Gtk.Wi
md.Destroy();
duplicateName = false;
}
+ ProfileChanged();
}
}
newProfileDialog.Destroy();
@@ -290,10 +332,10 @@ public partial class MainWindow : Gtk.Wi
if (profileSelected)
{
bool ok = profile.Load();
+
if (ok)
{
- PopulateDropDowns();
- recipe.Reactions = profile.Reactions;
+ ProfileChanged();
}
else
{
@@ -311,166 +353,6 @@ public partial class MainWindow : Gtk.Wi
return profileSelected;
}
- void PopulateDropDowns()
- {
- ReagentManager.PopulateReagents(ref ingredient1ComboBox);
- ReagentManager.PopulateReagents(ref ingredient2ComboBox);
- ReagentManager.PopulateReagents(ref ingredient3ComboBox);
-
- ingredient2ComboBox.Sensitive = false;
- ingredient3ComboBox.Sensitive = false;
-
- Gtk.TreeIter iter;
- ingredient1ComboBox.Model.IterNthChild(out iter, 0);
- ingredient1ComboBox.SetActiveIter(iter);
- ingredient2ComboBox.Model.IterNthChild(out iter, 0);
- ingredient2ComboBox.SetActiveIter(iter);
- ingredient3ComboBox.Model.IterNthChild(out iter, 0);
- ingredient3ComboBox.SetActiveIter(iter);
- }
-
- protected void SetExpectedColor(byte red, byte green, byte blue)
- {
- expectedColor.Red = red;
- expectedColor.Green = green;
- expectedColor.Blue = blue;
- unmodifiedSwatch.Color = expectedColor;
- }
-
- protected void SetExpectedColor(PaintColor color)
- {
- SetExpectedColor(color.Red, color.Green, color.Blue);
- }
-
- protected void UpdateIngredients()
- {
- Reaction reaction1, reaction2;
- TreeIter selectIter;
- string reagentName;
- reagents[0] = null;
- reagents[1] = null;
- reagents[2] = null;
-
- bool reactionKnown = true;
-
- saveButton.Sensitive = false;
-
- recipe.Clear();
-
- if (ingredient1ComboBox.GetActiveIter(out selectIter))
- {
- reagentName = (string)ingredient1ComboBox.Model.GetValue(selectIter, 0);
- if ((reagentName == null) || (reagentName.Length == 0))
- {
- // Nothing selected as reagent 1
- ingredient2ComboBox.Sensitive = false;
- ingredient3ComboBox.Sensitive = false;
- unmodifiedSwatch.Clear();
- captureButton.Sensitive = false;
- }
- else
- {
- recipe.AddReagent(reagentName);
- reagents[0] = ReagentManager.GetReagent(reagentName);
- ingredient2ComboBox.Sensitive = true;
- if (ingredient2ComboBox.GetActiveIter(out selectIter))
- {
- reagentName = (string)ingredient2ComboBox.Model.GetValue(selectIter, 0);
- if ((reagentName == null) || (reagentName.Length == 0))
- {
- ingredient3ComboBox.Sensitive = false;
- saveButton.Sensitive = false;
- reactionKnown = false;
- }
- else
- {
- recipe.AddReagent(reagentName);
- reagents[1] = ReagentManager.GetReagent(reagentName);
- ingredient3ComboBox.Sensitive = true;
- captureButton.Sensitive = true;
-
- reaction1 = profile.FindReaction(reagents[0], reagents[1]);
-
- if ((reaction1 != null) || (reagents[0] == reagents[1]))
- {
- ingredient3ComboBox.Sensitive = true;
- }
- else
- {
- reactionKnown = false;
- ingredient3ComboBox.Sensitive = false;
- }
-
- if (ingredient3ComboBox.GetActiveIter(out selectIter))
- {
- reagentName = (string)ingredient3ComboBox.Model.GetValue(selectIter, 0);
- if ((reagentName != null) && (reagentName.Length != 0))
- {
- recipe.AddReagent(reagentName);
- reagents[2] = ReagentManager.GetReagent(reagentName);
-
- if (!reactionKnown)
- {
- MessageDialog md = new MessageDialog(this,
- DialogFlags.DestroyWithParent,
- MessageType.Error, ButtonsType.Ok,
- "To do a three-ingredient reaction test, " +
- "you must first recored the reaction of " +
- "the first two ingredients.");
-
- md.Run();
- md.Destroy();
- captureButton.Sensitive = false;
- }
-
- reaction1 = profile.FindReaction(reagents[0], reagents[2]);
- reaction2 = profile.FindReaction(reagents[1], reagents[2]);
-
- if (reactionKnown && (reaction1 == null) && (reaction2 == null))
- {
- MessageDialog md = new MessageDialog(this,
- DialogFlags.DestroyWithParent,
- MessageType.Error, ButtonsType.Ok,
- "To do a three-ingredient reaction test, " +
- "you must first record the reaction of " +
- "either the first or second ingredient " +
- "with the third ingredient.");
-
- md.Run();
- md.Destroy();
- captureButton.Sensitive = false;
- }
-
- if ((reaction1 == null) && (reagents[0] != reagents[2]))
- {
- reactionKnown = false;
- }
-
- if ((reaction2 == null) && (reagents[1] != reagents[2]))
- {
- reactionKnown = false;
- }
- }
- }
- }
- }
- expectedColor.Set(recipe.BaseColor);
- unmodifiedSwatch.Color = expectedColor;
- //SetExpectedColor(recipeColor.Red, recipeColor.Green, recipeColor.Blue);
-
- if (reactionKnown)
- {
- reactedColor.Set(recipe.ReactedColor);
- reactionSwatch.Color = reactedColor;
- }
- else
- {
- reactionSwatch.Clear();
- }
- }
- }
- }
-
protected void OnDeleteEvent(object sender, DeleteEventArgs a)
{
if (ConfirmedExit())
@@ -484,74 +366,12 @@ public partial class MainWindow : Gtk.Wi
}
}
- bool IsPapyTexture(byte r, byte g, byte b)
- {
- return ((r > 0xD0) && (g > 0xC8) && (b > 0xA0)) &&
- ((r < 0xF4) && (g < 0xE0) && (b < 0xC4));
- }
-
- unsafe bool CaptureReactionColor()
- {
- // Take a screenshot.
- int screenWidth, screenHeight;
- bool debugScreenshot = false;
- bool enableDebugMenu = false;
- DesertPaintLab.Settings.Get("ScreenWidth", out screenWidth);
- DesertPaintLab.Settings.Get("ScreenHeight", out screenHeight);
- DesertPaintLab.Settings.Get("EnableDebugMenu", out enableDebugMenu);
- DesertPaintLab.Settings.Get("DebugScreenshot", out debugScreenshot);
- Gdk.Image rootImage = rootWindow.GetImage(0, 0, screenWidth, screenHeight);
- screenBuffer.GetFromImage(rootImage, rootImage.Colormap, 0, 0, 0, 0, screenWidth, screenHeight);
- //screenBuffer.GetFromDrawable(rootWindow,
- // rootWindow.Colormap, 0, 0, 0, 0, screenWidth, screenHeight);
- int stride = screenBuffer.Rowstride;
- byte* pixBytes = (byte*)screenBuffer.Pixels;
- int redPixelStart = -1;
-
- bool wasCaptured = ReactionRecorder.CaptureReaction(pixBytes, screenWidth, screenHeight, stride, ref reactedColor, ref redPixelStart);
- if (!wasCaptured && enableDebugMenu && debugScreenshot)
- {
- // write out the screenshot
- string screenshotDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
- string filename;
- int i = 0;
- do
- {
- ++i;
- filename = System.IO.Path.Combine(screenshotDir, String.Format("DesertPaintLab_Colormatch{0}.png", i));
- } while (System.IO.File.Exists(filename));
- screenBuffer.Save(filename, "png");
- }
- else
- {
- // convert to pixel offset instead of byte
- int redPixelStartX = (redPixelStart % stride) / 3;
- int redPixelStartY = (redPixelStart / stride);
- // write out the screenshot
- string screenshotDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
- string filename;
- int i = 0;
- do
- {
- ++i;
- filename = System.IO.Path.Combine(screenshotDir, String.Format("DesertPaintLab_Colormatch{0}.png", i));
- } while (System.IO.File.Exists(filename));
- int captureAreaWidth = Math.Min(64, screenWidth - redPixelStartX + 64);
- int captureAreaHeight = Math.Min(64, screenHeight - redPixelStartY + 64);
- Gdk.Pixbuf outPixBuf = new Gdk.Pixbuf(screenBuffer, Math.Max(0, redPixelStartX - 16), Math.Max(0, redPixelStartY - 16), captureAreaWidth, captureAreaHeight);
- //screenBuffer.Save(filename, "png");
- outPixBuf.Save(filename, "png");
- }
- //screenBuffer.Save("screenshot.png", "png");
-
- return wasCaptured;
- }
-
protected virtual void OnDebugScreenshot(object sender, System.EventArgs e)
{
int screenWidth, screenHeight;
- DesertPaintLab.Settings.Get("ScreenWidth", out screenWidth);
- DesertPaintLab.Settings.Get("ScreenHeight", out screenHeight);
+ rootWindow.GetSize(out screenWidth, out screenHeight);
+ DesertPaintLab.AppSettings.Get("ScreenWidth", out screenWidth);
+ DesertPaintLab.AppSettings.Get("ScreenHeight", out screenHeight);
Gdk.Image rootImage = rootWindow.GetImage(0, 0, screenWidth, screenHeight);
screenBuffer.GetFromImage(rootImage, rootImage.Colormap, 0, 0, 0, 0, screenWidth, screenHeight);
string screenshotDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
@@ -565,93 +385,6 @@ public partial class MainWindow : Gtk.Wi
screenBuffer.Save(filename, "png");
}
- protected virtual void OnCaptureButton(object sender, System.EventArgs e)
- {
- if (CaptureReactionColor())
- {
- string warning = "";
- if (reactedColor.Red == 0)
- {
- warning = warning + "\nRed is too low.";
- }
- if (reactedColor.Green == 0)
- {
- warning = warning + "\nGreen is too low.";
- }
- if (reactedColor.Blue == 0)
- {
- warning = warning + "\nBlue is too low.";
- }
- if (reactedColor.Red == 255)
- {
- warning = warning + "\nRed is too high.";
- }
- if (reactedColor.Green == 255)
- {
- warning = warning + "\nGreen is too high.";
- }
- if (reactedColor.Blue == 255)
- {
- warning = warning + "\nBlue is too high.";
- }
-
- if (warning.Length != 0)
- {
- MessageDialog md = new MessageDialog(this,
- DialogFlags.DestroyWithParent,
- MessageType.Error, ButtonsType.Ok,
- "Reaction clipped. You will need to do a " +
- "3-way reaction to test this pair. Details: " +
- warning);
-
- md.Run();
- md.Destroy();
- }
- else
- {
- this.reactionSwatch.Color = reactedColor;
- saveButton.Sensitive = true;
- }
- }
- else
- {
- MessageDialog md = new MessageDialog(this,
- DialogFlags.DestroyWithParent,
- MessageType.Error, ButtonsType.Ok,
- "Pigment Lab dialog box NOT FOUND. Please ensure " +
- "that there is an unobstructed view of the dialog " +
- "and that your interface size is set to 'small' " +
- "when you press the Capture button.");
-
- md.Run();
- md.Destroy();
- }
- }
-
- protected virtual void OnSaveButton(object sender, System.EventArgs e)
- {
- if (ReactionRecorder.RecordReaction(profile, expectedColor, reactedColor, reagents))
- {
- saveButton.Sensitive = false;
- }
- }
-
- protected virtual void OnChangedIngredient1(object sender, System.EventArgs e)
- {
- UpdateIngredients();
- }
-
- protected virtual void OnChangedIngredient2(object sender, System.EventArgs e)
- {
- UpdateIngredients();
- }
-
- protected virtual void OnChangedIngredient3(object sender, System.EventArgs e)
- {
- UpdateIngredients();
-
- }
-
protected virtual void OnNewProfile(object sender, System.EventArgs e)
{
if (unsavedData)
@@ -675,8 +408,7 @@ public partial class MainWindow : Gtk.Wi
bool ok = profile.Load();
if (ok)
{
- PopulateDropDowns();
- recipe.Reactions = profile.Reactions;
+ ProfileChanged();
}
else
{
@@ -711,7 +443,7 @@ public partial class MainWindow : Gtk.Wi
bool ok = profile.Load();
if (ok)
{
- PopulateDropDowns();
+ ProfileChanged();
}
else
{
@@ -746,7 +478,7 @@ public partial class MainWindow : Gtk.Wi
}
}
- protected virtual void OnExport(object sender, System.EventArgs e)
+ protected virtual void OnExportToPracticalPaint(object sender, System.EventArgs e)
{
FileChooserDialog fileDialog =
new FileChooserDialog("Select destination file.",
@@ -762,26 +494,6 @@ public partial class MainWindow : Gtk.Wi
}
fileDialog.Destroy();
}
-
- protected virtual void RunSimulator(object sender, System.EventArgs e)
- {
- SimulatorWindow win = new SimulatorWindow(profile);
- win.Show();
- }
-
- protected void OnOpenRecipeGenerator(object sender, EventArgs e)
- {
- RecipeGeneratorWindow win = new RecipeGeneratorWindow(profile);
- win.Show();
- //RecipeGenerator gen = new RecipeGenerator();
- //gen.BeginRecipeGeneration(profile.Reactions, 15, 7);
- //MessageDialog md = new MessageDialog(this,
- // DialogFlags.DestroyWithParent,
- // MessageType.Info, ButtonsType.Close,
- // "Coming Soon!");
- //md.Run();
- //md.Destroy();
- }
protected void OnShowReactionStatus(object sender, EventArgs e)
{
@@ -789,12 +501,6 @@ public partial class MainWindow : Gtk.Wi
win.Show();
}
- protected void OnShowIngredients(object sender, EventArgs e)
- {
- ReagentWindow win = new ReagentWindow(profile);
- win.Show();
- }
-
protected void OnExportProfile(object sender, EventArgs e)
{
FileChooserDialog fileDialog =
@@ -814,7 +520,7 @@ public partial class MainWindow : Gtk.Wi
MessageDialog md = new MessageDialog(this,
DialogFlags.DestroyWithParent,
MessageType.Warning, ButtonsType.OkCancel,
- "Overwrite profile at" +
+ "Overwrite file at " +
targetFile + "?");
resp = (ResponseType)md.Run();
@@ -856,8 +562,8 @@ public partial class MainWindow : Gtk.Wi
MessageDialog md = new MessageDialog(this,
DialogFlags.DestroyWithParent,
MessageType.Warning, ButtonsType.OkCancel,
- "Overwrite profile at" +
- directory + "?");
+ "Overwrite profile '" +
+ profile.Name + "'?");
resp = (ResponseType)md.Run();
md.Destroy();
@@ -874,8 +580,7 @@ public partial class MainWindow : Gtk.Wi
bool ok = profile.Load();
if (ok)
{
- PopulateDropDowns();
- recipe.Reactions = profile.Reactions;
+ ProfileChanged();
}
else
{
@@ -889,5 +594,128 @@ public partial class MainWindow : Gtk.Wi
}
fileDialog.Destroy();
}
+
+ protected void OnExportRecipeListToWiki(object sender, EventArgs e)
+ {
+ Gtk.FileChooserDialog fileDialog =
+ new Gtk.FileChooserDialog("Select destination file.",
+ (Gtk.Window)Toplevel, Gtk.FileChooserAction.Save,
+ Gtk.Stock.Cancel, Gtk.ResponseType.Cancel,
+ Gtk.Stock.Save, Gtk.ResponseType.Accept);
+ Gtk.ResponseType resp = (Gtk.ResponseType)fileDialog.Run();
+ if (resp == Gtk.ResponseType.Accept)
+ {
+ string fileName = fileDialog.Filename;
+ string directory = fileDialog.CurrentFolder;
+ profile.ExportWikiRecipes(System.IO.Path.Combine(directory, fileName));
+ }
+ fileDialog.Destroy();
+ }
+
+ protected void OnCopyRecipeListToClipboard(object sender, EventArgs e)
+ {
+ Gtk.Clipboard clipboard = this.GetClipboard(Gdk.Selection.Clipboard);
+
+ StringWriter writer = new StringWriter();
+ profile.ExportWikiRecipes(writer);
+
+ clipboard.Text = writer.ToString();
+ }
+
+ protected void OnSelectCaptureView(object sender, EventArgs e)
+ {
+ if (generatorView != null && generatorView.Visible)
+ {
+ generatorView.Hide();
+ contentContainer.Remove(generatorView);
+ }
+ if (simulatorView != null && simulatorView.Visible)
+ {
+ simulatorView.Hide();
+ contentContainer.Remove(simulatorView);
+ }
+ if (captureView == null)
+ {
+ captureView = new CaptureView(profile, screenBuffer);
+ }
+ if (captureView.Visible == false)
+ {
+ captureView.ResizeChildren();
+ captureView.CheckResize();
+ contentContainer.Add(captureView);
+ captureView.Show();
+ }
+ CheckResize();
+
+ // TODO: enable/disable menu options based on view
+ NewProfileAction.Sensitive = true;
+ OpenProfileAction.Sensitive = true;
+ ImportProfileAction.Sensitive = true;
+ }
+
+ protected void OnSelectRecipeGeneratorView(object sender, EventArgs e)
+ {
+ if (captureView != null && captureView.Visible)
+ {
+ captureView.Hide();
+ contentContainer.Remove(captureView);
+ }
+ if (simulatorView != null && simulatorView.Visible)
+ {
+ simulatorView.Hide();
+ contentContainer.Remove(simulatorView);
+ }
+ if (generatorView == null)
+ {
+ generatorView = new RecipeGeneratorView(profile);
+ generatorView.SetStatus += OnStatusUpdate;
+ generatorView.Started += OnGeneratorRunning;
+ generatorView.Stopped += OnGeneratorStopped;
+ }
+ if (generatorView.Visible == false)
+ {
+ generatorView.ResizeChildren();
+ generatorView.CheckResize();
+ contentContainer.Add(generatorView);
+ generatorView.Show();
+ }
+ CheckResize();
+
+ // TODO: only when generator is running
+ NewProfileAction.Sensitive = false;
+ OpenProfileAction.Sensitive = false;
+ ImportProfileAction.Sensitive = false;
+ // TODO: enable/disable menu options based on view
+ }
+
+ protected void OnSelectSimulatorView(object sender, EventArgs e)
+ {
+ if (captureView != null && captureView.Visible)
+ {
+ captureView.Hide();
+ contentContainer.Remove(captureView);
+ }
+ if (generatorView != null && generatorView.Visible)
+ {
+ generatorView.Hide();
+ contentContainer.Remove(generatorView);
+ }
+ if (simulatorView == null)
+ {
+ simulatorView = new SimulatorView(profile);
+ }
+ if (simulatorView.Visible == false)
+ {
+ simulatorView.ResizeChildren();
+ simulatorView.CheckResize();
+ contentContainer.Add(simulatorView);
+ simulatorView.Show();
+ }
+ CheckResize();
+ // TODO: enable/disable menu options based on view
+ NewProfileAction.Sensitive = true;
+ OpenProfileAction.Sensitive = true;
+ ImportProfileAction.Sensitive = true;
+ }
}
diff --git a/PaintRecipe.cs b/PaintRecipe.cs
--- a/PaintRecipe.cs
+++ b/PaintRecipe.cs
@@ -27,6 +27,9 @@ namespace DesertPaintLab
{
public class PaintRecipe
{
+ public static uint PAINT_RECIPE_MIN_CONCENTRATION = 10;
+ public static uint RIBBON_RECIPE_MIN_CONCENTRATION = 50;
+
public struct RGB
{
public int r;
@@ -336,27 +339,24 @@ namespace DesertPaintLab
return batchCount * cost;
}
- public bool IsValid
+ public bool IsValidForConcentration(uint concentration)
{
- get
+ uint weight = 0;
+ foreach (RecipeIngredient ingredient in recipe)
{
- uint weight = 0;
- foreach (RecipeIngredient ingredient in recipe)
+ string reagentName = ingredient.name;
+ if (reagentName == null)
{
- string reagentName = ingredient.name;
- if (reagentName == null)
- {
- continue;
- }
-
- Reagent reagent = ReagentManager.GetReagent(reagentName);
- if (!reagent.IsCatalyst)
- {
- weight += ingredient.quantity;
- }
+ continue;
}
- return (weight >= 10);
+
+ Reagent reagent = ReagentManager.GetReagent(reagentName);
+ if (!reagent.IsCatalyst)
+ {
+ weight += ingredient.quantity;
+ }
}
+ return (weight >= concentration);
}
public bool CheckMissingReactions(ref List> missing)
diff --git a/PlayerProfile.cs b/PlayerProfile.cs
--- a/PlayerProfile.cs
+++ b/PlayerProfile.cs
@@ -31,10 +31,11 @@ namespace DesertPaintLab
{
public class PlayerProfile
{
- string name;
+ public string Name { get; private set; }
string directory;
string reactFile;
string reagentFile;
+ string settingsFile;
static Regex recipeHeaderRegex = new Regex(@"^--- Recipe: (?(\w*\s)*\w+)\s*");
static Regex recipeIngredientRegex = new Regex(@"(?(\w+\s)?\w+)\s*\|\s*(?\d+)\s*");
@@ -44,6 +45,14 @@ namespace DesertPaintLab
//SortedDictionary> reactions =
// new SortedDictionary>();
SortedDictionary recipes;
+ SortedDictionary ribbonRecipes;
+
+ Settings settings = new Settings();
+ public Settings ProfileSettings {
+ get {
+ return settings;
+ }
+ }
static PlayerProfile current = null;
@@ -58,15 +67,21 @@ namespace DesertPaintLab
public PlayerProfile(string name, string directory)
{
- this.name = name;
+ this.Name = name;
this.directory = directory;
this.reactFile = System.IO.Path.Combine(directory, "dp_reactions.txt");
this.reagentFile = System.IO.Path.Combine(directory, "ingredients.txt");
+ this.settingsFile = System.IO.Path.Combine(directory, "settings");
this.recipes = new SortedDictionary();
+ this.ribbonRecipes = new SortedDictionary();
foreach (PaintColor color in Palette.Colors)
{
this.recipes.Add(color.Name, new PaintRecipe());
}
+ foreach (PaintColor color in Palette.Colors)
+ {
+ this.ribbonRecipes.Add(color.Name, new PaintRecipe());
+ }
}
public string Directory
@@ -97,13 +112,35 @@ namespace DesertPaintLab
}
}
+ public SortedDictionary RibbonRecipes
+ {
+ get {
+ return this.ribbonRecipes;
+ }
+ }
+
public int RecipeCount
{
get {
int count = 0;
foreach (PaintRecipe recipe in this.recipes.Values)
{
- if (recipe.IsValid)
+ if (recipe.IsValidForConcentration(PaintRecipe.PAINT_RECIPE_MIN_CONCENTRATION))
+ {
+ ++count;
+ }
+ }
+ return count;
+ }
+ }
+
+ public int RibbonCount
+ {
+ get {
+ int count = 0;
+ foreach (PaintRecipe recipe in this.ribbonRecipes.Values)
+ {
+ if (recipe.IsValidForConcentration(PaintRecipe.RIBBON_RECIPE_MIN_CONCENTRATION))
{
++count;
}
@@ -305,6 +342,8 @@ namespace DesertPaintLab
public bool Load()
{
string line;
+ settings.Reset();
+ settings.Load(settingsFile);
reactions.Clear();
if (File.Exists(reagentFile))
{
@@ -336,6 +375,7 @@ namespace DesertPaintLab
public void Save()
{
+ settings.Save(settingsFile);
Reaction reaction;
using (StreamWriter writer = new StreamWriter(reactFile, false))
{
@@ -361,13 +401,13 @@ namespace DesertPaintLab
}
}
- public void LoadRecipes()
+ private void LoadRecipes(SortedDictionary recipeDict, string filename, uint concentration)
{
- foreach (PaintRecipe recipe in this.recipes.Values)
+ foreach (PaintRecipe recipe in recipeDict.Values)
{
recipe.Clear();
}
- string recipeFile = System.IO.Path.Combine(directory, "dp_recipes.txt");
+ string recipeFile = System.IO.Path.Combine(directory, filename);
string line;
Match match;
bool inRecipe = false;
@@ -385,7 +425,10 @@ namespace DesertPaintLab
{
if (testRecipe != null && currentRecipeColor != null)
{
- recipes[currentRecipeColor].CopyFrom(testRecipe);
+ if (testRecipe.IsValidForConcentration(concentration))
+ {
+ recipeDict[currentRecipeColor].CopyFrom(testRecipe);
+ }
}
testRecipe.Clear();
currentRecipeColor = match.Groups["colorname"].Value;
@@ -404,20 +447,23 @@ namespace DesertPaintLab
}
if (inRecipe)
{
- recipes[currentRecipeColor].CopyFrom(testRecipe);
+ if (testRecipe.IsValidForConcentration(concentration))
+ {
+ recipeDict[currentRecipeColor].CopyFrom(testRecipe);
+ }
}
}
}
}
- public void SaveRecipes()
+ private void SaveRecipes(SortedDictionary recipeDict, string filename)
{
- if (recipes != null)
+ if (recipeDict != null)
{
- string recipeFile = System.IO.Path.Combine(directory, "dp_recipes.txt");
+ string recipeFile = System.IO.Path.Combine(directory, filename);
using (StreamWriter writer = new StreamWriter(recipeFile, false))
{
- foreach (KeyValuePair pair in recipes)
+ foreach (KeyValuePair pair in recipeDict)
{
writer.WriteLine("--- Recipe: {0}", pair.Key);
foreach (PaintRecipe.RecipeIngredient ingredient in pair.Value.Ingredients)
@@ -429,13 +475,41 @@ namespace DesertPaintLab
}
}
+ public void LoadRecipes()
+ {
+ LoadRecipes(this.recipes, "dp_recipes.txt", PaintRecipe.PAINT_RECIPE_MIN_CONCENTRATION);
+ LoadRecipes(this.ribbonRecipes, "dp_ribbons.txt", PaintRecipe.RIBBON_RECIPE_MIN_CONCENTRATION);
+ }
+
+ public void SaveRecipes()
+ {
+ SaveRecipes(this.recipes, "dp_recipes.txt");
+ SaveRecipes(this.ribbonRecipes, "dp_ribbons.txt");
+ }
+
public void ExportWikiRecipes(string file)
{
StreamWriter writer = new StreamWriter(file);
- ExportWikiFormat(writer);
+ ExportWikiFormat(writer, this.recipes);
}
- public void ExportWikiFormat(TextWriter writer)
+ public void ExportWikiRibbons(string file)
+ {
+ StreamWriter writer = new StreamWriter(file);
+ ExportWikiFormat(writer, this.ribbonRecipes);
+ }
+
+ public void ExportWikiRecipes(TextWriter writer)
+ {
+ ExportWikiFormat(writer, this.recipes);
+ }
+
+ public void ExportWikiRibbons(TextWriter writer)
+ {
+ ExportWikiFormat(writer, this.ribbonRecipes);
+ }
+
+ public void ExportWikiFormat(TextWriter writer, SortedDictionary recipeDict)
{
PaintRecipe recipe;
List> missing = new List>();
@@ -460,7 +534,7 @@ namespace DesertPaintLab
colorLine += " color: #FFFFFF;";
}
colorLine += "\" | " + color.Name + " || ";
- if (recipes.TryGetValue(color.Name, out recipe))
+ if (recipeDict.TryGetValue(color.Name, out recipe))
{
foreach (PaintRecipe.RecipeIngredient ingredient in recipe.Ingredients)
{
@@ -482,7 +556,7 @@ namespace DesertPaintLab
writer.WriteLine("|}");
}
}
-
+
public Reaction FindReaction(Reagent reagent1, Reagent reagent2)
{
return reactions.Find(reagent1, reagent2);
@@ -493,11 +567,23 @@ namespace DesertPaintLab
reactions.Set(reagent1, reagent2, reaction);
}
+ public void ClearReaction(Reagent reagent1, Reagent reagent2)
+ {
+ reactions.Remove(reagent1, reagent2);
+ }
+
public void SetRecipe(PaintRecipe recipe)
{
string colorName = Palette.FindNearest(recipe.ReactedColor);
recipes[colorName].CopyFrom(recipe);
}
+
+ public void SetRibbonRecipe(PaintRecipe recipe)
+ {
+ string colorName = Palette.FindNearest(recipe.ReactedColor);
+ ribbonRecipes[colorName].CopyFrom(recipe);
+ }
+
}
}
diff --git a/ReactionRecorder.cs b/ReactionRecorder.cs
--- a/ReactionRecorder.cs
+++ b/ReactionRecorder.cs
@@ -27,15 +27,17 @@ namespace DesertPaintLab
// ReactionRecorder - business logic for recording paint reactions
public class ReactionRecorder
{
- const int colorTolerance = 2;
+ const int COLOR_TOLERANCE = 3;
const int DEFAULT_SWATCH_HEIGHT = 24;
+ const int DEFAULT_SWATCH_WIDTH = 260;
const int DEFAULT_COLOR_BAR_WIDTH = 306;
const int DEFAULT_RED_BAR_SPACING = 32;
const int DEFAULT_GREEN_BAR_SPACING = 42;
const int DEFAULT_BLUE_BAR_SPACING = 52;
static int swatchHeight = DEFAULT_SWATCH_HEIGHT;
+ static int swatchWidth = DEFAULT_SWATCH_WIDTH;
static int colorBarWidth = DEFAULT_COLOR_BAR_WIDTH;
static int redBarSpacing = DEFAULT_RED_BAR_SPACING;
static int greenBarSpacing = DEFAULT_GREEN_BAR_SPACING;
@@ -43,24 +45,61 @@ namespace DesertPaintLab
private static bool IsPapyTexture(byte r, byte g, byte b)
{
- return ((r > 0xD0) && (g > 0xC8) && (b > 0xA0)) &&
- ((r < 0xF4) && (g < 0xE0) && (b < 0xC4));
+ return ((r > 0xD0) && (g >= 0xC4) && (b >= 0x91)) &&
+ ((r < 0xF4) && (g <= 0xED) && (b <= 0xCD));
}
public static void SetPixelMultiplier(int pixelMultiplier)
{
swatchHeight = DEFAULT_SWATCH_HEIGHT * pixelMultiplier;
+ swatchWidth = DEFAULT_SWATCH_WIDTH * pixelMultiplier;
colorBarWidth = DEFAULT_COLOR_BAR_WIDTH * pixelMultiplier;
redBarSpacing = DEFAULT_RED_BAR_SPACING * pixelMultiplier;
greenBarSpacing = DEFAULT_GREEN_BAR_SPACING * pixelMultiplier;
blueBarSpacing = DEFAULT_BLUE_BAR_SPACING * pixelMultiplier;
}
+ unsafe private static void ColorAt(byte *pixBytes, int x, int y, int stride, out byte r, out byte g, out byte b)
+ {
+ int pixelStart = (y * stride) + (x * 3);
+ r = pixBytes[pixelStart];
+ g = pixBytes[pixelStart + 1];
+ b = pixBytes[pixelStart + 2];
+ }
+
+ unsafe private static bool IsPossibleBorderPixel(byte* pixBytes, int x, int y, int stride)
+ {
+ int testPixelStart = (y * stride) + (x * 3);
+ byte r = pixBytes[testPixelStart];
+ byte g = pixBytes[testPixelStart+1];
+ byte b = pixBytes[testPixelStart+2];
+
+ bool isDarkPixel = false;
+ bool isPapyAbove = false;
+ bool isPapyBelow = false;
+ // 1.) Check if this is a dark pixel.
+ isDarkPixel = ((r < 0x46) && (g < 0x46) && (b < 0x46));
+
+ // 2.) Check the pixel above it,
+ // to see if it's from the papy texture.
+ int otherPixelStart = testPixelStart - stride;
+ isPapyAbove = ((otherPixelStart >= 0) &&
+ IsPapyTexture(pixBytes[otherPixelStart++], pixBytes[otherPixelStart++], pixBytes[otherPixelStart]));
+
+ // 3.) Check the pixel below where the swatch should be,
+ // to see if it's also from the papy texture.
+ otherPixelStart = testPixelStart + (stride * swatchHeight);
+ isPapyBelow = (IsPapyTexture(pixBytes[otherPixelStart++], pixBytes[otherPixelStart++], pixBytes[otherPixelStart]));
+
+ bool result = isDarkPixel && isPapyAbove && isPapyBelow;
+ return result;
+ }
+
unsafe public static bool CaptureReaction(byte* pixBytes, int screenshotWidth, int screenshotHeight, int stride, ref PaintColor reactedColor, ref int redPixelStart)
{
byte pixel_r, pixel_g, pixel_b;
int pixelStart, otherPixelStart;
- bool colorMatch;
+ bool colorMatch = true;
for (int x = 0; x < screenshotWidth - colorBarWidth; ++x)
{
for (int y = 0; y < (screenshotHeight - 53); ++y)
@@ -71,94 +110,83 @@ namespace DesertPaintLab
pixel_g = pixBytes[pixelStart + 1];
pixel_b = pixBytes[pixelStart + 2];
- // 1.) Check if this is a dark pixel.
- if ((pixel_r < 0x46) && (pixel_g < 0x46) && (pixel_b < 0x46))
+ bool foundSwatch = IsPossibleBorderPixel(pixBytes, x, y, stride); // ((pixel_r < 0x46) && (pixel_g < 0x46) && (pixel_b < 0x46));
+ if (foundSwatch)
{
- // 2.) Check the pixel above it,
- // to see if it's from the papy texture.
- otherPixelStart = pixelStart - stride;
- if ((otherPixelStart >= 0) &&
- IsPapyTexture(pixBytes[otherPixelStart++],
- pixBytes[otherPixelStart++],
- pixBytes[otherPixelStart]))
+ int borderXOffset = 0;
+ for (borderXOffset = 0; foundSwatch && (borderXOffset < swatchWidth); ++borderXOffset)
{
- // 3.) Check the pixel below where the swatch should be,
- // to see if it's also from the papy texture.
- otherPixelStart = pixelStart + (stride * swatchHeight);
- if (IsPapyTexture(pixBytes[otherPixelStart++],
- pixBytes[otherPixelStart++],
- pixBytes[otherPixelStart]))
+ foundSwatch &= IsPossibleBorderPixel(pixBytes, x + borderXOffset, y, stride);
+ }
+ }
+
+ if (foundSwatch)
+ {
+ // found a swatch with an appropriate dark top border with papyrus texture above it and papyrus a jump below it
+ // 4.) Scan the left border of the potential swatch
+ // location.
+ colorMatch = true;
+ for (int i = 1; i < swatchHeight - 2; ++i)
+ {
+ otherPixelStart = pixelStart + (stride * i);
+ if ((Math.Abs(pixel_r - pixBytes[otherPixelStart++]) > COLOR_TOLERANCE) ||
+ (Math.Abs(pixel_g - pixBytes[otherPixelStart++]) > COLOR_TOLERANCE) ||
+ (Math.Abs(pixel_b - pixBytes[otherPixelStart]) > COLOR_TOLERANCE))
{
- // pixBytes[pixelStart] = 0xFF;
- // pixBytes[pixelStart + 1] = 0x00;
- // pixBytes[pixelStart + 2] = 0xFF;
-
- // 4.) Scan the left border of the potential swatch
- // location.
- colorMatch = true;
- for (int i = 1; i < swatchHeight - 2; ++i)
- {
- otherPixelStart = pixelStart + (stride * i);
- if ((Math.Abs(pixel_r - pixBytes[otherPixelStart++]) > colorTolerance) ||
- (Math.Abs(pixel_g - pixBytes[otherPixelStart++]) > colorTolerance) ||
- (Math.Abs(pixel_b - pixBytes[otherPixelStart]) > colorTolerance))
- {
- colorMatch = false;
- break;
- }
- }
+ colorMatch = false;
+ break;
+ }
+ }
+
+ if (colorMatch)
+ {
+ // WE FOUND THE SWATCH!
+ // Now we know where the color bars are.
+ redPixelStart = pixelStart + (redBarSpacing * stride);
+ int redPixelCount = 0;
+ while ((pixBytes[redPixelStart] > 0x9F) &&
+ (pixBytes[redPixelStart + 1] < 0x62) &&
+ (pixBytes[redPixelStart + 2] < 0x62))
+ {
+ redPixelCount++;
+ // pixBytes[redPixelStart] = 0x00;
+ // pixBytes[redPixelStart + 1] = 0xFF;
+ // pixBytes[redPixelStart + 2] = 0xFF;
+ redPixelStart += 3;
+ }
- if (colorMatch)
- {
- // WE FOUND THE SWATCH!
- // Now we know where the color bars are.
- redPixelStart = pixelStart + (redBarSpacing * stride);
- int redPixelCount = 0;
- while ((pixBytes[redPixelStart] > 0x9F) &&
- (pixBytes[redPixelStart + 1] < 0x62) &&
- (pixBytes[redPixelStart + 2] < 0x62))
- {
- redPixelCount++;
- // pixBytes[redPixelStart] = 0x00;
- // pixBytes[redPixelStart + 1] = 0xFF;
- // pixBytes[redPixelStart + 2] = 0xFF;
- redPixelStart += 3;
- }
-
- reactedColor.Red = (byte)Math.Round((float)redPixelCount * 255f / (float)colorBarWidth);
- int greenPixelStart = pixelStart + (greenBarSpacing * stride);
-
- int greenPixelCount = 0;
- while ((pixBytes[greenPixelStart] < 0x62) &&
- (pixBytes[greenPixelStart + 1] > 0x9F) &&
- (pixBytes[greenPixelStart + 2] < 0x62))
- {
- greenPixelCount++;
- // pixBytes[greenPixelStart] = 0x00;
- // pixBytes[greenPixelStart + 1] = 0xFF;
- // pixBytes[greenPixelStart + 2] = 0xFF;
- greenPixelStart += 3;
- }
-
- reactedColor.Green = (byte)Math.Round((float)greenPixelCount * 255f / (float)colorBarWidth);
- int bluePixelStart = pixelStart + (blueBarSpacing * stride);
-
- int bluePixelCount = 0;
- while ((pixBytes[bluePixelStart] < 0x62) &&
- (pixBytes[bluePixelStart + 1] < 0x62) &&
- (pixBytes[bluePixelStart + 2] > 0x9F))
- {
- bluePixelCount++;
- // pixBytes[bluePixelStart] = 0x00;
- // pixBytes[bluePixelStart + 1] = 0xFF;
- // pixBytes[bluePixelStart + 2] = 0xFF;
- bluePixelStart += 3;
- }
-
- reactedColor.Blue = (byte)Math.Round((float)bluePixelCount * 255f / (float)colorBarWidth);
- return true;
- }
+ reactedColor.Red = (byte)Math.Round((float)redPixelCount * 255f / (float)colorBarWidth);
+ int greenPixelStart = pixelStart + (greenBarSpacing * stride);
+
+ int greenPixelCount = 0;
+ while ((pixBytes[greenPixelStart] < 0x62) &&
+ (pixBytes[greenPixelStart + 1] > 0x9F) &&
+ (pixBytes[greenPixelStart + 2] < 0x62))
+ {
+ greenPixelCount++;
+ // pixBytes[greenPixelStart] = 0x00;
+ // pixBytes[greenPixelStart + 1] = 0xFF;
+ // pixBytes[greenPixelStart + 2] = 0xFF;
+ greenPixelStart += 3;
}
+
+ reactedColor.Green = (byte)Math.Round((float)greenPixelCount * 255f / (float)colorBarWidth);
+ int bluePixelStart = pixelStart + (blueBarSpacing * stride);
+
+ int bluePixelCount = 0;
+ while ((pixBytes[bluePixelStart] < 0x62) &&
+ (pixBytes[bluePixelStart + 1] < 0x62) &&
+ (pixBytes[bluePixelStart + 2] > 0x9F))
+ {
+ bluePixelCount++;
+ // pixBytes[bluePixelStart] = 0x00;
+ // pixBytes[bluePixelStart + 1] = 0xFF;
+ // pixBytes[bluePixelStart + 2] = 0xFF;
+ bluePixelStart += 3;
+ }
+
+ reactedColor.Blue = (byte)Math.Round((float)bluePixelCount * 255f / (float)colorBarWidth);
+ return true;
}
}
}
diff --git a/ReactionSet.cs b/ReactionSet.cs
--- a/ReactionSet.cs
+++ b/ReactionSet.cs
@@ -59,6 +59,16 @@ namespace DesertPaintLab
secondReagentDict[reagent2.PracticalPaintName] = reaction;
}
+ public void Remove(Reagent reagent1, Reagent reagent2)
+ {
+ SortedDictionary secondReagentDict = null;
+ reactions.TryGetValue(reagent1.PracticalPaintName, out secondReagentDict);
+ if (secondReagentDict != null)
+ {
+ secondReagentDict.Remove(reagent2.PracticalPaintName);
+ }
+ }
+
public void Clear()
{
reactions.Clear();
diff --git a/RecipeGenerator.cs b/RecipeGenerator.cs
--- a/RecipeGenerator.cs
+++ b/RecipeGenerator.cs
@@ -64,7 +64,8 @@ namespace DesertPaintLab
public SearchType Mode { get; set; }
- public uint MaxQuantity { get; private set; } // maximum number of total ingredients
+ public uint MinConcentration { get; private set; } // minimum paint concentration
+ public uint MaxConcentration { get; private set; } // maximum paint concentration
public uint MaxReagents { get; private set; } // maximum number of reagents to use in the recipe
public uint MinReagents { get; private set; } // minimum number of reagents to use in the recipe
public uint FullQuantityDepth { get; private set; } // at or equal this number of reagents, ignore ingredient settings for max quantity
@@ -111,7 +112,8 @@ namespace DesertPaintLab
}
MinReagents = 1;
MaxReagents = 5;
- MaxQuantity = 20;
+ MinConcentration = 10;
+ MaxConcentration = 20;
}
public SortedDictionary Recipes
@@ -167,6 +169,8 @@ namespace DesertPaintLab
{
return;
}
+ recipeCosts.Clear();
+ recipes.Clear();
foreach (PaintRecipe recipe in initialRecipes.Values)
{
//PaintRecipe recipeCopy = new PaintRecipe(recipe);
@@ -185,7 +189,7 @@ namespace DesertPaintLab
costSortedReagents.Sort(new ReagentCostSort());
}
- public void BeginRecipeGeneration(uint maxQuantity, uint minReagents, uint maxReagents, uint fullQuantityDepth, uint fullQuantity)
+ public void BeginRecipeGeneration(uint minConcentration, uint maxConcentration, uint minReagents, uint maxReagents, uint fullQuantityDepth, uint fullQuantity)
{
if (running)
{
@@ -193,7 +197,8 @@ namespace DesertPaintLab
return;
}
- this.MaxQuantity = maxQuantity;
+ this.MinConcentration = minConcentration;
+ this.MaxConcentration = maxConcentration;
this.MinReagents = minReagents;
this.MaxReagents = maxReagents;
this.FullQuantity = fullQuantity;
@@ -205,7 +210,7 @@ namespace DesertPaintLab
totalReagents = (uint)costSortedReagents.Count;
// Pre-populate recipes list with:
- // 1) 1-ingredient recipes @ 10db for all enabled ingredients with a count >= 10
+ // 1) 1-ingredient recipes @ min concentration for all enabled ingredients with a count >= min concentration
// 2) any previously-generated recipes
int enabledReagentCount = 0;
PaintRecipe recipe = new PaintRecipe();
@@ -214,10 +219,10 @@ namespace DesertPaintLab
{
if (reagent.Enabled)
{
- if (!reagent.IsCatalyst && ((reagent.RecipeMax >= 10) || ((FullQuantityDepth > 0) && (FullQuantity >= 10))))
+ if (!reagent.IsCatalyst && ((reagent.RecipeMax >= minConcentration) || ((FullQuantityDepth > 0) && (FullQuantity >= minConcentration))))
{
recipe.Clear();
- recipe.AddReagent(reagent.Name, 10);
+ recipe.AddReagent(reagent.Name, minConcentration);
AddCheapestRecipe(recipe);
}
++enabledReagentCount;
@@ -239,7 +244,8 @@ namespace DesertPaintLab
RecipeSearchNode initialNode = new RecipeSearchNode(costSortedReagents, reagentIdx);
initialNode.FullQuantity = FullQuantity;
initialNode.FullQuantityDepth = FullQuantityDepth;
- initialNode.MaxQuantity = maxQuantity;
+ initialNode.MinConcentration = minConcentration;
+ initialNode.MaxConcentration = maxConcentration;
initialNode.MinReagents = minReagents;
initialNode.MaxReagents = maxReagents;
@@ -266,7 +272,7 @@ namespace DesertPaintLab
if (log != null)
{
- log.WriteLine("Begin recipe generation: MaxQuantity={0} MinReagents={1} MaxReagents={2} FullQuantity={3} FullQuantityDepth={4}", MaxQuantity, MinReagents, MaxReagents, FullQuantity, FullQuantityDepth);
+ log.WriteLine("Begin recipe generation: MaxConcentration={0} MinReagents={1} MaxReagents={2} FullQuantity={3} FullQuantityDepth={4}", MaxConcentration, MinReagents, MaxReagents, FullQuantity, FullQuantityDepth);
}
// start worker threads to do the actual work
@@ -440,7 +446,7 @@ namespace DesertPaintLab
node.FullQuantityDepth = FullQuantityDepth;
node.MinReagents = MinReagents;
node.MaxReagents = MaxReagents;
- node.MaxQuantity = MaxQuantity;
+ node.MaxConcentration = MaxConcentration;
success = success && node.LoadState(reader);
if (success)
{
@@ -486,11 +492,11 @@ namespace DesertPaintLab
{
if (Mode == SearchType.DEPTH_FIRST)
{
- uint targetQuantity = (node.ReagentCount <= FullQuantityDepth) ? ((uint)node.ReagentCount * FullQuantity) : node.MaxQuantity + 1;
+ uint targetQuantity = (node.ReagentCount <= FullQuantityDepth) ? ((uint)node.ReagentCount * FullQuantity) : node.MaxConcentration + 1;
do {
--targetQuantity;
node.InitForQuantity(targetQuantity);
- } while (targetQuantity > 10 && (node.CurrentTargetQuantity != node.UsedQuantity));
+ } while (targetQuantity > MinConcentration && (node.CurrentTargetQuantity != node.UsedQuantity));
while ((ok = IterateDepthFirst(node)) && !requestCancel)
{
@@ -503,8 +509,8 @@ namespace DesertPaintLab
else
{
// breadth-first search
- uint targetQuantity = 9;
- uint quantityLimit = (node.ReagentCount <= FullQuantityDepth) ? (FullQuantity * (uint)node.ReagentCount) : node.MaxQuantity;
+ uint targetQuantity = MinConcentration-1;
+ uint quantityLimit = (node.ReagentCount <= FullQuantityDepth) ? (FullQuantity * (uint)node.ReagentCount) : node.MaxConcentration;
do {
++targetQuantity;
node.InitForQuantity(targetQuantity);
@@ -549,7 +555,7 @@ namespace DesertPaintLab
// returns the discarded recipe from the pair (or null if no original recipe to replace)
private void AddCheapestRecipe(PaintRecipe recipe)
{
- if (recipe.IsValid)
+ if (recipe.IsValidForConcentration(MinConcentration))
{
recipe.Reactions = reactions;
@@ -574,6 +580,10 @@ namespace DesertPaintLab
NewRecipe(this, args);
}
}
+ else
+ {
+ Console.WriteLine("Ignoring recipe - existing cost is cheaper.");
+ }
}
else
{
@@ -588,17 +598,17 @@ namespace DesertPaintLab
}
}
}
- //else
- //{
- // string msg = String.Format("Recipe is invalid ({0} ingredients)\n", recipe.Ingredients.Count);
- // foreach (PaintRecipe.RecipeIngredient ingr in recipe.Ingredients)
- // {
- // msg += String.Format(" -> {0} {1}", ingr.quantity, ingr.name);
- // }
- // lock (workerLock) {
- // Console.WriteLine(msg);
- // }
- //}
+ else
+ {
+ string msg = String.Format("Recipe is invalid ({0} ingredients)\n", recipe.Ingredients.Count);
+ foreach (PaintRecipe.RecipeIngredient ingr in recipe.Ingredients)
+ {
+ msg += String.Format(" -> {0} {1}", ingr.quantity, ingr.name);
+ }
+ lock (workerLock) {
+ Console.WriteLine(msg);
+ }
+ }
}
private bool IterateDepthFirst(RecipeSearchNode node)
@@ -654,8 +664,8 @@ namespace DesertPaintLab
}
node.ReplaceLastReagent(nextReagent);
}
- } while (node.MaxQuantity < (10 + node.CatalystCount));
- node.InitForQuantity(node.MaxQuantity);
+ } while (node.MaxConcentration < (node.MinConcentration + node.CatalystCount));
+ node.InitForQuantity(node.MaxConcentration);
//string outStr = "{0} : {1} : ";
//for (int i = 0; i < currentReagents.Count; ++i)
@@ -689,7 +699,7 @@ namespace DesertPaintLab
// Try next quantity
uint newQuantity;
- uint quantityLimit = ((uint)node.ReagentCount <= FullQuantityDepth) ? ((uint)node.ReagentCount * FullQuantity) : node.MaxQuantity;
+ uint quantityLimit = ((uint)node.ReagentCount <= FullQuantityDepth) ? ((uint)node.ReagentCount * FullQuantity) : node.MaxConcentration;
do {
newQuantity = node.CurrentTargetQuantity + 1;
//Console.WriteLine("Try quantity {0}", newQuantity);
@@ -715,8 +725,8 @@ namespace DesertPaintLab
// next reagent in last position
// if at end, pop reagent
- //Console.WriteLine("Finding new recipe after quantity {0}/{1} used {2}", newQuantity, node.MaxQuantity, node.UsedQuantity);
- node.InitForQuantity(10+node.CatalystCount); // reset quantity
+ //Console.WriteLine("Finding new recipe after quantity {0}/{1} used {2}", newQuantity, node.MaxConcentration, node.UsedQuantity);
+ node.InitForQuantity(node.MinConcentration+node.CatalystCount); // reset quantity
int currentDepth = node.ReagentCount;
bool recipeFound = false;
uint nextReagent;
@@ -791,7 +801,7 @@ namespace DesertPaintLab
} while (currentDepth <= maxReagents);
if (recipeFound)
{
- node.InitForQuantity(10+node.CatalystCount); // minimum quantity for this recipe
+ node.InitForQuantity(node.MinConcentration+node.CatalystCount); // minimum quantity for this recipe
if (node.TestRecipe == null)
{
node.TestRecipe = new PaintRecipe();
@@ -835,7 +845,7 @@ namespace DesertPaintLab
{
// check for the next recipe
uint remainingWeight = node.CurrentTargetQuantity - node.CatalystCount;
- if (remainingWeight < 10)
+ if (remainingWeight < MinConcentration)
{
// not possible to make a valid recipe
Console.WriteLine("Insufficient remaining weight");
@@ -899,7 +909,7 @@ namespace DesertPaintLab
private bool NextRecipeSize(RecipeSearchNode node)
{
uint newQuantity = node.CurrentTargetQuantity - 1;
- if (newQuantity < (10 + node.CatalystCount))
+ if (newQuantity < (node.MinConcentration + node.CatalystCount))
{
return false;
}
diff --git a/RecipeGeneratorWindow.cs b/RecipeGeneratorWindow.cs
deleted file mode 100644
--- a/RecipeGeneratorWindow.cs
+++ /dev/null
@@ -1,656 +0,0 @@
-/*
- * Copyright (c) 2015, Jason Maltzen
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
-*/
-
-using System;
-using System.IO;
-using System.Collections.Generic;
-using System.Collections.Concurrent;
-
-namespace DesertPaintLab
-{
- public partial class RecipeGeneratorWindow : Gtk.Window
- {
- RecipeGenerator generator;
- PlayerProfile profile;
- bool canceling = false;
- bool running = false;
- bool pauseForCheckpoint = false;
-
- const long RECIPE_SAVE_INTERVAL = 30000; // msec between saving recipes
- const long CHECKPOINT_INTERVAL = 17000; // msec between saving out generator state
- const string STATE_FILE = "dp_generator_state";
-
- static Gtk.ListStore colorStore = new Gtk.ListStore(typeof(string));
-
- List> missingReactions = new List>();
-
- long lastProgressUpdate;
- long lastStatusUpdate;
- long lastProfileSave;
- long lastCheckpoint;
-
- static public Gtk.ListStore RecipeModel
- {
- get
- {
- return colorStore;
- }
- }
-
- Gtk.ThreadNotify notifyFinished;
- Gtk.ThreadNotify notifyProgress;
- Gtk.ThreadNotify notifyNewRecipe;
-
- ConcurrentQueue pendingNewRecipes = new ConcurrentQueue();
-
- Gtk.ListStore reagentListStore;
- // end reagent view
-
- public RecipeGeneratorWindow(PlayerProfile profile) : base(Gtk.WindowType.Toplevel)
- {
- this.profile = profile;
- this.Build();
- minIngredientsSpinButton.Value = 1; // TODO: read/save profile info
- maxIngredientsSpinButton.Value = 5; // TODO: read/save profile info
- maxRecipeSpinButton.Value = 20; // TODO: read/save profile info
- fullQuantitySpinButton.Value = 20; // TODO: read/save profile info
- fullQuantityDepthSpinButton.Value = 4; // TODO: read/save profile info
-
- fullQuantityDepthSpinButton.SetRange(0, ReagentManager.Names.Count);
- maxIngredientsSpinButton.SetRange(1, ReagentManager.Names.Count);
- minIngredientsSpinButton.SetRange(1, ReagentManager.Names.Count);
-
-
- Gtk.TreeViewColumn recipeColorColumn = new Gtk.TreeViewColumn();
- Gtk.CellRendererText recipeColumnCell = new Gtk.CellRendererText();
- recipeColorColumn.PackStart(recipeColumnCell, true);
- recipeColorColumn.Title = "Color";
-
- recipeList.AppendColumn(recipeColorColumn);
- recipeColorColumn.AddAttribute(recipeColumnCell, "text", 0);
-
- colorStore.Clear();
-
- colorStore.SetSortColumnId(0, Gtk.SortType.Ascending);
- recipeList.Model = RecipeModel;
-
- recipeList.Selection.Changed += OnColorSelected;
-
- recipeIngredientsView.AppendColumn("Quantity", new Gtk.CellRendererText(), "text", 0);
- recipeIngredientsView.AppendColumn("Ingredient", new Gtk.CellRendererText(), "text", 1);
- recipeIngredientsView.Model = new Gtk.ListStore(typeof(string), typeof(string));
-
- profile.LoadRecipes();
-
- // init UI
- foreach (KeyValuePair pair in profile.Recipes)
- {
- if (pair.Value.IsValid)
- {
- string colorName = pair.Key;
- colorStore.AppendValues(colorName);
- }
- }
-
- canceling = false;
- running = false;
- pauseForCheckpoint = false;
-
- generator = new RecipeGenerator(profile.Reactions);
- int threads;
- DesertPaintLab.Settings.Get("GeneratorThreads", out threads);
- if (threads <= 0) { threads = 15; }
- generator.MaxThreads = (uint)threads;
- generator.InitRecipes(profile.Recipes);
-
- generator.Progress += OnProgress;
- generator.Finished += OnFinished;
- generator.NewRecipe += OnNewRecipe;
-
- string stateFile = System.IO.Path.Combine(profile.Directory, STATE_FILE);
- if (System.IO.File.Exists(stateFile))
- {
- generator.LoadState(stateFile);
- if (generator.CanResume)
- {
- beginButton.Label = "Restart";
- stopResumeButton.Label = "Resume";
- stopResumeButton.Sensitive = true;
-
- maxRecipeSpinButton.Value = Math.Max(generator.MaxQuantity, 14); //
- fullQuantitySpinButton.Value = generator.FullQuantity; // TODO: read/save profile info
- fullQuantityDepthSpinButton.Value = generator.FullQuantityDepth; // TODO: read/save profile info
- maxIngredientsSpinButton.Value = generator.MaxReagents;
- }
- }
- //generator.Log = System.IO.Path.Combine(profile.Directory, "dp_log.txt");
- countLabel.Text = String.Format("{0} / {1}", profile.RecipeCount, Palette.Count);
-
- Destroyed += OnDestroyed;
-
- notifyFinished = new Gtk.ThreadNotify(new Gtk.ReadyEvent(HandleFinished));
- notifyProgress = new Gtk.ThreadNotify(new Gtk.ReadyEvent(HandleProgress));
- notifyNewRecipe = new Gtk.ThreadNotify(new Gtk.ReadyEvent(HandleNewRecipe));
-
- // initialize reagent list
-
- // Add the columns to the TreeView
- Gtk.TreeViewColumn reagentEnabledColumn = new Gtk.TreeViewColumn ();
- reagentEnabledColumn.Title = "Enabled";
- Gtk.CellRendererToggle reagentEnabledCell = new Gtk.CellRendererToggle ();
- reagentEnabledCell.Activatable = true;
- reagentEnabledCell.Sensitive = true;
- reagentEnabledCell.Mode = Gtk.CellRendererMode.Activatable;
- reagentEnabledCell.Visible = true;
- reagentEnabledCell.Toggled += new Gtk.ToggledHandler(OnReagentEnableToggled);
- reagentEnabledColumn.PackStart (reagentEnabledCell, true);
- //reagentEnabledColumn.AddAttribute(reagentEnabledCell, "active", 0);
-
- Gtk.TreeViewColumn reagentNameColumn = new Gtk.TreeViewColumn ();
- reagentNameColumn.Title = "Ingredient";
- Gtk.CellRendererText reagentNameCell = new Gtk.CellRendererText ();
- reagentNameCell.Mode = Gtk.CellRendererMode.Inert;
- reagentNameColumn.PackStart (reagentNameCell, true);
- reagentNameColumn.AddAttribute(reagentNameCell, "text", 1);
- reagentNameColumn.Expand = true;
-
- Gtk.TreeViewColumn reagentCostColumn = new Gtk.TreeViewColumn ();
- reagentCostColumn.Title = "Cost";
- Gtk.CellRendererText reagentCostCell = new Gtk.CellRendererText ();
- reagentCostCell.Edited += OnReagentCostChanged;
- reagentCostCell.Editable = true;
- reagentCostCell.Sensitive = true;
- reagentCostCell.Mode = Gtk.CellRendererMode.Editable;
- reagentCostColumn.PackStart (reagentCostCell, true);
- //reagentCostColumn.AddAttribute(reagentCostCell, "text", 0);
-
- Gtk.TreeViewColumn reagentMaxColumn = new Gtk.TreeViewColumn ();
- reagentMaxColumn.Title = "Max";
- Gtk.CellRendererText reagentMaxCell = new Gtk.CellRendererText ();
- reagentMaxCell.Edited += OnReagentQuantityChanged;
- reagentMaxCell.Editable = true;
- reagentMaxCell.Sensitive = true;
- reagentCostCell.Mode = Gtk.CellRendererMode.Editable;
- reagentMaxColumn.PackStart (reagentMaxCell, true);
- //reagentMaxColumn.AddAttribute(reagentMaxCell, "text", 0);
-
- reagentListStore = new Gtk.ListStore(typeof(Reagent), typeof(string), typeof(Reagent), typeof(Reagent));
- foreach (string reagentName in ReagentManager.Names)
- {
- Reagent reagent = ReagentManager.GetReagent(reagentName);
- reagentListStore.AppendValues(reagent, reagentName); // , reagent, reagent);
- }
-
- reagentEnabledColumn.SetCellDataFunc (reagentEnabledCell, new Gtk.TreeCellDataFunc (RenderReagentToggle));
- reagentCostColumn.SetCellDataFunc (reagentCostCell, new Gtk.TreeCellDataFunc (RenderReagentCost));
- reagentMaxColumn.SetCellDataFunc (reagentMaxCell, new Gtk.TreeCellDataFunc (RenderReagentQuantity));
-
- // Assign the model to the TreeView
- reagentListView.Model = reagentListStore;
- reagentListView.Sensitive = true;
-
- reagentListView.AppendColumn(reagentEnabledColumn);
- reagentListView.AppendColumn(reagentNameColumn);
- reagentListView.AppendColumn(reagentCostColumn);
- reagentListView.AppendColumn(reagentMaxColumn);
-
- reagentListView.
-
- ShowAll();
- }
-
- protected void OnMinIngredientsChanged(object sender, EventArgs e)
- {
- Gtk.SpinButton button = (Gtk.SpinButton) sender;
- if (button.ValueAsInt > maxIngredientsSpinButton.ValueAsInt)
- {
- maxIngredientsSpinButton.Value = button.ValueAsInt;
- }
- maxIngredientsSpinButton.SetRange(button.ValueAsInt, maxIngredientsSpinButton.Adjustment.Upper);
- }
-
- protected void OnMaxIngredientsChanged(object sender, EventArgs e)
- {
- Gtk.SpinButton button = (Gtk.SpinButton) sender;
- if (button.ValueAsInt < minIngredientsSpinButton.ValueAsInt)
- {
- minIngredientsSpinButton.Value = button.ValueAsInt;
- }
- minIngredientsSpinButton.SetRange(1, button.ValueAsInt);
- // TODO: save profile setting
- // TODO: no longer permit resume
- }
-
- protected void OnMaxRecipeChanged(object sender, EventArgs e)
- {
- // TODO: save profile setting
- // TODO: no longer permit resume
- }
-
- protected void OnFullQuantityDepthChanged(object sender, EventArgs e)
- {
- // TODO: save profile setting
- // TODO: no longer permit resume
- }
-
- protected void OnFullQuantityChanged(object sender, EventArgs e)
- {
- // TODO: save profile setting
- // TODO: no longer permit resume
- }
-
- protected void OnBegin(object sender, EventArgs e)
- {
- minIngredientsSpinButton.Sensitive = false;
- maxIngredientsSpinButton.Sensitive = false;
- ExportToWikiAction.Sensitive = false;
- IngredientsAction.Sensitive = false;
- maxRecipeSpinButton.Sensitive = false;
- beginButton.Sensitive = false; // TODO: change to "pause"?
- stopResumeButton.Sensitive = true;
- fullQuantitySpinButton.Sensitive = false;
- fullQuantityDepthSpinButton.Sensitive = false;
- reagentListView.Sensitive = false;
-
- countLabel.Text = String.Format("{0} / {1}", profile.RecipeCount, Palette.Count);
-
- // TODO: hook up event notifications
- // - progress
- // - complete
- // - new recipe / recipe update
-
- // Total recipe search count
- //int current = ReagentManager.Names.Count;
- //long recipePermutations = 1;
- //for (int i = 0; i < maxIngredientsSpinButton.ValueAsInt; ++i)
- //{
- // recipePermutations *= current;
- // --current;
- //}
- //System.Console.WriteLine("Will search {0} reagent permutations.", recipePermutations);
-
- lastProgressUpdate = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
- lastStatusUpdate = lastProgressUpdate;
-
- lastProfileSave = lastProgressUpdate;
- lastCheckpoint = lastProgressUpdate;
-
- running = true;
- canceling = false;
- pauseForCheckpoint = false;
- stopResumeButton.Label = "Pause";
-
- generator.BeginRecipeGeneration((uint)maxRecipeSpinButton.ValueAsInt, (uint)minIngredientsSpinButton.Value, (uint)maxIngredientsSpinButton.ValueAsInt, (uint)fullQuantityDepthSpinButton.ValueAsInt, (uint)fullQuantitySpinButton.ValueAsInt);
- }
-
- protected void OnStopResume(object sender, EventArgs e)
- {
- if (generator != null)
- {
- if (running)
- {
- canceling = true;
- pauseForCheckpoint = false;
- generator.Stop();
- }
- else
- {
- // Resume previous run
- ExportToWikiAction.Sensitive = false;
- IngredientsAction.Sensitive = false;
- reagentListView.Sensitive = false;
- minIngredientsSpinButton.Sensitive = false;
- maxIngredientsSpinButton.Sensitive = false;
- maxRecipeSpinButton.Sensitive = false;
- beginButton.Sensitive = false;
- stopResumeButton.Sensitive = true;
- fullQuantitySpinButton.Sensitive = false;
- fullQuantityDepthSpinButton.Sensitive = false;
- reagentListView.Sensitive = false;
-
- lastProgressUpdate = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
- lastStatusUpdate = lastProgressUpdate;
- lastProfileSave = lastProgressUpdate;
- lastCheckpoint = lastProgressUpdate;
-
- canceling = false;
- pauseForCheckpoint = false;
- running = true;
-
- stopResumeButton.Label = "Pause";
- generator.ResumeRecipeGeneration();
- }
- }
- }
-
- private void HandleFinished()
- {
- generator.Wait();
- if (pauseForCheckpoint)
- {
- pauseForCheckpoint = false;
- generator.SaveState(System.IO.Path.Combine(profile.Directory, STATE_FILE));
- generator.ResumeRecipeGeneration();
- }
- else
- {
- running = false;
- beginButton.Sensitive = true;
- ExportToWikiAction.Sensitive = true;
- IngredientsAction.Sensitive = true;
- stopResumeButton.Sensitive = false;
- minIngredientsSpinButton.Sensitive = true;
- maxIngredientsSpinButton.Sensitive = true;
- maxRecipeSpinButton.Sensitive = true;
- fullQuantitySpinButton.Sensitive = true;
- fullQuantityDepthSpinButton.Sensitive = true;
- reagentListView.Sensitive = true;
- //generator = null; // don't. Hang on to generator for resume.
- profile.SaveRecipes();
- if (canceling)
- {
- generator.SaveState(System.IO.Path.Combine(profile.Directory, STATE_FILE));
- stopResumeButton.Label = "Resume";
- stopResumeButton.Sensitive = true;
- beginButton.Label = "Restart";
- }
- else
- {
- System.IO.File.Delete(System.IO.Path.Combine(profile.Directory, STATE_FILE));
- }
- }
- }
-
- protected void OnFinished(object sender, EventArgs args)
- {
- notifyFinished.WakeupMain();
- //Gtk.Application.Invoke(delegate {
- // HandleFinished();
- //});
- }
-
- private void HandleNewRecipe()
- {
- progressBar.Pulse();
-
- PaintRecipe recipe = null;
- if (pendingNewRecipes.TryDequeue(out recipe))
- {
- string recipeColor = Palette.FindNearest(recipe.ReactedColor);
- // TODO: Add item to recipe list only if not already listed
- bool exists = false;
- Gtk.TreeIter iter;
- if (colorStore.GetIterFirst(out iter))
- {
- do
- {
- string color = (string)colorStore.GetValue(iter, 0);
- if (color.Equals(recipeColor))
- {
- exists = true;
- break;
- }
- } while (colorStore.IterNext(ref iter));
- }
- if (!exists)
- {
- //Console.WriteLine("Add new recipe for {0}", recipeColor);
- // bool isMissingReactions = args.Recipe.CheckMissingReactions(ref missingReactions);
- // string missingReactionLabel = isMissingReactions ? "X" : "";
- colorStore.AppendValues(recipeColor); // , missingReactionLabel);
- countLabel.Text = String.Format("{0} / {1}", profile.RecipeCount+1, Palette.Count);
- }
- //else
- //{
- // Console.WriteLine("Updated recipe for {0}", recipeColor);
- //}
- profile.SetRecipe(recipe);
-
- long progressTime = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
- long delta = progressTime - lastProfileSave;
- if (delta >= RECIPE_SAVE_INTERVAL)
- {
- profile.SaveRecipes();
- lastProfileSave = progressTime;
- }
- Gtk.TreeModel model;
- Gtk.TreeSelection selection = recipeList.Selection;
- if ((selection != null) && selection.GetSelected(out model, out iter))
- {
- string colorName = (string)colorStore.GetValue(iter, 0);
- if (colorName.Equals(recipeColor))
- {
- ShowColor(recipe);
- }
- }
- }
- }
-
- protected void OnNewRecipe(object sender, NewRecipeEventArgs args)
- {
- PaintRecipe recipe = new PaintRecipe(args.Recipe); // copy it, so the worker thread can release
- lock(this) {
- pendingNewRecipes.Enqueue(recipe);
- }
- notifyNewRecipe.WakeupMain();
- //Gtk.Application.Invoke(delegate {
- // HandleNewRecipe();
- //});
- }
-
- private void HandleProgress()
- {
- long progressTime = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
- long delta = progressTime - lastProgressUpdate;
- if (delta > 30)
- {
- lastProgressUpdate = progressTime;
- progressBar.Pulse();
- }
- delta = progressTime - lastStatusUpdate;
- if (delta > 500)
- {
- lastStatusUpdate = progressTime;
- statusLabel.Text = String.Format("Recipes searched: {0:N00}", generator.RecipeCount);
- }
- delta = progressTime - lastCheckpoint;
- if (delta > CHECKPOINT_INTERVAL)
- {
- lastCheckpoint = progressTime;
- pauseForCheckpoint = true;
- generator.Stop();
- }
- }
-
- protected void OnProgress(object sender, EventArgs args)
- {
- notifyProgress.WakeupMain();
- }
-
- private void ShowColor(PaintRecipe recipe)
- {
- Gtk.ListStore store = (Gtk.ListStore)recipeIngredientsView.Model;
- store.Clear();
- if (recipe.CheckMissingReactions(ref missingReactions))
- {
- statusLabel.Text = "WARNING: This recipe includes reactions that have not yet been recorded.";
- }
- foreach (PaintRecipe.RecipeIngredient ingredient in recipe.Ingredients)
- {
- store.AppendValues(ingredient.quantity.ToString(), ingredient.name);
- }
- paintSwatch.Color = recipe.ReactedColor;
- }
-
- protected void OnColorSelected(object o, EventArgs args)
- {
- Gtk.TreeModel model;
- Gtk.TreeIter iter;
- Gtk.TreeSelection selection = recipeList.Selection;
- if ((selection != null) && selection.GetSelected(out model, out iter))
- {
- string colorName = (string)colorStore.GetValue(iter, 0);
- PaintRecipe recipe;
- if (profile.Recipes.TryGetValue(colorName, out recipe))
- {
- ShowColor(recipe);
- }
- }
- }
-
- protected void OnExportToWiki(object sender, EventArgs e)
- {
- Gtk.FileChooserDialog fileDialog =
- new Gtk.FileChooserDialog("Select destination file.",
- this, Gtk.FileChooserAction.Save,
- Gtk.Stock.Cancel, Gtk.ResponseType.Cancel,
- Gtk.Stock.Save, Gtk.ResponseType.Accept);
- Gtk.ResponseType resp = (Gtk.ResponseType)fileDialog.Run();
- if (resp == Gtk.ResponseType.Accept)
- {
- string fileName = fileDialog.Filename;
- string directory = fileDialog.CurrentFolder;
- profile.ExportWikiRecipes(System.IO.Path.Combine(directory, fileName));
- }
- fileDialog.Destroy();
- }
-
- protected void OnShowIngredients(object sender, EventArgs e)
- {
- ReagentWindow win = new ReagentWindow(profile);
- win.Show();
- }
-
- protected void OnDestroyed(object o, EventArgs args)
- {
- if (running)
- {
- // window closed while generator running: stop and save
- generator.Finished -= OnFinished;
- generator.Progress -= OnProgress;
- generator.NewRecipe -= OnNewRecipe;
- generator.Stop();
- generator.Wait();
- generator.SaveState(System.IO.Path.Combine(profile.Directory, STATE_FILE));
- }
- }
-
- // Reagent view handling
- private void RenderReagentToggle (Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter)
- {
- Reagent reagent = (Reagent) model.GetValue (iter, 0);
- Gtk.CellRendererToggle toggle = (cell as Gtk.CellRendererToggle);
- toggle.Active = reagent.Enabled;
- toggle.Activatable = !reagent.IsCatalyst;
- toggle.Mode = reagent.IsCatalyst ? Gtk.CellRendererMode.Inert : Gtk.CellRendererMode.Activatable;
- }
- private void RenderReagentCost (Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter)
- {
- Reagent reagent = (Reagent) model.GetValue (iter, 0);
- (cell as Gtk.CellRendererText).Text = reagent.Cost.ToString();
- }
- private void RenderReagentQuantity (Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter)
- {
- Reagent reagent = (Reagent) model.GetValue (iter, 0);
- (cell as Gtk.CellRendererText).Text = reagent.RecipeMax.ToString();
- }
-
- private void OnReagentCostChanged(object o, Gtk.EditedArgs args)
- {
- uint newCost;
- if (uint.TryParse(args.NewText, out newCost))
- {
- Gtk.TreeIter iter;
- reagentListStore.GetIter (out iter, new Gtk.TreePath (args.Path));
-
- Reagent reagent = (Reagent) reagentListStore.GetValue (iter, 0);
- if (reagent.Cost != newCost)
- {
- reagent.Cost = newCost;
- SaveReagentSettings();
- }
- }
- }
-
- private void OnReagentQuantityChanged(object o, Gtk.EditedArgs args)
- {
- uint newMax;
- if (uint.TryParse(args.NewText, out newMax))
- {
- Gtk.TreeIter iter;
- reagentListStore.GetIter (out iter, new Gtk.TreePath (args.Path));
-
- Reagent reagent = (Reagent) reagentListStore.GetValue (iter, 0);
- if (reagent.RecipeMax != newMax)
- {
- reagent.RecipeMax = newMax;
- SaveReagentSettings();
- }
- }
- }
-
- private void OnReagentEnableToggled(object o, Gtk.ToggledArgs args)
- {
- Gtk.TreeIter iter;
- reagentListStore.GetIter (out iter, new Gtk.TreePath (args.Path));
-
- Reagent reagent = (Reagent) reagentListStore.GetValue (iter, 0);
- reagent.Enabled = !reagent.Enabled;
- SaveReagentSettings();
- }
-
- private void SaveReagentSettings()
- {
- // save out state
- ReagentManager.SaveProfileReagents(profile.ReagentFile);
- }
-
- protected void OnCopyRecipeToClipboard(object sender, EventArgs e)
- {
- Gtk.TreeModel model;
- Gtk.TreeIter iter;
- Gtk.Clipboard clipboard = recipeIngredientsView.GetClipboard(Gdk.Selection.Clipboard);
-
- Gtk.TreeSelection selection = recipeList.Selection;
- if ((selection != null) && selection.GetSelected(out model, out iter))
- {
- string colorName = (string)colorStore.GetValue(iter, 0);
- PaintRecipe recipe;
- if (profile.Recipes.TryGetValue(colorName, out recipe))
- {
- clipboard.Text = recipe.ToString();
- }
- }
- }
-
- protected void OnCopyRecipeListToClipboard(object sender, EventArgs e)
- {
- Gtk.Clipboard clipboard = recipeList.GetClipboard(Gdk.Selection.Clipboard);
-
- StringWriter writer = new StringWriter();
- profile.ExportWikiFormat(writer);
-
- clipboard.Text = writer.ToString();
- }
- }
-}
-
diff --git a/RecipeSearchNode.cs b/RecipeSearchNode.cs
--- a/RecipeSearchNode.cs
+++ b/RecipeSearchNode.cs
@@ -48,6 +48,8 @@ namespace DesertPaintLab
}
}
+ public uint MinConcentration { get; set; } = 10;
+
bool[] reagentInUse;
List costSortedReagents;
PaintRecipe testRecipe = null;
@@ -64,7 +66,7 @@ namespace DesertPaintLab
}
public uint CurrentTargetQuantity { get; set; }
- public uint MaxQuantity { get; set; }
+ public uint MaxConcentration { get; set; }
public uint UsedQuantity { get; private set; }
public uint CatalystCount { get; set; }
public uint FullQuantityDepth { get; set; }
@@ -111,7 +113,7 @@ namespace DesertPaintLab
nextReagentPos = other.nextReagentPos;
CurrentTargetQuantity = other.CurrentTargetQuantity;
- MaxQuantity = other.MaxQuantity;
+ MaxConcentration = other.MaxConcentration;
UsedQuantity = other.UsedQuantity;
CatalystCount = other.CatalystCount;
FullQuantityDepth = other.FullQuantityDepth;
@@ -285,7 +287,7 @@ namespace DesertPaintLab
{
//System.Console.WriteLine("Init for quantity: {0}, reagent count: {1} ({2} catalysts)", quantity, ReagentCount, CatalystCount);
CurrentTargetQuantity = quantity;
- if (CurrentTargetQuantity < (10 + CatalystCount))
+ if (CurrentTargetQuantity < (MinConcentration + CatalystCount))
{
// invalid quantity
return;
@@ -342,7 +344,8 @@ namespace DesertPaintLab
// pulled from parent: List costSortedReagents;
// new on construct: PaintRecipe testRecipe = null;
writer.WriteLine("CurrentTargetQuantity: {0}", CurrentTargetQuantity);
- writer.WriteLine("MaxQuantity: {0}", MaxQuantity);
+ writer.WriteLine("MinConcentration: {0}", MinConcentration);
+ writer.WriteLine("MaxConcentration: {0}", MaxConcentration);
writer.WriteLine("UsedQuantity: {0}", UsedQuantity);
writer.WriteLine("CatalystCount: {0}", CatalystCount);
writer.WriteLine("FullQuantity: {0}", FullQuantity);
@@ -419,7 +422,19 @@ namespace DesertPaintLab
case "MaxQuantity":
{
uint value = uint.Parse(match.Groups[2].Value);
- MaxQuantity = value;
+ MaxConcentration = value;
+ }
+ break;
+ case "MinConcentration":
+ {
+ uint value = uint.Parse(match.Groups[2].Value);
+ MinConcentration = value;
+ }
+ break;
+ case "MaxConcentration":
+ {
+ uint value = uint.Parse(match.Groups[2].Value);
+ MaxConcentration = value;
}
break;
case "MinReagents":
diff --git a/Settings.cs b/Settings.cs
--- a/Settings.cs
+++ b/Settings.cs
@@ -7,13 +7,13 @@ namespace DesertPaintLab
{
public class Settings
{
- private Settings()
+ public Settings()
{
}
- private static Dictionary _settings = new Dictionary();
+ private Dictionary _settings = new Dictionary();
- public static void Get(string key, out int value)
+ public void Get(string key, out int value)
{
value = 0;
string valStr;
@@ -22,7 +22,7 @@ namespace DesertPaintLab
Int32.TryParse(valStr, out value);
}
}
- public static void Get(string key, out bool value)
+ public void Get(string key, out bool value)
{
value = false;
string valStr;
@@ -31,18 +31,22 @@ namespace DesertPaintLab
Boolean.TryParse(valStr, out value);
}
}
- public static void Set(string key, int value)
+ public void Set(string key, int value)
{
_settings[key.ToLower()] = value.ToString();
}
- public static void Get(string key, bool value)
+ public void Set(string key, bool value)
{
_settings[key.ToLower()] = value.ToString();
}
- public static void Save()
+ public void Reset()
{
- string settingsPath = System.IO.Path.Combine(FileUtils.AppDataPath, "settings");
+ _settings.Clear();
+ }
+
+ public void Save(string settingsPath)
+ {
using (StreamWriter writer = new StreamWriter(settingsPath))
{
foreach (KeyValuePair pair in _settings)
@@ -51,12 +55,10 @@ namespace DesertPaintLab
}
}
}
-
static Regex optionEntry = new Regex(@"(?[^#=][^=]*)=(?.*)$");
- public static bool Load()
+ public bool Load(string settingsPath)
{
- string settingsPath = System.IO.Path.Combine(FileUtils.AppDataPath, "settings");
if (System.IO.File.Exists(settingsPath))
{
string line;
diff --git a/SimulatorWindow.cs b/SimulatorWindow.cs
deleted file mode 100644
--- a/SimulatorWindow.cs
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Copyright (c) 2010, Tess Snider
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
-*/
-
-using System;
-using System.Collections.Generic;
-
-namespace DesertPaintLab
-{
- public partial class SimulatorWindow : Gtk.Window
- {
- Gtk.ListStore recipeData = new Gtk.ListStore(typeof(string), typeof(int));
- PaintRecipe paintRecipe;
-
- List missingWarned = new List();
- List> newMissing = new List>();
-
- private class IngredientPair
- {
- public string first;
- public string second;
-
- public IngredientPair(string first, string second)
- {
- this.first = first;
- this.second = second;
- }
- }
-
- public SimulatorWindow(PlayerProfile profile) : base(Gtk.WindowType.Toplevel)
- {
- this.Build ();
-
- paintRecipe = new PaintRecipe();
- paintRecipe.Reactions = profile.Reactions;
-
- Gtk.TreeViewColumn reagentColumn = new Gtk.TreeViewColumn();
- Gtk.CellRendererText reagentColumnCell = new Gtk.CellRendererText();
- reagentColumn.PackStart(reagentColumnCell, true);
- reagentColumn.Title = "Ingredient";
-
- reagentListView.AppendColumn(reagentColumn);
- reagentColumn.AddAttribute(reagentColumnCell, "text", 0);
-
- reagentListView.Model = ReagentManager.NameListModel;
-
- Gtk.TreeViewColumn additiveColumn = new Gtk.TreeViewColumn();
- Gtk.CellRendererText additiveColumnCell = new Gtk.CellRendererText();
- additiveColumn.PackStart(additiveColumnCell, true);
- additiveColumn.Title = "Ingredient";
-
- recipeView.AppendColumn(additiveColumn);
- additiveColumn.AddAttribute(additiveColumnCell, "text", 0);
-
- Gtk.TreeViewColumn qtyColumn = new Gtk.TreeViewColumn();
- Gtk.CellRendererText qtyColumnCell = new Gtk.CellRendererText();
- qtyColumnCell.Editable = true;
- qtyColumnCell.Edited += OnQtyEdited;
- qtyColumn.PackStart(qtyColumnCell, true);
- qtyColumn.Title = "Qty";
-
- recipeView.AppendColumn(qtyColumn);
- qtyColumn.AddAttribute(qtyColumnCell, "text", 1);
-
- recipeView.Model = recipeData;
-
- recipeData.RowChanged += OnRecipeChanged;
- recipeData.RowDeleted += OnRecipeChanged;
- recipeData.RowInserted += OnRecipeChanged;
- recipeData.RowsReordered += OnRecipeChanged;
-
- }
-
- protected virtual void OnAddReagent(object sender, System.EventArgs e)
- {
- Gtk.TreeModel model;
- Gtk.TreeIter iter;
-
- Gtk.TreeSelection selection = reagentListView.Selection;
- if ((selection != null) && selection.GetSelected(out model, out iter))
- {
- recipeData.AppendValues(model.GetValue(iter, 0).ToString(), 1);
-
- recipeData.IterNthChild(out iter, recipeView.Children.Length - 1);
-
- selection = recipeView.Selection;
- selection.SelectIter(iter);
- }
- }
-
- protected void OnQtyEdited(object sender, Gtk.EditedArgs args)
- {
- Gtk.TreeIter iter;
- recipeData.GetIter(out iter, new Gtk.TreePath(args.Path));
-
- int oldValue = (int)recipeData.GetValue(iter, 1);
-
- try
- {
- recipeData.SetValue(iter, 1, int.Parse(args.NewText));
- UpdateRecipeColor();
- }
- catch (Exception)
- {
- recipeData.SetValue(iter, 1, oldValue);
- }
- }
-
- protected void OnRecipeChanged(object sender, GLib.SignalArgs args)
- {
- UpdateRecipeColor();
- }
-
- void UpdateRecipeColor()
- {
- if (recipeView.Children.Length == 0)
- {
- paintSwatch.Clear();
- }
-
- paintRecipe.Clear();
-
- Gtk.TreeIter iter;
- string reagentName;
- int qty;
-
- recipeData.GetIterFirst(out iter);
-
- do
- {
- reagentName = (string) recipeData.GetValue(iter, 0);
-
- if (reagentName == null)
- {
- continue;
- }
-
- qty = (int)recipeData.GetValue(iter, 1);
- for (int i = 0; i < qty; ++i)
- {
- paintRecipe.AddReagent(reagentName);
- }
- }
- while (recipeData.IterNext(ref iter));
-
- PaintColor resultColor = new PaintColor(paintRecipe.ReactedColor);
- paintSwatch.Color = resultColor;
- if (paintRecipe.CheckMissingReactions(ref newMissing))
- {
- string warningMsg = "";
-
- foreach (KeyValuePair newEntry in newMissing)
- {
- IngredientPair match = missingWarned.Find(x => (x.first.Equals(newEntry.Key) && x.second.Equals(newEntry.Value)));
- if (match == null)
- {
- match = new IngredientPair(newEntry.Key, newEntry.Value);
- missingWarned.Add(match);
- warningMsg += newEntry.Key + " + " + newEntry.Value + "\n";
- }
- }
- if (warningMsg.Length > 0)
- {
- Gtk.MessageDialog md = new Gtk.MessageDialog(this,
- Gtk.DialogFlags.DestroyWithParent,
- Gtk.MessageType.Warning,
- Gtk.ButtonsType.Ok,
- "These combinations have not yet had reactions recorded:\n\n" +
- warningMsg);
- md.Run();
- md.Destroy();
- }
- }
-
- }
-
- protected virtual void OnIncrementReagent (object sender, System.EventArgs e)
- {
- Gtk.TreeModel model;
- Gtk.TreeIter iter;
-
- Gtk.TreeSelection selection = recipeView.Selection;
- if ((selection != null) && selection.GetSelected(out model, out iter))
- {
- int oldValue = (int)recipeData.GetValue(iter, 1);
- recipeData.SetValue(iter, 1, oldValue + 1);
- }
-
- }
-
- protected virtual void OnDecrementReagent (object sender, System.EventArgs e)
- {
- Gtk.TreeModel model;
- Gtk.TreeIter iter;
-
- Gtk.TreeSelection selection = recipeView.Selection;
- if ((selection != null) && selection.GetSelected(out model, out iter))
- {
- int oldValue = (int)recipeData.GetValue(iter, 1);
- if (oldValue == 1)
- {
- recipeData.Remove(ref iter);
- }
- else
- {
- recipeData.SetValue(iter, 1, oldValue - 1);
- }
- }
-
- }
-
- protected virtual void OnFlushReagents (object sender, System.EventArgs e)
- {
- recipeData.Clear();
- }
- }
-}
\ No newline at end of file
diff --git a/UI/CaptureView.cs b/UI/CaptureView.cs
new file mode 100644
--- /dev/null
+++ b/UI/CaptureView.cs
@@ -0,0 +1,429 @@
+using System;
+
+namespace DesertPaintLab
+{
+ [System.ComponentModel.ToolboxItem(true)]
+ public partial class CaptureView : Gtk.Bin
+ {
+
+ Reagent[] reagents = new Reagent[3];
+ PaintRecipe recipe = new PaintRecipe();
+
+ PaintColor expectedColor = new PaintColor();
+ PaintColor reactedColor = new PaintColor();
+
+ PlayerProfile profile = null;
+
+ Gdk.Pixbuf screenBuffer = null;
+
+ bool recordEnabled = true;
+ bool isCaptured = false;
+
+ public CaptureView(PlayerProfile profile, Gdk.Pixbuf screenBuffer) : base()
+ {
+ this.profile = profile;
+ this.screenBuffer = screenBuffer;
+
+ this.Build();
+
+ reagents[0] = null;
+ reagents[1] = null;
+ reagents[2] = null;
+
+ if (unmodifiedSwatch != null)
+ {
+ unmodifiedSwatch.Clear();
+ }
+ if (reactionSwatch != null)
+ {
+ reactionSwatch.Clear();
+ }
+
+ PopulateDropDowns();
+ recipe.Reactions = profile.Reactions;
+ }
+
+ public PlayerProfile Profile
+ {
+ set {
+ profile = value;
+ PopulateDropDowns();
+ recipe.Reactions = profile.Reactions;
+ UpdateIngredients();
+ // TODO: reset views
+ }
+ }
+
+ public void DisableRecord()
+ {
+ recordEnabled = false;
+ recordButton.Sensitive = false;
+ }
+
+ public void EnableRecord()
+ {
+ recordEnabled = true;
+ if (isCaptured)
+ {
+ recordEnabled = true;
+ }
+ UpdateIngredients();
+ }
+
+ public void PopulateDropDowns()
+ {
+ ReagentManager.PopulateReagents(ref ingredient1ComboBox);
+ ReagentManager.PopulateReagents(ref ingredient2ComboBox);
+ ReagentManager.PopulateReagents(ref ingredient3ComboBox);
+
+ ingredient2ComboBox.Sensitive = false;
+ ingredient3ComboBox.Sensitive = false;
+
+ Gtk.TreeIter iter;
+ ingredient1ComboBox.Model.IterNthChild(out iter, 0);
+ ingredient1ComboBox.SetActiveIter(iter);
+ ingredient2ComboBox.Model.IterNthChild(out iter, 0);
+ ingredient2ComboBox.SetActiveIter(iter);
+ ingredient3ComboBox.Model.IterNthChild(out iter, 0);
+ ingredient3ComboBox.SetActiveIter(iter);
+ }
+
+ protected void SetExpectedColor(byte red, byte green, byte blue)
+ {
+ expectedColor.Red = red;
+ expectedColor.Green = green;
+ expectedColor.Blue = blue;
+ unmodifiedSwatch.Color = expectedColor;
+ }
+
+ protected void SetExpectedColor(PaintColor color)
+ {
+ SetExpectedColor(color.Red, color.Green, color.Blue);
+ }
+
+ protected string GetSelectedReagentName(int reagentNum)
+ {
+ Gtk.ComboBox[] comboBox = { ingredient1ComboBox, ingredient2ComboBox, ingredient3ComboBox };
+ Gtk.ComboBox desired = comboBox[reagentNum-1];
+
+ Gtk.TreeIter selectIter;
+ string reagentName = null;
+ if (desired.GetActiveIter(out selectIter))
+ {
+ reagentName = (string)desired.Model.GetValue(selectIter, 0);
+ }
+ if (reagentName != null && reagentName.Length == 0)
+ {
+ reagentName = null;
+ }
+
+ return reagentName;
+ }
+
+ protected void UpdateIngredients()
+ {
+ Reaction reaction1, reaction2;
+ string reagentName;
+ reagents[0] = null;
+ reagents[1] = null;
+ reagents[2] = null;
+
+ bool reactionKnown = true;
+
+ isCaptured = false;
+ recordButton.Sensitive = false;
+ clearReactionButton.Sensitive = false;
+ clearReactionButton.Visible = false;
+
+ recipe.Clear();
+
+ if ((reagentName = GetSelectedReagentName(1)) == null)
+ {
+ // Nothing selected as reagent 1
+ ingredient2ComboBox.Sensitive = false;
+ ingredient3ComboBox.Sensitive = false;
+ unmodifiedSwatch.Clear();
+ reactionSwatch.Clear();
+ captureButton.Sensitive = false;
+ return;
+ }
+ recipe.AddReagent(reagentName);
+ reagents[0] = ReagentManager.GetReagent(reagentName);
+ ingredient2ComboBox.Sensitive = true;
+ if ((reagentName = GetSelectedReagentName(2)) == null)
+ {
+ ingredient3ComboBox.Sensitive = false;
+ recordButton.Sensitive = false;
+ reactionKnown = false;
+ reactionSwatch.Clear();
+ return;
+ }
+
+ recipe.AddReagent(reagentName);
+ reagents[1] = ReagentManager.GetReagent(reagentName);
+ ingredient3ComboBox.Sensitive = true;
+ captureButton.Sensitive = true;
+
+ reaction1 = profile.FindReaction(reagents[0], reagents[1]);
+
+ // TODO: really should handle reagent0==reagent1 better
+ if ((reaction1 != null) || (reagents[0] == reagents[1]))
+ {
+ clearReactionButton.Sensitive = recordEnabled;
+ clearReactionButton.Visible = true;
+ ingredient3ComboBox.Sensitive = true;
+ if ((reagentName = GetSelectedReagentName(3)) != null)
+ {
+ clearReactionButton.Sensitive = false;
+ clearReactionButton.Visible = false;
+ recipe.AddReagent(reagentName);
+ reagents[2] = ReagentManager.GetReagent(reagentName);
+
+ if (!reactionKnown)
+ {
+ Gtk.MessageDialog md = new Gtk.MessageDialog((Gtk.Window)Toplevel,
+ Gtk.DialogFlags.DestroyWithParent,
+ Gtk.MessageType.Error, Gtk.ButtonsType.Ok,
+ "To do a three-ingredient reaction test, " +
+ "you must first recored the reaction of " +
+ "the first two ingredients.");
+
+ md.Run();
+ md.Destroy();
+ captureButton.Sensitive = false;
+ }
+
+ reaction1 = profile.FindReaction(reagents[0], reagents[2]);
+ reaction2 = profile.FindReaction(reagents[1], reagents[2]);
+
+ if (reactionKnown && (reaction1 == null) && (reaction2 == null))
+ {
+ Gtk.MessageDialog md = new Gtk.MessageDialog((Gtk.Window)Toplevel,
+ Gtk.DialogFlags.DestroyWithParent,
+ Gtk.MessageType.Error, Gtk.ButtonsType.Ok,
+ "To do a three-ingredient reaction test, " +
+ "you must first record the reaction of " +
+ "either the first or second ingredient " +
+ "with the third ingredient.");
+
+ md.Run();
+ md.Destroy();
+ captureButton.Sensitive = false;
+ }
+
+ if ((reaction1 == null) && (reagents[0] != reagents[2]))
+ {
+ reactionKnown = false;
+ }
+
+ if ((reaction2 == null) && (reagents[1] != reagents[2]))
+ {
+ reactionKnown = false;
+ }
+ }
+ }
+ else
+ {
+ reactionKnown = false;
+ ingredient3ComboBox.Sensitive = false;
+ }
+
+ expectedColor.Set(recipe.BaseColor);
+ unmodifiedSwatch.Color = expectedColor;
+ //SetExpectedColor(recipeColor.Red, recipeColor.Green, recipeColor.Blue);
+
+ if (reactionKnown)
+ {
+ reactedColor.Set(recipe.ReactedColor);
+ reactionSwatch.Color = reactedColor;
+ }
+ else
+ {
+ reactionSwatch.Clear();
+ }
+ }
+
+ unsafe bool CaptureReactionColor()
+ {
+ // Take a screenshot.
+ int screenWidth, screenHeight;
+ bool debugScreenshot = false;
+ bool enableDebugMenu = false;
+ Gdk.Window rootWindow = Gdk.Global.DefaultRootWindow;
+ DesertPaintLab.AppSettings.Get("ScreenWidth", out screenWidth);
+ DesertPaintLab.AppSettings.Get("ScreenHeight", out screenHeight);
+ DesertPaintLab.AppSettings.Get("EnableDebugMenu", out enableDebugMenu);
+ DesertPaintLab.AppSettings.Get("DebugScreenshot", out debugScreenshot);
+ Gdk.Image rootImage = rootWindow.GetImage(0, 0, screenWidth, screenHeight);
+ screenBuffer.GetFromImage(rootImage, rootImage.Colormap, 0, 0, 0, 0, screenWidth, screenHeight);
+ //screenBuffer.GetFromDrawable(rootWindow,
+ // rootWindow.Colormap, 0, 0, 0, 0, screenWidth, screenHeight);
+ int stride = screenBuffer.Rowstride;
+ byte* pixBytes = (byte*)screenBuffer.Pixels;
+ int redPixelStart = -1;
+
+ isCaptured = ReactionRecorder.CaptureReaction(pixBytes, screenWidth, screenHeight, stride, ref reactedColor, ref redPixelStart);
+ if (enableDebugMenu && debugScreenshot)
+ {
+ if (!isCaptured)
+ {
+ // write out the whole screenshot on a failure to capture
+ string screenshotDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
+ string filename;
+ int i = 0;
+ do
+ {
+ ++i;
+ filename = System.IO.Path.Combine(screenshotDir, String.Format("DesertPaintLab_Colormatch{0}.png", i));
+ } while (System.IO.File.Exists(filename));
+ screenBuffer.Save(filename, "png");
+ }
+ else
+ {
+ // record the swatch that was captured
+ // convert to pixel offset instead of byte
+ int redPixelStartX = (redPixelStart % stride) / 3;
+ int redPixelStartY = (redPixelStart / stride);
+ // write out the screenshot
+ string screenshotDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
+ string filename;
+ int i = 0;
+ do
+ {
+ ++i;
+ filename = System.IO.Path.Combine(screenshotDir, String.Format("DesertPaintLab_Colormatch{0}.png", i));
+ } while (System.IO.File.Exists(filename));
+ int captureAreaWidth = Math.Min(64, screenWidth - redPixelStartX + 64);
+ int captureAreaHeight = Math.Min(64, screenHeight - redPixelStartY + 64);
+ Gdk.Pixbuf outPixBuf = new Gdk.Pixbuf(screenBuffer, Math.Max(0, redPixelStartX - 16), Math.Max(0, redPixelStartY - 16), captureAreaWidth, captureAreaHeight);
+ //screenBuffer.Save(filename, "png");
+ outPixBuf.Save(filename, "png");
+ }
+ }
+ //screenBuffer.Save("screenshot.png", "png");
+
+ return isCaptured;
+ }
+
+ protected virtual void OnCapture(object sender, System.EventArgs e)
+ {
+ if (CaptureReactionColor())
+ {
+ string warning = "";
+ if (reactedColor.Red == 0)
+ {
+ warning = warning + "\nRed is too low.";
+ }
+ if (reactedColor.Green == 0)
+ {
+ warning = warning + "\nGreen is too low.";
+ }
+ if (reactedColor.Blue == 0)
+ {
+ warning = warning + "\nBlue is too low.";
+ }
+ if (reactedColor.Red == 255)
+ {
+ warning = warning + "\nRed is too high.";
+ }
+ if (reactedColor.Green == 255)
+ {
+ warning = warning + "\nGreen is too high.";
+ }
+ if (reactedColor.Blue == 255)
+ {
+ warning = warning + "\nBlue is too high.";
+ }
+
+ if (warning.Length != 0)
+ {
+ isCaptured = true;
+ Gtk.MessageDialog md = new Gtk.MessageDialog((Gtk.Window)Toplevel,
+ Gtk.DialogFlags.DestroyWithParent,
+ Gtk.MessageType.Error, Gtk.ButtonsType.Ok,
+ "Reaction clipped. You will need to do a " +
+ "3-way reaction to test this pair. Details: " +
+ warning);
+
+ md.Run();
+ md.Destroy();
+ }
+ else
+ {
+ this.reactionSwatch.Color = reactedColor;
+ recordButton.Sensitive = recordEnabled;
+ }
+ }
+ else
+ {
+ Gtk.MessageDialog md = new Gtk.MessageDialog((Gtk.Window)Toplevel,
+ Gtk.DialogFlags.DestroyWithParent,
+ Gtk.MessageType.Error, Gtk.ButtonsType.Ok,
+ "Pigment Lab dialog box NOT FOUND. Please ensure " +
+ "that there is an unobstructed view of the dialog " +
+ "and that your interface size is set to 'small' " +
+ "when you press the Capture button.");
+
+ md.Run();
+ md.Destroy();
+ }
+ }
+
+ protected virtual void OnRecord(object sender, System.EventArgs e)
+ {
+ if (ReactionRecorder.RecordReaction(profile, expectedColor, reactedColor, reagents))
+ {
+ recordButton.Sensitive = false;
+ }
+ }
+
+ protected virtual void OnChangedIngredient1(object sender, System.EventArgs e)
+ {
+ UpdateIngredients();
+ }
+
+ protected virtual void OnChangedIngredient2(object sender, System.EventArgs e)
+ {
+ UpdateIngredients();
+ }
+
+ protected virtual void OnChangedIngredient3(object sender, System.EventArgs e)
+ {
+ UpdateIngredients();
+
+ }
+
+ protected void OnClearReaction(object sender, EventArgs e)
+ {
+ string reagentName1 = GetSelectedReagentName(1);
+ string reagentName2 = GetSelectedReagentName(2);
+ string reagentName3 = GetSelectedReagentName(3);
+
+ if ((reagentName1 != null) && (reagentName2 != null) && (reagentName3 == null))
+ {
+ Reagent reagent1 = ReagentManager.GetReagent(reagentName1);
+ Reagent reagent2 = ReagentManager.GetReagent(reagentName2);
+
+ if (null != profile.FindReaction(reagent1, reagent2))
+ {
+ Gtk.MessageDialog md = new Gtk.MessageDialog((Gtk.Window)Toplevel,
+ Gtk.DialogFlags.DestroyWithParent,
+ Gtk.MessageType.Warning, Gtk.ButtonsType.OkCancel,
+ "This will delete the reaction status between " +
+ // TODO: ingredient1Name + " and " + ingredient2Name + "\n\n" +
+ "ARE YOU SURE?"
+ );
+
+ Gtk.ResponseType response = (Gtk.ResponseType)md.Run();
+ if (response == Gtk.ResponseType.Ok)
+ {
+ // really delete it
+ profile.ClearReaction(reagent1, reagent2);
+ }
+ md.Destroy();
+ }
+ }
+ }
+ }
+}
+
diff --git a/UI/RecipeGeneratorView.cs b/UI/RecipeGeneratorView.cs
new file mode 100644
--- /dev/null
+++ b/UI/RecipeGeneratorView.cs
@@ -0,0 +1,854 @@
+/*
+ * Copyright (c) 2015, Jason Maltzen
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+*/
+
+using System;
+using System.IO;
+using System.Collections.Generic;
+using System.Collections.Concurrent;
+
+namespace DesertPaintLab
+{
+ [System.ComponentModel.ToolboxItem(true)]
+ public partial class RecipeGeneratorView : Gtk.Bin
+ {
+ RecipeGenerator generator;
+ PlayerProfile profile;
+ bool canceling = false;
+ bool running = false;
+ bool pauseForCheckpoint = false;
+
+ const long RECIPE_SAVE_INTERVAL = 30000; // msec between saving recipes
+ const long CHECKPOINT_INTERVAL = 17000; // msec between saving out generator state
+ const string PAINT_STATE_FILE = "dp_generator_state";
+ const string RIBBON_STATE_FILE = "dp_generator_ribbon_state";
+
+ static Gtk.ListStore colorStore = new Gtk.ListStore(typeof(string));
+
+ List> missingReactions = new List>();
+
+ long lastProgressUpdate;
+ long lastStatusUpdate;
+ long lastProfileSave;
+ long lastCheckpoint;
+
+ public EventHandler SetStatus;
+ public EventHandler Started;
+ public EventHandler Stopped;
+
+ static public Gtk.ListStore RecipeModel
+ {
+ get
+ {
+ return colorStore;
+ }
+ }
+
+ Gtk.ThreadNotify notifyFinished;
+ Gtk.ThreadNotify notifyProgress;
+ Gtk.ThreadNotify notifyNewRecipe;
+
+ ConcurrentQueue pendingNewRecipes = new ConcurrentQueue();
+
+ Gtk.ListStore reagentListStore;
+ // end reagent view
+
+ public RecipeGeneratorView(PlayerProfile profile) : base()
+ {
+ this.profile = profile;
+ this.Build();
+ minIngredientsSpinButton.Value = 1; // TODO: read/save profile info
+ maxIngredientsSpinButton.Value = 5; // TODO: read/save profile info
+ maxRecipeSpinButton.Value = 20; // TODO: read/save profile info
+ fullQuantitySpinButton.Value = 20; // TODO: read/save profile info
+ fullQuantityDepthSpinButton.Value = 4; // TODO: read/save profile info
+
+ fullQuantityDepthSpinButton.SetRange(0, ReagentManager.Names.Count);
+ maxIngredientsSpinButton.SetRange(1, ReagentManager.Names.Count);
+ minIngredientsSpinButton.SetRange(1, ReagentManager.Names.Count);
+
+
+ Gtk.TreeViewColumn recipeColorColumn = new Gtk.TreeViewColumn();
+ Gtk.CellRendererText recipeColumnCell = new Gtk.CellRendererText();
+ recipeColorColumn.PackStart(recipeColumnCell, true);
+ recipeColorColumn.Title = "Color";
+
+ recipeList.AppendColumn(recipeColorColumn);
+ recipeColorColumn.AddAttribute(recipeColumnCell, "text", 0);
+
+ colorStore.Clear();
+
+ colorStore.SetSortColumnId(0, Gtk.SortType.Ascending);
+ recipeList.Model = RecipeModel;
+
+ recipeList.Selection.Changed += OnColorSelected;
+
+ recipeIngredientsView.AppendColumn("Quantity", new Gtk.CellRendererText(), "text", 0);
+ recipeIngredientsView.AppendColumn("Ingredient", new Gtk.CellRendererText(), "text", 1);
+ recipeIngredientsView.Model = new Gtk.ListStore(typeof(string), typeof(string));
+
+ profile.LoadRecipes();
+
+ canceling = false;
+ running = false;
+ pauseForCheckpoint = false;
+
+ generator = new RecipeGenerator(profile.Reactions);
+ int threads;
+ DesertPaintLab.AppSettings.Get("GeneratorThreads", out threads);
+ if (threads <= 0) { threads = 15; }
+ generator.MaxThreads = (uint)threads;
+ generator.InitRecipes(profile.Recipes);
+
+ generator.Progress += OnProgress;
+ generator.Finished += OnFinished;
+ generator.NewRecipe += OnNewRecipe;
+
+ string stateFile = System.IO.Path.Combine(profile.Directory, PAINT_STATE_FILE);
+ if (System.IO.File.Exists(stateFile))
+ {
+ generator.LoadState(stateFile);
+ if (generator.CanResume)
+ {
+ beginButton.Label = "Restart";
+ stopResumeButton.Label = "Resume";
+ stopResumeButton.Sensitive = true;
+
+ maxRecipeSpinButton.Value = Math.Max(generator.MaxConcentration, 14); //
+ fullQuantitySpinButton.Value = generator.FullQuantity; // TODO: read/save profile info
+ fullQuantityDepthSpinButton.Value = generator.FullQuantityDepth; // TODO: read/save profile info
+ maxIngredientsSpinButton.Value = generator.MaxReagents;
+ checkButtonRibbon.Active = false;
+ }
+ }
+ //generator.Log = System.IO.Path.Combine(profile.Directory, "dp_log.txt");
+ countLabel.Text = String.Format("{0} / {1}", profile.RecipeCount, Palette.Count);
+
+ Destroyed += OnDestroyed;
+
+ notifyFinished = new Gtk.ThreadNotify(new Gtk.ReadyEvent(HandleFinished));
+ notifyProgress = new Gtk.ThreadNotify(new Gtk.ReadyEvent(HandleProgress));
+ notifyNewRecipe = new Gtk.ThreadNotify(new Gtk.ReadyEvent(HandleNewRecipe));
+
+ // initialize reagent list
+
+ // Add the columns to the TreeView
+ Gtk.TreeViewColumn reagentEnabledColumn = new Gtk.TreeViewColumn ();
+ reagentEnabledColumn.Title = "Enabled";
+ Gtk.CellRendererToggle reagentEnabledCell = new Gtk.CellRendererToggle ();
+ reagentEnabledCell.Activatable = true;
+ reagentEnabledCell.Sensitive = true;
+ reagentEnabledCell.Mode = Gtk.CellRendererMode.Activatable;
+ reagentEnabledCell.Visible = true;
+ reagentEnabledCell.Toggled += new Gtk.ToggledHandler(OnReagentEnableToggled);
+ reagentEnabledColumn.PackStart (reagentEnabledCell, true);
+ //reagentEnabledColumn.AddAttribute(reagentEnabledCell, "active", 0);
+
+ Gtk.TreeViewColumn reagentNameColumn = new Gtk.TreeViewColumn ();
+ reagentNameColumn.Title = "Ingredient";
+ Gtk.CellRendererText reagentNameCell = new Gtk.CellRendererText ();
+ reagentNameCell.Mode = Gtk.CellRendererMode.Inert;
+ reagentNameColumn.PackStart (reagentNameCell, true);
+ reagentNameColumn.AddAttribute(reagentNameCell, "text", 1);
+ reagentNameColumn.Expand = true;
+
+ Gtk.TreeViewColumn reagentCostColumn = new Gtk.TreeViewColumn ();
+ reagentCostColumn.Title = "Cost";
+ Gtk.CellRendererText reagentCostCell = new Gtk.CellRendererText ();
+ reagentCostCell.Edited += OnReagentCostChanged;
+ reagentCostCell.Editable = true;
+ reagentCostCell.Sensitive = true;
+ reagentCostCell.Mode = Gtk.CellRendererMode.Editable;
+ reagentCostColumn.PackStart (reagentCostCell, true);
+ //reagentCostColumn.AddAttribute(reagentCostCell, "text", 0);
+
+ Gtk.TreeViewColumn reagentMaxColumn = new Gtk.TreeViewColumn ();
+ reagentMaxColumn.Title = "Max";
+ Gtk.CellRendererText reagentMaxCell = new Gtk.CellRendererText ();
+ reagentMaxCell.Edited += OnReagentQuantityChanged;
+ reagentMaxCell.Editable = true;
+ reagentMaxCell.Sensitive = true;
+ reagentCostCell.Mode = Gtk.CellRendererMode.Editable;
+ reagentMaxColumn.PackStart (reagentMaxCell, true);
+ //reagentMaxColumn.AddAttribute(reagentMaxCell, "text", 0);
+
+ reagentListStore = new Gtk.ListStore(typeof(Reagent), typeof(string), typeof(Reagent), typeof(Reagent));
+ foreach (string reagentName in ReagentManager.Names)
+ {
+ Reagent reagent = ReagentManager.GetReagent(reagentName);
+ reagentListStore.AppendValues(reagent, reagentName); // , reagent, reagent);
+ }
+
+ reagentEnabledColumn.SetCellDataFunc (reagentEnabledCell, new Gtk.TreeCellDataFunc (RenderReagentToggle));
+ reagentCostColumn.SetCellDataFunc (reagentCostCell, new Gtk.TreeCellDataFunc (RenderReagentCost));
+ reagentMaxColumn.SetCellDataFunc (reagentMaxCell, new Gtk.TreeCellDataFunc (RenderReagentQuantity));
+
+ // Assign the model to the TreeView
+ reagentListView.Model = reagentListStore;
+ reagentListView.Sensitive = true;
+
+ reagentListView.AppendColumn(reagentEnabledColumn);
+ reagentListView.AppendColumn(reagentNameColumn);
+ reagentListView.AppendColumn(reagentCostColumn);
+ reagentListView.AppendColumn(reagentMaxColumn);
+
+ bool ribbons = false;
+ profile.ProfileSettings.Get("Generator.Ribbons", out ribbons);
+ if (ribbons)
+ {
+ checkButtonRibbon.Active = true;
+ InitStateForRibbons();
+ }
+ else
+ {
+ checkButtonRibbon.Active = false;
+ InitStateForPaint();
+ }
+
+ ShowAll();
+ }
+
+ private void InitStateForPaint()
+ {
+ maxRecipeSpinButton.Adjustment.Lower = PaintRecipe.PAINT_RECIPE_MIN_CONCENTRATION;
+ fullQuantitySpinButton.Adjustment.Upper = 30;
+ if (generator == null)
+ {
+ generator = new RecipeGenerator(profile.Reactions);
+ int threads;
+ DesertPaintLab.AppSettings.Get("GeneratorThreads", out threads);
+ if (threads <= 0) { threads = 15; }
+ generator.MaxThreads = (uint)threads;
+
+ generator.Progress += OnProgress;
+ generator.Finished += OnFinished;
+ generator.NewRecipe += OnNewRecipe;
+ }
+ generator.InitRecipes(profile.Recipes);
+
+ string stateFile = System.IO.Path.Combine(profile.Directory, PAINT_STATE_FILE);
+ if (System.IO.File.Exists(stateFile))
+ {
+ generator.LoadState(stateFile);
+ if (generator.CanResume)
+ {
+ beginButton.Label = "Restart";
+ stopResumeButton.Label = "Resume";
+ stopResumeButton.Sensitive = true;
+
+ maxRecipeSpinButton.Value = Math.Max(generator.MaxConcentration, 14); //
+ fullQuantitySpinButton.Value = generator.FullQuantity; // TODO: read/save profile info
+ fullQuantityDepthSpinButton.Value = generator.FullQuantityDepth; // TODO: read/save profile info
+ maxIngredientsSpinButton.Value = generator.MaxReagents;
+ }
+ }
+ else
+ {
+ beginButton.Label = "Start";
+ stopResumeButton.Label = "Stop";
+ stopResumeButton.Sensitive = false;
+
+ maxRecipeSpinButton.Value = 14;
+ //fullQuantitySpinButton.Value = generator.FullQuantity; // TODO: read/save profile info
+ //fullQuantityDepthSpinButton.Value = generator.FullQuantityDepth; // TODO: read/save profile info
+ //maxIngredientsSpinButton.Value = generator.MaxReagents;
+ }
+ //generator.Log = System.IO.Path.Combine(profile.Directory, "dp_log.txt");
+ countLabel.Text = String.Format("{0} / {1}", profile.RecipeCount, Palette.Count);
+
+ colorStore.Clear();
+ foreach (KeyValuePair pair in profile.Recipes)
+ {
+ if (pair.Value.IsValidForConcentration(PaintRecipe.PAINT_RECIPE_MIN_CONCENTRATION))
+ {
+ string colorName = pair.Key;
+ colorStore.AppendValues(colorName);
+ }
+ }
+ recipeList.Show();
+ }
+
+ private void InitStateForRibbons()
+ {
+ maxRecipeSpinButton.Adjustment.Lower = PaintRecipe.RIBBON_RECIPE_MIN_CONCENTRATION;
+ fullQuantitySpinButton.Adjustment.Upper = 100;
+ if (generator == null)
+ {
+ generator = new RecipeGenerator(profile.Reactions);
+ int threads;
+ DesertPaintLab.AppSettings.Get("GeneratorThreads", out threads);
+ if (threads <= 0) { threads = 15; }
+ generator.MaxThreads = (uint)threads;
+
+ generator.Progress += OnProgress;
+ generator.Finished += OnFinished;
+ generator.NewRecipe += OnNewRecipe;
+ }
+ generator.InitRecipes(profile.RibbonRecipes);
+
+ string stateFile = System.IO.Path.Combine(profile.Directory, RIBBON_STATE_FILE);
+ if (System.IO.File.Exists(stateFile))
+ {
+ generator.LoadState(stateFile);
+ if (generator.CanResume)
+ {
+ beginButton.Label = "Restart";
+ stopResumeButton.Label = "Resume";
+ stopResumeButton.Sensitive = true;
+
+ maxRecipeSpinButton.Value = Math.Max(generator.MaxConcentration, PaintRecipe.RIBBON_RECIPE_MIN_CONCENTRATION); //
+ fullQuantitySpinButton.Value = generator.FullQuantity; // TODO: read/save profile info
+ fullQuantityDepthSpinButton.Value = generator.FullQuantityDepth; // TODO: read/save profile info
+ maxIngredientsSpinButton.Value = generator.MaxReagents;
+ }
+ }
+ else
+ {
+ beginButton.Label = "Start";
+ stopResumeButton.Label = "Stop";
+ stopResumeButton.Sensitive = false;
+
+ maxRecipeSpinButton.Value = PaintRecipe.RIBBON_RECIPE_MIN_CONCENTRATION
+;
+ //fullQuantitySpinButton.Value = generator.FullQuantity; // TODO: read/save profile info
+ //fullQuantityDepthSpinButton.Value = generator.FullQuantityDepth; // TODO: read/save profile info
+ //maxIngredientsSpinButton.Value = generator.MaxReagents;
+ }
+
+ countLabel.Text = String.Format("{0} / {1}", profile.RibbonCount, Palette.Count);
+
+ colorStore.Clear();
+ foreach (KeyValuePair pair in profile.RibbonRecipes)
+ {
+ if (pair.Value.IsValidForConcentration(PaintRecipe.RIBBON_RECIPE_MIN_CONCENTRATION))
+ {
+ string colorName = pair.Key;
+ colorStore.AppendValues(colorName);
+ }
+ }
+ recipeList.Show();
+ }
+
+ public PlayerProfile Profile {
+ set {
+ if (profile != value) {
+ // TODO: ensure not running
+ profile = value;
+ profile.LoadRecipes();
+
+ generator = new RecipeGenerator(profile.Reactions);
+ int threads;
+ DesertPaintLab.AppSettings.Get("GeneratorThreads", out threads);
+ if (threads <= 0) { threads = 15; }
+ generator.MaxThreads = (uint)threads;
+
+ generator.Progress += OnProgress;
+ generator.Finished += OnFinished;
+ generator.NewRecipe += OnNewRecipe;
+
+ if (checkButtonRibbon.Active)
+ {
+ InitStateForRibbons();
+ }
+ else
+ {
+ InitStateForPaint();
+ }
+ }
+ }
+ }
+
+ protected void OnMinIngredientsChanged(object sender, EventArgs e)
+ {
+ Gtk.SpinButton button = (Gtk.SpinButton) sender;
+ if (button.ValueAsInt > maxIngredientsSpinButton.ValueAsInt)
+ {
+ maxIngredientsSpinButton.Value = button.ValueAsInt;
+ }
+ maxIngredientsSpinButton.SetRange(button.ValueAsInt, maxIngredientsSpinButton.Adjustment.Upper);
+ }
+
+ protected void OnMaxIngredientsChanged(object sender, EventArgs e)
+ {
+ Gtk.SpinButton button = (Gtk.SpinButton) sender;
+ if (button.ValueAsInt < minIngredientsSpinButton.ValueAsInt)
+ {
+ minIngredientsSpinButton.Value = button.ValueAsInt;
+ }
+ minIngredientsSpinButton.SetRange(1, button.ValueAsInt);
+ // TODO: save profile setting
+ // TODO: no longer permit resume
+ }
+
+ protected void OnMaxRecipeChanged(object sender, EventArgs e)
+ {
+ // TODO: save profile setting
+ // TODO: no longer permit resume
+ }
+
+ protected void OnFullQuantityDepthChanged(object sender, EventArgs e)
+ {
+ // TODO: save profile setting
+ // TODO: no longer permit resume
+ }
+
+ protected void OnFullQuantityChanged(object sender, EventArgs e)
+ {
+ // TODO: save profile setting
+ // TODO: no longer permit resume
+ }
+
+ protected void OnBegin(object sender, EventArgs e)
+ {
+ minIngredientsSpinButton.Sensitive = false;
+ maxIngredientsSpinButton.Sensitive = false;
+ //TODO ExportToWikiAction.Sensitive = false;
+ maxRecipeSpinButton.Sensitive = false;
+ beginButton.Sensitive = false; // TODO: change to "pause"?
+ stopResumeButton.Sensitive = true;
+ fullQuantitySpinButton.Sensitive = false;
+ fullQuantityDepthSpinButton.Sensitive = false;
+ reagentListView.Sensitive = false;
+ checkButtonRibbon.Sensitive = false;
+
+ countLabel.Text = String.Format("{0} / {1}", checkButtonRibbon.Active ? profile.RibbonCount : profile.RecipeCount, Palette.Count);
+
+ // TODO: hook up event notifications
+ // - progress
+ // - complete
+ // - new recipe / recipe update
+
+ // Total recipe search count
+ //int current = ReagentManager.Names.Count;
+ //long recipePermutations = 1;
+ //for (int i = 0; i < maxIngredientsSpinButton.ValueAsInt; ++i)
+ //{
+ // recipePermutations *= current;
+ // --current;
+ //}
+ //System.Console.WriteLine("Will search {0} reagent permutations.", recipePermutations);
+
+ lastProgressUpdate = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
+ lastStatusUpdate = lastProgressUpdate;
+
+ lastProfileSave = lastProgressUpdate;
+ lastCheckpoint = lastProgressUpdate;
+
+ running = true;
+ canceling = false;
+ pauseForCheckpoint = false;
+ stopResumeButton.Label = "Pause";
+
+ if (Started != null)
+ {
+ Started(this, null);
+ }
+
+ generator.BeginRecipeGeneration((uint)(checkButtonRibbon.Active ? PaintRecipe.RIBBON_RECIPE_MIN_CONCENTRATION : PaintRecipe.PAINT_RECIPE_MIN_CONCENTRATION), (uint)maxRecipeSpinButton.ValueAsInt, (uint)minIngredientsSpinButton.Value, (uint)maxIngredientsSpinButton.ValueAsInt, (uint)fullQuantityDepthSpinButton.ValueAsInt, (uint)fullQuantitySpinButton.ValueAsInt);
+ }
+
+ protected void OnStopResume(object sender, EventArgs e)
+ {
+ if (generator != null)
+ {
+ if (running)
+ {
+ canceling = true;
+ pauseForCheckpoint = false;
+ generator.Stop();
+ }
+ else
+ {
+ // Resume previous run
+ //TODO ExportToWikiAction.Sensitive = false;
+ reagentListView.Sensitive = false;
+ minIngredientsSpinButton.Sensitive = false;
+ maxIngredientsSpinButton.Sensitive = false;
+ maxRecipeSpinButton.Sensitive = false;
+ beginButton.Sensitive = false;
+ stopResumeButton.Sensitive = true;
+ fullQuantitySpinButton.Sensitive = false;
+ fullQuantityDepthSpinButton.Sensitive = false;
+ reagentListView.Sensitive = false;
+ checkButtonRibbon.Sensitive = false;
+
+ lastProgressUpdate = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
+ lastStatusUpdate = lastProgressUpdate;
+ lastProfileSave = lastProgressUpdate;
+ lastCheckpoint = lastProgressUpdate;
+
+ canceling = false;
+ pauseForCheckpoint = false;
+ running = true;
+
+ stopResumeButton.Label = "Pause";
+
+ if (Started != null)
+ {
+ Started(this, null);
+ }
+ generator.ResumeRecipeGeneration();
+ }
+ }
+ }
+
+ private void HandleFinished()
+ {
+ generator.Wait();
+ if (pauseForCheckpoint)
+ {
+ pauseForCheckpoint = false;
+ generator.SaveState(System.IO.Path.Combine(profile.Directory, checkButtonRibbon.Active ? RIBBON_STATE_FILE : PAINT_STATE_FILE));
+ generator.ResumeRecipeGeneration();
+ }
+ else
+ {
+ running = false;
+ beginButton.Sensitive = true;
+ //TODO ExportToWikiAction.Sensitive = true;
+ stopResumeButton.Sensitive = false;
+ minIngredientsSpinButton.Sensitive = true;
+ maxIngredientsSpinButton.Sensitive = true;
+ maxRecipeSpinButton.Sensitive = true;
+ fullQuantitySpinButton.Sensitive = true;
+ fullQuantityDepthSpinButton.Sensitive = true;
+ reagentListView.Sensitive = true;
+ checkButtonRibbon.Sensitive = true;
+
+ //generator = null; // don't. Hang on to generator for resume.
+ profile.SaveRecipes();
+ if (canceling)
+ {
+ generator.SaveState(System.IO.Path.Combine(profile.Directory, checkButtonRibbon.Active ? RIBBON_STATE_FILE : PAINT_STATE_FILE));
+ stopResumeButton.Label = "Resume";
+ stopResumeButton.Sensitive = true;
+ beginButton.Label = "Restart";
+ }
+ else
+ {
+ System.IO.File.Delete(System.IO.Path.Combine(profile.Directory, checkButtonRibbon.Active ? RIBBON_STATE_FILE : PAINT_STATE_FILE));
+ }
+ if (Stopped != null)
+ {
+ Stopped(this, null);
+ }
+ }
+ }
+
+ protected void OnFinished(object sender, EventArgs args)
+ {
+ notifyFinished.WakeupMain();
+ //Gtk.Application.Invoke(delegate {
+ // HandleFinished();
+ //});
+ }
+
+ private void HandleNewRecipe()
+ {
+ progressBar.Pulse();
+
+ PaintRecipe recipe = null;
+ if (pendingNewRecipes.TryDequeue(out recipe))
+ {
+ string recipeColor = Palette.FindNearest(recipe.ReactedColor);
+ // TODO: Add item to recipe list only if not already listed
+ bool exists = false;
+ Gtk.TreeIter iter;
+ if (colorStore.GetIterFirst(out iter))
+ {
+ do
+ {
+ string color = (string)colorStore.GetValue(iter, 0);
+ if (color.Equals(recipeColor))
+ {
+ exists = true;
+ break;
+ }
+ } while (colorStore.IterNext(ref iter));
+ }
+ if (!exists)
+ {
+ //Console.WriteLine("Add new recipe for {0}", recipeColor);
+ // bool isMissingReactions = args.Recipe.CheckMissingReactions(ref missingReactions);
+ // string missingReactionLabel = isMissingReactions ? "X" : "";
+ colorStore.AppendValues(recipeColor); // , missingReactionLabel);
+ countLabel.Text = String.Format("{0} / {1}", (checkButtonRibbon.Active ? profile.RibbonCount : profile.RecipeCount)+1, Palette.Count);
+ }
+ //else
+ //{
+ // Console.WriteLine("Updated recipe for {0}", recipeColor);
+ //}
+ if (checkButtonRibbon.Active)
+ {
+ profile.SetRibbonRecipe(recipe);
+ }
+ else
+ {
+ profile.SetRecipe(recipe);
+ }
+
+ long progressTime = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
+ long delta = progressTime - lastProfileSave;
+ if (delta >= RECIPE_SAVE_INTERVAL)
+ {
+ profile.SaveRecipes();
+ lastProfileSave = progressTime;
+ }
+ Gtk.TreeModel model;
+ Gtk.TreeSelection selection = recipeList.Selection;
+ if ((selection != null) && selection.GetSelected(out model, out iter))
+ {
+ string colorName = (string)colorStore.GetValue(iter, 0);
+ if (colorName.Equals(recipeColor))
+ {
+ ShowColor(recipe);
+ }
+ }
+ }
+ }
+
+ protected void OnNewRecipe(object sender, NewRecipeEventArgs args)
+ {
+ PaintRecipe recipe = new PaintRecipe(args.Recipe); // copy it, so the worker thread can release
+ lock(this) {
+ pendingNewRecipes.Enqueue(recipe);
+ }
+ notifyNewRecipe.WakeupMain();
+ //Gtk.Application.Invoke(delegate {
+ // HandleNewRecipe();
+ //});
+ }
+
+ private void HandleProgress()
+ {
+ long progressTime = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
+ long delta = progressTime - lastProgressUpdate;
+ if (delta > 30)
+ {
+ lastProgressUpdate = progressTime;
+ progressBar.Pulse();
+ }
+ delta = progressTime - lastStatusUpdate;
+ if (delta > 500)
+ {
+ lastStatusUpdate = progressTime;
+ if (SetStatus != null)
+ {
+ SetStatus(this, new StatusUpdateEventArgs(String.Format("Recipes searched: {0:N00}", generator.RecipeCount)));
+ }
+ //TODO statusLabel.Text = String.Format("Recipes searched: {0:N00}", generator.RecipeCount);
+ }
+ delta = progressTime - lastCheckpoint;
+ if (delta > CHECKPOINT_INTERVAL)
+ {
+ lastCheckpoint = progressTime;
+ pauseForCheckpoint = true;
+ generator.Stop();
+ }
+ }
+
+ protected void OnProgress(object sender, EventArgs args)
+ {
+ notifyProgress.WakeupMain();
+ }
+
+ private void ShowColor(PaintRecipe recipe)
+ {
+ Gtk.ListStore store = (Gtk.ListStore)recipeIngredientsView.Model;
+ store.Clear();
+ if (recipe.CheckMissingReactions(ref missingReactions))
+ {
+ if (SetStatus != null)
+ {
+ SetStatus(this, new StatusUpdateEventArgs("WARNING: This recipe includes reactions that have not yet been recorded."));
+ }
+ //TODO statusLabel.Text = "WARNING: This recipe includes reactions that have not yet been recorded.";
+ }
+ foreach (PaintRecipe.RecipeIngredient ingredient in recipe.Ingredients)
+ {
+ store.AppendValues(ingredient.quantity.ToString(), ingredient.name);
+ }
+ paintSwatch.Color = recipe.ReactedColor;
+ }
+
+ protected void OnColorSelected(object o, EventArgs args)
+ {
+ Gtk.TreeModel model;
+ Gtk.TreeIter iter;
+ Gtk.TreeSelection selection = recipeList.Selection;
+ if ((selection != null) && selection.GetSelected(out model, out iter))
+ {
+ string colorName = (string)colorStore.GetValue(iter, 0);
+ PaintRecipe recipe;
+ if (checkButtonRibbon.Active)
+ {
+ if (profile.RibbonRecipes.TryGetValue(colorName, out recipe))
+ {
+ ShowColor(recipe);
+ }
+ }
+ else
+ {
+ if (profile.Recipes.TryGetValue(colorName, out recipe))
+ {
+ ShowColor(recipe);
+ }
+ }
+ }
+ }
+
+ protected void OnShowIngredients(object sender, EventArgs e)
+ {
+ ReagentWindow win = new ReagentWindow(profile);
+ win.Show();
+ }
+
+ protected void OnDestroyed(object o, EventArgs args)
+ {
+ if (running)
+ {
+ // window closed while generator running: stop and save
+ generator.Finished -= OnFinished;
+ generator.Progress -= OnProgress;
+ generator.NewRecipe -= OnNewRecipe;
+ generator.Stop();
+ generator.Wait();
+ generator.SaveState(System.IO.Path.Combine(profile.Directory, checkButtonRibbon.Active ? RIBBON_STATE_FILE : PAINT_STATE_FILE));
+ }
+ }
+
+ // Reagent view handling
+ private void RenderReagentToggle (Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter)
+ {
+ Reagent reagent = (Reagent) model.GetValue (iter, 0);
+ Gtk.CellRendererToggle toggle = (cell as Gtk.CellRendererToggle);
+ toggle.Active = reagent.Enabled;
+ toggle.Activatable = !reagent.IsCatalyst;
+ toggle.Mode = reagent.IsCatalyst ? Gtk.CellRendererMode.Inert : Gtk.CellRendererMode.Activatable;
+ }
+ private void RenderReagentCost (Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter)
+ {
+ Reagent reagent = (Reagent) model.GetValue (iter, 0);
+ (cell as Gtk.CellRendererText).Text = reagent.Cost.ToString();
+ }
+ private void RenderReagentQuantity (Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter)
+ {
+ Reagent reagent = (Reagent) model.GetValue (iter, 0);
+ (cell as Gtk.CellRendererText).Text = reagent.RecipeMax.ToString();
+ }
+
+ private void OnReagentCostChanged(object o, Gtk.EditedArgs args)
+ {
+ uint newCost;
+ if (uint.TryParse(args.NewText, out newCost))
+ {
+ Gtk.TreeIter iter;
+ reagentListStore.GetIter (out iter, new Gtk.TreePath (args.Path));
+
+ Reagent reagent = (Reagent) reagentListStore.GetValue (iter, 0);
+ if (reagent.Cost != newCost)
+ {
+ reagent.Cost = newCost;
+ SaveReagentSettings();
+ }
+ }
+ }
+
+ private void OnReagentQuantityChanged(object o, Gtk.EditedArgs args)
+ {
+ uint newMax;
+ if (uint.TryParse(args.NewText, out newMax))
+ {
+ Gtk.TreeIter iter;
+ reagentListStore.GetIter (out iter, new Gtk.TreePath (args.Path));
+
+ Reagent reagent = (Reagent) reagentListStore.GetValue (iter, 0);
+ if (reagent.RecipeMax != newMax)
+ {
+ reagent.RecipeMax = newMax;
+ SaveReagentSettings();
+ }
+ }
+ }
+
+ private void OnReagentEnableToggled(object o, Gtk.ToggledArgs args)
+ {
+ Gtk.TreeIter iter;
+ reagentListStore.GetIter (out iter, new Gtk.TreePath (args.Path));
+
+ Reagent reagent = (Reagent) reagentListStore.GetValue (iter, 0);
+ reagent.Enabled = !reagent.Enabled;
+ SaveReagentSettings();
+ }
+
+ private void SaveReagentSettings()
+ {
+ // save out state
+ ReagentManager.SaveProfileReagents(profile.ReagentFile);
+ }
+
+ protected void OnCopyRecipeToClipboard(object sender, EventArgs e)
+ {
+ Gtk.TreeModel model;
+ Gtk.TreeIter iter;
+ Gtk.Clipboard clipboard = recipeIngredientsView.GetClipboard(Gdk.Selection.Clipboard);
+
+ Gtk.TreeSelection selection = recipeList.Selection;
+ if ((selection != null) && selection.GetSelected(out model, out iter))
+ {
+ string colorName = (string)colorStore.GetValue(iter, 0);
+ PaintRecipe recipe;
+ if (checkButtonRibbon.Active)
+ {
+ if (profile.RibbonRecipes.TryGetValue(colorName, out recipe))
+ {
+ clipboard.Text = recipe.ToString();
+ }
+ }
+ else
+ {
+ if (profile.Recipes.TryGetValue(colorName, out recipe))
+ {
+ clipboard.Text = recipe.ToString();
+ }
+ }
+ }
+ }
+
+ protected void OnRecipesToggled(object sender, EventArgs e)
+ {
+ if (checkButtonRibbon.Active)
+ {
+ // changed to ribbons
+ InitStateForRibbons();
+ }
+ else
+ {
+ // changed to paints
+ InitStateForPaint();
+ }
+ profile.ProfileSettings.Set("Generator.Ribbons", checkButtonRibbon.Active);
+ profile.Save();
+ }
+ }
+}
+
+
diff --git a/UI/SimulatorView.cs b/UI/SimulatorView.cs
new file mode 100644
--- /dev/null
+++ b/UI/SimulatorView.cs
@@ -0,0 +1,246 @@
+/*
+ * Copyright (c) 2010, Tess Snider
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+*/
+
+using System;
+using System.Collections.Generic;
+
+
+namespace DesertPaintLab
+{
+ [System.ComponentModel.ToolboxItem(true)]
+ public partial class SimulatorView : Gtk.Bin
+ {
+ Gtk.ListStore recipeData = new Gtk.ListStore(typeof(string), typeof(int));
+ PaintRecipe paintRecipe;
+
+ List missingWarned = new List();
+ List> newMissing = new List>();
+
+ private class IngredientPair
+ {
+ public string first;
+ public string second;
+
+ public IngredientPair(string first, string second)
+ {
+ this.first = first;
+ this.second = second;
+ }
+ }
+
+ public PlayerProfile Profile
+ {
+ set {
+ paintRecipe.Clear();
+ paintRecipe.Reactions = value.Reactions;
+ UpdateRecipeColor();
+ }
+ }
+
+ public SimulatorView(PlayerProfile profile) : base()
+ {
+ this.Build ();
+
+ paintRecipe = new PaintRecipe();
+ paintRecipe.Reactions = profile.Reactions;
+
+ Gtk.TreeViewColumn reagentColumn = new Gtk.TreeViewColumn();
+ Gtk.CellRendererText reagentColumnCell = new Gtk.CellRendererText();
+ reagentColumn.PackStart(reagentColumnCell, true);
+ reagentColumn.Title = "Ingredient";
+
+ reagentListView.AppendColumn(reagentColumn);
+ reagentColumn.AddAttribute(reagentColumnCell, "text", 0);
+
+ reagentListView.Model = ReagentManager.NameListModel;
+
+ Gtk.TreeViewColumn additiveColumn = new Gtk.TreeViewColumn();
+ Gtk.CellRendererText additiveColumnCell = new Gtk.CellRendererText();
+ additiveColumn.PackStart(additiveColumnCell, true);
+ additiveColumn.Title = "Ingredient";
+
+ recipeView.AppendColumn(additiveColumn);
+ additiveColumn.AddAttribute(additiveColumnCell, "text", 0);
+
+ Gtk.TreeViewColumn qtyColumn = new Gtk.TreeViewColumn();
+ Gtk.CellRendererText qtyColumnCell = new Gtk.CellRendererText();
+ qtyColumnCell.Editable = true;
+ qtyColumnCell.Edited += OnQtyEdited;
+ qtyColumn.PackStart(qtyColumnCell, true);
+ qtyColumn.Title = "Qty";
+
+ recipeView.AppendColumn(qtyColumn);
+ qtyColumn.AddAttribute(qtyColumnCell, "text", 1);
+
+ recipeView.Model = recipeData;
+
+ recipeData.RowChanged += OnRecipeChanged;
+ recipeData.RowDeleted += OnRecipeChanged;
+ recipeData.RowInserted += OnRecipeChanged;
+ recipeData.RowsReordered += OnRecipeChanged;
+
+ }
+
+ protected virtual void OnAddReagent(object sender, System.EventArgs e)
+ {
+ Gtk.TreeModel model;
+ Gtk.TreeIter iter;
+
+ Gtk.TreeSelection selection = reagentListView.Selection;
+ if ((selection != null) && selection.GetSelected(out model, out iter))
+ {
+ recipeData.AppendValues(model.GetValue(iter, 0).ToString(), 1);
+
+ recipeData.IterNthChild(out iter, recipeView.Children.Length - 1);
+
+ selection = recipeView.Selection;
+ selection.SelectIter(iter);
+ }
+ }
+
+ protected void OnQtyEdited(object sender, Gtk.EditedArgs args)
+ {
+ Gtk.TreeIter iter;
+ recipeData.GetIter(out iter, new Gtk.TreePath(args.Path));
+
+ int oldValue = (int)recipeData.GetValue(iter, 1);
+
+ try
+ {
+ recipeData.SetValue(iter, 1, int.Parse(args.NewText));
+ UpdateRecipeColor();
+ }
+ catch (Exception)
+ {
+ recipeData.SetValue(iter, 1, oldValue);
+ }
+ }
+
+ protected void OnRecipeChanged(object sender, GLib.SignalArgs args)
+ {
+ UpdateRecipeColor();
+ }
+
+ void UpdateRecipeColor()
+ {
+ if (recipeView.Children.Length == 0)
+ {
+ paintSwatch.Clear();
+ }
+
+ paintRecipe.Clear();
+
+ Gtk.TreeIter iter;
+ string reagentName;
+ int qty;
+
+ recipeData.GetIterFirst(out iter);
+
+ do
+ {
+ reagentName = (string) recipeData.GetValue(iter, 0);
+
+ if (reagentName == null)
+ {
+ continue;
+ }
+
+ qty = (int)recipeData.GetValue(iter, 1);
+ for (int i = 0; i < qty; ++i)
+ {
+ paintRecipe.AddReagent(reagentName);
+ }
+ }
+ while (recipeData.IterNext(ref iter));
+
+ PaintColor resultColor = new PaintColor(paintRecipe.ReactedColor);
+ paintSwatch.Color = resultColor;
+ if (paintRecipe.CheckMissingReactions(ref newMissing))
+ {
+ string warningMsg = "";
+
+ foreach (KeyValuePair newEntry in newMissing)
+ {
+ IngredientPair match = missingWarned.Find(x => (x.first.Equals(newEntry.Key) && x.second.Equals(newEntry.Value)));
+ if (match == null)
+ {
+ match = new IngredientPair(newEntry.Key, newEntry.Value);
+ missingWarned.Add(match);
+ warningMsg += newEntry.Key + " + " + newEntry.Value + "\n";
+ }
+ }
+ if (warningMsg.Length > 0)
+ {
+ Gtk.MessageDialog md = new Gtk.MessageDialog((Gtk.Window)Toplevel,
+ Gtk.DialogFlags.DestroyWithParent,
+ Gtk.MessageType.Warning,
+ Gtk.ButtonsType.Ok,
+ "These combinations have not yet had reactions recorded:\n\n" +
+ warningMsg);
+ md.Run();
+ md.Destroy();
+ }
+ }
+
+ }
+
+ protected virtual void OnIncrementReagent (object sender, System.EventArgs e)
+ {
+ Gtk.TreeModel model;
+ Gtk.TreeIter iter;
+
+ Gtk.TreeSelection selection = recipeView.Selection;
+ if ((selection != null) && selection.GetSelected(out model, out iter))
+ {
+ int oldValue = (int)recipeData.GetValue(iter, 1);
+ recipeData.SetValue(iter, 1, oldValue + 1);
+ }
+
+ }
+
+ protected virtual void OnDecrementReagent (object sender, System.EventArgs e)
+ {
+ Gtk.TreeModel model;
+ Gtk.TreeIter iter;
+
+ Gtk.TreeSelection selection = recipeView.Selection;
+ if ((selection != null) && selection.GetSelected(out model, out iter))
+ {
+ int oldValue = (int)recipeData.GetValue(iter, 1);
+ if (oldValue == 1)
+ {
+ recipeData.Remove(ref iter);
+ }
+ else
+ {
+ recipeData.SetValue(iter, 1, oldValue - 1);
+ }
+ }
+
+ }
+
+ protected virtual void OnFlushReagents (object sender, System.EventArgs e)
+ {
+ recipeData.Clear();
+ }
+ }
+}
\ No newline at end of file
diff --git a/gtk-gui/DesertPaintLab.CaptureView.cs b/gtk-gui/DesertPaintLab.CaptureView.cs
new file mode 100644
--- /dev/null
+++ b/gtk-gui/DesertPaintLab.CaptureView.cs
@@ -0,0 +1,292 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace DesertPaintLab
+{
+ public partial class CaptureView
+ {
+ private global::Gtk.HBox hbox1;
+
+ private global::Gtk.Frame selectIngredientsFrame;
+
+ private global::Gtk.Alignment GtkAlignment;
+
+ private global::Gtk.VBox vbox2;
+
+ private global::Gtk.HBox hbox2;
+
+ private global::Gtk.Label ingredient1Label;
+
+ private global::Gtk.ComboBox ingredient1ComboBox;
+
+ private global::Gtk.HBox hbox3;
+
+ private global::Gtk.Label ingredient2Label;
+
+ private global::Gtk.ComboBox ingredient2ComboBox;
+
+ private global::Gtk.HBox hbox4;
+
+ private global::Gtk.Label ingredient3Label;
+
+ private global::Gtk.ComboBox ingredient3ComboBox;
+
+ private global::Gtk.Button clearReactionButton;
+
+ private global::Gtk.Label selectIngredientsLabel;
+
+ private global::Gtk.Frame unmodifiedColorFrame;
+
+ private global::Gtk.Alignment GtkAlignment1;
+
+ private global::Gtk.VBox vbox3;
+
+ private global::DesertPaintLab.PaintSwatch unmodifiedSwatch;
+
+ private global::Gtk.Button captureButton;
+
+ private global::Gtk.Label unmodifiedLabel;
+
+ private global::Gtk.Frame reactedColorFrame;
+
+ private global::Gtk.Alignment GtkAlignment2;
+
+ private global::Gtk.VBox vbox4;
+
+ private global::DesertPaintLab.PaintSwatch reactionSwatch;
+
+ private global::Gtk.Button recordButton;
+
+ private global::Gtk.Label reactionLabel;
+
+ protected virtual void Build ()
+ {
+ global::Stetic.Gui.Initialize (this);
+ // Widget DesertPaintLab.CaptureView
+ global::Stetic.BinContainer.Attach (this);
+ this.Name = "DesertPaintLab.CaptureView";
+ // Container child DesertPaintLab.CaptureView.Gtk.Container+ContainerChild
+ this.hbox1 = new global::Gtk.HBox ();
+ this.hbox1.Name = "hbox1";
+ this.hbox1.Spacing = 6;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.selectIngredientsFrame = new global::Gtk.Frame ();
+ this.selectIngredientsFrame.Name = "selectIngredientsFrame";
+ this.selectIngredientsFrame.BorderWidth = ((uint)(4));
+ // Container child selectIngredientsFrame.Gtk.Container+ContainerChild
+ this.GtkAlignment = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
+ this.GtkAlignment.Name = "GtkAlignment";
+ this.GtkAlignment.LeftPadding = ((uint)(6));
+ this.GtkAlignment.RightPadding = ((uint)(6));
+ // Container child GtkAlignment.Gtk.Container+ContainerChild
+ this.vbox2 = new global::Gtk.VBox ();
+ this.vbox2.Name = "vbox2";
+ this.vbox2.Spacing = 6;
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.hbox2 = new global::Gtk.HBox ();
+ this.hbox2.Name = "hbox2";
+ this.hbox2.Spacing = 6;
+ // Container child hbox2.Gtk.Box+BoxChild
+ this.ingredient1Label = new global::Gtk.Label ();
+ this.ingredient1Label.Name = "ingredient1Label";
+ this.ingredient1Label.LabelProp = "Ingredient 1:";
+ this.hbox2.Add (this.ingredient1Label);
+ global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.ingredient1Label]));
+ w1.Position = 0;
+ w1.Expand = false;
+ w1.Fill = false;
+ // Container child hbox2.Gtk.Box+BoxChild
+ this.ingredient1ComboBox = global::Gtk.ComboBox.NewText ();
+ this.ingredient1ComboBox.Name = "ingredient1ComboBox";
+ this.hbox2.Add (this.ingredient1ComboBox);
+ global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.ingredient1ComboBox]));
+ w2.Position = 1;
+ this.vbox2.Add (this.hbox2);
+ global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox2]));
+ w3.Position = 0;
+ w3.Expand = false;
+ w3.Fill = false;
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.hbox3 = new global::Gtk.HBox ();
+ this.hbox3.Name = "hbox3";
+ this.hbox3.Spacing = 6;
+ // Container child hbox3.Gtk.Box+BoxChild
+ this.ingredient2Label = new global::Gtk.Label ();
+ this.ingredient2Label.Name = "ingredient2Label";
+ this.ingredient2Label.LabelProp = "Ingredient 2:";
+ this.hbox3.Add (this.ingredient2Label);
+ global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.ingredient2Label]));
+ w4.Position = 0;
+ w4.Expand = false;
+ w4.Fill = false;
+ // Container child hbox3.Gtk.Box+BoxChild
+ this.ingredient2ComboBox = global::Gtk.ComboBox.NewText ();
+ this.ingredient2ComboBox.Name = "ingredient2ComboBox";
+ this.hbox3.Add (this.ingredient2ComboBox);
+ global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.ingredient2ComboBox]));
+ w5.Position = 1;
+ this.vbox2.Add (this.hbox3);
+ global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox3]));
+ w6.Position = 1;
+ w6.Expand = false;
+ w6.Fill = false;
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.hbox4 = new global::Gtk.HBox ();
+ this.hbox4.Name = "hbox4";
+ this.hbox4.Spacing = 6;
+ // Container child hbox4.Gtk.Box+BoxChild
+ this.ingredient3Label = new global::Gtk.Label ();
+ this.ingredient3Label.Name = "ingredient3Label";
+ this.ingredient3Label.LabelProp = "Ingredient 3:";
+ this.hbox4.Add (this.ingredient3Label);
+ global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.hbox4 [this.ingredient3Label]));
+ w7.Position = 0;
+ w7.Expand = false;
+ w7.Fill = false;
+ // Container child hbox4.Gtk.Box+BoxChild
+ this.ingredient3ComboBox = global::Gtk.ComboBox.NewText ();
+ this.ingredient3ComboBox.Name = "ingredient3ComboBox";
+ this.hbox4.Add (this.ingredient3ComboBox);
+ global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.hbox4 [this.ingredient3ComboBox]));
+ w8.Position = 1;
+ this.vbox2.Add (this.hbox4);
+ global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox4]));
+ w9.Position = 2;
+ w9.Expand = false;
+ w9.Fill = false;
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.clearReactionButton = new global::Gtk.Button ();
+ this.clearReactionButton.Sensitive = false;
+ this.clearReactionButton.CanFocus = true;
+ this.clearReactionButton.Name = "clearReactionButton";
+ this.clearReactionButton.UseUnderline = true;
+ this.clearReactionButton.Label = "Clear Reaction";
+ this.vbox2.Add (this.clearReactionButton);
+ global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.clearReactionButton]));
+ w10.PackType = ((global::Gtk.PackType)(1));
+ w10.Position = 3;
+ w10.Expand = false;
+ w10.Fill = false;
+ w10.Padding = ((uint)(6));
+ this.GtkAlignment.Add (this.vbox2);
+ this.selectIngredientsFrame.Add (this.GtkAlignment);
+ this.selectIngredientsLabel = new global::Gtk.Label ();
+ this.selectIngredientsLabel.Name = "selectIngredientsLabel";
+ this.selectIngredientsLabel.LabelProp = "Select Ingredients";
+ this.selectIngredientsLabel.UseMarkup = true;
+ this.selectIngredientsFrame.LabelWidget = this.selectIngredientsLabel;
+ this.hbox1.Add (this.selectIngredientsFrame);
+ global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.selectIngredientsFrame]));
+ w13.Position = 0;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.unmodifiedColorFrame = new global::Gtk.Frame ();
+ this.unmodifiedColorFrame.Name = "unmodifiedColorFrame";
+ this.unmodifiedColorFrame.BorderWidth = ((uint)(4));
+ // Container child unmodifiedColorFrame.Gtk.Container+ContainerChild
+ this.GtkAlignment1 = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
+ this.GtkAlignment1.Name = "GtkAlignment1";
+ this.GtkAlignment1.LeftPadding = ((uint)(5));
+ this.GtkAlignment1.TopPadding = ((uint)(5));
+ this.GtkAlignment1.RightPadding = ((uint)(5));
+ this.GtkAlignment1.BottomPadding = ((uint)(6));
+ // Container child GtkAlignment1.Gtk.Container+ContainerChild
+ this.vbox3 = new global::Gtk.VBox ();
+ this.vbox3.WidthRequest = 120;
+ this.vbox3.Name = "vbox3";
+ this.vbox3.Spacing = 6;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.unmodifiedSwatch = new global::DesertPaintLab.PaintSwatch ();
+ this.unmodifiedSwatch.WidthRequest = 120;
+ this.unmodifiedSwatch.HeightRequest = 120;
+ this.unmodifiedSwatch.Events = ((global::Gdk.EventMask)(256));
+ this.unmodifiedSwatch.Name = "unmodifiedSwatch";
+ this.vbox3.Add (this.unmodifiedSwatch);
+ global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.unmodifiedSwatch]));
+ w14.Position = 0;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.captureButton = new global::Gtk.Button ();
+ this.captureButton.CanFocus = true;
+ this.captureButton.Name = "captureButton";
+ this.captureButton.UseUnderline = true;
+ this.captureButton.Label = "Capture";
+ this.vbox3.Add (this.captureButton);
+ global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.captureButton]));
+ w15.Position = 1;
+ w15.Expand = false;
+ w15.Fill = false;
+ this.GtkAlignment1.Add (this.vbox3);
+ this.unmodifiedColorFrame.Add (this.GtkAlignment1);
+ this.unmodifiedLabel = new global::Gtk.Label ();
+ this.unmodifiedLabel.Name = "unmodifiedLabel";
+ this.unmodifiedLabel.LabelProp = "Unmodified";
+ this.unmodifiedLabel.UseMarkup = true;
+ this.unmodifiedLabel.Justify = ((global::Gtk.Justification)(2));
+ this.unmodifiedColorFrame.LabelWidget = this.unmodifiedLabel;
+ this.hbox1.Add (this.unmodifiedColorFrame);
+ global::Gtk.Box.BoxChild w18 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.unmodifiedColorFrame]));
+ w18.Position = 1;
+ w18.Expand = false;
+ w18.Fill = false;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.reactedColorFrame = new global::Gtk.Frame ();
+ this.reactedColorFrame.Name = "reactedColorFrame";
+ this.reactedColorFrame.BorderWidth = ((uint)(4));
+ // Container child reactedColorFrame.Gtk.Container+ContainerChild
+ this.GtkAlignment2 = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
+ this.GtkAlignment2.Name = "GtkAlignment2";
+ this.GtkAlignment2.LeftPadding = ((uint)(5));
+ this.GtkAlignment2.TopPadding = ((uint)(5));
+ this.GtkAlignment2.RightPadding = ((uint)(5));
+ this.GtkAlignment2.BottomPadding = ((uint)(6));
+ // Container child GtkAlignment2.Gtk.Container+ContainerChild
+ this.vbox4 = new global::Gtk.VBox ();
+ this.vbox4.WidthRequest = 120;
+ this.vbox4.Name = "vbox4";
+ this.vbox4.Spacing = 6;
+ // Container child vbox4.Gtk.Box+BoxChild
+ this.reactionSwatch = new global::DesertPaintLab.PaintSwatch ();
+ this.reactionSwatch.WidthRequest = 120;
+ this.reactionSwatch.HeightRequest = 120;
+ this.reactionSwatch.Events = ((global::Gdk.EventMask)(256));
+ this.reactionSwatch.Name = "reactionSwatch";
+ this.vbox4.Add (this.reactionSwatch);
+ global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.reactionSwatch]));
+ w19.Position = 0;
+ // Container child vbox4.Gtk.Box+BoxChild
+ this.recordButton = new global::Gtk.Button ();
+ this.recordButton.CanFocus = true;
+ this.recordButton.Name = "recordButton";
+ this.recordButton.UseUnderline = true;
+ this.recordButton.Label = "Record";
+ this.vbox4.Add (this.recordButton);
+ global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.recordButton]));
+ w20.Position = 1;
+ w20.Expand = false;
+ w20.Fill = false;
+ this.GtkAlignment2.Add (this.vbox4);
+ this.reactedColorFrame.Add (this.GtkAlignment2);
+ this.reactionLabel = new global::Gtk.Label ();
+ this.reactionLabel.Name = "reactionLabel";
+ this.reactionLabel.LabelProp = "Reacted";
+ this.reactionLabel.UseMarkup = true;
+ this.reactionLabel.Justify = ((global::Gtk.Justification)(2));
+ this.reactedColorFrame.LabelWidget = this.reactionLabel;
+ this.hbox1.Add (this.reactedColorFrame);
+ global::Gtk.Box.BoxChild w23 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.reactedColorFrame]));
+ w23.Position = 2;
+ w23.Expand = false;
+ w23.Fill = false;
+ this.Add (this.hbox1);
+ if ((this.Child != null)) {
+ this.Child.ShowAll ();
+ }
+ this.clearReactionButton.Hide ();
+ this.Hide ();
+ this.ingredient1ComboBox.Changed += new global::System.EventHandler (this.OnChangedIngredient1);
+ this.ingredient2ComboBox.Changed += new global::System.EventHandler (this.OnChangedIngredient2);
+ this.ingredient3ComboBox.Changed += new global::System.EventHandler (this.OnChangedIngredient3);
+ this.clearReactionButton.Clicked += new global::System.EventHandler (this.OnClearReaction);
+ this.captureButton.Clicked += new global::System.EventHandler (this.OnCapture);
+ this.recordButton.Clicked += new global::System.EventHandler (this.OnRecord);
+ }
+ }
+}
diff --git a/gtk-gui/DesertPaintLab.RecipeGeneratorView.cs b/gtk-gui/DesertPaintLab.RecipeGeneratorView.cs
new file mode 100644
--- /dev/null
+++ b/gtk-gui/DesertPaintLab.RecipeGeneratorView.cs
@@ -0,0 +1,507 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace DesertPaintLab
+{
+ public partial class RecipeGeneratorView
+ {
+ private global::Gtk.UIManager UIManager;
+
+ private global::Gtk.VBox vbox2;
+
+ private global::Gtk.HBox hbox1;
+
+ private global::Gtk.VBox vbox8;
+
+ private global::Gtk.HBox hbox2;
+
+ private global::Gtk.SpinButton minIngredientsSpinButton;
+
+ private global::Gtk.Label label1;
+
+ private global::Gtk.HBox hbox7;
+
+ private global::Gtk.SpinButton maxIngredientsSpinButton;
+
+ private global::Gtk.Label label3;
+
+ private global::Gtk.HSeparator hseparator3;
+
+ private global::Gtk.CheckButton checkButtonRibbon;
+
+ private global::Gtk.HBox hbox4;
+
+ private global::Gtk.SpinButton maxRecipeSpinButton;
+
+ private global::Gtk.Label label4;
+
+ private global::Gtk.HSeparator hseparator4;
+
+ private global::Gtk.HBox hbox5;
+
+ private global::Gtk.SpinButton fullQuantityDepthSpinButton;
+
+ private global::Gtk.Label label8;
+
+ private global::Gtk.HSeparator hseparator5;
+
+ private global::Gtk.HBox hbox6;
+
+ private global::Gtk.SpinButton fullQuantitySpinButton;
+
+ private global::Gtk.Label label9;
+
+ private global::Gtk.Frame frame3;
+
+ private global::Gtk.Alignment GtkAlignment1;
+
+ private global::Gtk.ScrolledWindow scrolledwindow2;
+
+ private global::Gtk.TreeView reagentListView;
+
+ private global::Gtk.Label GtkLabel4;
+
+ private global::Gtk.HSeparator hseparator6;
+
+ private global::Gtk.ScrolledWindow GtkScrolledWindow1;
+
+ private global::Gtk.TreeView recipeList;
+
+ private global::Gtk.VBox vbox3;
+
+ private global::Gtk.Frame frame2;
+
+ private global::Gtk.ScrolledWindow GtkScrolledWindow;
+
+ private global::Gtk.TreeView recipeIngredientsView;
+
+ private global::Gtk.Label recipeLabel;
+
+ private global::Gtk.Button button919;
+
+ private global::DesertPaintLab.PaintSwatch paintSwatch;
+
+ private global::Gtk.HBox hbox3;
+
+ private global::Gtk.HSeparator hseparator2;
+
+ private global::Gtk.Button stopResumeButton;
+
+ private global::Gtk.Label countLabel;
+
+ private global::Gtk.Button beginButton;
+
+ private global::Gtk.HSeparator hseparator1;
+
+ private global::Gtk.ProgressBar progressBar;
+
+ protected virtual void Build ()
+ {
+ global::Stetic.Gui.Initialize (this);
+ // Widget DesertPaintLab.RecipeGeneratorView
+ Stetic.BinContainer w1 = global::Stetic.BinContainer.Attach (this);
+ this.UIManager = new global::Gtk.UIManager ();
+ global::Gtk.ActionGroup w2 = new global::Gtk.ActionGroup ("Default");
+ this.UIManager.InsertActionGroup (w2, 0);
+ this.Name = "DesertPaintLab.RecipeGeneratorView";
+ // Container child DesertPaintLab.RecipeGeneratorView.Gtk.Container+ContainerChild
+ this.vbox2 = new global::Gtk.VBox ();
+ this.vbox2.Name = "vbox2";
+ this.vbox2.Spacing = 6;
+ this.vbox2.BorderWidth = ((uint)(8));
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.hbox1 = new global::Gtk.HBox ();
+ this.hbox1.Name = "hbox1";
+ this.hbox1.Spacing = 6;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.vbox8 = new global::Gtk.VBox ();
+ this.vbox8.Name = "vbox8";
+ this.vbox8.Spacing = 6;
+ // Container child vbox8.Gtk.Box+BoxChild
+ this.hbox2 = new global::Gtk.HBox ();
+ this.hbox2.Name = "hbox2";
+ this.hbox2.Spacing = 6;
+ // Container child hbox2.Gtk.Box+BoxChild
+ this.minIngredientsSpinButton = new global::Gtk.SpinButton (1, 14, 1);
+ this.minIngredientsSpinButton.CanFocus = true;
+ this.minIngredientsSpinButton.Name = "minIngredientsSpinButton";
+ this.minIngredientsSpinButton.Adjustment.PageIncrement = 10;
+ this.minIngredientsSpinButton.ClimbRate = 1;
+ this.minIngredientsSpinButton.Numeric = true;
+ this.minIngredientsSpinButton.Value = 1;
+ this.hbox2.Add (this.minIngredientsSpinButton);
+ global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.minIngredientsSpinButton]));
+ w3.Position = 0;
+ w3.Expand = false;
+ w3.Fill = false;
+ // Container child hbox2.Gtk.Box+BoxChild
+ this.label1 = new global::Gtk.Label ();
+ this.label1.Name = "label1";
+ this.label1.LabelProp = "Minimum Ingredients";
+ this.hbox2.Add (this.label1);
+ global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.label1]));
+ w4.Position = 1;
+ w4.Expand = false;
+ w4.Fill = false;
+ this.vbox8.Add (this.hbox2);
+ global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hbox2]));
+ w5.Position = 0;
+ w5.Expand = false;
+ w5.Fill = false;
+ // Container child vbox8.Gtk.Box+BoxChild
+ this.hbox7 = new global::Gtk.HBox ();
+ this.hbox7.Name = "hbox7";
+ this.hbox7.Spacing = 6;
+ // Container child hbox7.Gtk.Box+BoxChild
+ this.maxIngredientsSpinButton = new global::Gtk.SpinButton (1, 14, 1);
+ this.maxIngredientsSpinButton.CanFocus = true;
+ this.maxIngredientsSpinButton.Name = "maxIngredientsSpinButton";
+ this.maxIngredientsSpinButton.Adjustment.PageIncrement = 10;
+ this.maxIngredientsSpinButton.ClimbRate = 1;
+ this.maxIngredientsSpinButton.Numeric = true;
+ this.maxIngredientsSpinButton.Value = 5;
+ this.hbox7.Add (this.maxIngredientsSpinButton);
+ global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.hbox7 [this.maxIngredientsSpinButton]));
+ w6.Position = 0;
+ w6.Expand = false;
+ w6.Fill = false;
+ // Container child hbox7.Gtk.Box+BoxChild
+ this.label3 = new global::Gtk.Label ();
+ this.label3.Name = "label3";
+ this.label3.LabelProp = "Maximum Ingredients";
+ this.hbox7.Add (this.label3);
+ global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.hbox7 [this.label3]));
+ w7.Position = 1;
+ w7.Expand = false;
+ w7.Fill = false;
+ this.vbox8.Add (this.hbox7);
+ global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hbox7]));
+ w8.Position = 1;
+ w8.Expand = false;
+ w8.Fill = false;
+ // Container child vbox8.Gtk.Box+BoxChild
+ this.hseparator3 = new global::Gtk.HSeparator ();
+ this.hseparator3.Name = "hseparator3";
+ this.vbox8.Add (this.hseparator3);
+ global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hseparator3]));
+ w9.Position = 2;
+ w9.Expand = false;
+ w9.Fill = false;
+ // Container child vbox8.Gtk.Box+BoxChild
+ this.checkButtonRibbon = new global::Gtk.CheckButton ();
+ this.checkButtonRibbon.CanFocus = true;
+ this.checkButtonRibbon.Name = "checkButtonRibbon";
+ this.checkButtonRibbon.Label = "Ribbon Recipes";
+ this.checkButtonRibbon.DrawIndicator = true;
+ this.checkButtonRibbon.UseUnderline = true;
+ this.vbox8.Add (this.checkButtonRibbon);
+ global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.checkButtonRibbon]));
+ w10.Position = 3;
+ w10.Expand = false;
+ w10.Fill = false;
+ // Container child vbox8.Gtk.Box+BoxChild
+ this.hbox4 = new global::Gtk.HBox ();
+ this.hbox4.Name = "hbox4";
+ this.hbox4.Spacing = 6;
+ // Container child hbox4.Gtk.Box+BoxChild
+ this.maxRecipeSpinButton = new global::Gtk.SpinButton (10, 100, 1);
+ this.maxRecipeSpinButton.CanFocus = true;
+ this.maxRecipeSpinButton.Name = "maxRecipeSpinButton";
+ this.maxRecipeSpinButton.Adjustment.PageIncrement = 10;
+ this.maxRecipeSpinButton.ClimbRate = 1;
+ this.maxRecipeSpinButton.Numeric = true;
+ this.maxRecipeSpinButton.Value = 14;
+ this.hbox4.Add (this.maxRecipeSpinButton);
+ global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.hbox4 [this.maxRecipeSpinButton]));
+ w11.Position = 0;
+ w11.Expand = false;
+ w11.Fill = false;
+ // Container child hbox4.Gtk.Box+BoxChild
+ this.label4 = new global::Gtk.Label ();
+ this.label4.Name = "label4";
+ this.label4.LabelProp = "Maximum Concentration";
+ this.label4.UseMarkup = true;
+ this.label4.Wrap = true;
+ this.hbox4.Add (this.label4);
+ global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.hbox4 [this.label4]));
+ w12.Position = 1;
+ w12.Expand = false;
+ w12.Fill = false;
+ this.vbox8.Add (this.hbox4);
+ global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hbox4]));
+ w13.Position = 4;
+ w13.Expand = false;
+ w13.Fill = false;
+ // Container child vbox8.Gtk.Box+BoxChild
+ this.hseparator4 = new global::Gtk.HSeparator ();
+ this.hseparator4.Name = "hseparator4";
+ this.vbox8.Add (this.hseparator4);
+ global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hseparator4]));
+ w14.Position = 5;
+ w14.Expand = false;
+ w14.Fill = false;
+ w14.Padding = ((uint)(8));
+ // Container child vbox8.Gtk.Box+BoxChild
+ this.hbox5 = new global::Gtk.HBox ();
+ this.hbox5.Name = "hbox5";
+ this.hbox5.Spacing = 6;
+ // Container child hbox5.Gtk.Box+BoxChild
+ this.fullQuantityDepthSpinButton = new global::Gtk.SpinButton (0, 15, 1);
+ this.fullQuantityDepthSpinButton.CanFocus = true;
+ this.fullQuantityDepthSpinButton.Name = "fullQuantityDepthSpinButton";
+ this.fullQuantityDepthSpinButton.Adjustment.PageIncrement = 10;
+ this.fullQuantityDepthSpinButton.ClimbRate = 1;
+ this.fullQuantityDepthSpinButton.Numeric = true;
+ this.fullQuantityDepthSpinButton.Value = 4;
+ this.hbox5.Add (this.fullQuantityDepthSpinButton);
+ global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.hbox5 [this.fullQuantityDepthSpinButton]));
+ w15.Position = 0;
+ w15.Expand = false;
+ w15.Fill = false;
+ // Container child hbox5.Gtk.Box+BoxChild
+ this.label8 = new global::Gtk.Label ();
+ this.label8.Name = "label8";
+ this.label8.LabelProp = "Full Quantity Depth";
+ this.hbox5.Add (this.label8);
+ global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.hbox5 [this.label8]));
+ w16.Position = 1;
+ w16.Expand = false;
+ w16.Fill = false;
+ this.vbox8.Add (this.hbox5);
+ global::Gtk.Box.BoxChild w17 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hbox5]));
+ w17.Position = 6;
+ w17.Expand = false;
+ w17.Fill = false;
+ // Container child vbox8.Gtk.Box+BoxChild
+ this.hseparator5 = new global::Gtk.HSeparator ();
+ this.hseparator5.Name = "hseparator5";
+ this.vbox8.Add (this.hseparator5);
+ global::Gtk.Box.BoxChild w18 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hseparator5]));
+ w18.Position = 7;
+ w18.Expand = false;
+ w18.Fill = false;
+ // Container child vbox8.Gtk.Box+BoxChild
+ this.hbox6 = new global::Gtk.HBox ();
+ this.hbox6.Name = "hbox6";
+ this.hbox6.Spacing = 6;
+ // Container child hbox6.Gtk.Box+BoxChild
+ this.fullQuantitySpinButton = new global::Gtk.SpinButton (0, 30, 1);
+ this.fullQuantitySpinButton.CanFocus = true;
+ this.fullQuantitySpinButton.Name = "fullQuantitySpinButton";
+ this.fullQuantitySpinButton.Adjustment.PageIncrement = 10;
+ this.fullQuantitySpinButton.ClimbRate = 1;
+ this.fullQuantitySpinButton.Numeric = true;
+ this.fullQuantitySpinButton.Value = 20;
+ this.hbox6.Add (this.fullQuantitySpinButton);
+ global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.hbox6 [this.fullQuantitySpinButton]));
+ w19.Position = 0;
+ w19.Expand = false;
+ w19.Fill = false;
+ // Container child hbox6.Gtk.Box+BoxChild
+ this.label9 = new global::Gtk.Label ();
+ this.label9.Name = "label9";
+ this.label9.LabelProp = "FullQuantity";
+ this.hbox6.Add (this.label9);
+ global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.hbox6 [this.label9]));
+ w20.Position = 1;
+ w20.Expand = false;
+ w20.Fill = false;
+ this.vbox8.Add (this.hbox6);
+ global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hbox6]));
+ w21.Position = 8;
+ w21.Expand = false;
+ w21.Fill = false;
+ // Container child vbox8.Gtk.Box+BoxChild
+ this.frame3 = new global::Gtk.Frame ();
+ this.frame3.Name = "frame3";
+ this.frame3.ShadowType = ((global::Gtk.ShadowType)(0));
+ // Container child frame3.Gtk.Container+ContainerChild
+ this.GtkAlignment1 = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
+ this.GtkAlignment1.Name = "GtkAlignment1";
+ this.GtkAlignment1.LeftPadding = ((uint)(12));
+ // Container child GtkAlignment1.Gtk.Container+ContainerChild
+ this.scrolledwindow2 = new global::Gtk.ScrolledWindow ();
+ this.scrolledwindow2.CanFocus = true;
+ this.scrolledwindow2.Name = "scrolledwindow2";
+ this.scrolledwindow2.ShadowType = ((global::Gtk.ShadowType)(1));
+ // Container child scrolledwindow2.Gtk.Container+ContainerChild
+ this.reagentListView = new global::Gtk.TreeView ();
+ this.reagentListView.WidthRequest = 300;
+ this.reagentListView.CanFocus = true;
+ this.reagentListView.Name = "reagentListView";
+ this.scrolledwindow2.Add (this.reagentListView);
+ this.GtkAlignment1.Add (this.scrolledwindow2);
+ this.frame3.Add (this.GtkAlignment1);
+ this.GtkLabel4 = new global::Gtk.Label ();
+ this.GtkLabel4.Name = "GtkLabel4";
+ this.GtkLabel4.LabelProp = "Ingredients";
+ this.GtkLabel4.UseMarkup = true;
+ this.frame3.LabelWidget = this.GtkLabel4;
+ this.vbox8.Add (this.frame3);
+ global::Gtk.Box.BoxChild w25 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.frame3]));
+ w25.PackType = ((global::Gtk.PackType)(1));
+ w25.Position = 9;
+ // Container child vbox8.Gtk.Box+BoxChild
+ this.hseparator6 = new global::Gtk.HSeparator ();
+ this.hseparator6.Name = "hseparator6";
+ this.vbox8.Add (this.hseparator6);
+ global::Gtk.Box.BoxChild w26 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hseparator6]));
+ w26.PackType = ((global::Gtk.PackType)(1));
+ w26.Position = 10;
+ w26.Expand = false;
+ w26.Fill = false;
+ this.hbox1.Add (this.vbox8);
+ global::Gtk.Box.BoxChild w27 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox8]));
+ w27.Position = 0;
+ w27.Expand = false;
+ w27.Fill = false;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.GtkScrolledWindow1 = new global::Gtk.ScrolledWindow ();
+ this.GtkScrolledWindow1.Name = "GtkScrolledWindow1";
+ this.GtkScrolledWindow1.ShadowType = ((global::Gtk.ShadowType)(1));
+ // Container child GtkScrolledWindow1.Gtk.Container+ContainerChild
+ this.recipeList = new global::Gtk.TreeView ();
+ this.recipeList.WidthRequest = 300;
+ this.recipeList.CanFocus = true;
+ this.recipeList.Name = "recipeList";
+ this.GtkScrolledWindow1.Add (this.recipeList);
+ this.hbox1.Add (this.GtkScrolledWindow1);
+ global::Gtk.Box.BoxChild w29 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.GtkScrolledWindow1]));
+ w29.Position = 1;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.vbox3 = new global::Gtk.VBox ();
+ this.vbox3.Name = "vbox3";
+ this.vbox3.Spacing = 6;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.frame2 = new global::Gtk.Frame ();
+ this.frame2.WidthRequest = 200;
+ this.frame2.HeightRequest = 200;
+ this.frame2.Name = "frame2";
+ this.frame2.ShadowType = ((global::Gtk.ShadowType)(0));
+ // Container child frame2.Gtk.Container+ContainerChild
+ this.GtkScrolledWindow = new global::Gtk.ScrolledWindow ();
+ this.GtkScrolledWindow.Name = "GtkScrolledWindow";
+ this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
+ // Container child GtkScrolledWindow.Gtk.Container+ContainerChild
+ this.recipeIngredientsView = new global::Gtk.TreeView ();
+ this.recipeIngredientsView.CanFocus = true;
+ this.recipeIngredientsView.Name = "recipeIngredientsView";
+ this.GtkScrolledWindow.Add (this.recipeIngredientsView);
+ this.frame2.Add (this.GtkScrolledWindow);
+ this.recipeLabel = new global::Gtk.Label ();
+ this.recipeLabel.Name = "recipeLabel";
+ this.recipeLabel.LabelProp = "Recipe";
+ this.recipeLabel.UseMarkup = true;
+ this.frame2.LabelWidget = this.recipeLabel;
+ this.vbox3.Add (this.frame2);
+ global::Gtk.Box.BoxChild w32 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.frame2]));
+ w32.Position = 0;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.button919 = new global::Gtk.Button ();
+ this.button919.CanFocus = true;
+ this.button919.Name = "button919";
+ this.button919.UseUnderline = true;
+ this.button919.Label = "Copy";
+ this.vbox3.Add (this.button919);
+ global::Gtk.Box.BoxChild w33 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.button919]));
+ w33.Position = 1;
+ w33.Expand = false;
+ w33.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.paintSwatch = new global::DesertPaintLab.PaintSwatch ();
+ this.paintSwatch.HeightRequest = 200;
+ this.paintSwatch.Events = ((global::Gdk.EventMask)(256));
+ this.paintSwatch.Name = "paintSwatch";
+ this.vbox3.Add (this.paintSwatch);
+ global::Gtk.Box.BoxChild w34 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.paintSwatch]));
+ w34.Position = 2;
+ this.hbox1.Add (this.vbox3);
+ global::Gtk.Box.BoxChild w35 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox3]));
+ w35.Position = 2;
+ w35.Expand = false;
+ w35.Fill = false;
+ this.vbox2.Add (this.hbox1);
+ global::Gtk.Box.BoxChild w36 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox1]));
+ w36.Position = 0;
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.hbox3 = new global::Gtk.HBox ();
+ this.hbox3.Name = "hbox3";
+ this.hbox3.Spacing = 6;
+ // Container child hbox3.Gtk.Box+BoxChild
+ this.hseparator2 = new global::Gtk.HSeparator ();
+ this.hseparator2.Name = "hseparator2";
+ this.hbox3.Add (this.hseparator2);
+ global::Gtk.Box.BoxChild w37 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.hseparator2]));
+ w37.Position = 0;
+ // Container child hbox3.Gtk.Box+BoxChild
+ this.stopResumeButton = new global::Gtk.Button ();
+ this.stopResumeButton.Sensitive = false;
+ this.stopResumeButton.CanFocus = true;
+ this.stopResumeButton.Name = "stopResumeButton";
+ this.stopResumeButton.UseUnderline = true;
+ this.stopResumeButton.Label = "Stop";
+ this.hbox3.Add (this.stopResumeButton);
+ global::Gtk.Box.BoxChild w38 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.stopResumeButton]));
+ w38.Position = 1;
+ w38.Expand = false;
+ w38.Fill = false;
+ w38.Padding = ((uint)(20));
+ // Container child hbox3.Gtk.Box+BoxChild
+ this.countLabel = new global::Gtk.Label ();
+ this.countLabel.Name = "countLabel";
+ this.countLabel.LabelProp = "0/192";
+ this.hbox3.Add (this.countLabel);
+ global::Gtk.Box.BoxChild w39 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.countLabel]));
+ w39.Position = 2;
+ w39.Expand = false;
+ w39.Fill = false;
+ w39.Padding = ((uint)(40));
+ // Container child hbox3.Gtk.Box+BoxChild
+ this.beginButton = new global::Gtk.Button ();
+ this.beginButton.CanFocus = true;
+ this.beginButton.Name = "beginButton";
+ this.beginButton.UseUnderline = true;
+ this.beginButton.Label = "Begin";
+ this.hbox3.Add (this.beginButton);
+ global::Gtk.Box.BoxChild w40 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.beginButton]));
+ w40.Position = 3;
+ w40.Expand = false;
+ w40.Fill = false;
+ w40.Padding = ((uint)(20));
+ // Container child hbox3.Gtk.Box+BoxChild
+ this.hseparator1 = new global::Gtk.HSeparator ();
+ this.hseparator1.Name = "hseparator1";
+ this.hbox3.Add (this.hseparator1);
+ global::Gtk.Box.BoxChild w41 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.hseparator1]));
+ w41.Position = 4;
+ this.vbox2.Add (this.hbox3);
+ global::Gtk.Box.BoxChild w42 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox3]));
+ w42.Position = 1;
+ w42.Expand = false;
+ w42.Fill = false;
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.progressBar = new global::Gtk.ProgressBar ();
+ this.progressBar.Name = "progressBar";
+ this.vbox2.Add (this.progressBar);
+ global::Gtk.Box.BoxChild w43 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.progressBar]));
+ w43.PackType = ((global::Gtk.PackType)(1));
+ w43.Position = 2;
+ w43.Expand = false;
+ w43.Fill = false;
+ this.Add (this.vbox2);
+ if ((this.Child != null)) {
+ this.Child.ShowAll ();
+ }
+ w1.SetUiManager (UIManager);
+ this.Hide ();
+ this.minIngredientsSpinButton.ValueChanged += new global::System.EventHandler (this.OnMinIngredientsChanged);
+ this.maxIngredientsSpinButton.ValueChanged += new global::System.EventHandler (this.OnMaxIngredientsChanged);
+ this.checkButtonRibbon.Toggled += new global::System.EventHandler (this.OnRecipesToggled);
+ this.maxRecipeSpinButton.ValueChanged += new global::System.EventHandler (this.OnMaxRecipeChanged);
+ this.fullQuantityDepthSpinButton.ValueChanged += new global::System.EventHandler (this.OnFullQuantityDepthChanged);
+ this.fullQuantitySpinButton.ValueChanged += new global::System.EventHandler (this.OnFullQuantityChanged);
+ this.button919.Clicked += new global::System.EventHandler (this.OnCopyRecipeToClipboard);
+ this.stopResumeButton.Clicked += new global::System.EventHandler (this.OnStopResume);
+ this.beginButton.Clicked += new global::System.EventHandler (this.OnBegin);
+ }
+ }
+}
diff --git a/gtk-gui/DesertPaintLab.RecipeGeneratorWindow.cs b/gtk-gui/DesertPaintLab.RecipeGeneratorWindow.cs
deleted file mode 100644
--- a/gtk-gui/DesertPaintLab.RecipeGeneratorWindow.cs
+++ /dev/null
@@ -1,545 +0,0 @@
-
-// This file has been generated by the GUI designer. Do not modify.
-namespace DesertPaintLab
-{
- public partial class RecipeGeneratorWindow
- {
- private global::Gtk.UIManager UIManager;
-
- private global::Gtk.Action ExportAction;
-
- private global::Gtk.Action ExportToWikiAction;
-
- private global::Gtk.Action SettingsAction;
-
- private global::Gtk.Action IngredientsAction;
-
- private global::Gtk.Action CopyToClipboardAction;
-
- private global::Gtk.VBox vbox2;
-
- private global::Gtk.MenuBar menubar1;
-
- private global::Gtk.HBox hbox1;
-
- private global::Gtk.VBox vbox8;
-
- private global::Gtk.HBox hbox2;
-
- private global::Gtk.SpinButton minIngredientsSpinButton;
-
- private global::Gtk.Label label1;
-
- private global::Gtk.HBox hbox7;
-
- private global::Gtk.SpinButton maxIngredientsSpinButton;
-
- private global::Gtk.Label label3;
-
- private global::Gtk.HSeparator hseparator3;
-
- private global::Gtk.HBox hbox4;
-
- private global::Gtk.SpinButton maxRecipeSpinButton;
-
- private global::Gtk.Label label4;
-
- private global::Gtk.HSeparator hseparator4;
-
- private global::Gtk.HBox hbox5;
-
- private global::Gtk.SpinButton fullQuantityDepthSpinButton;
-
- private global::Gtk.Label label8;
-
- private global::Gtk.HSeparator hseparator5;
-
- private global::Gtk.HBox hbox6;
-
- private global::Gtk.SpinButton fullQuantitySpinButton;
-
- private global::Gtk.Label label9;
-
- private global::Gtk.Frame frame3;
-
- private global::Gtk.Alignment GtkAlignment1;
-
- private global::Gtk.ScrolledWindow scrolledwindow2;
-
- private global::Gtk.TreeView reagentListView;
-
- private global::Gtk.Label GtkLabel4;
-
- private global::Gtk.HSeparator hseparator6;
-
- private global::Gtk.ScrolledWindow GtkScrolledWindow1;
-
- private global::Gtk.TreeView recipeList;
-
- private global::Gtk.VBox vbox3;
-
- private global::Gtk.Frame frame2;
-
- private global::Gtk.ScrolledWindow GtkScrolledWindow;
-
- private global::Gtk.TreeView recipeIngredientsView;
-
- private global::Gtk.Label recipeLabel;
-
- private global::Gtk.Button button919;
-
- private global::DesertPaintLab.PaintSwatch paintSwatch;
-
- private global::Gtk.HBox hbox3;
-
- private global::Gtk.HSeparator hseparator2;
-
- private global::Gtk.Button stopResumeButton;
-
- private global::Gtk.Label countLabel;
-
- private global::Gtk.Button beginButton;
-
- private global::Gtk.HSeparator hseparator1;
-
- private global::Gtk.Label statusLabel;
-
- private global::Gtk.ProgressBar progressBar;
-
- protected virtual void Build ()
- {
- global::Stetic.Gui.Initialize (this);
- // Widget DesertPaintLab.RecipeGeneratorWindow
- this.UIManager = new global::Gtk.UIManager ();
- global::Gtk.ActionGroup w1 = new global::Gtk.ActionGroup ("Default");
- this.ExportAction = new global::Gtk.Action ("ExportAction", "Export", null, null);
- this.ExportAction.ShortLabel = "Export";
- w1.Add (this.ExportAction, null);
- this.ExportToWikiAction = new global::Gtk.Action ("ExportToWikiAction", "Export to Wiki", null, null);
- this.ExportToWikiAction.ShortLabel = "Export to Wiki";
- w1.Add (this.ExportToWikiAction, null);
- this.SettingsAction = new global::Gtk.Action ("SettingsAction", "Settings", null, null);
- this.SettingsAction.ShortLabel = "Tools";
- w1.Add (this.SettingsAction, null);
- this.IngredientsAction = new global::Gtk.Action ("IngredientsAction", "Ingredients", null, null);
- this.IngredientsAction.ShortLabel = "Ingredients";
- w1.Add (this.IngredientsAction, null);
- this.CopyToClipboardAction = new global::Gtk.Action ("CopyToClipboardAction", "Copy to Clipboard", null, null);
- this.CopyToClipboardAction.ShortLabel = "Copy to Clipboard";
- w1.Add (this.CopyToClipboardAction, null);
- this.UIManager.InsertActionGroup (w1, 0);
- this.AddAccelGroup (this.UIManager.AccelGroup);
- this.Name = "DesertPaintLab.RecipeGeneratorWindow";
- this.Title = "Recipe Generator";
- this.WindowPosition = ((global::Gtk.WindowPosition)(4));
- // Container child DesertPaintLab.RecipeGeneratorWindow.Gtk.Container+ContainerChild
- this.vbox2 = new global::Gtk.VBox ();
- this.vbox2.Name = "vbox2";
- this.vbox2.Spacing = 6;
- this.vbox2.BorderWidth = ((uint)(8));
- // Container child vbox2.Gtk.Box+BoxChild
- this.UIManager.AddUiFromString ("");
- this.menubar1 = ((global::Gtk.MenuBar)(this.UIManager.GetWidget ("/menubar1")));
- this.menubar1.Name = "menubar1";
- this.vbox2.Add (this.menubar1);
- global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.menubar1]));
- w2.Position = 0;
- w2.Expand = false;
- w2.Fill = false;
- // Container child vbox2.Gtk.Box+BoxChild
- this.hbox1 = new global::Gtk.HBox ();
- this.hbox1.Name = "hbox1";
- this.hbox1.Spacing = 6;
- // Container child hbox1.Gtk.Box+BoxChild
- this.vbox8 = new global::Gtk.VBox ();
- this.vbox8.Name = "vbox8";
- this.vbox8.Spacing = 6;
- // Container child vbox8.Gtk.Box+BoxChild
- this.hbox2 = new global::Gtk.HBox ();
- this.hbox2.Name = "hbox2";
- this.hbox2.Spacing = 6;
- // Container child hbox2.Gtk.Box+BoxChild
- this.minIngredientsSpinButton = new global::Gtk.SpinButton (1, 14, 1);
- this.minIngredientsSpinButton.CanFocus = true;
- this.minIngredientsSpinButton.Name = "minIngredientsSpinButton";
- this.minIngredientsSpinButton.Adjustment.PageIncrement = 10;
- this.minIngredientsSpinButton.ClimbRate = 1;
- this.minIngredientsSpinButton.Numeric = true;
- this.minIngredientsSpinButton.Value = 1;
- this.hbox2.Add (this.minIngredientsSpinButton);
- global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.minIngredientsSpinButton]));
- w3.Position = 0;
- w3.Expand = false;
- w3.Fill = false;
- // Container child hbox2.Gtk.Box+BoxChild
- this.label1 = new global::Gtk.Label ();
- this.label1.Name = "label1";
- this.label1.LabelProp = "Minimum Ingredients";
- this.hbox2.Add (this.label1);
- global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.label1]));
- w4.Position = 1;
- w4.Expand = false;
- w4.Fill = false;
- this.vbox8.Add (this.hbox2);
- global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hbox2]));
- w5.Position = 0;
- w5.Expand = false;
- w5.Fill = false;
- // Container child vbox8.Gtk.Box+BoxChild
- this.hbox7 = new global::Gtk.HBox ();
- this.hbox7.Name = "hbox7";
- this.hbox7.Spacing = 6;
- // Container child hbox7.Gtk.Box+BoxChild
- this.maxIngredientsSpinButton = new global::Gtk.SpinButton (1, 14, 1);
- this.maxIngredientsSpinButton.CanFocus = true;
- this.maxIngredientsSpinButton.Name = "maxIngredientsSpinButton";
- this.maxIngredientsSpinButton.Adjustment.PageIncrement = 10;
- this.maxIngredientsSpinButton.ClimbRate = 1;
- this.maxIngredientsSpinButton.Numeric = true;
- this.maxIngredientsSpinButton.Value = 5;
- this.hbox7.Add (this.maxIngredientsSpinButton);
- global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.hbox7 [this.maxIngredientsSpinButton]));
- w6.Position = 0;
- w6.Expand = false;
- w6.Fill = false;
- // Container child hbox7.Gtk.Box+BoxChild
- this.label3 = new global::Gtk.Label ();
- this.label3.Name = "label3";
- this.label3.LabelProp = "Maximum Ingredients";
- this.hbox7.Add (this.label3);
- global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.hbox7 [this.label3]));
- w7.Position = 1;
- w7.Expand = false;
- w7.Fill = false;
- this.vbox8.Add (this.hbox7);
- global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hbox7]));
- w8.Position = 1;
- w8.Expand = false;
- w8.Fill = false;
- // Container child vbox8.Gtk.Box+BoxChild
- this.hseparator3 = new global::Gtk.HSeparator ();
- this.hseparator3.Name = "hseparator3";
- this.vbox8.Add (this.hseparator3);
- global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hseparator3]));
- w9.Position = 2;
- w9.Expand = false;
- w9.Fill = false;
- // Container child vbox8.Gtk.Box+BoxChild
- this.hbox4 = new global::Gtk.HBox ();
- this.hbox4.Name = "hbox4";
- this.hbox4.Spacing = 6;
- // Container child hbox4.Gtk.Box+BoxChild
- this.maxRecipeSpinButton = new global::Gtk.SpinButton (10, 100, 1);
- this.maxRecipeSpinButton.CanFocus = true;
- this.maxRecipeSpinButton.Name = "maxRecipeSpinButton";
- this.maxRecipeSpinButton.Adjustment.PageIncrement = 10;
- this.maxRecipeSpinButton.ClimbRate = 1;
- this.maxRecipeSpinButton.Numeric = true;
- this.maxRecipeSpinButton.Value = 14;
- this.hbox4.Add (this.maxRecipeSpinButton);
- global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.hbox4 [this.maxRecipeSpinButton]));
- w10.Position = 0;
- w10.Expand = false;
- w10.Fill = false;
- // Container child hbox4.Gtk.Box+BoxChild
- this.label4 = new global::Gtk.Label ();
- this.label4.Name = "label4";
- this.label4.LabelProp = "Max Total Quantity";
- this.label4.UseMarkup = true;
- this.label4.Wrap = true;
- this.hbox4.Add (this.label4);
- global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.hbox4 [this.label4]));
- w11.Position = 1;
- w11.Expand = false;
- w11.Fill = false;
- this.vbox8.Add (this.hbox4);
- global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hbox4]));
- w12.Position = 3;
- w12.Expand = false;
- w12.Fill = false;
- // Container child vbox8.Gtk.Box+BoxChild
- this.hseparator4 = new global::Gtk.HSeparator ();
- this.hseparator4.Name = "hseparator4";
- this.vbox8.Add (this.hseparator4);
- global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hseparator4]));
- w13.Position = 4;
- w13.Expand = false;
- w13.Fill = false;
- w13.Padding = ((uint)(8));
- // Container child vbox8.Gtk.Box+BoxChild
- this.hbox5 = new global::Gtk.HBox ();
- this.hbox5.Name = "hbox5";
- this.hbox5.Spacing = 6;
- // Container child hbox5.Gtk.Box+BoxChild
- this.fullQuantityDepthSpinButton = new global::Gtk.SpinButton (0, 15, 1);
- this.fullQuantityDepthSpinButton.CanFocus = true;
- this.fullQuantityDepthSpinButton.Name = "fullQuantityDepthSpinButton";
- this.fullQuantityDepthSpinButton.Adjustment.PageIncrement = 10;
- this.fullQuantityDepthSpinButton.ClimbRate = 1;
- this.fullQuantityDepthSpinButton.Numeric = true;
- this.fullQuantityDepthSpinButton.Value = 4;
- this.hbox5.Add (this.fullQuantityDepthSpinButton);
- global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.hbox5 [this.fullQuantityDepthSpinButton]));
- w14.Position = 0;
- w14.Expand = false;
- w14.Fill = false;
- // Container child hbox5.Gtk.Box+BoxChild
- this.label8 = new global::Gtk.Label ();
- this.label8.Name = "label8";
- this.label8.LabelProp = "Full Quantity Depth";
- this.hbox5.Add (this.label8);
- global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.hbox5 [this.label8]));
- w15.Position = 1;
- w15.Expand = false;
- w15.Fill = false;
- this.vbox8.Add (this.hbox5);
- global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hbox5]));
- w16.Position = 5;
- w16.Expand = false;
- w16.Fill = false;
- // Container child vbox8.Gtk.Box+BoxChild
- this.hseparator5 = new global::Gtk.HSeparator ();
- this.hseparator5.Name = "hseparator5";
- this.vbox8.Add (this.hseparator5);
- global::Gtk.Box.BoxChild w17 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hseparator5]));
- w17.Position = 6;
- w17.Expand = false;
- w17.Fill = false;
- // Container child vbox8.Gtk.Box+BoxChild
- this.hbox6 = new global::Gtk.HBox ();
- this.hbox6.Name = "hbox6";
- this.hbox6.Spacing = 6;
- // Container child hbox6.Gtk.Box+BoxChild
- this.fullQuantitySpinButton = new global::Gtk.SpinButton (0, 30, 1);
- this.fullQuantitySpinButton.CanFocus = true;
- this.fullQuantitySpinButton.Name = "fullQuantitySpinButton";
- this.fullQuantitySpinButton.Adjustment.PageIncrement = 10;
- this.fullQuantitySpinButton.ClimbRate = 1;
- this.fullQuantitySpinButton.Numeric = true;
- this.fullQuantitySpinButton.Value = 20;
- this.hbox6.Add (this.fullQuantitySpinButton);
- global::Gtk.Box.BoxChild w18 = ((global::Gtk.Box.BoxChild)(this.hbox6 [this.fullQuantitySpinButton]));
- w18.Position = 0;
- w18.Expand = false;
- w18.Fill = false;
- // Container child hbox6.Gtk.Box+BoxChild
- this.label9 = new global::Gtk.Label ();
- this.label9.Name = "label9";
- this.label9.LabelProp = "FullQuantity";
- this.hbox6.Add (this.label9);
- global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.hbox6 [this.label9]));
- w19.Position = 1;
- w19.Expand = false;
- w19.Fill = false;
- this.vbox8.Add (this.hbox6);
- global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hbox6]));
- w20.Position = 7;
- w20.Expand = false;
- w20.Fill = false;
- // Container child vbox8.Gtk.Box+BoxChild
- this.frame3 = new global::Gtk.Frame ();
- this.frame3.Name = "frame3";
- this.frame3.ShadowType = ((global::Gtk.ShadowType)(0));
- // Container child frame3.Gtk.Container+ContainerChild
- this.GtkAlignment1 = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
- this.GtkAlignment1.Name = "GtkAlignment1";
- this.GtkAlignment1.LeftPadding = ((uint)(12));
- // Container child GtkAlignment1.Gtk.Container+ContainerChild
- this.scrolledwindow2 = new global::Gtk.ScrolledWindow ();
- this.scrolledwindow2.CanFocus = true;
- this.scrolledwindow2.Name = "scrolledwindow2";
- this.scrolledwindow2.ShadowType = ((global::Gtk.ShadowType)(1));
- // Container child scrolledwindow2.Gtk.Container+ContainerChild
- this.reagentListView = new global::Gtk.TreeView ();
- this.reagentListView.WidthRequest = 300;
- this.reagentListView.CanFocus = true;
- this.reagentListView.Name = "reagentListView";
- this.scrolledwindow2.Add (this.reagentListView);
- this.GtkAlignment1.Add (this.scrolledwindow2);
- this.frame3.Add (this.GtkAlignment1);
- this.GtkLabel4 = new global::Gtk.Label ();
- this.GtkLabel4.Name = "GtkLabel4";
- this.GtkLabel4.LabelProp = "Ingredients";
- this.GtkLabel4.UseMarkup = true;
- this.frame3.LabelWidget = this.GtkLabel4;
- this.vbox8.Add (this.frame3);
- global::Gtk.Box.BoxChild w24 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.frame3]));
- w24.PackType = ((global::Gtk.PackType)(1));
- w24.Position = 8;
- // Container child vbox8.Gtk.Box+BoxChild
- this.hseparator6 = new global::Gtk.HSeparator ();
- this.hseparator6.Name = "hseparator6";
- this.vbox8.Add (this.hseparator6);
- global::Gtk.Box.BoxChild w25 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hseparator6]));
- w25.PackType = ((global::Gtk.PackType)(1));
- w25.Position = 9;
- w25.Expand = false;
- w25.Fill = false;
- this.hbox1.Add (this.vbox8);
- global::Gtk.Box.BoxChild w26 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox8]));
- w26.Position = 0;
- w26.Expand = false;
- w26.Fill = false;
- // Container child hbox1.Gtk.Box+BoxChild
- this.GtkScrolledWindow1 = new global::Gtk.ScrolledWindow ();
- this.GtkScrolledWindow1.Name = "GtkScrolledWindow1";
- this.GtkScrolledWindow1.ShadowType = ((global::Gtk.ShadowType)(1));
- // Container child GtkScrolledWindow1.Gtk.Container+ContainerChild
- this.recipeList = new global::Gtk.TreeView ();
- this.recipeList.WidthRequest = 300;
- this.recipeList.CanFocus = true;
- this.recipeList.Name = "recipeList";
- this.GtkScrolledWindow1.Add (this.recipeList);
- this.hbox1.Add (this.GtkScrolledWindow1);
- global::Gtk.Box.BoxChild w28 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.GtkScrolledWindow1]));
- w28.Position = 1;
- // Container child hbox1.Gtk.Box+BoxChild
- this.vbox3 = new global::Gtk.VBox ();
- this.vbox3.Name = "vbox3";
- this.vbox3.Spacing = 6;
- // Container child vbox3.Gtk.Box+BoxChild
- this.frame2 = new global::Gtk.Frame ();
- this.frame2.WidthRequest = 200;
- this.frame2.HeightRequest = 200;
- this.frame2.Name = "frame2";
- this.frame2.ShadowType = ((global::Gtk.ShadowType)(0));
- // Container child frame2.Gtk.Container+ContainerChild
- this.GtkScrolledWindow = new global::Gtk.ScrolledWindow ();
- this.GtkScrolledWindow.Name = "GtkScrolledWindow";
- this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
- // Container child GtkScrolledWindow.Gtk.Container+ContainerChild
- this.recipeIngredientsView = new global::Gtk.TreeView ();
- this.recipeIngredientsView.CanFocus = true;
- this.recipeIngredientsView.Name = "recipeIngredientsView";
- this.GtkScrolledWindow.Add (this.recipeIngredientsView);
- this.frame2.Add (this.GtkScrolledWindow);
- this.recipeLabel = new global::Gtk.Label ();
- this.recipeLabel.Name = "recipeLabel";
- this.recipeLabel.LabelProp = "Recipe";
- this.recipeLabel.UseMarkup = true;
- this.frame2.LabelWidget = this.recipeLabel;
- this.vbox3.Add (this.frame2);
- global::Gtk.Box.BoxChild w31 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.frame2]));
- w31.Position = 0;
- // Container child vbox3.Gtk.Box+BoxChild
- this.button919 = new global::Gtk.Button ();
- this.button919.CanFocus = true;
- this.button919.Name = "button919";
- this.button919.UseUnderline = true;
- this.button919.Label = "Copy";
- this.vbox3.Add (this.button919);
- global::Gtk.Box.BoxChild w32 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.button919]));
- w32.Position = 1;
- w32.Expand = false;
- w32.Fill = false;
- // Container child vbox3.Gtk.Box+BoxChild
- this.paintSwatch = new global::DesertPaintLab.PaintSwatch ();
- this.paintSwatch.HeightRequest = 200;
- this.paintSwatch.Events = ((global::Gdk.EventMask)(256));
- this.paintSwatch.Name = "paintSwatch";
- this.vbox3.Add (this.paintSwatch);
- global::Gtk.Box.BoxChild w33 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.paintSwatch]));
- w33.Position = 2;
- this.hbox1.Add (this.vbox3);
- global::Gtk.Box.BoxChild w34 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox3]));
- w34.Position = 2;
- w34.Expand = false;
- w34.Fill = false;
- this.vbox2.Add (this.hbox1);
- global::Gtk.Box.BoxChild w35 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox1]));
- w35.Position = 1;
- // Container child vbox2.Gtk.Box+BoxChild
- this.hbox3 = new global::Gtk.HBox ();
- this.hbox3.Name = "hbox3";
- this.hbox3.Spacing = 6;
- // Container child hbox3.Gtk.Box+BoxChild
- this.hseparator2 = new global::Gtk.HSeparator ();
- this.hseparator2.Name = "hseparator2";
- this.hbox3.Add (this.hseparator2);
- global::Gtk.Box.BoxChild w36 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.hseparator2]));
- w36.Position = 0;
- // Container child hbox3.Gtk.Box+BoxChild
- this.stopResumeButton = new global::Gtk.Button ();
- this.stopResumeButton.Sensitive = false;
- this.stopResumeButton.CanFocus = true;
- this.stopResumeButton.Name = "stopResumeButton";
- this.stopResumeButton.UseUnderline = true;
- this.stopResumeButton.Label = "Stop";
- this.hbox3.Add (this.stopResumeButton);
- global::Gtk.Box.BoxChild w37 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.stopResumeButton]));
- w37.Position = 1;
- w37.Expand = false;
- w37.Fill = false;
- w37.Padding = ((uint)(20));
- // Container child hbox3.Gtk.Box+BoxChild
- this.countLabel = new global::Gtk.Label ();
- this.countLabel.Name = "countLabel";
- this.countLabel.LabelProp = "0/192";
- this.hbox3.Add (this.countLabel);
- global::Gtk.Box.BoxChild w38 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.countLabel]));
- w38.Position = 2;
- w38.Expand = false;
- w38.Fill = false;
- w38.Padding = ((uint)(40));
- // Container child hbox3.Gtk.Box+BoxChild
- this.beginButton = new global::Gtk.Button ();
- this.beginButton.CanFocus = true;
- this.beginButton.Name = "beginButton";
- this.beginButton.UseUnderline = true;
- this.beginButton.Label = "Begin";
- this.hbox3.Add (this.beginButton);
- global::Gtk.Box.BoxChild w39 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.beginButton]));
- w39.Position = 3;
- w39.Expand = false;
- w39.Fill = false;
- w39.Padding = ((uint)(20));
- // Container child hbox3.Gtk.Box+BoxChild
- this.hseparator1 = new global::Gtk.HSeparator ();
- this.hseparator1.Name = "hseparator1";
- this.hbox3.Add (this.hseparator1);
- global::Gtk.Box.BoxChild w40 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.hseparator1]));
- w40.Position = 4;
- this.vbox2.Add (this.hbox3);
- global::Gtk.Box.BoxChild w41 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox3]));
- w41.Position = 2;
- w41.Expand = false;
- w41.Fill = false;
- // Container child vbox2.Gtk.Box+BoxChild
- this.statusLabel = new global::Gtk.Label ();
- this.statusLabel.Name = "statusLabel";
- this.vbox2.Add (this.statusLabel);
- global::Gtk.Box.BoxChild w42 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.statusLabel]));
- w42.PackType = ((global::Gtk.PackType)(1));
- w42.Position = 3;
- w42.Expand = false;
- w42.Fill = false;
- // Container child vbox2.Gtk.Box+BoxChild
- this.progressBar = new global::Gtk.ProgressBar ();
- this.progressBar.Name = "progressBar";
- this.vbox2.Add (this.progressBar);
- global::Gtk.Box.BoxChild w43 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.progressBar]));
- w43.PackType = ((global::Gtk.PackType)(1));
- w43.Position = 4;
- w43.Expand = false;
- w43.Fill = false;
- this.Add (this.vbox2);
- if ((this.Child != null)) {
- this.Child.ShowAll ();
- }
- this.DefaultWidth = 887;
- this.DefaultHeight = 577;
- this.Show ();
- this.ExportToWikiAction.Activated += new global::System.EventHandler (this.OnExportToWiki);
- this.IngredientsAction.Activated += new global::System.EventHandler (this.OnShowIngredients);
- this.CopyToClipboardAction.Activated += new global::System.EventHandler (this.OnCopyRecipeListToClipboard);
- this.minIngredientsSpinButton.ValueChanged += new global::System.EventHandler (this.OnMinIngredientsChanged);
- this.maxIngredientsSpinButton.ValueChanged += new global::System.EventHandler (this.OnMaxIngredientsChanged);
- this.maxRecipeSpinButton.ValueChanged += new global::System.EventHandler (this.OnMaxRecipeChanged);
- this.fullQuantityDepthSpinButton.ValueChanged += new global::System.EventHandler (this.OnFullQuantityDepthChanged);
- this.fullQuantitySpinButton.ValueChanged += new global::System.EventHandler (this.OnFullQuantityChanged);
- this.button919.Clicked += new global::System.EventHandler (this.OnCopyRecipeToClipboard);
- this.stopResumeButton.Clicked += new global::System.EventHandler (this.OnStopResume);
- this.beginButton.Clicked += new global::System.EventHandler (this.OnBegin);
- }
- }
-}
diff --git a/gtk-gui/DesertPaintLab.SimulatorView.cs b/gtk-gui/DesertPaintLab.SimulatorView.cs
new file mode 100644
--- /dev/null
+++ b/gtk-gui/DesertPaintLab.SimulatorView.cs
@@ -0,0 +1,201 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace DesertPaintLab
+{
+ public partial class SimulatorView
+ {
+ private global::Gtk.HBox hbox1;
+
+ private global::Gtk.ScrolledWindow GtkScrolledWindow;
+
+ private global::Gtk.TreeView reagentListView;
+
+ private global::Gtk.VBox vbox162;
+
+ private global::Gtk.Alignment alignment1;
+
+ private global::Gtk.Button addReagentButton;
+
+ private global::Gtk.Image addReagentButtonImage;
+
+ private global::Gtk.Alignment alignment3;
+
+ private global::Gtk.ScrolledWindow GtkScrolledWindow1;
+
+ private global::Gtk.TreeView recipeView;
+
+ private global::Gtk.VBox vbox3;
+
+ private global::Gtk.Alignment alignment2;
+
+ private global::Gtk.Button button65;
+
+ private global::Gtk.Image image1;
+
+ private global::Gtk.Button button66;
+
+ private global::Gtk.Image image2;
+
+ private global::Gtk.Button button67;
+
+ private global::Gtk.Image image3;
+
+ private global::Gtk.Alignment alignment4;
+
+ private global::DesertPaintLab.PaintSwatch paintSwatch;
+
+ protected virtual void Build ()
+ {
+ global::Stetic.Gui.Initialize (this);
+ // Widget DesertPaintLab.SimulatorView
+ global::Stetic.BinContainer.Attach (this);
+ this.Name = "DesertPaintLab.SimulatorView";
+ // Container child DesertPaintLab.SimulatorView.Gtk.Container+ContainerChild
+ this.hbox1 = new global::Gtk.HBox ();
+ this.hbox1.Name = "hbox1";
+ this.hbox1.Spacing = 6;
+ this.hbox1.BorderWidth = ((uint)(12));
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.GtkScrolledWindow = new global::Gtk.ScrolledWindow ();
+ this.GtkScrolledWindow.Name = "GtkScrolledWindow";
+ this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
+ // Container child GtkScrolledWindow.Gtk.Container+ContainerChild
+ this.reagentListView = new global::Gtk.TreeView ();
+ this.reagentListView.CanFocus = true;
+ this.reagentListView.Name = "reagentListView";
+ this.GtkScrolledWindow.Add (this.reagentListView);
+ this.hbox1.Add (this.GtkScrolledWindow);
+ global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.GtkScrolledWindow]));
+ w2.Position = 0;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.vbox162 = new global::Gtk.VBox ();
+ this.vbox162.Name = "vbox162";
+ this.vbox162.Spacing = 6;
+ // Container child vbox162.Gtk.Box+BoxChild
+ this.alignment1 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F);
+ this.alignment1.Name = "alignment1";
+ this.vbox162.Add (this.alignment1);
+ global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.vbox162 [this.alignment1]));
+ w3.Position = 0;
+ // Container child vbox162.Gtk.Box+BoxChild
+ this.addReagentButton = new global::Gtk.Button ();
+ this.addReagentButton.CanFocus = true;
+ this.addReagentButton.Name = "addReagentButton";
+ // Container child addReagentButton.Gtk.Container+ContainerChild
+ this.addReagentButtonImage = new global::Gtk.Image ();
+ this.addReagentButtonImage.Name = "addReagentButtonImage";
+ this.addReagentButtonImage.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-go-forward", global::Gtk.IconSize.Menu);
+ this.addReagentButton.Add (this.addReagentButtonImage);
+ this.vbox162.Add (this.addReagentButton);
+ global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox162 [this.addReagentButton]));
+ w5.Position = 1;
+ w5.Expand = false;
+ w5.Fill = false;
+ // Container child vbox162.Gtk.Box+BoxChild
+ this.alignment3 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F);
+ this.alignment3.Name = "alignment3";
+ this.vbox162.Add (this.alignment3);
+ global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox162 [this.alignment3]));
+ w6.Position = 2;
+ this.hbox1.Add (this.vbox162);
+ global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox162]));
+ w7.Position = 1;
+ w7.Expand = false;
+ w7.Fill = false;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.GtkScrolledWindow1 = new global::Gtk.ScrolledWindow ();
+ this.GtkScrolledWindow1.Name = "GtkScrolledWindow1";
+ this.GtkScrolledWindow1.ShadowType = ((global::Gtk.ShadowType)(1));
+ // Container child GtkScrolledWindow1.Gtk.Container+ContainerChild
+ this.recipeView = new global::Gtk.TreeView ();
+ this.recipeView.CanFocus = true;
+ this.recipeView.Name = "recipeView";
+ this.recipeView.EnableSearch = false;
+ this.recipeView.Reorderable = true;
+ this.GtkScrolledWindow1.Add (this.recipeView);
+ this.hbox1.Add (this.GtkScrolledWindow1);
+ global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.GtkScrolledWindow1]));
+ w9.Position = 2;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.vbox3 = new global::Gtk.VBox ();
+ this.vbox3.Name = "vbox3";
+ this.vbox3.Spacing = 6;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.alignment2 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F);
+ this.alignment2.Name = "alignment2";
+ this.vbox3.Add (this.alignment2);
+ global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.alignment2]));
+ w10.Position = 0;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.button65 = new global::Gtk.Button ();
+ this.button65.CanFocus = true;
+ this.button65.Name = "button65";
+ // Container child button65.Gtk.Container+ContainerChild
+ this.image1 = new global::Gtk.Image ();
+ this.image1.Name = "image1";
+ this.image1.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-add", global::Gtk.IconSize.Menu);
+ this.button65.Add (this.image1);
+ this.vbox3.Add (this.button65);
+ global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.button65]));
+ w12.Position = 1;
+ w12.Expand = false;
+ w12.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.button66 = new global::Gtk.Button ();
+ this.button66.CanFocus = true;
+ this.button66.Name = "button66";
+ // Container child button66.Gtk.Container+ContainerChild
+ this.image2 = new global::Gtk.Image ();
+ this.image2.Name = "image2";
+ this.image2.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-remove", global::Gtk.IconSize.Menu);
+ this.button66.Add (this.image2);
+ this.vbox3.Add (this.button66);
+ global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.button66]));
+ w14.Position = 2;
+ w14.Expand = false;
+ w14.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.button67 = new global::Gtk.Button ();
+ this.button67.CanFocus = true;
+ this.button67.Name = "button67";
+ // Container child button67.Gtk.Container+ContainerChild
+ this.image3 = new global::Gtk.Image ();
+ this.image3.Name = "image3";
+ this.image3.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-goto-first", global::Gtk.IconSize.Menu);
+ this.button67.Add (this.image3);
+ this.vbox3.Add (this.button67);
+ global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.button67]));
+ w16.Position = 3;
+ w16.Expand = false;
+ w16.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.alignment4 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F);
+ this.alignment4.Name = "alignment4";
+ this.vbox3.Add (this.alignment4);
+ global::Gtk.Box.BoxChild w17 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.alignment4]));
+ w17.Position = 4;
+ this.hbox1.Add (this.vbox3);
+ global::Gtk.Box.BoxChild w18 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox3]));
+ w18.Position = 3;
+ w18.Expand = false;
+ w18.Fill = false;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.paintSwatch = new global::DesertPaintLab.PaintSwatch ();
+ this.paintSwatch.WidthRequest = 200;
+ this.paintSwatch.Events = ((global::Gdk.EventMask)(256));
+ this.paintSwatch.Name = "paintSwatch";
+ this.hbox1.Add (this.paintSwatch);
+ global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.paintSwatch]));
+ w19.Position = 4;
+ this.Add (this.hbox1);
+ if ((this.Child != null)) {
+ this.Child.ShowAll ();
+ }
+ this.Hide ();
+ this.addReagentButton.Clicked += new global::System.EventHandler (this.OnAddReagent);
+ this.button65.Clicked += new global::System.EventHandler (this.OnIncrementReagent);
+ this.button66.Clicked += new global::System.EventHandler (this.OnDecrementReagent);
+ this.button67.Clicked += new global::System.EventHandler (this.OnFlushReagents);
+ }
+ }
+}
diff --git a/gtk-gui/DesertPaintLab.SimulatorWindow.cs b/gtk-gui/DesertPaintLab.SimulatorWindow.cs
deleted file mode 100644
--- a/gtk-gui/DesertPaintLab.SimulatorWindow.cs
+++ /dev/null
@@ -1,204 +0,0 @@
-
-// This file has been generated by the GUI designer. Do not modify.
-namespace DesertPaintLab
-{
- public partial class SimulatorWindow
- {
- private global::Gtk.HBox hbox1;
-
- private global::Gtk.ScrolledWindow GtkScrolledWindow;
-
- private global::Gtk.TreeView reagentListView;
-
- private global::Gtk.VBox vbox162;
-
- private global::Gtk.Alignment alignment1;
-
- private global::Gtk.Button addReagentButton;
-
- private global::Gtk.Image addReagentButtonImage;
-
- private global::Gtk.Alignment alignment3;
-
- private global::Gtk.ScrolledWindow GtkScrolledWindow1;
-
- private global::Gtk.TreeView recipeView;
-
- private global::Gtk.VBox vbox3;
-
- private global::Gtk.Alignment alignment2;
-
- private global::Gtk.Button button65;
-
- private global::Gtk.Image image1;
-
- private global::Gtk.Button button66;
-
- private global::Gtk.Image image2;
-
- private global::Gtk.Button button67;
-
- private global::Gtk.Image image3;
-
- private global::Gtk.Alignment alignment4;
-
- private global::DesertPaintLab.PaintSwatch paintSwatch;
-
- protected virtual void Build ()
- {
- global::Stetic.Gui.Initialize (this);
- // Widget DesertPaintLab.SimulatorWindow
- this.Name = "DesertPaintLab.SimulatorWindow";
- this.Title = "Simulator";
- this.WindowPosition = ((global::Gtk.WindowPosition)(4));
- // Container child DesertPaintLab.SimulatorWindow.Gtk.Container+ContainerChild
- this.hbox1 = new global::Gtk.HBox ();
- this.hbox1.Name = "hbox1";
- this.hbox1.Spacing = 6;
- this.hbox1.BorderWidth = ((uint)(12));
- // Container child hbox1.Gtk.Box+BoxChild
- this.GtkScrolledWindow = new global::Gtk.ScrolledWindow ();
- this.GtkScrolledWindow.Name = "GtkScrolledWindow";
- this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
- // Container child GtkScrolledWindow.Gtk.Container+ContainerChild
- this.reagentListView = new global::Gtk.TreeView ();
- this.reagentListView.CanFocus = true;
- this.reagentListView.Name = "reagentListView";
- this.GtkScrolledWindow.Add (this.reagentListView);
- this.hbox1.Add (this.GtkScrolledWindow);
- global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.GtkScrolledWindow]));
- w2.Position = 0;
- // Container child hbox1.Gtk.Box+BoxChild
- this.vbox162 = new global::Gtk.VBox ();
- this.vbox162.Name = "vbox162";
- this.vbox162.Spacing = 6;
- // Container child vbox162.Gtk.Box+BoxChild
- this.alignment1 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F);
- this.alignment1.Name = "alignment1";
- this.vbox162.Add (this.alignment1);
- global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.vbox162 [this.alignment1]));
- w3.Position = 0;
- // Container child vbox162.Gtk.Box+BoxChild
- this.addReagentButton = new global::Gtk.Button ();
- this.addReagentButton.CanFocus = true;
- this.addReagentButton.Name = "addReagentButton";
- // Container child addReagentButton.Gtk.Container+ContainerChild
- this.addReagentButtonImage = new global::Gtk.Image ();
- this.addReagentButtonImage.Name = "addReagentButtonImage";
- this.addReagentButtonImage.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-go-forward", global::Gtk.IconSize.Menu);
- this.addReagentButton.Add (this.addReagentButtonImage);
- this.vbox162.Add (this.addReagentButton);
- global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox162 [this.addReagentButton]));
- w5.Position = 1;
- w5.Expand = false;
- w5.Fill = false;
- // Container child vbox162.Gtk.Box+BoxChild
- this.alignment3 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F);
- this.alignment3.Name = "alignment3";
- this.vbox162.Add (this.alignment3);
- global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox162 [this.alignment3]));
- w6.Position = 2;
- this.hbox1.Add (this.vbox162);
- global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox162]));
- w7.Position = 1;
- w7.Expand = false;
- w7.Fill = false;
- // Container child hbox1.Gtk.Box+BoxChild
- this.GtkScrolledWindow1 = new global::Gtk.ScrolledWindow ();
- this.GtkScrolledWindow1.Name = "GtkScrolledWindow1";
- this.GtkScrolledWindow1.ShadowType = ((global::Gtk.ShadowType)(1));
- // Container child GtkScrolledWindow1.Gtk.Container+ContainerChild
- this.recipeView = new global::Gtk.TreeView ();
- this.recipeView.CanFocus = true;
- this.recipeView.Name = "recipeView";
- this.recipeView.EnableSearch = false;
- this.recipeView.Reorderable = true;
- this.GtkScrolledWindow1.Add (this.recipeView);
- this.hbox1.Add (this.GtkScrolledWindow1);
- global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.GtkScrolledWindow1]));
- w9.Position = 2;
- // Container child hbox1.Gtk.Box+BoxChild
- this.vbox3 = new global::Gtk.VBox ();
- this.vbox3.Name = "vbox3";
- this.vbox3.Spacing = 6;
- // Container child vbox3.Gtk.Box+BoxChild
- this.alignment2 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F);
- this.alignment2.Name = "alignment2";
- this.vbox3.Add (this.alignment2);
- global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.alignment2]));
- w10.Position = 0;
- // Container child vbox3.Gtk.Box+BoxChild
- this.button65 = new global::Gtk.Button ();
- this.button65.CanFocus = true;
- this.button65.Name = "button65";
- // Container child button65.Gtk.Container+ContainerChild
- this.image1 = new global::Gtk.Image ();
- this.image1.Name = "image1";
- this.image1.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-add", global::Gtk.IconSize.Menu);
- this.button65.Add (this.image1);
- this.vbox3.Add (this.button65);
- global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.button65]));
- w12.Position = 1;
- w12.Expand = false;
- w12.Fill = false;
- // Container child vbox3.Gtk.Box+BoxChild
- this.button66 = new global::Gtk.Button ();
- this.button66.CanFocus = true;
- this.button66.Name = "button66";
- // Container child button66.Gtk.Container+ContainerChild
- this.image2 = new global::Gtk.Image ();
- this.image2.Name = "image2";
- this.image2.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-remove", global::Gtk.IconSize.Menu);
- this.button66.Add (this.image2);
- this.vbox3.Add (this.button66);
- global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.button66]));
- w14.Position = 2;
- w14.Expand = false;
- w14.Fill = false;
- // Container child vbox3.Gtk.Box+BoxChild
- this.button67 = new global::Gtk.Button ();
- this.button67.CanFocus = true;
- this.button67.Name = "button67";
- // Container child button67.Gtk.Container+ContainerChild
- this.image3 = new global::Gtk.Image ();
- this.image3.Name = "image3";
- this.image3.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-goto-first", global::Gtk.IconSize.Menu);
- this.button67.Add (this.image3);
- this.vbox3.Add (this.button67);
- global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.button67]));
- w16.Position = 3;
- w16.Expand = false;
- w16.Fill = false;
- // Container child vbox3.Gtk.Box+BoxChild
- this.alignment4 = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F);
- this.alignment4.Name = "alignment4";
- this.vbox3.Add (this.alignment4);
- global::Gtk.Box.BoxChild w17 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.alignment4]));
- w17.Position = 4;
- this.hbox1.Add (this.vbox3);
- global::Gtk.Box.BoxChild w18 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox3]));
- w18.Position = 3;
- w18.Expand = false;
- w18.Fill = false;
- // Container child hbox1.Gtk.Box+BoxChild
- this.paintSwatch = new global::DesertPaintLab.PaintSwatch ();
- this.paintSwatch.WidthRequest = 200;
- this.paintSwatch.Events = ((global::Gdk.EventMask)(256));
- this.paintSwatch.Name = "paintSwatch";
- this.hbox1.Add (this.paintSwatch);
- global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.paintSwatch]));
- w19.Position = 4;
- this.Add (this.hbox1);
- if ((this.Child != null)) {
- this.Child.ShowAll ();
- }
- this.DefaultWidth = 804;
- this.DefaultHeight = 390;
- this.Show ();
- this.addReagentButton.Clicked += new global::System.EventHandler (this.OnAddReagent);
- this.button65.Clicked += new global::System.EventHandler (this.OnIncrementReagent);
- this.button66.Clicked += new global::System.EventHandler (this.OnDecrementReagent);
- this.button67.Clicked += new global::System.EventHandler (this.OnFlushReagents);
- }
- }
-}
diff --git a/gtk-gui/MainWindow.cs b/gtk-gui/MainWindow.cs
--- a/gtk-gui/MainWindow.cs
+++ b/gtk-gui/MainWindow.cs
@@ -11,87 +11,45 @@ public partial class MainWindow
private global::Gtk.Action AboutAction;
- private global::Gtk.Action NewProfileAction;
-
- private global::Gtk.Action OpenProfileAction;
-
private global::Gtk.Action ExitAction;
- private global::Gtk.Action ExportForPracticalPaintAction;
-
- private global::Gtk.Action WindowAction;
-
- private global::Gtk.Action RunSimulatorAction;
-
private global::Gtk.Action DebugAction;
private global::Gtk.Action ScreenshotAction;
+ private global::Gtk.Action ReactionStatusAction;
+
+ private global::Gtk.Action ViewAction;
+
+ private global::Gtk.RadioAction CaptureAction;
+
+ private global::Gtk.RadioAction SimulatorAction;
+
+ private global::Gtk.RadioAction RecipeGeneratorAction;
+
private global::Gtk.Action RecipesAction;
- private global::Gtk.Action ReactionStatusAction;
+ private global::Gtk.Action ExportRecipesAction;
+
+ private global::Gtk.Action CopyRecipesToClipboardAction;
+
+ private global::Gtk.Action ProfileAction;
- private global::Gtk.Action IngredientsAction;
+ private global::Gtk.Action NewProfileAction;
+
+ private global::Gtk.Action OpenProfileAction;
+
+ private global::Gtk.Action ImportProfileAction;
private global::Gtk.Action ExportProfileAction;
- private global::Gtk.Action ImportProfileAction;
+ private global::Gtk.Action ExportForPracticalPaintAction;
private global::Gtk.VBox vbox1;
- private global::Gtk.MenuBar menubar1;
-
- private global::Gtk.HBox hbox1;
-
- private global::Gtk.Frame frame2;
-
- private global::Gtk.Alignment GtkAlignment;
-
- private global::Gtk.VBox vbox3;
-
- private global::Gtk.HBox hbox6;
-
- private global::Gtk.Label label4;
-
- private global::Gtk.ComboBox ingredient1ComboBox;
-
- private global::Gtk.HBox hbox7;
-
- private global::Gtk.Label label5;
-
- private global::Gtk.ComboBox ingredient2ComboBox;
-
- private global::Gtk.HBox hbox8;
-
- private global::Gtk.Label label6;
+ private global::Gtk.MenuBar menu;
- private global::Gtk.ComboBox ingredient3ComboBox;
-
- private global::Gtk.Label GtkLabel2;
-
- private global::Gtk.Frame frame3;
-
- private global::Gtk.Alignment GtkAlignment1;
-
- private global::Gtk.VBox vbox4;
-
- private global::DesertPaintLab.PaintSwatch unmodifiedSwatch;
-
- private global::Gtk.Button captureButton;
-
- private global::Gtk.Label GtkLabel25;
-
- private global::Gtk.Frame frame4;
-
- private global::Gtk.Alignment GtkAlignment2;
-
- private global::Gtk.VBox vbox5;
-
- private global::DesertPaintLab.PaintSwatch reactionSwatch;
-
- private global::Gtk.Button saveButton;
-
- private global::Gtk.Label GtkLabel26;
+ private global::Gtk.Alignment contentContainer;
private global::Gtk.Statusbar statusBar;
@@ -110,45 +68,60 @@ public partial class MainWindow
this.AboutAction = new global::Gtk.Action ("AboutAction", "_About...", null, null);
this.AboutAction.ShortLabel = "_About...";
w1.Add (this.AboutAction, "a");
- this.NewProfileAction = new global::Gtk.Action ("NewProfileAction", "_New Profile...", null, null);
- this.NewProfileAction.ShortLabel = "_New Profile...";
- w1.Add (this.NewProfileAction, "n");
- this.OpenProfileAction = new global::Gtk.Action ("OpenProfileAction", "_Open Profile...", null, null);
- this.OpenProfileAction.ShortLabel = "_Open Profile...";
- w1.Add (this.OpenProfileAction, "o");
this.ExitAction = new global::Gtk.Action ("ExitAction", "E_xit", null, null);
this.ExitAction.ShortLabel = "E_xit";
w1.Add (this.ExitAction, "x");
- this.ExportForPracticalPaintAction = new global::Gtk.Action ("ExportForPracticalPaintAction", "Export for _PracticalPaint...", null, null);
- this.ExportForPracticalPaintAction.ShortLabel = "Export for _PracticalPaint...";
- w1.Add (this.ExportForPracticalPaintAction, null);
- this.WindowAction = new global::Gtk.Action ("WindowAction", "_Window", null, null);
- this.WindowAction.ShortLabel = "_Window";
- w1.Add (this.WindowAction, null);
- this.RunSimulatorAction = new global::Gtk.Action ("RunSimulatorAction", "_Run Simulator", null, null);
- this.RunSimulatorAction.ShortLabel = "_Run Simulator";
- w1.Add (this.RunSimulatorAction, null);
this.DebugAction = new global::Gtk.Action ("DebugAction", "Debug", null, null);
this.DebugAction.ShortLabel = "Debug";
w1.Add (this.DebugAction, null);
this.ScreenshotAction = new global::Gtk.Action ("ScreenshotAction", "Screenshot", null, null);
this.ScreenshotAction.ShortLabel = "Screenshot";
w1.Add (this.ScreenshotAction, null);
- this.RecipesAction = new global::Gtk.Action ("RecipesAction", "Recipes", null, null);
- this.RecipesAction.ShortLabel = "Recipe Generator";
- w1.Add (this.RecipesAction, null);
this.ReactionStatusAction = new global::Gtk.Action ("ReactionStatusAction", "Reaction Status", null, null);
this.ReactionStatusAction.ShortLabel = "Reaction Status";
w1.Add (this.ReactionStatusAction, null);
- this.IngredientsAction = new global::Gtk.Action ("IngredientsAction", "Ingredients", null, null);
- this.IngredientsAction.ShortLabel = "Ingredients";
- w1.Add (this.IngredientsAction, null);
+ this.ViewAction = new global::Gtk.Action ("ViewAction", "View", null, null);
+ this.ViewAction.ShortLabel = "View";
+ w1.Add (this.ViewAction, null);
+ this.CaptureAction = new global::Gtk.RadioAction ("CaptureAction", "Capture", null, null, 0);
+ this.CaptureAction.Group = new global::GLib.SList (global::System.IntPtr.Zero);
+ this.CaptureAction.ShortLabel = "Capture";
+ w1.Add (this.CaptureAction, null);
+ this.SimulatorAction = new global::Gtk.RadioAction ("SimulatorAction", "Simulator", null, null, 0);
+ this.SimulatorAction.Group = this.CaptureAction.Group;
+ this.SimulatorAction.ShortLabel = "Simulator";
+ w1.Add (this.SimulatorAction, null);
+ this.RecipeGeneratorAction = new global::Gtk.RadioAction ("RecipeGeneratorAction", "Recipe Generator", null, null, 0);
+ this.RecipeGeneratorAction.Group = this.SimulatorAction.Group;
+ this.RecipeGeneratorAction.ShortLabel = "Recipe Generator";
+ w1.Add (this.RecipeGeneratorAction, null);
+ this.RecipesAction = new global::Gtk.Action ("RecipesAction", "Recipes...", null, null);
+ this.RecipesAction.ShortLabel = "Recipes...";
+ w1.Add (this.RecipesAction, null);
+ this.ExportRecipesAction = new global::Gtk.Action ("ExportRecipesAction", "Export Recipes", null, null);
+ this.ExportRecipesAction.ShortLabel = "Export Recipes";
+ w1.Add (this.ExportRecipesAction, null);
+ this.CopyRecipesToClipboardAction = new global::Gtk.Action ("CopyRecipesToClipboardAction", "Copy to Clipboard", null, null);
+ this.CopyRecipesToClipboardAction.ShortLabel = "Copy to Clipboard";
+ w1.Add (this.CopyRecipesToClipboardAction, null);
+ this.ProfileAction = new global::Gtk.Action ("ProfileAction", "Profile...", null, null);
+ this.ProfileAction.ShortLabel = "Profile...";
+ w1.Add (this.ProfileAction, null);
+ this.NewProfileAction = new global::Gtk.Action ("NewProfileAction", "New Profile", null, null);
+ this.NewProfileAction.ShortLabel = "New Profile";
+ w1.Add (this.NewProfileAction, null);
+ this.OpenProfileAction = new global::Gtk.Action ("OpenProfileAction", "Open Profile", null, null);
+ this.OpenProfileAction.ShortLabel = "Open Profile";
+ w1.Add (this.OpenProfileAction, null);
+ this.ImportProfileAction = new global::Gtk.Action ("ImportProfileAction", "Import Profile", null, null);
+ this.ImportProfileAction.ShortLabel = "Import Profile";
+ w1.Add (this.ImportProfileAction, null);
this.ExportProfileAction = new global::Gtk.Action ("ExportProfileAction", "Export Profile", null, null);
this.ExportProfileAction.ShortLabel = "Export Profile";
w1.Add (this.ExportProfileAction, null);
- this.ImportProfileAction = new global::Gtk.Action ("ImportProfileAction", "Import Profile", null, null);
- this.ImportProfileAction.ShortLabel = "Import Profile";
- w1.Add (this.ImportProfileAction, null);
+ this.ExportForPracticalPaintAction = new global::Gtk.Action ("ExportForPracticalPaintAction", "Export for PracticalPaint", null, null);
+ this.ExportForPracticalPaintAction.ShortLabel = "Export for PracticalPaint";
+ w1.Add (this.ExportForPracticalPaintAction, null);
this.UIManager.InsertActionGroup (w1, 0);
this.AddAccelGroup (this.UIManager.AccelGroup);
this.Name = "MainWindow";
@@ -158,246 +131,54 @@ public partial class MainWindow
this.vbox1 = new global::Gtk.VBox ();
this.vbox1.Name = "vbox1";
// Container child vbox1.Gtk.Box+BoxChild
- this.UIManager.AddUiFromString ("");
- this.menubar1 = ((global::Gtk.MenuBar)(this.UIManager.GetWidget ("/menubar1")));
- this.menubar1.Name = "menubar1";
- this.vbox1.Add (this.menubar1);
- global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.menubar1]));
+ this.UIManager.AddUiFromString ("");
+ this.menu = ((global::Gtk.MenuBar)(this.UIManager.GetWidget ("/menu")));
+ this.menu.Name = "menu";
+ this.vbox1.Add (this.menu);
+ global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.menu]));
w2.Position = 0;
w2.Expand = false;
w2.Fill = false;
// Container child vbox1.Gtk.Box+BoxChild
- this.hbox1 = new global::Gtk.HBox ();
- this.hbox1.Name = "hbox1";
- this.hbox1.Spacing = 6;
- this.hbox1.BorderWidth = ((uint)(4));
- // Container child hbox1.Gtk.Box+BoxChild
- this.frame2 = new global::Gtk.Frame ();
- this.frame2.Name = "frame2";
- this.frame2.BorderWidth = ((uint)(4));
- // Container child frame2.Gtk.Container+ContainerChild
- this.GtkAlignment = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
- this.GtkAlignment.Name = "GtkAlignment";
- this.GtkAlignment.LeftPadding = ((uint)(6));
- this.GtkAlignment.RightPadding = ((uint)(6));
- // Container child GtkAlignment.Gtk.Container+ContainerChild
- this.vbox3 = new global::Gtk.VBox ();
- this.vbox3.Name = "vbox3";
- this.vbox3.Homogeneous = true;
- this.vbox3.Spacing = 6;
- // Container child vbox3.Gtk.Box+BoxChild
- this.hbox6 = new global::Gtk.HBox ();
- this.hbox6.Name = "hbox6";
- this.hbox6.Spacing = 6;
- // Container child hbox6.Gtk.Box+BoxChild
- this.label4 = new global::Gtk.Label ();
- this.label4.Name = "label4";
- this.label4.LabelProp = "Ingredient 1:";
- this.hbox6.Add (this.label4);
- global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox6 [this.label4]));
- w3.Position = 0;
- w3.Expand = false;
- w3.Fill = false;
- // Container child hbox6.Gtk.Box+BoxChild
- this.ingredient1ComboBox = global::Gtk.ComboBox.NewText ();
- this.ingredient1ComboBox.Name = "ingredient1ComboBox";
- this.hbox6.Add (this.ingredient1ComboBox);
- global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.hbox6 [this.ingredient1ComboBox]));
- w4.Position = 1;
- this.vbox3.Add (this.hbox6);
- global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.hbox6]));
- w5.Position = 0;
- w5.Expand = false;
- w5.Fill = false;
- // Container child vbox3.Gtk.Box+BoxChild
- this.hbox7 = new global::Gtk.HBox ();
- this.hbox7.Name = "hbox7";
- this.hbox7.Spacing = 6;
- // Container child hbox7.Gtk.Box+BoxChild
- this.label5 = new global::Gtk.Label ();
- this.label5.Name = "label5";
- this.label5.LabelProp = "Ingredient 2:";
- this.hbox7.Add (this.label5);
- global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.hbox7 [this.label5]));
- w6.Position = 0;
- w6.Expand = false;
- w6.Fill = false;
- // Container child hbox7.Gtk.Box+BoxChild
- this.ingredient2ComboBox = global::Gtk.ComboBox.NewText ();
- this.ingredient2ComboBox.Name = "ingredient2ComboBox";
- this.hbox7.Add (this.ingredient2ComboBox);
- global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.hbox7 [this.ingredient2ComboBox]));
- w7.Position = 1;
- this.vbox3.Add (this.hbox7);
- global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.hbox7]));
- w8.Position = 1;
- w8.Expand = false;
- w8.Fill = false;
- // Container child vbox3.Gtk.Box+BoxChild
- this.hbox8 = new global::Gtk.HBox ();
- this.hbox8.Name = "hbox8";
- this.hbox8.Spacing = 6;
- // Container child hbox8.Gtk.Box+BoxChild
- this.label6 = new global::Gtk.Label ();
- this.label6.Name = "label6";
- this.label6.LabelProp = "Ingredient 3:";
- this.hbox8.Add (this.label6);
- global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.hbox8 [this.label6]));
- w9.Position = 0;
- w9.Expand = false;
- w9.Fill = false;
- // Container child hbox8.Gtk.Box+BoxChild
- this.ingredient3ComboBox = global::Gtk.ComboBox.NewText ();
- this.ingredient3ComboBox.Name = "ingredient3ComboBox";
- this.hbox8.Add (this.ingredient3ComboBox);
- global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.hbox8 [this.ingredient3ComboBox]));
- w10.Position = 1;
- this.vbox3.Add (this.hbox8);
- global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.hbox8]));
- w11.Position = 2;
- w11.Expand = false;
- w11.Fill = false;
- this.GtkAlignment.Add (this.vbox3);
- this.frame2.Add (this.GtkAlignment);
- this.GtkLabel2 = new global::Gtk.Label ();
- this.GtkLabel2.Name = "GtkLabel2";
- this.GtkLabel2.LabelProp = "Select Ingredients";
- this.GtkLabel2.UseMarkup = true;
- this.frame2.LabelWidget = this.GtkLabel2;
- this.hbox1.Add (this.frame2);
- global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.frame2]));
- w14.Position = 0;
- // Container child hbox1.Gtk.Box+BoxChild
- this.frame3 = new global::Gtk.Frame ();
- this.frame3.Name = "frame3";
- this.frame3.BorderWidth = ((uint)(4));
- // Container child frame3.Gtk.Container+ContainerChild
- this.GtkAlignment1 = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
- this.GtkAlignment1.Name = "GtkAlignment1";
- this.GtkAlignment1.LeftPadding = ((uint)(5));
- this.GtkAlignment1.TopPadding = ((uint)(5));
- this.GtkAlignment1.RightPadding = ((uint)(5));
- this.GtkAlignment1.BottomPadding = ((uint)(6));
- // Container child GtkAlignment1.Gtk.Container+ContainerChild
- this.vbox4 = new global::Gtk.VBox ();
- this.vbox4.WidthRequest = 120;
- this.vbox4.Name = "vbox4";
- this.vbox4.Spacing = 6;
- // Container child vbox4.Gtk.Box+BoxChild
- this.unmodifiedSwatch = new global::DesertPaintLab.PaintSwatch ();
- this.unmodifiedSwatch.Events = ((global::Gdk.EventMask)(256));
- this.unmodifiedSwatch.Name = "unmodifiedSwatch";
- this.vbox4.Add (this.unmodifiedSwatch);
- global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.unmodifiedSwatch]));
- w15.Position = 0;
- // Container child vbox4.Gtk.Box+BoxChild
- this.captureButton = new global::Gtk.Button ();
- this.captureButton.WidthRequest = 100;
- this.captureButton.CanFocus = true;
- this.captureButton.Name = "captureButton";
- this.captureButton.UseUnderline = true;
- this.captureButton.Label = "Capture";
- this.vbox4.Add (this.captureButton);
- global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.vbox4 [this.captureButton]));
- w16.Position = 1;
- w16.Expand = false;
- w16.Fill = false;
- this.GtkAlignment1.Add (this.vbox4);
- this.frame3.Add (this.GtkAlignment1);
- this.GtkLabel25 = new global::Gtk.Label ();
- this.GtkLabel25.Name = "GtkLabel25";
- this.GtkLabel25.LabelProp = "Unmodified";
- this.GtkLabel25.UseMarkup = true;
- this.frame3.LabelWidget = this.GtkLabel25;
- this.hbox1.Add (this.frame3);
- global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.frame3]));
- w19.Position = 1;
- w19.Expand = false;
- w19.Fill = false;
- // Container child hbox1.Gtk.Box+BoxChild
- this.frame4 = new global::Gtk.Frame ();
- this.frame4.Name = "frame4";
- this.frame4.BorderWidth = ((uint)(4));
- // Container child frame4.Gtk.Container+ContainerChild
- this.GtkAlignment2 = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
- this.GtkAlignment2.WidthRequest = 130;
- this.GtkAlignment2.Name = "GtkAlignment2";
- this.GtkAlignment2.LeftPadding = ((uint)(5));
- this.GtkAlignment2.TopPadding = ((uint)(5));
- this.GtkAlignment2.RightPadding = ((uint)(5));
- this.GtkAlignment2.BottomPadding = ((uint)(6));
- // Container child GtkAlignment2.Gtk.Container+ContainerChild
- this.vbox5 = new global::Gtk.VBox ();
- this.vbox5.WidthRequest = 120;
- this.vbox5.Name = "vbox5";
- this.vbox5.Spacing = 6;
- // Container child vbox5.Gtk.Box+BoxChild
- this.reactionSwatch = new global::DesertPaintLab.PaintSwatch ();
- this.reactionSwatch.Events = ((global::Gdk.EventMask)(256));
- this.reactionSwatch.Name = "reactionSwatch";
- this.vbox5.Add (this.reactionSwatch);
- global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.vbox5 [this.reactionSwatch]));
- w20.Position = 0;
- // Container child vbox5.Gtk.Box+BoxChild
- this.saveButton = new global::Gtk.Button ();
- this.saveButton.WidthRequest = 100;
- this.saveButton.CanFocus = true;
- this.saveButton.Name = "saveButton";
- this.saveButton.UseUnderline = true;
- this.saveButton.Label = "Record";
- this.vbox5.Add (this.saveButton);
- global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.vbox5 [this.saveButton]));
- w21.Position = 1;
- w21.Expand = false;
- w21.Fill = false;
- this.GtkAlignment2.Add (this.vbox5);
- this.frame4.Add (this.GtkAlignment2);
- this.GtkLabel26 = new global::Gtk.Label ();
- this.GtkLabel26.Name = "GtkLabel26";
- this.GtkLabel26.LabelProp = "Reaction";
- this.GtkLabel26.UseMarkup = true;
- this.frame4.LabelWidget = this.GtkLabel26;
- this.hbox1.Add (this.frame4);
- global::Gtk.Box.BoxChild w24 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.frame4]));
- w24.Position = 2;
- w24.Expand = false;
- w24.Fill = false;
- this.vbox1.Add (this.hbox1);
- global::Gtk.Box.BoxChild w25 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.hbox1]));
- w25.Position = 1;
+ this.contentContainer = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F);
+ this.contentContainer.Name = "contentContainer";
+ this.contentContainer.LeftPadding = ((uint)(8));
+ this.contentContainer.TopPadding = ((uint)(6));
+ this.contentContainer.RightPadding = ((uint)(8));
+ this.contentContainer.BottomPadding = ((uint)(5));
+ this.vbox1.Add (this.contentContainer);
+ global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.contentContainer]));
+ w3.Position = 1;
// Container child vbox1.Gtk.Box+BoxChild
this.statusBar = new global::Gtk.Statusbar ();
this.statusBar.Name = "statusBar";
this.statusBar.Spacing = 6;
this.vbox1.Add (this.statusBar);
- global::Gtk.Box.BoxChild w26 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.statusBar]));
- w26.Position = 2;
- w26.Expand = false;
- w26.Fill = false;
+ global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.statusBar]));
+ w4.Position = 2;
+ w4.Expand = false;
+ w4.Fill = false;
this.Add (this.vbox1);
if ((this.Child != null)) {
this.Child.ShowAll ();
}
- this.DefaultWidth = 629;
- this.DefaultHeight = 265;
+ this.DefaultWidth = 732;
+ this.DefaultHeight = 384;
this.Show ();
this.DeleteEvent += new global::Gtk.DeleteEventHandler (this.OnDeleteEvent);
this.AboutAction.Activated += new global::System.EventHandler (this.OnAbout);
+ this.ExitAction.Activated += new global::System.EventHandler (this.OnMenuExit);
+ this.ScreenshotAction.Activated += new global::System.EventHandler (this.OnDebugScreenshot);
+ this.ReactionStatusAction.Activated += new global::System.EventHandler (this.OnShowReactionStatus);
+ this.CaptureAction.Toggled += new global::System.EventHandler (this.OnSelectCaptureView);
+ this.SimulatorAction.Toggled += new global::System.EventHandler (this.OnSelectSimulatorView);
+ this.RecipeGeneratorAction.Toggled += new global::System.EventHandler (this.OnSelectRecipeGeneratorView);
+ this.ExportRecipesAction.Activated += new global::System.EventHandler (this.OnExportRecipeListToWiki);
+ this.CopyRecipesToClipboardAction.Activated += new global::System.EventHandler (this.OnCopyRecipeListToClipboard);
this.NewProfileAction.Activated += new global::System.EventHandler (this.OnNewProfile);
this.OpenProfileAction.Activated += new global::System.EventHandler (this.OnOpenProfile);
- this.ExitAction.Activated += new global::System.EventHandler (this.OnMenuExit);
- this.ExportForPracticalPaintAction.Activated += new global::System.EventHandler (this.OnExport);
- this.RunSimulatorAction.Activated += new global::System.EventHandler (this.RunSimulator);
- this.ScreenshotAction.Activated += new global::System.EventHandler (this.OnDebugScreenshot);
- this.RecipesAction.Activated += new global::System.EventHandler (this.OnOpenRecipeGenerator);
- this.ReactionStatusAction.Activated += new global::System.EventHandler (this.OnShowReactionStatus);
- this.IngredientsAction.Activated += new global::System.EventHandler (this.OnShowIngredients);
+ this.ImportProfileAction.Activated += new global::System.EventHandler (this.OnImportProfile);
this.ExportProfileAction.Activated += new global::System.EventHandler (this.OnExportProfile);
- this.ImportProfileAction.Activated += new global::System.EventHandler (this.OnImportProfile);
- this.ingredient1ComboBox.Changed += new global::System.EventHandler (this.OnChangedIngredient1);
- this.ingredient2ComboBox.Changed += new global::System.EventHandler (this.OnChangedIngredient2);
- this.ingredient3ComboBox.Changed += new global::System.EventHandler (this.OnChangedIngredient3);
- this.captureButton.Clicked += new global::System.EventHandler (this.OnCaptureButton);
- this.saveButton.Clicked += new global::System.EventHandler (this.OnSaveButton);
+ this.ExportForPracticalPaintAction.Activated += new global::System.EventHandler (this.OnExportToPracticalPaint);
}
}
diff --git a/gtk-gui/gui.stetic b/gtk-gui/gui.stetic
--- a/gtk-gui/gui.stetic
+++ b/gtk-gui/gui.stetic
@@ -8,7 +8,7 @@
-
+
Action
@@ -29,20 +29,6 @@
_About...
-
- Action
- <Alt>n
- _New Profile...
- _New Profile...
-
-
-
- Action
- <Alt>o
- _Open Profile...
- _Open Profile...
-
-
Action
<Alt>x
@@ -50,23 +36,6 @@
E_xit
-
- Action
- Export for _PracticalPaint...
- Export for _PracticalPaint...
-
-
-
- Action
- _Window
- _Window
-
-
- Action
- _Run Simulator
- _Run Simulator
-
-
Action
Debug
@@ -78,23 +47,86 @@
Screenshot
-
- Action
- Recipes
- Recipe Generator
-
-
Action
Reaction Status
Reaction Status
-
+
+ Action
+ View
+ View
+
+
+ Radio
+ Capture
+ Capture
+ False
+ True
+ 0
+ viewGroup
+
+
+
+ Radio
+ Simulator
+ Simulator
+ False
+ False
+ 0
+ viewGroup
+
+
+
+ Radio
+ Recipe Generator
+ Recipe Generator
+ False
+ False
+ 0
+ viewGroup
+
+
+
Action
- Ingredients
- Ingredients
-
+ Recipes...
+ Recipes...
+
+
+ Action
+ Export Recipes
+ Export Recipes
+
+
+
+ Action
+ Copy to Clipboard
+ Copy to Clipboard
+
+
+
+ Action
+ Profile...
+ Profile...
+
+
+ Action
+ New Profile
+ New Profile
+
+
+
+ Action
+ Open Profile
+ Open Profile
+
+
+
+ Action
+ Import Profile
+ Import Profile
+
Action
@@ -102,11 +134,11 @@
Export Profile
-
+
Action
- Import Profile
- Import Profile
-
+ Export for PracticalPaint
+ Export for PracticalPaint
+
@@ -117,22 +149,28 @@
-
-
+
- 6
- 4
+ 8
+ 6
+ 8
+ 5
-
-
- 4
-
-
-
- 0
- 0
- 6
- 6
-
-
-
- True
- 6
-
-
-
- 6
-
-
-
- Ingredient 1:
-
-
- 0
- True
- False
- False
-
-
-
-
-
- True
-
-
-
-
- 1
- False
-
-
-
-
- 0
- True
- False
- False
-
-
-
-
-
- 6
-
-
-
- Ingredient 2:
-
-
- 0
- True
- False
- False
-
-
-
-
-
- True
-
-
-
-
- 1
- False
-
-
-
-
- 1
- True
- False
- False
-
-
-
-
-
- 6
-
-
-
- Ingredient 3:
-
-
- 0
- True
- False
- False
-
-
-
-
-
- True
-
-
-
-
- 1
- False
-
-
-
-
- 2
- True
- False
- False
-
-
-
-
-
-
-
-
-
- <b>Select Ingredients</b>
- True
-
-
- label_item
-
-
-
-
- 0
- False
-
-
-
-
-
- 4
-
-
-
- 0
- 0
- 5
- 5
- 5
- 6
-
-
-
- 120
- 6
-
-
-
- ButtonPressMask
-
-
- 0
- True
-
-
-
-
-
- 100
- True
- TextOnly
- Capture
- True
-
-
-
- 1
- True
- False
- False
-
-
-
-
-
-
-
-
-
- <b>Unmodified</b>
- True
-
-
- label_item
-
-
-
-
- 1
- True
- False
- False
-
-
-
-
-
- 4
-
-
-
- 130
- 0
- 0
- 5
- 5
- 5
- 6
-
-
-
- 120
- 6
-
-
-
- ButtonPressMask
-
-
- 0
- True
-
-
-
-
-
- 100
- True
- TextOnly
- Record
- True
-
-
-
- 1
- True
- False
- False
-
-
-
-
-
-
-
-
-
- <b>Reaction</b>
- True
-
-
- label_item
-
-
-
-
- 2
- True
- False
- False
-
+
1
- False
+ True
@@ -763,10 +527,1162 @@ You can either import an existing Practi
-
+
+
+ Screen Check
+ CenterOnParent
+ True
+ 9
+ 1
+ False
+
+
+
+
+
+
+ 20
+ 20
+
+
+
+ 20
+ 10
+
+
+
+ Screen Resolution
+
+
+ 0
+ True
+ False
+ False
+
+
+
+
+
+ 50
+ True
+ True
+ ●
+
+
+ 1
+ True
+
+
+
+
+
+ 50
+ True
+ True
+ ●
+
+
+ 2
+ True
+
+
+
+
+ 0
+ True
+ False
+ False
+
+
+
+
+
+ 20
+ 10
+
+
+
+ Game Pixel Width in Screen Pixels
+
+
+ 0
+ True
+ False
+ False
+
+
+
+
+
+ 50
+ True
+ True
+ ●
+
+
+ 1
+ False
+ False
+ False
+
+
+
+
+
+
+
+ 1
+ True
+ False
+ False
+
+
+
+
+
+
+
+ 0
+ True
+
+
+
+
+
+
+
+ 10
+ 5
+ 1
+ End
+
+
+
+ True
+ True
+ True
+ StockItem
+ gtk-ok
+ -5
+ gtk-ok
+
+
+ False
+ False
+
+
+
+
+
+
+
+ Reaction Status
+ CenterOnParent
+
+
+
+ True
+ In
+
+
+
+ None
+
+
+
+ 6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ReagentWindow
+ CenterOnParent
+
+
+
+ 6
+ 8
+
+
+
+ None
+
+
+
+ 0
+ 0
+ 12
+
+
+
+ 3
+ 3
+ 6
+ 6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <b>Ingredients</b>
+ True
+
+
+ label_item
+
+
+
+
+ 0
+ True
+
+
+
+
+
+ 2
+
+
+
+ 80
+ True
+ TextOnly
+ Ok
+ True
+
+
+
+ False
+ False
+
+
+
+
+
+ 80
+ True
+ TextOnly
+ Cancel
+ True
+
+
+
+ 1
+ False
+ False
+
+
+
+
+ End
+ 1
+ True
+ False
+ False
+
+
+
+
+
+
- Simulator
- CenterOnParent
+ False
+
+
+
+ 6
+
+
+
+ 4
+
+
+
+ 0
+ 0
+ 6
+ 6
+
+
+
+ 6
+
+
+
+ 6
+
+
+
+ Ingredient 1:
+
+
+ 0
+ True
+ False
+ False
+
+
+
+
+
+ True
+
+
+
+
+ 1
+ False
+
+
+
+
+ 0
+ True
+ False
+ False
+
+
+
+
+
+ 6
+
+
+
+ Ingredient 2:
+
+
+ 0
+ True
+ False
+ False
+
+
+
+
+
+ True
+
+
+
+
+ 1
+ False
+
+
+
+
+ 1
+ True
+ False
+ False
+
+
+
+
+
+ 6
+
+
+
+ Ingredient 3:
+
+
+ 0
+ True
+ False
+ False
+
+
+
+
+
+ True
+
+
+
+
+ 1
+ False
+
+
+
+
+ 2
+ True
+ False
+ False
+
+
+
+
+
+ False
+ False
+ True
+ TextOnly
+ Clear Reaction
+ True
+
+
+
+ End
+ 3
+ True
+ False
+ False
+ 6
+
+
+
+
+
+
+
+
+
+ <b>Select Ingredients</b>
+ True
+
+
+ label_item
+
+
+
+
+ 0
+ False
+
+
+
+
+
+ 4
+
+
+
+ 0
+ 0
+ 5
+ 5
+ 5
+ 6
+
+
+
+ 120
+ 6
+
+
+
+ 120
+ 120
+ ButtonPressMask
+
+
+ 0
+ True
+
+
+
+
+
+ True
+ TextOnly
+ Capture
+ True
+
+
+
+ 1
+ True
+ False
+ False
+
+
+
+
+
+
+
+
+
+ <b>Unmodified</b>
+ True
+ Center
+
+
+ label_item
+
+
+
+
+ 1
+ True
+ False
+ False
+
+
+
+
+
+ 4
+
+
+
+ 0
+ 0
+ 5
+ 5
+ 5
+ 6
+
+
+
+ 120
+ 6
+
+
+
+ 120
+ 120
+ ButtonPressMask
+
+
+ 0
+ True
+
+
+
+
+
+ True
+ TextOnly
+ Record
+ True
+
+
+
+ 1
+ True
+ False
+ False
+
+
+
+
+
+
+
+
+
+ <b>Reacted</b>
+ True
+ Center
+
+
+ label_item
+
+
+
+
+ 2
+ True
+ False
+ False
+
+
+
+
+
+
+
+
+ False
+
+
+
+ 6
+ 8
+
+
+
+ 6
+
+
+
+ 6
+
+
+
+ 6
+
+
+
+ True
+ 1
+ 14
+ 10
+ 1
+ 1
+ True
+ 1
+
+
+
+ 0
+ True
+ False
+ False
+
+
+
+
+
+ Minimum Ingredients
+
+
+ 1
+ True
+ False
+ False
+
+
+
+
+ 0
+ True
+ False
+ False
+
+
+
+
+
+ 6
+
+
+
+ True
+ 1
+ 14
+ 10
+ 1
+ 1
+ True
+ 5
+
+
+
+ 0
+ True
+ False
+ False
+
+
+
+
+
+ Maximum Ingredients
+
+
+ 1
+ True
+ False
+ False
+
+
+
+
+ 1
+ True
+ False
+ False
+
+
+
+
+
+
+
+ 2
+ True
+ False
+ False
+
+
+
+
+
+ True
+ Ribbon Recipes
+ True
+ True
+ True
+
+
+
+ 3
+ True
+ False
+ False
+
+
+
+
+
+ 6
+
+
+
+ True
+ 10
+ 100
+ 10
+ 1
+ 1
+ True
+ 14
+
+
+
+ 0
+ True
+ False
+ False
+
+
+
+
+
+ Maximum Concentration
+ True
+ True
+
+
+ 1
+ True
+ False
+ False
+
+
+
+
+ 4
+ True
+ False
+ False
+
+
+
+
+
+
+
+ 5
+ True
+ False
+ False
+ 8
+
+
+
+
+
+ 6
+
+
+
+ True
+ 15
+ 10
+ 1
+ 1
+ True
+ 4
+
+
+
+ 0
+ True
+ False
+ False
+
+
+
+
+
+ Full Quantity Depth
+
+
+ 1
+ True
+ False
+ False
+
+
+
+
+ 6
+ True
+ False
+ False
+
+
+
+
+
+
+
+ 7
+ True
+ False
+ False
+
+
+
+
+
+ 6
+
+
+
+ True
+ 30
+ 10
+ 1
+ 1
+ True
+ 20
+
+
+
+ 0
+ True
+ False
+ False
+
+
+
+
+
+ FullQuantity
+
+
+ 1
+ True
+ False
+ False
+
+
+
+
+ 8
+ True
+ False
+ False
+
+
+
+
+
+ None
+
+
+
+ 0
+ 0
+ 12
+
+
+
+ True
+ In
+
+
+
+ 300
+ True
+
+
+
+
+
+
+
+
+
+ <b>Ingredients</b>
+ True
+
+
+ label_item
+
+
+
+
+ End
+ 9
+ True
+
+
+
+
+
+
+
+ End
+ 10
+ True
+ False
+ False
+
+
+
+
+ 0
+ True
+ False
+ False
+
+
+
+
+
+ In
+
+
+
+ 300
+ True
+ True
+
+
+
+
+ 1
+ True
+
+
+
+
+
+ 6
+
+
+
+ 200
+ 200
+ None
+
+
+
+ In
+
+
+
+ True
+ True
+
+
+
+
+
+
+
+ <b>Recipe</b>
+ True
+
+
+ label_item
+
+
+
+
+ 0
+ True
+
+
+
+
+
+ True
+ TextOnly
+ Copy
+ True
+
+
+
+ 1
+ True
+ False
+ False
+
+
+
+
+
+ 200
+ ButtonPressMask
+
+
+ 2
+ True
+
+
+
+
+ 2
+ True
+ False
+ False
+
+
+
+
+ 0
+ False
+
+
+
+
+
+ 6
+
+
+
+
+
+ 0
+ True
+
+
+
+
+
+ False
+ True
+ TextOnly
+ Stop
+ True
+
+
+
+ 1
+ True
+ False
+ False
+ 20
+
+
+
+
+
+ 0/192
+
+
+ 2
+ True
+ False
+ False
+ 40
+
+
+
+
+
+ True
+ TextOnly
+ Begin
+ True
+
+
+
+ 3
+ True
+ False
+ False
+ 20
+
+
+
+
+
+
+
+ 4
+ True
+
+
+
+
+ 1
+ True
+ False
+ False
+
+
+
+
+
+
+
+ End
+ 2
+ True
+ False
+ False
+
+
+
+
+
+
+
+ False
@@ -974,888 +1890,4 @@ You can either import an existing Practi
-
-
- Screen Check
- CenterOnParent
- True
- 9
- 1
- False
-
-
-
-
-
-
- 20
- 20
-
-
-
- 20
- 10
-
-
-
- Screen Resolution
-
-
- 0
- True
- False
- False
-
-
-
-
-
- 50
- True
- True
- ●
-
-
- 1
- True
-
-
-
-
-
- 50
- True
- True
- ●
-
-
- 2
- True
-
-
-
-
- 0
- True
- False
- False
-
-
-
-
-
- 20
- 10
-
-
-
- Game Pixel Width in Screen Pixels
-
-
- 0
- True
- False
- False
-
-
-
-
-
- 50
- True
- True
- ●
-
-
- 1
- False
- False
- False
-
-
-
-
-
-
-
- 1
- True
- False
- False
-
-
-
-
-
-
-
- 0
- True
-
-
-
-
-
-
-
- 10
- 5
- 1
- End
-
-
-
- True
- True
- True
- StockItem
- gtk-ok
- -5
- gtk-ok
-
-
- False
- False
-
-
-
-
-
-
-
- Reaction Status
- CenterOnParent
-
-
-
- True
- In
-
-
-
- None
-
-
-
- 6
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Action
- Export
- Export
-
-
- Action
- Export to Wiki
- Export to Wiki
-
-
-
- Action
- Settings
- Tools
-
-
- Action
- Ingredients
- Ingredients
-
-
-
- Action
- Copy to Clipboard
- Copy to Clipboard
-
-
-
-
- Recipe Generator
- CenterOnParent
-
-
-
- 6
- 8
-
-
-
- 0
- True
- False
- False
-
-
-
-
-
- 6
-
-
-
- 6
-
-
-
- 6
-
-
-
- True
- 1
- 14
- 10
- 1
- 1
- True
- 1
-
-
-
- 0
- True
- False
- False
-
-
-
-
-
- Minimum Ingredients
-
-
- 1
- True
- False
- False
-
-
-
-
- 0
- True
- False
- False
-
-
-
-
-
- 6
-
-
-
- True
- 1
- 14
- 10
- 1
- 1
- True
- 5
-
-
-
- 0
- True
- False
- False
-
-
-
-
-
- Maximum Ingredients
-
-
- 1
- True
- False
- False
-
-
-
-
- 1
- True
- False
- False
-
-
-
-
-
-
-
- 2
- True
- False
- False
-
-
-
-
-
- 6
-
-
-
- True
- 10
- 100
- 10
- 1
- 1
- True
- 14
-
-
-
- 0
- True
- False
- False
-
-
-
-
-
- Max Total Quantity
- True
- True
-
-
- 1
- True
- False
- False
-
-
-
-
- 3
- True
- False
- False
-
-
-
-
-
-
-
- 4
- True
- False
- False
- 8
-
-
-
-
-
- 6
-
-
-
- True
- 15
- 10
- 1
- 1
- True
- 4
-
-
-
- 0
- True
- False
- False
-
-
-
-
-
- Full Quantity Depth
-
-
- 1
- True
- False
- False
-
-
-
-
- 5
- True
- False
- False
-
-
-
-
-
-
-
- 6
- True
- False
- False
-
-
-
-
-
- 6
-
-
-
- True
- 30
- 10
- 1
- 1
- True
- 20
-
-
-
- 0
- True
- False
- False
-
-
-
-
-
- FullQuantity
-
-
- 1
- True
- False
- False
-
-
-
-
- 7
- True
- False
- False
-
-
-
-
-
- None
-
-
-
- 0
- 0
- 12
-
-
-
- True
- In
-
-
-
- 300
- True
-
-
-
-
-
-
-
-
-
- <b>Ingredients</b>
- True
-
-
- label_item
-
-
-
-
- End
- 8
- True
-
-
-
-
-
-
-
- End
- 9
- True
- False
- False
-
-
-
-
- 0
- True
- False
- False
-
-
-
-
-
- In
-
-
-
- 300
- True
- True
-
-
-
-
- 1
- True
-
-
-
-
-
- 6
-
-
-
- 200
- 200
- None
-
-
-
- In
-
-
-
- True
- True
-
-
-
-
-
-
-
- <b>Recipe</b>
- True
-
-
- label_item
-
-
-
-
- 0
- True
-
-
-
-
-
- True
- TextOnly
- Copy
- True
-
-
-
- 1
- True
- False
- False
-
-
-
-
-
- 200
- ButtonPressMask
-
-
- 2
- True
-
-
-
-
- 2
- True
- False
- False
-
-
-
-
- 1
- False
-
-
-
-
-
- 6
-
-
-
-
-
- 0
- True
-
-
-
-
-
- False
- True
- TextOnly
- Stop
- True
-
-
-
- 1
- True
- False
- False
- 20
-
-
-
-
-
- 0/192
-
-
- 2
- True
- False
- False
- 40
-
-
-
-
-
- True
- TextOnly
- Begin
- True
-
-
-
- 3
- True
- False
- False
- 20
-
-
-
-
-
-
-
- 4
- True
-
-
-
-
- 2
- True
- False
- False
-
-
-
-
-
-
-
- End
- 3
- True
- False
- False
-
-
-
-
-
-
-
- End
- 4
- True
- False
- False
-
-
-
-
-
-
-
- ReagentWindow
- CenterOnParent
-
-
-
- 6
- 8
-
-
-
- None
-
-
-
- 0
- 0
- 12
-
-
-
- 3
- 3
- 6
- 6
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <b>Ingredients</b>
- True
-
-
- label_item
-
-
-
-
- 0
- True
-
-
-
-
-
- 2
-
-
-
- 80
- True
- TextOnly
- Ok
- True
-
-
-
- False
- False
-
-
-
-
-
- 80
- True
- TextOnly
- Cancel
- True
-
-
-
- 1
- False
- False
-
-
-
-
- End
- 1
- True
- False
- False
-
-
-
-
-
\ No newline at end of file