diff --git a/MainWindow.cs b/MainWindow.cs --- a/MainWindow.cs +++ b/MainWindow.cs @@ -29,6 +29,8 @@ using DesertPaintLab; public partial class MainWindow : Gtk.Window { + const string APP_VERSION = "1.1.10"; + bool unsavedData = false; bool shouldShutDown = false; string appDataPath; @@ -84,9 +86,33 @@ public partial class MainWindow : Gtk.Wi reagents[2] = null; string colorsPath = FileUtils.FindApplicationResourceFile("colors.txt"); + if (colorsPath == null) + { + // failed to find colors.txt file + MessageDialog md = new MessageDialog(this, + DialogFlags.DestroyWithParent, + MessageType.Error, ButtonsType.Close, + "Failed to find colors.txt file. Please check your installation."); + + md.Run(); + md.Destroy(); + Application.Quit(); + } Palette.Load(colorsPath); string ingredientsPath = FileUtils.FindApplicationResourceFile("ingredients.txt"); + if (ingredientsPath == null) + { + // failed to find ingredients.txt file + MessageDialog md = new MessageDialog(this, + DialogFlags.DestroyWithParent, + MessageType.Error, ButtonsType.Close, + "Failed to find ingredients.txt file. Please check your installation."); + + md.Run(); + md.Destroy(); + Application.Quit(); + } ReagentManager.Load(ingredientsPath); Build(); @@ -267,9 +293,17 @@ public partial class MainWindow : Gtk.Wi // Set profile name. SetProfileName(newProfileDialog.ProfileName); - profile.Initialize(); - - newProfileCreated = true; + newProfileCreated = profile.Initialize(); + if (!newProfileCreated) + { + MessageDialog md = new MessageDialog(this, + DialogFlags.DestroyWithParent, + MessageType.Error, ButtonsType.Ok, + "Failed to initialize profile: " + profile.LastError); + resp = (ResponseType)md.Run(); + md.Destroy(); + duplicateName = false; + } } } newProfileDialog.Destroy(); @@ -333,9 +367,23 @@ public partial class MainWindow : Gtk.Wi if (profileSelected) { - profile.Load(); - PopulateDropDowns(); - recipe.Reactions = profile.Reactions; + bool ok = profile.Load(); + if (ok) + { + PopulateDropDowns(); + recipe.Reactions = profile.Reactions; + } + else + { + MessageDialog md = new MessageDialog(this, + DialogFlags.DestroyWithParent, + MessageType.Error, ButtonsType.Ok, + "Error loading profile: " + profile.LastError); + + md.Run(); + md.Destroy(); + profileSelected = false; + } } return profileSelected; @@ -692,9 +740,21 @@ public partial class MainWindow : Gtk.Wi if (NewProfile()) { - profile.Load(); - PopulateDropDowns(); - recipe.Reactions = profile.Reactions; + bool ok = profile.Load(); + if (ok) + { + PopulateDropDowns(); + recipe.Reactions = profile.Reactions; + } + else + { + MessageDialog md = new MessageDialog(this, + DialogFlags.DestroyWithParent, + MessageType.Warning, ButtonsType.OkCancel, + "Failed to load profile: " + profile.LastError); + md.Run(); + md.Destroy(); + } } } @@ -716,8 +776,20 @@ public partial class MainWindow : Gtk.Wi } if (profileSelected) { - profile.Load(); - PopulateDropDowns(); + bool ok = profile.Load(); + if (ok) + { + PopulateDropDowns(); + } + else + { + MessageDialog md = new MessageDialog(this, + DialogFlags.DestroyWithParent, + MessageType.Warning, ButtonsType.OkCancel, + "Failed to load profile: " + profile.LastError); + md.Run(); + md.Destroy(); + } } } @@ -726,7 +798,7 @@ public partial class MainWindow : Gtk.Wi AboutDialog aboutDialog = new AboutDialog(); aboutDialog.ProgramName = "Desert Paint Lab"; - aboutDialog.Version = "0.0.1"; + aboutDialog.Version = APP_VERSION ; aboutDialog.Comments = "Desert Paint Lab paint reaction recorder for A Tale in the Desert"; aboutDialog.Authors = new string [] {"Tess Snider", "Jason Maltzen"}; //aboutDialog.Website = "http://www.google.com/"; @@ -867,9 +939,21 @@ public partial class MainWindow : Gtk.Wi { profile.Import(targetFile); } - profile.Load(); - PopulateDropDowns(); - recipe.Reactions = profile.Reactions; + bool ok = profile.Load(); + if (ok) + { + PopulateDropDowns(); + recipe.Reactions = profile.Reactions; + } + else + { + MessageDialog md = new MessageDialog(this, + DialogFlags.DestroyWithParent, + MessageType.Warning, ButtonsType.OkCancel, + "Failed to load imported profile: " + profile.LastError); + md.Run(); + md.Destroy(); + } } fileDialog.Destroy(); } diff --git a/PaintRecipe.cs b/PaintRecipe.cs --- a/PaintRecipe.cs +++ b/PaintRecipe.cs @@ -205,7 +205,10 @@ namespace DesertPaintLab byte CalculateColor(int baseSum, uint pigmentCount, int reactSum) { // Changed to Math.Floor from Math.Round, since Round appears to be incorrect. - return (byte)Math.Max(Math.Min(Math.Floor((((float)baseSum / (float)pigmentCount) + (float)reactSum)), 255), 0); + return (byte)Math.Max( + Math.Min(Math.Floor((((float)baseSum / (float)pigmentCount) + (float)reactSum)), + 255), + 0); } // Compute the color including reactions based on the player's profile diff --git a/PlayerProfile.cs b/PlayerProfile.cs --- a/PlayerProfile.cs +++ b/PlayerProfile.cs @@ -20,6 +20,7 @@ THE SOFTWARE. */ +using Gtk; using System; using System.IO; using System.IO.Compression; @@ -52,6 +53,8 @@ namespace DesertPaintLab return current; } } + + public string LastError { get; private set; } public PlayerProfile(string name, string directory) { @@ -109,7 +112,7 @@ namespace DesertPaintLab } } - public void Initialize() + public bool Initialize() { // Create new directory. System.IO.Directory.CreateDirectory(directory); @@ -119,6 +122,8 @@ namespace DesertPaintLab if (!System.IO.Directory.Exists(templatePath)) { + LastError = "Failed to find profile template folder."; + return false; } DirectoryInfo di = new DirectoryInfo(templatePath); @@ -126,9 +131,15 @@ namespace DesertPaintLab foreach (FileInfo file in templateFiles) { - System.IO.File.Copy(file.FullName, - System.IO.Path.Combine(directory, file.Name), true); + string destFile = System.IO.Path.Combine(directory, file.Name); + System.IO.File.Copy(file.FullName, destFile, true); + if (!File.Exists(destFile)) + { + LastError = "Failed to copy template file " + file.Name + "."; + return false; + } } + return true; } public void ConvertFromPP(string ppFile, string dpFile) @@ -291,12 +302,25 @@ namespace DesertPaintLab ZipFile.CreateFromDirectory(directory, file); } - public void Load() + public bool Load() { string line; reactions.Clear(); - ReagentManager.LoadProfileReagents(reagentFile); + if (File.Exists(reagentFile)) + { + ReagentManager.LoadProfileReagents(reagentFile); + } + else + { + LastError = "Failed to find profile reagents file."; + return false; + } ReagentManager.InitializeReactions(ref reactions); + if (!File.Exists(reactFile)) + { + LastError = "Failed to find profile reactions file."; + return false; + } using (StreamReader reader = new StreamReader(reactFile)) { while ((line = reader.ReadLine()) != null) @@ -307,6 +331,7 @@ namespace DesertPaintLab reactions.Set(reagent1, reagent2, new Reaction(int.Parse(tokens[2]), int.Parse(tokens[3]), int.Parse(tokens[4]))); } } + return true; } public void Save() diff --git a/RecipeGenerator.cs b/RecipeGenerator.cs --- a/RecipeGenerator.cs +++ b/RecipeGenerator.cs @@ -66,6 +66,7 @@ namespace DesertPaintLab public uint MaxQuantity { get; private set; } // maximum number of total ingredients 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 public uint FullQuantity { get; private set; } // The max number of a reagent to use at full quantity @@ -106,6 +107,9 @@ namespace DesertPaintLab recipes.Add(color.Name, new PaintRecipe()); recipeCosts.Add(color.Name, uint.MaxValue); } + MinReagents = 1; + MaxReagents = 5; + MaxQuantity = 20; } public SortedDictionary Recipes @@ -179,7 +183,7 @@ namespace DesertPaintLab costSortedReagents.Sort(new ReagentCostSort()); } - public void BeginRecipeGeneration(uint maxQuantity, uint maxReagents, uint fullQuantityDepth, uint fullQuantity) + public void BeginRecipeGeneration(uint maxQuantity, uint minReagents, uint maxReagents, uint fullQuantityDepth, uint fullQuantity) { if (running) { @@ -188,6 +192,7 @@ namespace DesertPaintLab } this.MaxQuantity = maxQuantity; + this.MinReagents = minReagents; this.MaxReagents = maxReagents; this.FullQuantity = fullQuantity; this.FullQuantityDepth = fullQuantityDepth; @@ -217,6 +222,7 @@ namespace DesertPaintLab } } this.MaxReagents = (uint)Math.Min(enabledReagentCount, this.MaxReagents); + this.MinReagents = (uint)Math.Min(this.MinReagents, this.MaxReagents); while (!searchQueue.IsEmpty) { @@ -231,6 +237,7 @@ namespace DesertPaintLab initialNode.FullQuantity = FullQuantity; initialNode.FullQuantityDepth = FullQuantityDepth; initialNode.MaxQuantity = maxQuantity; + initialNode.MinReagents = minReagents; initialNode.MaxReagents = maxReagents; searchQueue.Enqueue(initialNode); } @@ -240,7 +247,7 @@ namespace DesertPaintLab if (log != null) { - log.WriteLine("Begin recipe generation: MaxQuantity={0} MaxReagents={1} FullQuantity={2} FullQuantityDepth={3}", MaxQuantity, MaxReagents, FullQuantity, FullQuantityDepth); + log.WriteLine("Begin recipe generation: MaxQuantity={0} MinReagents={1} MaxReagents={2} FullQuantity={3} FullQuantityDepth={4}", MaxQuantity, MinReagents, MaxReagents, FullQuantity, FullQuantityDepth); } // start worker threads to do the actual work @@ -293,6 +300,7 @@ namespace DesertPaintLab using (StreamWriter writer = new StreamWriter(file, false)) { + writer.WriteLine("MinReagents: {0}", MinReagents); writer.WriteLine("MaxReagents: {0}", MaxReagents); writer.WriteLine("FullQuantityDepth: {0}", FullQuantityDepth); writer.WriteLine("FullQuantity: {0}", FullQuantity); @@ -345,8 +353,13 @@ namespace DesertPaintLab string value = match.Groups["value"].Value; switch(match.Groups["key"].Value) { + case "MinReagents": + MinReagents = uint.Parse(value); + MaxReagents = (uint)Math.Max(this.MinReagents, this.MaxReagents); + break; case "MaxReagents": MaxReagents = uint.Parse(value); + MinReagents = (uint)Math.Min(this.MinReagents, this.MaxReagents); break; case "FullQuantityDepth": FullQuantityDepth = uint.Parse(value); @@ -401,6 +414,7 @@ namespace DesertPaintLab RecipeSearchNode node = new RecipeSearchNode(costSortedReagents); node.FullQuantity = FullQuantity; node.FullQuantityDepth = FullQuantityDepth; + node.MinReagents = MinReagents; node.MaxReagents = MaxReagents; node.MaxQuantity = MaxQuantity; success = success && node.LoadState(reader); @@ -590,26 +604,26 @@ namespace DesertPaintLab { if (!node.AddNextReagent()) { - while ((node.ReagentCount > node.InitialCount) && (node.LastReagent == (totalReagents-1))) + while ((node.ReagentCount > node.MinReagents) && (node.LastReagent == (totalReagents-1))) { node.RemoveLastReagent(); } - if (node.ReagentCount == node.InitialCount) + if (node.ReagentCount == node.MinReagents) { // done return false; } uint nextReagent = node.NextFreeReagent(node.LastReagent); - while ((node.ReagentCount > node.InitialCount) && (nextReagent >= totalReagents)) + while ((node.ReagentCount > node.MinReagents) && (nextReagent >= totalReagents)) { // No more reagents to try at this level node.RemoveLastReagent(); - if (node.ReagentCount > node.InitialCount) + if (node.ReagentCount > node.MinReagents) { nextReagent = node.NextFreeReagent(node.LastReagent); } } - if (node.ReagentCount == node.InitialCount) + if (node.ReagentCount == node.MinReagents) { // done return false; @@ -681,9 +695,9 @@ namespace DesertPaintLab do { recipeFound = false; // back out until we find a node that can be incremented - if (currentDepth > node.InitialCount) + if (currentDepth > node.MinReagents) { - while (node.ReagentCount > node.InitialCount) + while (node.ReagentCount > node.MinReagents) { if (node.LastReagent < (totalReagents - 1)) { @@ -699,7 +713,7 @@ namespace DesertPaintLab // shouldn't happen //Console.WriteLine("No available reagents at depth {0}!", node.ReagentCount); node.RemoveLastReagent(); - if (node.ReagentCount == node.InitialCount) + if (node.ReagentCount == node.MinReagents) { // just popped the last reagent at the top level ++currentDepth; @@ -711,7 +725,7 @@ namespace DesertPaintLab { //Console.WriteLine("Pop last reagent"); node.RemoveLastReagent(); - if (node.ReagentCount == node.InitialCount) + if (node.ReagentCount == node.MinReagents) { // just popped the last reagent at the top level ++currentDepth; @@ -720,7 +734,7 @@ namespace DesertPaintLab } } // fill in the nodes up to the current depth - if (node.ReagentCount >= node.InitialCount) + if (node.ReagentCount >= node.MinReagents) { recipeFound = true; while (node.ReagentCount < currentDepth) @@ -733,8 +747,8 @@ namespace DesertPaintLab } } } - //Console.WriteLine("Catalysts: {0} Reagents: {1} Initial: {2}", node.CatalystCount, node.ReagentCount, node.InitialCount); - } while ((node.CatalystCount >= node.ReagentCount) && (node.ReagentCount >= node.InitialCount)); // make sure to skip all-catalyst combinations + //Console.WriteLine("Catalysts: {0} Reagents: {1} Min: {2}", node.CatalystCount, node.ReagentCount, node.MinReagents); + } while ((node.CatalystCount >= node.ReagentCount) && (node.ReagentCount >= node.MinReagents)); // make sure to skip all-catalyst combinations if (recipeFound) { break; diff --git a/RecipeGeneratorWindow.cs b/RecipeGeneratorWindow.cs --- a/RecipeGeneratorWindow.cs +++ b/RecipeGeneratorWindow.cs @@ -69,13 +69,15 @@ namespace DesertPaintLab { 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(0, ReagentManager.Names.Count); + maxIngredientsSpinButton.SetRange(1, ReagentManager.Names.Count); + minIngredientsSpinButton.SetRange(1, ReagentManager.Names.Count); Gtk.TreeViewColumn recipeColorColumn = new Gtk.TreeViewColumn(); @@ -212,8 +214,24 @@ namespace DesertPaintLab 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 } @@ -238,6 +256,7 @@ namespace DesertPaintLab protected void OnBegin(object sender, EventArgs e) { + minIngredientsSpinButton.Sensitive = false; maxIngredientsSpinButton.Sensitive = false; ExportToWikiAction.Sensitive = false; IngredientsAction.Sensitive = false; @@ -276,7 +295,7 @@ namespace DesertPaintLab pauseForCheckpoint = false; stopResumeButton.Label = "Pause"; - generator.BeginRecipeGeneration((uint)maxRecipeSpinButton.ValueAsInt, (uint)maxIngredientsSpinButton.ValueAsInt, (uint)fullQuantityDepthSpinButton.ValueAsInt, (uint)fullQuantitySpinButton.ValueAsInt); + generator.BeginRecipeGeneration((uint)maxRecipeSpinButton.ValueAsInt, (uint)minIngredientsSpinButton.Value, (uint)maxIngredientsSpinButton.ValueAsInt, (uint)fullQuantityDepthSpinButton.ValueAsInt, (uint)fullQuantitySpinButton.ValueAsInt); } protected void OnStopResume(object sender, EventArgs e) @@ -295,6 +314,7 @@ namespace DesertPaintLab ExportToWikiAction.Sensitive = false; IngredientsAction.Sensitive = false; reagentListView.Sensitive = false; + minIngredientsSpinButton.Sensitive = false; maxIngredientsSpinButton.Sensitive = false; maxRecipeSpinButton.Sensitive = false; beginButton.Sensitive = false; @@ -334,6 +354,7 @@ namespace DesertPaintLab ExportToWikiAction.Sensitive = true; IngredientsAction.Sensitive = true; stopResumeButton.Sensitive = false; + minIngredientsSpinButton.Sensitive = true; maxIngredientsSpinButton.Sensitive = true; maxRecipeSpinButton.Sensitive = true; fullQuantitySpinButton.Sensitive = true; diff --git a/RecipeSearchNode.cs b/RecipeSearchNode.cs --- a/RecipeSearchNode.cs +++ b/RecipeSearchNode.cs @@ -63,13 +63,13 @@ namespace DesertPaintLab } } - public int InitialCount { get; private set; } public uint CurrentTargetQuantity { get; set; } public uint MaxQuantity { get; set; } public uint UsedQuantity { get; private set; } public uint CatalystCount { get; set; } public uint FullQuantityDepth { get; set; } public uint FullQuantity { get; set; } + public uint MinReagents { get; set; } uint maxReagents; public uint MaxReagents @@ -124,7 +124,7 @@ namespace DesertPaintLab reagentInUse[reagentIdx] = true; } } - InitialCount = nextReagentPos; + MinReagents = (uint)nextReagentPos; MaxReagents = (uint)nextReagentPos; // better set this later! UsedQuantity = 0; } @@ -147,7 +147,7 @@ namespace DesertPaintLab } this.reagents[nextReagentPos++] = NextFreeReagent(startReagent); //Console.WriteLine("Added reagent {0} at pos {1}", this.reagents[nextReagentPos-1], nextReagentPos-1); - InitialCount = 1; // don't iterate up beyond the start reagent + MinReagents = 1; // don't iterate up beyond the start reagent MaxReagents = 1; UsedQuantity = 0; } @@ -168,7 +168,7 @@ namespace DesertPaintLab reagentInUse[reagentIdx] = false; } this.reagents[nextReagentPos++] = NextFreeReagent(0); - InitialCount = 0; + MinReagents = 0; MaxReagents = 1; UsedQuantity = 0; } @@ -300,6 +300,7 @@ namespace DesertPaintLab public void SaveState(StreamWriter writer) { writer.WriteLine("---SearchNode---"); + writer.WriteLine("MinReagents: {0}", MinReagents); writer.WriteLine("MaxReagents: {0}", MaxReagents); writer.WriteLine("Reagents: {0}", nextReagentPos); for (int i = 0; i < nextReagentPos; ++i) @@ -314,7 +315,6 @@ namespace DesertPaintLab writer.WriteLine("MaxQuantity: {0}", MaxQuantity); writer.WriteLine("UsedQuantity: {0}", UsedQuantity); writer.WriteLine("CatalystCount: {0}", CatalystCount); - writer.WriteLine("InitialCount: {0}", InitialCount); writer.WriteLine("FullQuantity: {0}", FullQuantity); writer.WriteLine("FullQuantityDepth: {0}", FullQuantityDepth); writer.WriteLine("---EndNode---"); @@ -392,6 +392,12 @@ namespace DesertPaintLab MaxQuantity = value; } break; + case "MinReagents": + { + uint value = uint.Parse(match.Groups[2].Value); + MinReagents = value; + } + break; case "MaxReagents": { uint value = uint.Parse(match.Groups[2].Value); @@ -412,8 +418,8 @@ namespace DesertPaintLab break; case "InitialCount": { - int value = int.Parse(match.Groups[2].Value); - InitialCount = value; + uint value = uint.Parse(match.Groups[2].Value); + MinReagents = value; } break; case "FullQuantity": diff --git a/gtk-gui/DesertPaintLab.RecipeGeneratorWindow.cs b/gtk-gui/DesertPaintLab.RecipeGeneratorWindow.cs --- a/gtk-gui/DesertPaintLab.RecipeGeneratorWindow.cs +++ b/gtk-gui/DesertPaintLab.RecipeGeneratorWindow.cs @@ -26,6 +26,12 @@ namespace DesertPaintLab 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; @@ -153,23 +159,24 @@ namespace DesertPaintLab this.hbox2.Name = "hbox2"; this.hbox2.Spacing = 6; // Container child hbox2.Gtk.Box+BoxChild - this.maxIngredientsSpinButton = new global::Gtk.SpinButton (0, 14, 1); - this.maxIngredientsSpinButton.CanFocus = true; - this.maxIngredientsSpinButton.Name = "maxIngredientsSpinButton"; - this.maxIngredientsSpinButton.Adjustment.PageIncrement = 10; - this.maxIngredientsSpinButton.ClimbRate = 1; - this.maxIngredientsSpinButton.Numeric = true; - this.hbox2.Add (this.maxIngredientsSpinButton); - global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.maxIngredientsSpinButton])); + 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.label3 = new global::Gtk.Label (); - this.label3.Name = "label3"; - this.label3.LabelProp = "Maximum Ingredients"; - this.hbox2.Add (this.label3); - global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.hbox2 [this.label3])); + 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; @@ -179,29 +186,61 @@ namespace DesertPaintLab 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 w6 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hseparator3])); - w6.Position = 1; - w6.Expand = false; - w6.Fill = false; + 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 (0, 100, 1); + 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 w7 = ((global::Gtk.Box.BoxChild)(this.hbox4 [this.maxRecipeSpinButton])); - w7.Position = 0; - w7.Expand = false; - w7.Fill = false; + 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"; @@ -209,24 +248,24 @@ namespace DesertPaintLab this.label4.UseMarkup = true; this.label4.Wrap = true; this.hbox4.Add (this.label4); - global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.hbox4 [this.label4])); - w8.Position = 1; - w8.Expand = false; - w8.Fill = false; + 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 w9 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hbox4])); - w9.Position = 2; - w9.Expand = false; - w9.Fill = false; + 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 w10 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hseparator4])); - w10.Position = 3; - w10.Expand = false; - w10.Fill = false; - w10.Padding = ((uint)(8)); + 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"; @@ -238,33 +277,34 @@ namespace DesertPaintLab 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 w11 = ((global::Gtk.Box.BoxChild)(this.hbox5 [this.fullQuantityDepthSpinButton])); - w11.Position = 0; - w11.Expand = false; - w11.Fill = false; + 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 w12 = ((global::Gtk.Box.BoxChild)(this.hbox5 [this.label8])); - w12.Position = 1; - w12.Expand = false; - w12.Fill = false; + 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 w13 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hbox5])); - w13.Position = 4; - w13.Expand = false; - w13.Fill = false; + 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 w14 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hseparator5])); - w14.Position = 5; - w14.Expand = false; - w14.Fill = false; + 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"; @@ -276,25 +316,26 @@ namespace DesertPaintLab 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 w15 = ((global::Gtk.Box.BoxChild)(this.hbox6 [this.fullQuantitySpinButton])); - w15.Position = 0; - w15.Expand = false; - w15.Fill = false; + 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 w16 = ((global::Gtk.Box.BoxChild)(this.hbox6 [this.label9])); - w16.Position = 1; - w16.Expand = false; - w16.Fill = false; + 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 w17 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hbox6])); - w17.Position = 6; - w17.Expand = false; - w17.Fill = false; + 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"; @@ -322,23 +363,23 @@ namespace DesertPaintLab this.GtkLabel4.UseMarkup = true; this.frame3.LabelWidget = this.GtkLabel4; this.vbox8.Add (this.frame3); - global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.frame3])); - w21.PackType = ((global::Gtk.PackType)(1)); - w21.Position = 7; + 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 w22 = ((global::Gtk.Box.BoxChild)(this.vbox8 [this.hseparator6])); - w22.PackType = ((global::Gtk.PackType)(1)); - w22.Position = 8; - w22.Expand = false; - w22.Fill = false; + 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 w23 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox8])); - w23.Position = 0; - w23.Expand = false; - w23.Fill = false; + 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"; @@ -350,8 +391,8 @@ namespace DesertPaintLab this.recipeList.Name = "recipeList"; this.GtkScrolledWindow1.Add (this.recipeList); this.hbox1.Add (this.GtkScrolledWindow1); - global::Gtk.Box.BoxChild w25 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.GtkScrolledWindow1])); - w25.Position = 1; + 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"; @@ -378,8 +419,8 @@ namespace DesertPaintLab this.recipeLabel.UseMarkup = true; this.frame2.LabelWidget = this.recipeLabel; this.vbox3.Add (this.frame2); - global::Gtk.Box.BoxChild w28 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.frame2])); - w28.Position = 0; + 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; @@ -387,26 +428,26 @@ namespace DesertPaintLab this.button919.UseUnderline = true; this.button919.Label = "Copy"; this.vbox3.Add (this.button919); - global::Gtk.Box.BoxChild w29 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.button919])); - w29.Position = 1; - w29.Expand = false; - w29.Fill = false; + 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 w30 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.paintSwatch])); - w30.Position = 2; + 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 w31 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox3])); - w31.Position = 2; - w31.Expand = false; - w31.Fill = false; + 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 w32 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox1])); - w32.Position = 1; + 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"; @@ -415,8 +456,8 @@ namespace DesertPaintLab this.hseparator2 = new global::Gtk.HSeparator (); this.hseparator2.Name = "hseparator2"; this.hbox3.Add (this.hseparator2); - global::Gtk.Box.BoxChild w33 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.hseparator2])); - w33.Position = 0; + 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; @@ -425,21 +466,21 @@ namespace DesertPaintLab this.stopResumeButton.UseUnderline = true; this.stopResumeButton.Label = "Stop"; this.hbox3.Add (this.stopResumeButton); - global::Gtk.Box.BoxChild w34 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.stopResumeButton])); - w34.Position = 1; - w34.Expand = false; - w34.Fill = false; - w34.Padding = ((uint)(20)); + 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 w35 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.countLabel])); - w35.Position = 2; - w35.Expand = false; - w35.Fill = false; - w35.Padding = ((uint)(40)); + 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; @@ -447,40 +488,40 @@ namespace DesertPaintLab this.beginButton.UseUnderline = true; this.beginButton.Label = "Begin"; this.hbox3.Add (this.beginButton); - global::Gtk.Box.BoxChild w36 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.beginButton])); - w36.Position = 3; - w36.Expand = false; - w36.Fill = false; - w36.Padding = ((uint)(20)); + 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 w37 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.hseparator1])); - w37.Position = 4; + 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 w38 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.hbox3])); - w38.Position = 2; - w38.Expand = false; - w38.Fill = false; + 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 w39 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.statusLabel])); - w39.PackType = ((global::Gtk.PackType)(1)); - w39.Position = 3; - w39.Expand = false; - w39.Fill = false; + 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 w40 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.progressBar])); - w40.PackType = ((global::Gtk.PackType)(1)); - w40.Position = 4; - w40.Expand = false; - w40.Fill = false; + 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 (); @@ -491,6 +532,7 @@ namespace DesertPaintLab 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); diff --git a/gtk-gui/gui.stetic b/gtk-gui/gui.stetic --- a/gtk-gui/gui.stetic +++ b/gtk-gui/gui.stetic @@ -6,7 +6,7 @@ - + @@ -1196,7 +1196,7 @@ You can either import an existing Practi - + @@ -1223,14 +1223,60 @@ You can either import an existing Practi 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 @@ -1254,7 +1300,7 @@ You can either import an existing Practi - 0 + 1 True False False @@ -1265,7 +1311,7 @@ You can either import an existing Practi - 1 + 2 True False False @@ -1279,11 +1325,13 @@ You can either import an existing Practi True + 10 100 10 1 1 True + 14 @@ -1309,7 +1357,7 @@ You can either import an existing Practi - 2 + 3 True False False @@ -1320,7 +1368,7 @@ You can either import an existing Practi - 3 + 4 True False False @@ -1340,6 +1388,7 @@ You can either import an existing Practi 1 1 True + 4 @@ -1363,7 +1412,7 @@ You can either import an existing Practi - 4 + 5 True False False @@ -1374,7 +1423,7 @@ You can either import an existing Practi - 5 + 6 True False False @@ -1393,6 +1442,7 @@ You can either import an existing Practi 1 1 True + 20 @@ -1416,7 +1466,7 @@ You can either import an existing Practi - 6 + 7 True False False @@ -1461,7 +1511,7 @@ You can either import an existing Practi End - 7 + 8 True @@ -1471,7 +1521,7 @@ You can either import an existing Practi End - 8 + 9 True False False