From d5adeff27ade214ac7e33e476985a9332e080597 Mon Sep 17 00:00:00 2001 From: Alexandre Agostinho Date: Thu, 11 May 2023 09:52:42 +0200 Subject: [PATCH 01/15] start #31 --- MCTG/ConsoleApp/Menu/IMenu.cs | 22 ++++ MCTG/ConsoleApp/Menu/Menu.cs | 79 ++++++++++++ MCTG/ConsoleApp/Menu/SearcherRecipe.cs | 119 ++---------------- MCTG/ConsoleApp/Menu/Selector.cs | 32 +++++ MCTG/ConsoleApp/MenuManager.cs | 64 ++++++++++ MCTG/ConsoleApp/Program.cs | 2 +- .../Manager.cs => Managers/DataManager.cs} | 6 +- 7 files changed, 212 insertions(+), 112 deletions(-) create mode 100644 MCTG/ConsoleApp/Menu/IMenu.cs create mode 100644 MCTG/ConsoleApp/Menu/Menu.cs create mode 100644 MCTG/ConsoleApp/Menu/Selector.cs create mode 100644 MCTG/ConsoleApp/MenuManager.cs rename MCTG/Model/{Manager/Manager.cs => Managers/DataManager.cs} (89%) diff --git a/MCTG/ConsoleApp/Menu/IMenu.cs b/MCTG/ConsoleApp/Menu/IMenu.cs new file mode 100644 index 0000000..4f1aab2 --- /dev/null +++ b/MCTG/ConsoleApp/Menu/IMenu.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConsoleApp.Menu +{ + internal interface IMenu + { + bool WriteMode { get; set; } + StringBuilder InputStr { get; set; } + + void Display(); + void Update(); + void SelectNext(); + void SelectPrevious(); + void EnableWriteMode(); + void DisableWriteMode(); + void Return(); + } +} diff --git a/MCTG/ConsoleApp/Menu/Menu.cs b/MCTG/ConsoleApp/Menu/Menu.cs new file mode 100644 index 0000000..c7ede43 --- /dev/null +++ b/MCTG/ConsoleApp/Menu/Menu.cs @@ -0,0 +1,79 @@ +using Model; +using System; +using System.Collections.Generic; +using System.ComponentModel.Design; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConsoleApp.Menu +{ + internal abstract class Menu : IMenu + { + protected StringBuilder _screenDisplay; + protected readonly List> _selectList; + + public string Title { get; private set; } + public StringBuilder InputStr { get; set; } + public int CurrentLine { get; private set; } + public T CurrentSelected { get; private set; } + public bool WriteMode { get; set; } + + public Menu(string title, params Selector[] selections ) + { + if (selections == null || selections.Length == 0) + throw new ArgumentException("Error: a menu must contain at least 1 selection"); + + Title = title; + CurrentLine = 0; + CurrentSelected = selections[0].Item; + WriteMode = false; + _selectList = new List>(selections); + _screenDisplay = new StringBuilder(); + InputStr = new StringBuilder(); + } + + public virtual void Display() + { + Console.WriteLine(_screenDisplay); + } + + public virtual void Update() + { + _screenDisplay.AppendLine($"[ {Title} ]"); + _screenDisplay.AppendLine("-------------------------------------------\n"); + + foreach (Selector selector in _selectList) + { + if (selector.Equals(CurrentSelected)) + _screenDisplay.Append($"> "); + else + _screenDisplay.Append($" "); + + _screenDisplay.AppendLine($"{selector.Line}"); + } + } + + public void SelectNext() + { + CurrentSelected = _selectList[++CurrentLine].Item; + } + + public void SelectPrevious() + { + CurrentSelected = _selectList[--CurrentLine].Item + } + + public void EnableWriteMode() + { + WriteMode = true; + } + + public void DisableWriteMode() + { + WriteMode = false; + } + + public abstract void Return(); + } +} diff --git a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs index 4e17512..a213e7d 100644 --- a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs +++ b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs @@ -12,114 +12,17 @@ namespace ConsoleApp.Menu /// /// An utility to find a recipe. /// - public class SearcherRecipe : SelectMenu - { - #region Attribute - private RecipeCollection _recipeOnSearch; - #endregion - - #region Properties - /// - /// A collection of recipe where the title contain the search string - /// - public RecipeCollection SearchResult { get; private set; } - - /// - /// The search string - /// - public string ResearchStr { get; set; } - #endregion - - /// - /// Constructor of the SearcherRecipe utility. - /// - /// The collection of recipe where to search - public SearcherRecipe(RecipeCollection recipeOnSearch) - { - _recipeOnSearch = recipeOnSearch; - SearchResult = _recipeOnSearch; - ResearchStr = ""; - } - - #region Methodes - /// - /// Launch a search by name request in the collection of Recipe with with a string. - /// - /// The string for search - /// True if the result of the search gave at least 1 element. False otherwise. - public bool ComputeSearch(string researchStr = "") - { - ResearchStr = researchStr; - SearchResult = _recipeOnSearch.ResearchByName(ResearchStr.ToLower()); - _maxLines = SearchResult.Count - 1; - - return SearchResult.Count > 0; - } - - public override void UpdateDisplay() - { - StringBuilder sb = new StringBuilder(); - sb.AppendLine("---------------------------------------------------------"); - sb.AppendLine($" Research: {ResearchStr}"); - sb.AppendLine("---------------------------------------------------------"); - for (int i = 0; i < SearchResult.Count; i++) - { - if (i == CurrentLine) - { - CurrentSelected = SearchResult[i]; - sb.Append($">"); - } - sb.AppendLine($" [ {SearchResult[i].Id} ]:\t{SearchResult[i].Title} "); - } - Console.Clear(); - Console.WriteLine(sb); - } - - /// - /// Launch and pilot the search menu. - /// - /// The collection of recipe where to search - /// The recipe selected - public static Recipe? ResearchOn(RecipeCollection recipeOnSearch) - { - SearcherRecipe sr = new SearcherRecipe(recipeOnSearch); - StringBuilder sb = new StringBuilder(); - sr.ComputeSearch(); - sr.UpdateDisplay(); - - ConsoleKeyInfo cki; - - do - { - cki = Console.ReadKey(true); - - switch (cki.Key) - { - case ConsoleKey.UpArrow: - sr.SelectPrevioustLine(); - break; - case ConsoleKey.DownArrow: - sr.SelectNextLine(); - break; - case ConsoleKey.Backspace: - if (sb.Length > 0) - { - sb.Remove(sb.Length - 1, 1); - sr.ComputeSearch(sb.ToString()); - } - break; - default: - sb.Append(cki.KeyChar); - sr.ComputeSearch(sb.ToString()); - break; - } - - sr.UpdateDisplay(); - - } while (cki.Key != ConsoleKey.Enter); - - return sr.CurrentSelected; - } + internal class SearcherRecipe : Menu + { + public SearcherRecipe(string title, params Selector[] selections) + : base(title, selections) + { } + + #region Methodes + public override void Return() + { + Console.WriteLine(CurrentSelected); + } #endregion } } diff --git a/MCTG/ConsoleApp/Menu/Selector.cs b/MCTG/ConsoleApp/Menu/Selector.cs new file mode 100644 index 0000000..9a398f4 --- /dev/null +++ b/MCTG/ConsoleApp/Menu/Selector.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Emit; +using System.Text; +using System.Threading.Tasks; + +namespace ConsoleApp.Menu +{ + internal class Selector + { + private string _line = ""; + + public string Line { + get => _line; + private set + { + if (string.IsNullOrEmpty(value)) + _line = "no data"; + else + _line = value; + } + } + public T Item { get; private set; } + + public Selector(T item, string line = "") + { + Line = line; + Item = item; + } + } +} diff --git a/MCTG/ConsoleApp/MenuManager.cs b/MCTG/ConsoleApp/MenuManager.cs new file mode 100644 index 0000000..4bdfa76 --- /dev/null +++ b/MCTG/ConsoleApp/MenuManager.cs @@ -0,0 +1,64 @@ +using Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConsoleApp +{ + internal class MenuManager + { + public DataManager DataManager { get; private set; } + public Stack MenuCallStack { get; set; } + + public MenuManager(DataManager dataManager, Menu.IMenu firstMenu) + { + DataManager = dataManager; + + MenuCallStack = new Stack(); + MenuCallStack.Append(firstMenu); + } + + public void Loop() + { + ConsoleKeyInfo cki; + Menu.IMenu menuOnHead; + do + { + menuOnHead = MenuCallStack.Peek(); + menuOnHead.Update(); + menuOnHead.Display(); + + cki = Console.ReadKey(true); + switch (cki.Key) + { + case ConsoleKey.DownArrow: + menuOnHead.SelectNext(); + break; + case ConsoleKey.UpArrow: + menuOnHead.SelectPrevious(); + break; + case ConsoleKey.Enter: + menuOnHead.Return(); + MenuCallStack.Pop(); + break; + case ConsoleKey.R: + if (menuOnHead.WriteMode) + menuOnHead.DisableWriteMode(); + else + menuOnHead.EnableWriteMode(); + break; + default: + if (menuOnHead.WriteMode) + { + menuOnHead.InputStr.Append(cki.KeyChar); + } + break; + } + + } while (MenuCallStack.Count > 0); + + } + } +} diff --git a/MCTG/ConsoleApp/Program.cs b/MCTG/ConsoleApp/Program.cs index ac9a1e9..ebb65b1 100644 --- a/MCTG/ConsoleApp/Program.cs +++ b/MCTG/ConsoleApp/Program.cs @@ -20,7 +20,7 @@ RecipeCollection? allRecipe = recipeCollections.Find(x => x.Description.Equals(" if (allRecipe == null) throw new ArgumentException("Load AllRecipe in stub: can't find 'All'."); -Manager manager = new Manager(allRecipe); +DataManager manager = new DataManager(allRecipe); Recipe? ret = SearcherRecipe.ResearchOn(allRecipe); Console.WriteLine(ret); diff --git a/MCTG/Model/Manager/Manager.cs b/MCTG/Model/Managers/DataManager.cs similarity index 89% rename from MCTG/Model/Manager/Manager.cs rename to MCTG/Model/Managers/DataManager.cs index 5c4a6a7..02768d1 100644 --- a/MCTG/Model/Manager/Manager.cs +++ b/MCTG/Model/Managers/DataManager.cs @@ -9,7 +9,7 @@ namespace Model /// /// Manager of the model. Here is stoked all the recipes, the users, etc... /// - public class Manager + public class DataManager { /// /// A collection of all the recipe loaded in the app. @@ -19,7 +19,7 @@ namespace Model /// /// The constructor of the manager. /// - public Manager() + public DataManager() { AllRecipes = new RecipeCollection(description: "All Recipes"); } @@ -28,7 +28,7 @@ namespace Model /// The constructor of the manager. /// /// A list of loaded recipes - public Manager(RecipeCollection allRecipes) + public DataManager(RecipeCollection allRecipes) { AllRecipes = new RecipeCollection( description: "All Recipes", From 352e38421f754345afb4bfea7b8150f7c0f601b2 Mon Sep 17 00:00:00 2001 From: Alexandre AGOSTINHO Date: Thu, 11 May 2023 15:15:09 +0200 Subject: [PATCH 02/15] partial commit (bf change of RecipeCollection) --- MCTG/ConsoleApp/Menu/IMenuDisplay.cs | 28 -------------- MCTG/ConsoleApp/Menu/Menu.cs | 41 +++++++++++++++----- MCTG/ConsoleApp/Menu/SearcherRecipe.cs | 22 ++++++++++- MCTG/ConsoleApp/Menu/SelectMenu.cs | 52 -------------------------- MCTG/ConsoleApp/Menu/Selector.cs | 26 ++++++++++++- MCTG/ConsoleApp/Program.cs | 3 +- 6 files changed, 78 insertions(+), 94 deletions(-) delete mode 100644 MCTG/ConsoleApp/Menu/IMenuDisplay.cs delete mode 100644 MCTG/ConsoleApp/Menu/SelectMenu.cs diff --git a/MCTG/ConsoleApp/Menu/IMenuDisplay.cs b/MCTG/ConsoleApp/Menu/IMenuDisplay.cs deleted file mode 100644 index 572082c..0000000 --- a/MCTG/ConsoleApp/Menu/IMenuDisplay.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ConsoleApp.Menu -{ - internal interface IMenuDisplay - { - /// - /// Update the menu display in the Console. - /// - void UpdateDisplay(); - - /// - /// Select the next line in the menu - /// - /// The current number of the new selected line - int SelectNextLine(); - - /// - /// Select the previous line in the menu - /// - /// The current number of the new selected line - int SelectPrevioustLine(); - } -} diff --git a/MCTG/ConsoleApp/Menu/Menu.cs b/MCTG/ConsoleApp/Menu/Menu.cs index c7ede43..fb6a09e 100644 --- a/MCTG/ConsoleApp/Menu/Menu.cs +++ b/MCTG/ConsoleApp/Menu/Menu.cs @@ -9,30 +9,53 @@ using System.Threading.Tasks; namespace ConsoleApp.Menu { internal abstract class Menu : IMenu + where T : notnull { protected StringBuilder _screenDisplay; - protected readonly List> _selectList; + protected readonly List>? _selectList; public string Title { get; private set; } public StringBuilder InputStr { get; set; } public int CurrentLine { get; private set; } - public T CurrentSelected { get; private set; } + public T? CurrentSelected { get; private set; } public bool WriteMode { get; set; } - public Menu(string title, params Selector[] selections ) + private Menu(string title) { - if (selections == null || selections.Length == 0) - throw new ArgumentException("Error: a menu must contain at least 1 selection"); - Title = title; CurrentLine = 0; - CurrentSelected = selections[0].Item; WriteMode = false; - _selectList = new List>(selections); _screenDisplay = new StringBuilder(); InputStr = new StringBuilder(); } + public Menu(string title, params Selector[] selections ) : this(title) + { + if (selections == null || selections.Length == 0) + throw new ArgumentException("Error: a menu must contain at least 1 selection"); + + _selectList = selections.ToList(); + CurrentSelected = _selectList[0].Item; + } + + public Menu(string title, Dictionary lines) : this(title, CreateSelection(lines)) + { } + + public static Selector[] CreateSelection(Dictionary lines) + { + if (lines is null) + { + throw new ArgumentNullException(nameof(lines)); + } + + Selector[] selections = new Selector[lines.Count]; + foreach (KeyValuePair line in lines) + { + selections.Append(new Selector(line.Key, line.Value)); + } + return selections; + } + public virtual void Display() { Console.WriteLine(_screenDisplay); @@ -61,7 +84,7 @@ namespace ConsoleApp.Menu public void SelectPrevious() { - CurrentSelected = _selectList[--CurrentLine].Item + CurrentSelected = _selectList[--CurrentLine].Item; } public void EnableWriteMode() diff --git a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs index a213e7d..b437757 100644 --- a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs +++ b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs @@ -14,10 +14,30 @@ namespace ConsoleApp.Menu /// internal class SearcherRecipe : Menu { - public SearcherRecipe(string title, params Selector[] selections) + private SearcherRecipe(string title, params Selector[] selections) : base(title, selections) { } + private SearcherRecipe(string title, Dictionary lines) + : base(title, lines) + { } + + public SearcherRecipe(RecipeCollection recipeCollection) + : this("Recipe search", recipeCollection.ToDictionary(recipe => recipe.GetHashCode())) + { + + } + + public static SearcherRecipe SearchInRecipeCollection(string title, RecipeCollection recipeCollection) + { + Dictionary recipesSelectors = new Dictionary(); + foreach (Recipe recipe in recipeCollection) + { + recipesSelectors.Add(recipe, recipe.Title); + } + return new SearcherRecipe(title, CreateSelection(recipesSelectors)); + } + #region Methodes public override void Return() { diff --git a/MCTG/ConsoleApp/Menu/SelectMenu.cs b/MCTG/ConsoleApp/Menu/SelectMenu.cs deleted file mode 100644 index 0e331c6..0000000 --- a/MCTG/ConsoleApp/Menu/SelectMenu.cs +++ /dev/null @@ -1,52 +0,0 @@ -using ConsoleApp; -using Model; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - - -namespace ConsoleApp.Menu -{ - /// - /// An abstract class that define the components of a selection-type menu. - /// - /// The return type of the currently selected item - public abstract class SelectMenu : IMenuDisplay - { - protected int _currentLine = 0; - protected int _maxLines = 0; - - /// - /// The currently selected item. - /// - public T? CurrentSelected { get; protected set; } - - /// - /// The current line selected in the menu. - /// - public int CurrentLine - { - get => _currentLine; - protected set - { - _currentLine = value; - if (_currentLine > _maxLines) - { - _currentLine = _maxLines; - } - if (_currentLine < 0) - { - _currentLine = 0; - } - return; - } - } - - public int SelectNextLine() { return ++CurrentLine; } - public int SelectPrevioustLine() { return --CurrentLine; } - - public abstract void UpdateDisplay(); - } -} diff --git a/MCTG/ConsoleApp/Menu/Selector.cs b/MCTG/ConsoleApp/Menu/Selector.cs index 9a398f4..7278db8 100644 --- a/MCTG/ConsoleApp/Menu/Selector.cs +++ b/MCTG/ConsoleApp/Menu/Selector.cs @@ -1,5 +1,7 @@ -using System; +using Model; +using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection.Emit; using System.Text; @@ -7,7 +9,8 @@ using System.Threading.Tasks; namespace ConsoleApp.Menu { - internal class Selector + internal class Selector : IEquatable> + where T : notnull { private string _line = ""; @@ -28,5 +31,24 @@ namespace ConsoleApp.Menu Line = line; Item = item; } + + public virtual bool Equals(Selector? other) + { + if (other == null) return false; + if (other == this) return true; + return other.Line.Equals(this.Line); + } + + public override bool Equals(object? obj) + { + var item = obj as Selector; + if (item == null) return false; + return Equals(obj); + } + + public override int GetHashCode() + { + return Line.GetHashCode(); + } } } diff --git a/MCTG/ConsoleApp/Program.cs b/MCTG/ConsoleApp/Program.cs index ebb65b1..f32038b 100644 --- a/MCTG/ConsoleApp/Program.cs +++ b/MCTG/ConsoleApp/Program.cs @@ -22,8 +22,7 @@ if (allRecipe == null) DataManager manager = new DataManager(allRecipe); -Recipe? ret = SearcherRecipe.ResearchOn(allRecipe); -Console.WriteLine(ret); +MenuManager menuManager = new MenuManager(manager, ConsoleApp.Menu.SearcherRecipe.SearchInRecipeCollection("search recipe", manager.AllRecipes)); // press any key to quit Console.ReadKey(); From 0dd5e9bf7e838f6577d0af414643cefafe2289db Mon Sep 17 00:00:00 2001 From: Alexandre Agostinho Date: Thu, 11 May 2023 15:27:07 +0200 Subject: [PATCH 03/15] change RecipeCollection implementation to a child of a list --- MCTG/ConsoleApp/Menu/Menu.cs | 17 +----- MCTG/ConsoleApp/Menu/SearcherRecipe.cs | 4 +- MCTG/Model/Recipes/RecipeCollection.cs | 73 +++----------------------- 3 files changed, 11 insertions(+), 83 deletions(-) diff --git a/MCTG/ConsoleApp/Menu/Menu.cs b/MCTG/ConsoleApp/Menu/Menu.cs index fb6a09e..169a66b 100644 --- a/MCTG/ConsoleApp/Menu/Menu.cs +++ b/MCTG/ConsoleApp/Menu/Menu.cs @@ -38,23 +38,10 @@ namespace ConsoleApp.Menu CurrentSelected = _selectList[0].Item; } - public Menu(string title, Dictionary lines) : this(title, CreateSelection(lines)) + public Menu(string title, Dictionary lines) : this(title, CreateSelection(lines)) { } - public static Selector[] CreateSelection(Dictionary lines) - { - if (lines is null) - { - throw new ArgumentNullException(nameof(lines)); - } - - Selector[] selections = new Selector[lines.Count]; - foreach (KeyValuePair line in lines) - { - selections.Append(new Selector(line.Key, line.Value)); - } - return selections; - } + public static Selector[] CreateSelection(List lines); public virtual void Display() { diff --git a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs index b437757..1bf77b5 100644 --- a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs +++ b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs @@ -18,12 +18,12 @@ namespace ConsoleApp.Menu : base(title, selections) { } - private SearcherRecipe(string title, Dictionary lines) + private SearcherRecipe(string title, Dictionary lines) : base(title, lines) { } public SearcherRecipe(RecipeCollection recipeCollection) - : this("Recipe search", recipeCollection.ToDictionary(recipe => recipe.GetHashCode())) + : this("Recipe search", recipeCollection.ToDictionary(r => r.GetHashCode())) { } diff --git a/MCTG/Model/Recipes/RecipeCollection.cs b/MCTG/Model/Recipes/RecipeCollection.cs index d439c76..42d4971 100644 --- a/MCTG/Model/Recipes/RecipeCollection.cs +++ b/MCTG/Model/Recipes/RecipeCollection.cs @@ -10,10 +10,9 @@ namespace Model /// Define a collection of . ///
This class implement and . /// - public class RecipeCollection : IList, IEquatable + public class RecipeCollection : List, IEquatable { #region Attributes - private readonly List _recipes; private string _description = ""; #endregion @@ -33,12 +32,6 @@ namespace Model _description = value; } } - - #region IList Prperties - public int Count => _recipes.Count; - public bool IsReadOnly => false; - public Recipe this[int index] { get => _recipes[index]; set => _recipes[index] = value; } - #endregion #endregion #region Constructors @@ -48,8 +41,8 @@ namespace Model /// A short description of what this list will contain /// Recipes to add in this new collection public RecipeCollection(string description, params Recipe[] recipes) + : base(recipes) { - _recipes = new List(recipes); Description = description; } #endregion @@ -63,7 +56,7 @@ namespace Model /// public Recipe? GetRecipeById(int id) { - Recipe? recipe = _recipes.Find(r => r.Id == id); + Recipe? recipe = this.Find(r => r.Id == id); if (recipe == null) throw new ArgumentException("No _recipes match the given id."); return recipe; } @@ -77,66 +70,14 @@ namespace Model { return new RecipeCollection( description: $"Results of the research: {str}", - recipes: _recipes.FindAll(x => x.Title.ToLower().Contains(str.ToLower())).ToArray()); - } - - #region IList Methods - public int IndexOf(Recipe item) - { - return _recipes.IndexOf(item); - } - - public void Insert(int index, Recipe item) - { - _recipes.Insert(index, item); - } - - public void RemoveAt(int index) - { - _recipes.RemoveAt(index); - } - - public void Add(Recipe item) - { - _recipes.Add(item); - } - - public void Clear() - { - _recipes.Clear(); + recipes: this.FindAll(x => x.Title.ToLower().Contains(str.ToLower())).ToArray()); } - public bool Contains(Recipe item) - { - return _recipes.Contains(item); - } - - public void CopyTo(Recipe[] array, int arrayIndex) - { - _recipes.CopyTo(array, arrayIndex); - } - - public bool Remove(Recipe item) - { - return _recipes.Remove(item); - } - - public IEnumerator GetEnumerator() - { - return _recipes.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return _recipes.GetEnumerator(); - } - #endregion - public virtual bool Equals(RecipeCollection? other) { if (other == null) return false; if (other == this) return true; - return _description.Equals(other.Description) && _recipes.Equals(other._recipes); + return _description.Equals(other.Description) && this.Equals(other.this); } public override bool Equals(object? obj) @@ -148,13 +89,13 @@ namespace Model public override int GetHashCode() { - return _recipes.GetHashCode(); + return this.GetHashCode(); } public override string ToString() { StringBuilder sb = new StringBuilder($"[RecipeCollection] - {Description}:\n"); - foreach (Recipe r in _recipes) + foreach (Recipe r in this) { sb.AppendFormat("\t - {0}\n", r.ToString()); } From d76ddfe7e56ea4b618cd8eaed6010323972a920a Mon Sep 17 00:00:00 2001 From: Alexandre Agostinho Date: Thu, 11 May 2023 15:32:33 +0200 Subject: [PATCH 04/15] pause save --- MCTG/ConsoleApp/Menu/Menu.cs | 5 ----- MCTG/ConsoleApp/Menu/SearcherRecipe.cs | 13 ++----------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/MCTG/ConsoleApp/Menu/Menu.cs b/MCTG/ConsoleApp/Menu/Menu.cs index 169a66b..b18da5a 100644 --- a/MCTG/ConsoleApp/Menu/Menu.cs +++ b/MCTG/ConsoleApp/Menu/Menu.cs @@ -38,11 +38,6 @@ namespace ConsoleApp.Menu CurrentSelected = _selectList[0].Item; } - public Menu(string title, Dictionary lines) : this(title, CreateSelection(lines)) - { } - - public static Selector[] CreateSelection(List lines); - public virtual void Display() { Console.WriteLine(_screenDisplay); diff --git a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs index 1bf77b5..5386f83 100644 --- a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs +++ b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs @@ -14,18 +14,9 @@ namespace ConsoleApp.Menu /// internal class SearcherRecipe : Menu { - private SearcherRecipe(string title, params Selector[] selections) - : base(title, selections) - { } - - private SearcherRecipe(string title, Dictionary lines) - : base(title, lines) - { } - - public SearcherRecipe(RecipeCollection recipeCollection) - : this("Recipe search", recipeCollection.ToDictionary(r => r.GetHashCode())) + public SearcherRecipe() : base("Search recipe") { - + } public static SearcherRecipe SearchInRecipeCollection(string title, RecipeCollection recipeCollection) From 2df795a3472b7e4e3711695bb1f8e77a057793b3 Mon Sep 17 00:00:00 2001 From: Alexandre Agostinho Date: Sat, 13 May 2023 11:55:28 +0200 Subject: [PATCH 05/15] select recipe on screen work --- MCTG/ConsoleApp/Menu/Menu.cs | 28 ++++++++++----- MCTG/ConsoleApp/Menu/SearcherRecipe.cs | 48 +++++++++++--------------- MCTG/ConsoleApp/MenuManager.cs | 2 +- MCTG/ConsoleApp/Program.cs | 11 +++--- MCTG/Model/Recipes/RecipeCollection.cs | 2 +- 5 files changed, 49 insertions(+), 42 deletions(-) diff --git a/MCTG/ConsoleApp/Menu/Menu.cs b/MCTG/ConsoleApp/Menu/Menu.cs index b18da5a..594cbb4 100644 --- a/MCTG/ConsoleApp/Menu/Menu.cs +++ b/MCTG/ConsoleApp/Menu/Menu.cs @@ -12,15 +12,26 @@ namespace ConsoleApp.Menu where T : notnull { protected StringBuilder _screenDisplay; - protected readonly List>? _selectList; + protected List> _selectList = new List>(); public string Title { get; private set; } public StringBuilder InputStr { get; set; } - public int CurrentLine { get; private set; } - public T? CurrentSelected { get; private set; } + + private int _currentLine; + public int CurrentLine { + get => _currentLine; + private set + { + _currentLine = value; + if (_currentLine < 0) _currentLine = 0; + if (_currentLine >= _selectList.Count) _currentLine = _selectList.Count-1; + } + } + + public T? CurrentSelected { get; protected set; } public bool WriteMode { get; set; } - private Menu(string title) + protected Menu(string title) { Title = title; CurrentLine = 0; @@ -29,7 +40,7 @@ namespace ConsoleApp.Menu InputStr = new StringBuilder(); } - public Menu(string title, params Selector[] selections ) : this(title) + protected Menu(string title, params Selector[] selections ) : this(title) { if (selections == null || selections.Length == 0) throw new ArgumentException("Error: a menu must contain at least 1 selection"); @@ -40,6 +51,7 @@ namespace ConsoleApp.Menu public virtual void Display() { + Console.Clear(); Console.WriteLine(_screenDisplay); } @@ -48,14 +60,14 @@ namespace ConsoleApp.Menu _screenDisplay.AppendLine($"[ {Title} ]"); _screenDisplay.AppendLine("-------------------------------------------\n"); - foreach (Selector selector in _selectList) + for (int i = 0; i < _selectList.Count; i++) { - if (selector.Equals(CurrentSelected)) + if (CurrentLine == i) _screenDisplay.Append($"> "); else _screenDisplay.Append($" "); - _screenDisplay.AppendLine($"{selector.Line}"); + _screenDisplay.AppendLine($"{_selectList[i].Line}"); } } diff --git a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs index 5386f83..334754a 100644 --- a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs +++ b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs @@ -1,32 +1,26 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Cryptography.X509Certificates; -using System.Text; -using System.Threading.Tasks; - -using Model; - -namespace ConsoleApp.Menu -{ - /// - /// An utility to find a recipe. - /// - internal class SearcherRecipe : Menu - { - public SearcherRecipe() : base("Search recipe") - { - - } +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading.Tasks; - public static SearcherRecipe SearchInRecipeCollection(string title, RecipeCollection recipeCollection) +using Model; + +namespace ConsoleApp.Menu +{ + /// + /// An utility to find a recipe. + /// + internal class SearcherRecipe : Menu + { + public SearcherRecipe(RecipeCollection recipeCollection) : base("Search recipe") { - Dictionary recipesSelectors = new Dictionary(); foreach (Recipe recipe in recipeCollection) { - recipesSelectors.Add(recipe, recipe.Title); + _selectList.Add(new Selector(recipe, $"[{recipe.Id}]: {recipe.Title}")); } - return new SearcherRecipe(title, CreateSelection(recipesSelectors)); + CurrentSelected = _selectList[0].Item; } #region Methodes @@ -34,6 +28,6 @@ namespace ConsoleApp.Menu { Console.WriteLine(CurrentSelected); } - #endregion - } -} + #endregion + } +} diff --git a/MCTG/ConsoleApp/MenuManager.cs b/MCTG/ConsoleApp/MenuManager.cs index 4bdfa76..790d261 100644 --- a/MCTG/ConsoleApp/MenuManager.cs +++ b/MCTG/ConsoleApp/MenuManager.cs @@ -17,7 +17,7 @@ namespace ConsoleApp DataManager = dataManager; MenuCallStack = new Stack(); - MenuCallStack.Append(firstMenu); + MenuCallStack.Push(firstMenu); } public void Loop() diff --git a/MCTG/ConsoleApp/Program.cs b/MCTG/ConsoleApp/Program.cs index f32038b..1863be2 100644 --- a/MCTG/ConsoleApp/Program.cs +++ b/MCTG/ConsoleApp/Program.cs @@ -20,9 +20,10 @@ RecipeCollection? allRecipe = recipeCollections.Find(x => x.Description.Equals(" if (allRecipe == null) throw new ArgumentException("Load AllRecipe in stub: can't find 'All'."); -DataManager manager = new DataManager(allRecipe); +DataManager dataMgr = new DataManager(allRecipe); -MenuManager menuManager = new MenuManager(manager, ConsoleApp.Menu.SearcherRecipe.SearchInRecipeCollection("search recipe", manager.AllRecipes)); - -// press any key to quit -Console.ReadKey(); +MenuManager menuMgr = new MenuManager(dataMgr, new SearcherRecipe(dataMgr.AllRecipes)); +menuMgr.Loop(); + +// press any key to quit +Console.ReadKey(); diff --git a/MCTG/Model/Recipes/RecipeCollection.cs b/MCTG/Model/Recipes/RecipeCollection.cs index 42d4971..a532edb 100644 --- a/MCTG/Model/Recipes/RecipeCollection.cs +++ b/MCTG/Model/Recipes/RecipeCollection.cs @@ -77,7 +77,7 @@ namespace Model { if (other == null) return false; if (other == this) return true; - return _description.Equals(other.Description) && this.Equals(other.this); + return this.Description.Equals(other.Description); } public override bool Equals(object? obj) From 7c66b30f7c6fe68e5dc155b5130f3ad950fcb603 Mon Sep 17 00:00:00 2001 From: Alexandre Agostinho Date: Sat, 13 May 2023 12:49:01 +0200 Subject: [PATCH 06/15] :poop: bad indexing on _selectLines --- MCTG/ConsoleApp/Menu/IMenu.cs | 1 + MCTG/ConsoleApp/Menu/Menu.cs | 57 ++++++++++++++------------ MCTG/ConsoleApp/Menu/SearcherRecipe.cs | 24 ++++++++++- MCTG/ConsoleApp/MenuManager.cs | 27 ++++++++---- 4 files changed, 73 insertions(+), 36 deletions(-) diff --git a/MCTG/ConsoleApp/Menu/IMenu.cs b/MCTG/ConsoleApp/Menu/IMenu.cs index 4f1aab2..b93359c 100644 --- a/MCTG/ConsoleApp/Menu/IMenu.cs +++ b/MCTG/ConsoleApp/Menu/IMenu.cs @@ -17,6 +17,7 @@ namespace ConsoleApp.Menu void SelectPrevious(); void EnableWriteMode(); void DisableWriteMode(); + void ToggleWriteMode(); void Return(); } } diff --git a/MCTG/ConsoleApp/Menu/Menu.cs b/MCTG/ConsoleApp/Menu/Menu.cs index 594cbb4..22eae40 100644 --- a/MCTG/ConsoleApp/Menu/Menu.cs +++ b/MCTG/ConsoleApp/Menu/Menu.cs @@ -1,4 +1,5 @@ -using Model; +using System.Data; +using Model; using System; using System.Collections.Generic; using System.ComponentModel.Design; @@ -24,7 +25,7 @@ namespace ConsoleApp.Menu { _currentLine = value; if (_currentLine < 0) _currentLine = 0; - if (_currentLine >= _selectList.Count) _currentLine = _selectList.Count-1; + if (_currentLine > _selectList.Count) _currentLine = _selectList.Count-1; } } @@ -43,22 +44,29 @@ namespace ConsoleApp.Menu protected Menu(string title, params Selector[] selections ) : this(title) { if (selections == null || selections.Length == 0) - throw new ArgumentException("Error: a menu must contain at least 1 selection"); + { + Console.WriteLine("Empty menu..."); + return; + } _selectList = selections.ToList(); CurrentSelected = _selectList[0].Item; } - public virtual void Display() - { - Console.Clear(); - Console.WriteLine(_screenDisplay); - } + public abstract void Update(); - public virtual void Update() + public abstract void Return(); + + public virtual void Display() { _screenDisplay.AppendLine($"[ {Title} ]"); - _screenDisplay.AppendLine("-------------------------------------------\n"); + _screenDisplay.AppendLine("-------------------------------------------"); + + if (WriteMode) + { + _screenDisplay.Append("Search: "); + _screenDisplay.AppendLine(InputStr.ToString()); + } for (int i = 0; i < _selectList.Count; i++) { @@ -69,28 +77,25 @@ namespace ConsoleApp.Menu _screenDisplay.AppendLine($"{_selectList[i].Line}"); } + + Console.Clear(); + Console.WriteLine(_screenDisplay); } - public void SelectNext() - { - CurrentSelected = _selectList[++CurrentLine].Item; - } + public void SelectNext() => CurrentSelected = _selectList[++CurrentLine].Item; - public void SelectPrevious() - { - CurrentSelected = _selectList[--CurrentLine].Item; - } + public void SelectPrevious() => CurrentSelected = _selectList[--CurrentLine].Item; - public void EnableWriteMode() - { - WriteMode = true; - } + public void EnableWriteMode() => WriteMode = true; + + public void DisableWriteMode() => WriteMode = false; - public void DisableWriteMode() + public void ToggleWriteMode() { - WriteMode = false; + if (WriteMode) + DisableWriteMode(); + else + EnableWriteMode(); } - - public abstract void Return(); } } diff --git a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs index 334754a..2c50f05 100644 --- a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs +++ b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs @@ -14,8 +14,23 @@ namespace ConsoleApp.Menu /// internal class SearcherRecipe : Menu { + private RecipeCollection _recipeCollectionOnSearch; + public SearcherRecipe(RecipeCollection recipeCollection) : base("Search recipe") { + _recipeCollectionOnSearch = recipeCollection; + UpdateSelection(_recipeCollectionOnSearch); + } + + #region Methodes + private void UpdateSelection(RecipeCollection recipeCollection) + { + _selectList.Clear(); + if (recipeCollection == null || recipeCollection.Count == 0) + { + Console.WriteLine("Empty menu..."); + return; + } foreach (Recipe recipe in recipeCollection) { _selectList.Add(new Selector(recipe, $"[{recipe.Id}]: {recipe.Title}")); @@ -23,7 +38,14 @@ namespace ConsoleApp.Menu CurrentSelected = _selectList[0].Item; } - #region Methodes + public override void Update() + { + RecipeCollection newRCSearchView = + _recipeCollectionOnSearch.ResearchByName(InputStr.ToString()); + + UpdateSelection(newRCSearchView); + } + public override void Return() { Console.WriteLine(CurrentSelected); diff --git a/MCTG/ConsoleApp/MenuManager.cs b/MCTG/ConsoleApp/MenuManager.cs index 790d261..d4800ec 100644 --- a/MCTG/ConsoleApp/MenuManager.cs +++ b/MCTG/ConsoleApp/MenuManager.cs @@ -20,6 +20,22 @@ namespace ConsoleApp MenuCallStack.Push(firstMenu); } + private void WriteMenuMode(Menu.IMenu menu, ConsoleKeyInfo cki) + { + if (!menu.WriteMode) + { + return; + } + + if (cki.Key == ConsoleKey.Backspace) + { + menu.InputStr.Remove(menu.InputStr.Length-1, 1); + return; + } + + menu.InputStr.Append(cki.KeyChar); + } + public void Loop() { ConsoleKeyInfo cki; @@ -44,19 +60,12 @@ namespace ConsoleApp MenuCallStack.Pop(); break; case ConsoleKey.R: - if (menuOnHead.WriteMode) - menuOnHead.DisableWriteMode(); - else - menuOnHead.EnableWriteMode(); + menuOnHead.ToggleWriteMode(); break; default: - if (menuOnHead.WriteMode) - { - menuOnHead.InputStr.Append(cki.KeyChar); - } + WriteMenuMode(menuOnHead, cki); break; } - } while (MenuCallStack.Count > 0); } From c5b717a6ff5f48bc693e63d65a654d8159351f83 Mon Sep 17 00:00:00 2001 From: Alexandre Agostinho Date: Sat, 13 May 2023 14:00:22 +0200 Subject: [PATCH 07/15] ::adhesive_bandage: fix selectLine OutOfRange --- MCTG/ConsoleApp/Menu/Menu.cs | 17 +++++++++++------ MCTG/ConsoleApp/Menu/SearcherRecipe.cs | 26 +++++++++++--------------- MCTG/ConsoleApp/MenuManager.cs | 2 +- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/MCTG/ConsoleApp/Menu/Menu.cs b/MCTG/ConsoleApp/Menu/Menu.cs index 22eae40..86c7639 100644 --- a/MCTG/ConsoleApp/Menu/Menu.cs +++ b/MCTG/ConsoleApp/Menu/Menu.cs @@ -24,8 +24,8 @@ namespace ConsoleApp.Menu private set { _currentLine = value; - if (_currentLine < 0) _currentLine = 0; - if (_currentLine > _selectList.Count) _currentLine = _selectList.Count-1; + if (_currentLine <= 0) _currentLine = 0; + else if (_currentLine >= _selectList.Count) _currentLine = _selectList.Count-1; } } @@ -59,6 +59,9 @@ namespace ConsoleApp.Menu public virtual void Display() { + _screenDisplay.Clear(); + Console.Clear(); + _screenDisplay.AppendLine($"[ {Title} ]"); _screenDisplay.AppendLine("-------------------------------------------"); @@ -77,14 +80,16 @@ namespace ConsoleApp.Menu _screenDisplay.AppendLine($"{_selectList[i].Line}"); } - - Console.Clear(); + + if (_selectList == null || _selectList.Count == 0) + _screenDisplay.AppendLine("Empty..."); + Console.WriteLine(_screenDisplay); } - public void SelectNext() => CurrentSelected = _selectList[++CurrentLine].Item; + public void SelectNext() => CurrentSelected = _selectList[CurrentLine++].Item; - public void SelectPrevious() => CurrentSelected = _selectList[--CurrentLine].Item; + public void SelectPrevious() => CurrentSelected = _selectList[CurrentLine--].Item; public void EnableWriteMode() => WriteMode = true; diff --git a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs index 2c50f05..e509938 100644 --- a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs +++ b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs @@ -19,33 +19,29 @@ namespace ConsoleApp.Menu public SearcherRecipe(RecipeCollection recipeCollection) : base("Search recipe") { _recipeCollectionOnSearch = recipeCollection; - UpdateSelection(_recipeCollectionOnSearch); + Update(); } #region Methodes - private void UpdateSelection(RecipeCollection recipeCollection) + public override void Update() { + RecipeCollection newRCSearchView = + _recipeCollectionOnSearch.ResearchByName(InputStr.ToString()); + _selectList.Clear(); - if (recipeCollection == null || recipeCollection.Count == 0) + + foreach (Recipe recipe in newRCSearchView) { - Console.WriteLine("Empty menu..."); - return; + _selectList.Add(new Selector(recipe, $"[{recipe.Id}]: {recipe.Title}")); } - foreach (Recipe recipe in recipeCollection) + if (_selectList == null || _selectList.Count == 0) { - _selectList.Add(new Selector(recipe, $"[{recipe.Id}]: {recipe.Title}")); + CurrentSelected = null; + return; } CurrentSelected = _selectList[0].Item; } - public override void Update() - { - RecipeCollection newRCSearchView = - _recipeCollectionOnSearch.ResearchByName(InputStr.ToString()); - - UpdateSelection(newRCSearchView); - } - public override void Return() { Console.WriteLine(CurrentSelected); diff --git a/MCTG/ConsoleApp/MenuManager.cs b/MCTG/ConsoleApp/MenuManager.cs index d4800ec..cfd7a0f 100644 --- a/MCTG/ConsoleApp/MenuManager.cs +++ b/MCTG/ConsoleApp/MenuManager.cs @@ -27,7 +27,7 @@ namespace ConsoleApp return; } - if (cki.Key == ConsoleKey.Backspace) + if (cki.Key == ConsoleKey.Backspace && menu.InputStr.Length > 0) { menu.InputStr.Remove(menu.InputStr.Length-1, 1); return; From b0b7dec22dc03438682e29be02492f5158b74159 Mon Sep 17 00:00:00 2001 From: Alexandre Agostinho Date: Sat, 13 May 2023 17:20:44 +0200 Subject: [PATCH 08/15] :art: new menu (selection) done --- MCTG/ConsoleApp/Menu/IMenu.cs | 5 ++-- MCTG/ConsoleApp/Menu/Menu.cs | 30 ++++++++++++++++++----- MCTG/ConsoleApp/Menu/PlainText.cs | 33 ++++++++++++++++++++++++++ MCTG/ConsoleApp/Menu/SearcherRecipe.cs | 26 ++++++++++---------- MCTG/ConsoleApp/MenuManager.cs | 33 +++++++++++++++++--------- 5 files changed, 94 insertions(+), 33 deletions(-) create mode 100644 MCTG/ConsoleApp/Menu/PlainText.cs diff --git a/MCTG/ConsoleApp/Menu/IMenu.cs b/MCTG/ConsoleApp/Menu/IMenu.cs index b93359c..0816923 100644 --- a/MCTG/ConsoleApp/Menu/IMenu.cs +++ b/MCTG/ConsoleApp/Menu/IMenu.cs @@ -1,4 +1,5 @@ -using System; +using Model; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -18,6 +19,6 @@ namespace ConsoleApp.Menu void EnableWriteMode(); void DisableWriteMode(); void ToggleWriteMode(); - void Return(); + IMenu? Return(); } } diff --git a/MCTG/ConsoleApp/Menu/Menu.cs b/MCTG/ConsoleApp/Menu/Menu.cs index 86c7639..ae0deba 100644 --- a/MCTG/ConsoleApp/Menu/Menu.cs +++ b/MCTG/ConsoleApp/Menu/Menu.cs @@ -20,8 +20,12 @@ namespace ConsoleApp.Menu private int _currentLine; public int CurrentLine { - get => _currentLine; - private set + get + { + if (_currentLine >= _selectList.Count) _currentLine = _selectList.Count - 1; + return _currentLine; + } + protected set { _currentLine = value; if (_currentLine <= 0) _currentLine = 0; @@ -53,9 +57,21 @@ namespace ConsoleApp.Menu CurrentSelected = _selectList[0].Item; } - public abstract void Update(); + public abstract IMenu? Return(); + + protected abstract List> SearchInSelection(); + + public void Update() + { + _selectList = SearchInSelection(); - public abstract void Return(); + if (_selectList == null || _selectList.Count == 0) + { + CurrentSelected = default; + return; + } + CurrentSelected = _selectList[CurrentLine].Item; + } public virtual void Display() { @@ -84,12 +100,14 @@ namespace ConsoleApp.Menu if (_selectList == null || _selectList.Count == 0) _screenDisplay.AppendLine("Empty..."); + _screenDisplay.AppendLine( + "\n\nHint:\n^:previous, v:next, <:ret, -enter-:select, r:search mode, -escape-:exit search mode"); Console.WriteLine(_screenDisplay); } - public void SelectNext() => CurrentSelected = _selectList[CurrentLine++].Item; + public void SelectNext() => ++CurrentLine; - public void SelectPrevious() => CurrentSelected = _selectList[CurrentLine--].Item; + public void SelectPrevious() => --CurrentLine; public void EnableWriteMode() => WriteMode = true; diff --git a/MCTG/ConsoleApp/Menu/PlainText.cs b/MCTG/ConsoleApp/Menu/PlainText.cs new file mode 100644 index 0000000..fa67426 --- /dev/null +++ b/MCTG/ConsoleApp/Menu/PlainText.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConsoleApp.Menu +{ + internal class PlainText : IMenu + { + public PlainText(string text) + { + InputStr = new StringBuilder(text); + WriteMode = false; + } + + public IMenu? Return() { return null; } + public void Display() + { + Console.Clear(); + Console.WriteLine(InputStr); + } + + public bool WriteMode { get; set; } + public StringBuilder InputStr { get; set; } + public void DisableWriteMode() { return; } + public void EnableWriteMode() { return; } + public void SelectNext() { return; } + public void SelectPrevious() { return; } + public void ToggleWriteMode() { return; } + public void Update() { return; } + } +} diff --git a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs index e509938..c517763 100644 --- a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs +++ b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs @@ -19,32 +19,30 @@ namespace ConsoleApp.Menu public SearcherRecipe(RecipeCollection recipeCollection) : base("Search recipe") { _recipeCollectionOnSearch = recipeCollection; - Update(); + _selectList = SearchInSelection(); } #region Methodes - public override void Update() + protected override List> SearchInSelection() { - RecipeCollection newRCSearchView = + RecipeCollection newRCSearchView = _recipeCollectionOnSearch.ResearchByName(InputStr.ToString()); - _selectList.Clear(); - + List> newSelectors = new List>(); foreach (Recipe recipe in newRCSearchView) { - _selectList.Add(new Selector(recipe, $"[{recipe.Id}]: {recipe.Title}")); - } - if (_selectList == null || _selectList.Count == 0) - { - CurrentSelected = null; - return; + newSelectors.Add(new Selector(recipe, $"[{recipe.Id}]: {recipe.Title}")); } - CurrentSelected = _selectList[0].Item; + + return newSelectors; } - public override void Return() + public override IMenu? Return() { - Console.WriteLine(CurrentSelected); + if (CurrentSelected == null) + throw new Exception("Error: CurrentSelected is null."); + + return new PlainText(CurrentSelected.ToString()); } #endregion } diff --git a/MCTG/ConsoleApp/MenuManager.cs b/MCTG/ConsoleApp/MenuManager.cs index cfd7a0f..7eef410 100644 --- a/MCTG/ConsoleApp/MenuManager.cs +++ b/MCTG/ConsoleApp/MenuManager.cs @@ -22,18 +22,29 @@ namespace ConsoleApp private void WriteMenuMode(Menu.IMenu menu, ConsoleKeyInfo cki) { - if (!menu.WriteMode) + if (!menu.WriteMode && cki.Key == ConsoleKey.R) { + menu.EnableWriteMode(); return; } - if (cki.Key == ConsoleKey.Backspace && menu.InputStr.Length > 0) + if (menu.WriteMode) { - menu.InputStr.Remove(menu.InputStr.Length-1, 1); - return; - } + if (cki.Key == ConsoleKey.Escape) + { + menu.DisableWriteMode(); + menu.InputStr.Clear(); + return; + } - menu.InputStr.Append(cki.KeyChar); + if (cki.Key == ConsoleKey.Backspace && menu.InputStr.Length > 0) + { + menu.InputStr.Remove(menu.InputStr.Length - 1, 1); + return; + } + + menu.InputStr.Append(cki.KeyChar); + } } public void Loop() @@ -56,18 +67,18 @@ namespace ConsoleApp menuOnHead.SelectPrevious(); break; case ConsoleKey.Enter: - menuOnHead.Return(); - MenuCallStack.Pop(); + Menu.IMenu? retMenu = menuOnHead.Return(); + if (retMenu is null) MenuCallStack.Pop(); + else MenuCallStack.Push(retMenu); break; - case ConsoleKey.R: - menuOnHead.ToggleWriteMode(); + case ConsoleKey.LeftArrow: + MenuCallStack.Pop(); break; default: WriteMenuMode(menuOnHead, cki); break; } } while (MenuCallStack.Count > 0); - } } } From 65a3c8feea308b815a2332787c4cdba8eb255c71 Mon Sep 17 00:00:00 2001 From: Alexandre Agostinho Date: Sat, 13 May 2023 18:39:18 +0200 Subject: [PATCH 09/15] start Entry + changes on research/write mode --- MCTG/ConsoleApp/Menu/Entry.EntryStep.cs | 50 +++++++++++++++++++++++++ MCTG/ConsoleApp/Menu/Entry.cs | 34 +++++++++++++++++ MCTG/ConsoleApp/Menu/IMenu.cs | 1 + MCTG/ConsoleApp/Menu/Menu.cs | 43 +++++++++++++++++++-- MCTG/ConsoleApp/Menu/PlainText.cs | 1 + MCTG/ConsoleApp/Menu/SearcherRecipe.cs | 11 ++---- MCTG/ConsoleApp/MenuManager.cs | 29 +------------- MCTG/Model/Recipes/RecipeCollection.cs | 2 +- 8 files changed, 132 insertions(+), 39 deletions(-) create mode 100644 MCTG/ConsoleApp/Menu/Entry.EntryStep.cs create mode 100644 MCTG/ConsoleApp/Menu/Entry.cs diff --git a/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs b/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs new file mode 100644 index 0000000..2e8e471 --- /dev/null +++ b/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConsoleApp.Menu +{ + internal abstract partial class Entry + { + public class EntryStep + { + private Type _entryType; + + public string Description { get; private set; } + public string? Input { get; private set; } + + internal EntryStep(string description, Type type) + { + Description = description; + Input = null; + _entryType = type; + } + + public object GetEntry() + { + Input = Console.ReadLine(); + + if (Input is null) + throw new ArgumentException("Error: input is null."); + + try + { + if (_entryType == typeof(string)) + return Input; + if (_entryType == typeof(int)) + return Int32.Parse(Input); + if (_entryType == typeof(DateTime)) + return DateTime.Parse(Input); + } + catch (FormatException fe) + { + Console.Error.WriteLine(fe); + } + + throw new NotImplementedException("Error: parse of this type is not implemented."); + } + } + } +} diff --git a/MCTG/ConsoleApp/Menu/Entry.cs b/MCTG/ConsoleApp/Menu/Entry.cs new file mode 100644 index 0000000..21f323e --- /dev/null +++ b/MCTG/ConsoleApp/Menu/Entry.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConsoleApp.Menu +{ + internal abstract partial class Entry : Menu + { + private List> _allSelectors; + + protected Entry(string title) : base(title) + { + _allSelectors = _selectList; + } + + protected override List> SearchInSelection() + { + return _allSelectors; + } + + public override IMenu? Return() + { + if (CurrentSelected == null) + throw new Exception("Error: CurrentSelected is null."); + + + return null; + } + + + } +} diff --git a/MCTG/ConsoleApp/Menu/IMenu.cs b/MCTG/ConsoleApp/Menu/IMenu.cs index 0816923..a9e15fa 100644 --- a/MCTG/ConsoleApp/Menu/IMenu.cs +++ b/MCTG/ConsoleApp/Menu/IMenu.cs @@ -19,6 +19,7 @@ namespace ConsoleApp.Menu void EnableWriteMode(); void DisableWriteMode(); void ToggleWriteMode(); + void WriteMenuMode(ConsoleKeyInfo cki); IMenu? Return(); } } diff --git a/MCTG/ConsoleApp/Menu/Menu.cs b/MCTG/ConsoleApp/Menu/Menu.cs index ae0deba..1f38516 100644 --- a/MCTG/ConsoleApp/Menu/Menu.cs +++ b/MCTG/ConsoleApp/Menu/Menu.cs @@ -13,6 +13,8 @@ namespace ConsoleApp.Menu where T : notnull { protected StringBuilder _screenDisplay; + + protected List> _allSelectors = new List>(); protected List> _selectList = new List>(); public string Title { get; private set; } @@ -53,13 +55,48 @@ namespace ConsoleApp.Menu return; } - _selectList = selections.ToList(); - CurrentSelected = _selectList[0].Item; + _allSelectors = selections.ToList(); + _selectList = _allSelectors; + CurrentSelected = _allSelectors[0].Item; } public abstract IMenu? Return(); - protected abstract List> SearchInSelection(); + protected virtual List> SearchInSelection() + { + if (_allSelectors is null) + throw new Exception("Error: _allSelector is null."); + + return _allSelectors.FindAll(x => + x.Line.ToLower().Contains(InputStr.ToString().ToLower())); + } + + public void WriteMenuMode(ConsoleKeyInfo cki) + { + if (!WriteMode && cki.Key == ConsoleKey.R) + { + EnableWriteMode(); + return; + } + + if (WriteMode) + { + if (cki.Key == ConsoleKey.Escape) + { + DisableWriteMode(); + InputStr.Clear(); + return; + } + + if (cki.Key == ConsoleKey.Backspace && InputStr.Length > 0) + { + InputStr.Remove(InputStr.Length - 1, 1); + return; + } + + InputStr.Append(cki.KeyChar); + } + } public void Update() { diff --git a/MCTG/ConsoleApp/Menu/PlainText.cs b/MCTG/ConsoleApp/Menu/PlainText.cs index fa67426..3495ac7 100644 --- a/MCTG/ConsoleApp/Menu/PlainText.cs +++ b/MCTG/ConsoleApp/Menu/PlainText.cs @@ -29,5 +29,6 @@ namespace ConsoleApp.Menu public void SelectPrevious() { return; } public void ToggleWriteMode() { return; } public void Update() { return; } + public void WriteMenuMode(ConsoleKeyInfo cki) { return; } } } diff --git a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs index c517763..68abaef 100644 --- a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs +++ b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs @@ -19,21 +19,18 @@ namespace ConsoleApp.Menu public SearcherRecipe(RecipeCollection recipeCollection) : base("Search recipe") { _recipeCollectionOnSearch = recipeCollection; - _selectList = SearchInSelection(); + _allSelectors = ConvertRecipeCollectionInSelectors(); + _selectList = _allSelectors; } #region Methodes - protected override List> SearchInSelection() + private List> ConvertRecipeCollectionInSelectors() { - RecipeCollection newRCSearchView = - _recipeCollectionOnSearch.ResearchByName(InputStr.ToString()); - List> newSelectors = new List>(); - foreach (Recipe recipe in newRCSearchView) + foreach (Recipe recipe in _recipeCollectionOnSearch) { newSelectors.Add(new Selector(recipe, $"[{recipe.Id}]: {recipe.Title}")); } - return newSelectors; } diff --git a/MCTG/ConsoleApp/MenuManager.cs b/MCTG/ConsoleApp/MenuManager.cs index 7eef410..3131d5c 100644 --- a/MCTG/ConsoleApp/MenuManager.cs +++ b/MCTG/ConsoleApp/MenuManager.cs @@ -20,33 +20,6 @@ namespace ConsoleApp MenuCallStack.Push(firstMenu); } - private void WriteMenuMode(Menu.IMenu menu, ConsoleKeyInfo cki) - { - if (!menu.WriteMode && cki.Key == ConsoleKey.R) - { - menu.EnableWriteMode(); - return; - } - - if (menu.WriteMode) - { - if (cki.Key == ConsoleKey.Escape) - { - menu.DisableWriteMode(); - menu.InputStr.Clear(); - return; - } - - if (cki.Key == ConsoleKey.Backspace && menu.InputStr.Length > 0) - { - menu.InputStr.Remove(menu.InputStr.Length - 1, 1); - return; - } - - menu.InputStr.Append(cki.KeyChar); - } - } - public void Loop() { ConsoleKeyInfo cki; @@ -75,7 +48,7 @@ namespace ConsoleApp MenuCallStack.Pop(); break; default: - WriteMenuMode(menuOnHead, cki); + menuOnHead.WriteMenuMode(cki); break; } } while (MenuCallStack.Count > 0); diff --git a/MCTG/Model/Recipes/RecipeCollection.cs b/MCTG/Model/Recipes/RecipeCollection.cs index a532edb..a1d8393 100644 --- a/MCTG/Model/Recipes/RecipeCollection.cs +++ b/MCTG/Model/Recipes/RecipeCollection.cs @@ -89,7 +89,7 @@ namespace Model public override int GetHashCode() { - return this.GetHashCode(); + return Description.GetHashCode(); } public override string ToString() From d0146a0e14c0b1bfa35c925abc82ceb6af24447f Mon Sep 17 00:00:00 2001 From: Alexandre Agostinho Date: Sat, 13 May 2023 19:20:47 +0200 Subject: [PATCH 10/15] first version of entry menu (working) --- MCTG/ConsoleApp/Menu/ConnectionMenu.cs | 22 +++++++ MCTG/ConsoleApp/Menu/Entry.EntryStep.cs | 9 +-- MCTG/ConsoleApp/Menu/Entry.cs | 86 ++++++++++++++++++++++--- MCTG/ConsoleApp/Menu/Menu.cs | 9 +-- MCTG/ConsoleApp/Program.cs | 5 +- 5 files changed, 110 insertions(+), 21 deletions(-) create mode 100644 MCTG/ConsoleApp/Menu/ConnectionMenu.cs diff --git a/MCTG/ConsoleApp/Menu/ConnectionMenu.cs b/MCTG/ConsoleApp/Menu/ConnectionMenu.cs new file mode 100644 index 0000000..7dc7b09 --- /dev/null +++ b/MCTG/ConsoleApp/Menu/ConnectionMenu.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConsoleApp.Menu +{ + internal class ConnectionMenu : Entry + { + public ConnectionMenu(params EntryStep[] entrySteps) + : base("Connection", entrySteps) + { } + + public override IMenu? Return() + { + string username = _selectList[0].Item.Input; + string password = _selectList[1].Item.Input; + return new PlainText($"User: {username} connected with password: {password}"); + } + } +} diff --git a/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs b/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs index 2e8e471..06dfc88 100644 --- a/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs +++ b/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs @@ -13,22 +13,17 @@ namespace ConsoleApp.Menu private Type _entryType; public string Description { get; private set; } - public string? Input { get; private set; } + public string Input { get; internal set; } internal EntryStep(string description, Type type) { Description = description; - Input = null; + Input = ""; _entryType = type; } public object GetEntry() { - Input = Console.ReadLine(); - - if (Input is null) - throw new ArgumentException("Error: input is null."); - try { if (_entryType == typeof(string)) diff --git a/MCTG/ConsoleApp/Menu/Entry.cs b/MCTG/ConsoleApp/Menu/Entry.cs index 21f323e..de4cd0d 100644 --- a/MCTG/ConsoleApp/Menu/Entry.cs +++ b/MCTG/ConsoleApp/Menu/Entry.cs @@ -8,27 +8,95 @@ namespace ConsoleApp.Menu { internal abstract partial class Entry : Menu { - private List> _allSelectors; + private List _steps = new List(); - protected Entry(string title) : base(title) + protected Entry(string title, params EntryStep[] entrySteps) : base(title) { - _allSelectors = _selectList; + _steps = entrySteps.ToList(); + _allSelectors = ConvertEntryStepsInSelector(); + _selectList = _allSelectors; } - protected override List> SearchInSelection() + private List> ConvertEntryStepsInSelector() { - return _allSelectors; + List> newSelectors = new List>(); + foreach (EntryStep step in _steps) + { + newSelectors.Add(new Selector(step, step.Description)); + } + return newSelectors; } - public override IMenu? Return() + public override void WriteMenuMode(ConsoleKeyInfo cki) { - if (CurrentSelected == null) - throw new Exception("Error: CurrentSelected is null."); + if (!WriteMode && cki.Key == ConsoleKey.R) + { + EnableWriteMode(); + return; + } + if (WriteMode) + { + if (cki.Key == ConsoleKey.Escape) + { + if (CurrentSelected is null) + throw new Exception("Error: CurrentSelected is null."); - return null; + CurrentSelected.Input = InputStr.ToString(); + DisableWriteMode(); + InputStr.Clear(); + return; + } + + if (cki.Key == ConsoleKey.Backspace && InputStr.Length > 0) + { + InputStr.Remove(InputStr.Length - 1, 1); + return; + } + + InputStr.Append(cki.KeyChar); + } } + public override void Update() + { + if (_selectList == null || _selectList.Count == 0) + { + CurrentSelected = default; + return; + } + CurrentSelected = _selectList[CurrentLine].Item; + } + + public override void Display() + { + _screenDisplay.Clear(); + Console.Clear(); + + _screenDisplay.AppendLine($"[ {Title} ]"); + _screenDisplay.AppendLine("-------------------------------------------"); + for (int i = 0; i < _selectList.Count; i++) + { + if (CurrentLine == i) + _screenDisplay.Append($"> "); + else + _screenDisplay.Append($" "); + + _screenDisplay.Append($"{_selectList[i].Line} {_selectList[i].Item.Input}"); + + if (CurrentLine == i && WriteMode) + _screenDisplay.Append(InputStr.ToString()); + + _screenDisplay.AppendLine(); + } + + if (_selectList == null || _selectList.Count == 0) + _screenDisplay.AppendLine("Empty..."); + + _screenDisplay.AppendLine( + "\n\nHint:\n^:previous, v:next, <:ret, -enter-:return, r:write, -escape-:exit search mode"); + Console.WriteLine(_screenDisplay); + } } } diff --git a/MCTG/ConsoleApp/Menu/Menu.cs b/MCTG/ConsoleApp/Menu/Menu.cs index 1f38516..bc8e7b1 100644 --- a/MCTG/ConsoleApp/Menu/Menu.cs +++ b/MCTG/ConsoleApp/Menu/Menu.cs @@ -21,7 +21,8 @@ namespace ConsoleApp.Menu public StringBuilder InputStr { get; set; } private int _currentLine; - public int CurrentLine { + public int CurrentLine + { get { if (_currentLine >= _selectList.Count) _currentLine = _selectList.Count - 1; @@ -71,7 +72,7 @@ namespace ConsoleApp.Menu x.Line.ToLower().Contains(InputStr.ToString().ToLower())); } - public void WriteMenuMode(ConsoleKeyInfo cki) + public virtual void WriteMenuMode(ConsoleKeyInfo cki) { if (!WriteMode && cki.Key == ConsoleKey.R) { @@ -98,7 +99,7 @@ namespace ConsoleApp.Menu } } - public void Update() + public virtual void Update() { _selectList = SearchInSelection(); @@ -138,7 +139,7 @@ namespace ConsoleApp.Menu _screenDisplay.AppendLine("Empty..."); _screenDisplay.AppendLine( - "\n\nHint:\n^:previous, v:next, <:ret, -enter-:select, r:search mode, -escape-:exit search mode"); + "\n\nHint:\n^:previous, v:next, <:ret, -enter-:select, r:search, -escape-:exit search mode"); Console.WriteLine(_screenDisplay); } diff --git a/MCTG/ConsoleApp/Program.cs b/MCTG/ConsoleApp/Program.cs index 1863be2..a4cef53 100644 --- a/MCTG/ConsoleApp/Program.cs +++ b/MCTG/ConsoleApp/Program.cs @@ -22,7 +22,10 @@ if (allRecipe == null) DataManager dataMgr = new DataManager(allRecipe); -MenuManager menuMgr = new MenuManager(dataMgr, new SearcherRecipe(dataMgr.AllRecipes)); +MenuManager menuMgr = new MenuManager(dataMgr, new ConnectionMenu( + new Entry.EntryStep("Username: ", typeof(string)), + new Entry.EntryStep("Password: ", typeof(string)))); + menuMgr.Loop(); // press any key to quit From ff996aa421a36a22f313440aa2061d3867aa921e Mon Sep 17 00:00:00 2001 From: Alexandre Agostinho Date: Sat, 13 May 2023 19:34:23 +0200 Subject: [PATCH 11/15] add MainMenu + tests: OK --- MCTG/ConsoleApp/Menu/ConnectionMenu.cs | 6 ++++-- MCTG/ConsoleApp/Menu/MainMenu.cs | 25 +++++++++++++++++++++++++ MCTG/ConsoleApp/MenuManager.cs | 6 +++++- MCTG/ConsoleApp/Program.cs | 4 +--- 4 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 MCTG/ConsoleApp/Menu/MainMenu.cs diff --git a/MCTG/ConsoleApp/Menu/ConnectionMenu.cs b/MCTG/ConsoleApp/Menu/ConnectionMenu.cs index 7dc7b09..d4c9949 100644 --- a/MCTG/ConsoleApp/Menu/ConnectionMenu.cs +++ b/MCTG/ConsoleApp/Menu/ConnectionMenu.cs @@ -8,8 +8,10 @@ namespace ConsoleApp.Menu { internal class ConnectionMenu : Entry { - public ConnectionMenu(params EntryStep[] entrySteps) - : base("Connection", entrySteps) + public ConnectionMenu() + : base("Connection", + new Entry.EntryStep("Username: ", typeof(string)), + new Entry.EntryStep("Password: ", typeof(string))) { } public override IMenu? Return() diff --git a/MCTG/ConsoleApp/Menu/MainMenu.cs b/MCTG/ConsoleApp/Menu/MainMenu.cs new file mode 100644 index 0000000..b167526 --- /dev/null +++ b/MCTG/ConsoleApp/Menu/MainMenu.cs @@ -0,0 +1,25 @@ +using Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ConsoleApp.Menu +{ + internal class MainMenu : Menu + { + public MainMenu(DataManager dataMgr) + : base("Main menu", + new Selector( + new SearcherRecipe(dataMgr.AllRecipes), "Recipe search"), + new Selector( + new ConnectionMenu(), "Connection")) + { } + + public override IMenu? Return() + { + return CurrentSelected; + } + } +} diff --git a/MCTG/ConsoleApp/MenuManager.cs b/MCTG/ConsoleApp/MenuManager.cs index 3131d5c..4c47e0c 100644 --- a/MCTG/ConsoleApp/MenuManager.cs +++ b/MCTG/ConsoleApp/MenuManager.cs @@ -1,4 +1,5 @@ -using Model; +using ConsoleApp.Menu; +using Model; using System; using System.Collections.Generic; using System.Linq; @@ -20,6 +21,9 @@ namespace ConsoleApp MenuCallStack.Push(firstMenu); } + public MenuManager(DataManager dataManager) : this(dataManager, new MainMenu(dataManager)) + { } + public void Loop() { ConsoleKeyInfo cki; diff --git a/MCTG/ConsoleApp/Program.cs b/MCTG/ConsoleApp/Program.cs index a4cef53..3b9b798 100644 --- a/MCTG/ConsoleApp/Program.cs +++ b/MCTG/ConsoleApp/Program.cs @@ -22,9 +22,7 @@ if (allRecipe == null) DataManager dataMgr = new DataManager(allRecipe); -MenuManager menuMgr = new MenuManager(dataMgr, new ConnectionMenu( - new Entry.EntryStep("Username: ", typeof(string)), - new Entry.EntryStep("Password: ", typeof(string)))); +MenuManager menuMgr = new MenuManager(dataMgr); menuMgr.Loop(); From 628fa7045fb41501385a2e3b44497c47aef17648 Mon Sep 17 00:00:00 2001 From: Alexandre Agostinho Date: Sat, 13 May 2023 21:01:36 +0200 Subject: [PATCH 12/15] :memo: update documentation --- MCTG/ConsoleApp/Menu/Entry.EntryStep.cs | 28 +++++++++++++- MCTG/ConsoleApp/Menu/Entry.cs | 19 +++++++++- MCTG/ConsoleApp/Menu/IMenu.cs | 47 ++++++++++++++++++++++++ MCTG/ConsoleApp/Menu/MainMenu.cs | 8 ++-- MCTG/ConsoleApp/Menu/Menu.cs | 49 ++++++++++++++++++++++--- MCTG/ConsoleApp/Menu/PlainText.cs | 12 ++++++ MCTG/ConsoleApp/Menu/SearcherRecipe.cs | 2 +- MCTG/ConsoleApp/Menu/Selector.cs | 22 +++++++++++ MCTG/ConsoleApp/MenuManager.cs | 28 ++++++++++++++ MCTG/ConsoleApp/Program.cs | 3 -- 10 files changed, 202 insertions(+), 16 deletions(-) diff --git a/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs b/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs index 06dfc88..ee9bdfb 100644 --- a/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs +++ b/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs @@ -8,20 +8,45 @@ namespace ConsoleApp.Menu { internal abstract partial class Entry { + /// + /// Define a step of the Entry menu, or in other word, an entry itself. + /// public class EntryStep { + #region Attributes & Properties private Type _entryType; + /// + /// The entry description. This text is generally placed before the input field. + /// public string Description { get; private set; } + + /// + /// Contain the input gave by the menu. + /// public string Input { get; internal set; } + #endregion - internal EntryStep(string description, Type type) + #region Constructors + /// + /// Constructor of the entry step. + /// + /// The text generally placed before the input in the menu. + /// The type of the returned input. + public EntryStep(string description, Type type) { Description = description; Input = ""; _entryType = type; } + #endregion + #region Methods + /// + /// Get the inputed string converted on this entry type. + /// + /// The converted string on the entry type. + /// Throw when the entry type converter does not exist here. public object GetEntry() { try @@ -40,6 +65,7 @@ namespace ConsoleApp.Menu throw new NotImplementedException("Error: parse of this type is not implemented."); } + #endregion } } } diff --git a/MCTG/ConsoleApp/Menu/Entry.cs b/MCTG/ConsoleApp/Menu/Entry.cs index de4cd0d..cb08dbb 100644 --- a/MCTG/ConsoleApp/Menu/Entry.cs +++ b/MCTG/ConsoleApp/Menu/Entry.cs @@ -6,17 +6,31 @@ using System.Threading.Tasks; namespace ConsoleApp.Menu { + /// + /// Define an Entry menu. + ///
It allows you to navigate through the entries and completes them with a console input. + ///
internal abstract partial class Entry : Menu { + #region Attributes & Properties private List _steps = new List(); - + #endregion + + #region Constructors + /// + /// Constructor of the entry menu, based on the Menu constructor. + /// + /// The title of this menu. + /// All the entries of this menu. protected Entry(string title, params EntryStep[] entrySteps) : base(title) { _steps = entrySteps.ToList(); _allSelectors = ConvertEntryStepsInSelector(); _selectList = _allSelectors; } + #endregion + #region Methods private List> ConvertEntryStepsInSelector() { List> newSelectors = new List>(); @@ -26,7 +40,9 @@ namespace ConsoleApp.Menu } return newSelectors; } + #endregion + #region IMenu implementation public override void WriteMenuMode(ConsoleKeyInfo cki) { if (!WriteMode && cki.Key == ConsoleKey.R) @@ -98,5 +114,6 @@ namespace ConsoleApp.Menu "\n\nHint:\n^:previous, v:next, <:ret, -enter-:return, r:write, -escape-:exit search mode"); Console.WriteLine(_screenDisplay); } + #endregion } } diff --git a/MCTG/ConsoleApp/Menu/IMenu.cs b/MCTG/ConsoleApp/Menu/IMenu.cs index a9e15fa..120a387 100644 --- a/MCTG/ConsoleApp/Menu/IMenu.cs +++ b/MCTG/ConsoleApp/Menu/IMenu.cs @@ -7,19 +7,66 @@ using System.Threading.Tasks; namespace ConsoleApp.Menu { + /// + /// Define a console menu with element selection. + /// internal interface IMenu { + /// + /// True when enable, False otherwise. + /// bool WriteMode { get; set; } + + /// + /// A string input. Used for search string or entry input. + /// StringBuilder InputStr { get; set; } + /// + /// Refresh the console with the updated display. This function dose not call Update(). + /// void Display(); + + /// + /// Update the parameters of the menu. Generally called before Display() to refresh the informations. + /// void Update(); + + /// + /// Select the next element in the selection list. + /// void SelectNext(); + + /// + /// Select the previous element in the selection list. + /// void SelectPrevious(); + + /// + /// Enable the write mode. + /// void EnableWriteMode(); + + /// + /// Disable the write mode. + /// void DisableWriteMode(); + + /// + /// Toogle the write mode. + /// void ToggleWriteMode(); + + /// + /// Define the comportement of the write mode. For instence: in the standard menu, it is used for the research of a line. + /// + /// The key to deal with. void WriteMenuMode(ConsoleKeyInfo cki); + + /// + /// Execute some actions and then return. + /// + /// 'null' when there is no menu after this selection. Otherwise the next menu. IMenu? Return(); } } diff --git a/MCTG/ConsoleApp/Menu/MainMenu.cs b/MCTG/ConsoleApp/Menu/MainMenu.cs index b167526..f26bdf0 100644 --- a/MCTG/ConsoleApp/Menu/MainMenu.cs +++ b/MCTG/ConsoleApp/Menu/MainMenu.cs @@ -7,6 +7,9 @@ using System.Threading.Tasks; namespace ConsoleApp.Menu { + /// + /// Main menu of the console. Contain the first interaction menus. + /// internal class MainMenu : Menu { public MainMenu(DataManager dataMgr) @@ -16,10 +19,5 @@ namespace ConsoleApp.Menu new Selector( new ConnectionMenu(), "Connection")) { } - - public override IMenu? Return() - { - return CurrentSelected; - } } } diff --git a/MCTG/ConsoleApp/Menu/Menu.cs b/MCTG/ConsoleApp/Menu/Menu.cs index bc8e7b1..5f59e16 100644 --- a/MCTG/ConsoleApp/Menu/Menu.cs +++ b/MCTG/ConsoleApp/Menu/Menu.cs @@ -9,18 +9,30 @@ using System.Threading.Tasks; namespace ConsoleApp.Menu { + /// + /// Define a selection menu. + ///
It allows you to navigate through the selections and search with a console input. + ///
+ /// The type (or the implementation) of the selection. internal abstract class Menu : IMenu where T : notnull { + #region Attributes & Properties protected StringBuilder _screenDisplay; protected List> _allSelectors = new List>(); protected List> _selectList = new List>(); + private int _currentLine; + + /// + /// Title of the menu. + /// public string Title { get; private set; } - public StringBuilder InputStr { get; set; } - private int _currentLine; + /// + /// The current line of the selection list. + /// public int CurrentLine { get @@ -36,9 +48,19 @@ namespace ConsoleApp.Menu } } + /// + /// The currently selected object. + /// public T? CurrentSelected { get; protected set; } - public bool WriteMode { get; set; } - + #endregion + + #region Constructors + /// + /// Base constructor of the Menu class. + ///
This one is incomplete and need to be completed in the inherited class constructors. + ///
Basically, the '_allSelection' and '_selectList' attribute initialization are missing. + ///
+ /// The title of the Menu. protected Menu(string title) { Title = title; @@ -48,6 +70,11 @@ namespace ConsoleApp.Menu InputStr = new StringBuilder(); } + /// + /// Constructor of the Menu class. This constructor allows you to directly pass the selections. + /// + /// The title of the menu. + /// The selections of the menu. protected Menu(string title, params Selector[] selections ) : this(title) { if (selections == null || selections.Length == 0) @@ -60,8 +87,19 @@ namespace ConsoleApp.Menu _selectList = _allSelectors; CurrentSelected = _allSelectors[0].Item; } + #endregion - public abstract IMenu? Return(); + #region IMenu implementation + public StringBuilder InputStr { get; set; } + public bool WriteMode { get; set; } + + public virtual IMenu? Return() + { + if (CurrentSelected is null) + throw new Exception("Error: CurrentSelected is null."); + + return (IMenu)CurrentSelected; + } protected virtual List> SearchInSelection() { @@ -158,5 +196,6 @@ namespace ConsoleApp.Menu else EnableWriteMode(); } + #endregion } } diff --git a/MCTG/ConsoleApp/Menu/PlainText.cs b/MCTG/ConsoleApp/Menu/PlainText.cs index 3495ac7..f18379e 100644 --- a/MCTG/ConsoleApp/Menu/PlainText.cs +++ b/MCTG/ConsoleApp/Menu/PlainText.cs @@ -6,14 +6,25 @@ using System.Threading.Tasks; namespace ConsoleApp.Menu { + /// + /// Define a Plain text menu. + ///
This menu is a bit special. It display some text, and then, the only action that can be performed is the back return. Usefull for testing. + ///
internal class PlainText : IMenu { + #region Constructors + /// + /// Constructor of the Plain text menu. + /// + /// The text buffer to display. public PlainText(string text) { InputStr = new StringBuilder(text); WriteMode = false; } + #endregion + #region IMenu implementation public IMenu? Return() { return null; } public void Display() { @@ -30,5 +41,6 @@ namespace ConsoleApp.Menu public void ToggleWriteMode() { return; } public void Update() { return; } public void WriteMenuMode(ConsoleKeyInfo cki) { return; } + #endregion } } diff --git a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs index 68abaef..a04a041 100644 --- a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs +++ b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs @@ -23,7 +23,7 @@ namespace ConsoleApp.Menu _selectList = _allSelectors; } - #region Methodes + #region Methods private List> ConvertRecipeCollectionInSelectors() { List> newSelectors = new List>(); diff --git a/MCTG/ConsoleApp/Menu/Selector.cs b/MCTG/ConsoleApp/Menu/Selector.cs index 7278db8..f8f71e0 100644 --- a/MCTG/ConsoleApp/Menu/Selector.cs +++ b/MCTG/ConsoleApp/Menu/Selector.cs @@ -9,11 +9,19 @@ using System.Threading.Tasks; namespace ConsoleApp.Menu { + /// + /// The selector of a menu. + /// + /// The type of the selector. internal class Selector : IEquatable> where T : notnull { + #region Attributes & Properties private string _line = ""; + /// + /// The string that are displayed on the menu. + /// public string Line { get => _line; private set @@ -24,14 +32,27 @@ namespace ConsoleApp.Menu _line = value; } } + + /// + /// The item contained in the selector. + /// public T Item { get; private set; } + #endregion + #region Constructors + /// + /// The constructor of the selector. + /// + /// The item to place inside. + /// The string to display in the menu. public Selector(T item, string line = "") { Line = line; Item = item; } + #endregion + #region IEquatable implementation public virtual bool Equals(Selector? other) { if (other == null) return false; @@ -50,5 +71,6 @@ namespace ConsoleApp.Menu { return Line.GetHashCode(); } + #endregion } } diff --git a/MCTG/ConsoleApp/MenuManager.cs b/MCTG/ConsoleApp/MenuManager.cs index 4c47e0c..bbbf6d1 100644 --- a/MCTG/ConsoleApp/MenuManager.cs +++ b/MCTG/ConsoleApp/MenuManager.cs @@ -8,11 +8,29 @@ using System.Threading.Tasks; namespace ConsoleApp { + /// + /// Manage the menus of the console application. + /// internal class MenuManager { + #region Attributes & Properties + /// + /// The manager that contains usefull data taken from the model. + /// public DataManager DataManager { get; private set; } + + /// + /// Each menu called are push in this stack. Then, to return back, we pop this stack to retrive the previous menu. + /// public Stack MenuCallStack { get; set; } + #endregion + #region Constructors + /// + /// Constructor of the MenuManager class. This constructor allows you to give the first menu of the call stack, wich is usefull for testing. + /// + /// The data manager needed by the menus inside. + /// The starting menu, the first that will be push on the call stack. public MenuManager(DataManager dataManager, Menu.IMenu firstMenu) { DataManager = dataManager; @@ -21,9 +39,18 @@ namespace ConsoleApp MenuCallStack.Push(firstMenu); } + /// + /// Constructor of the MenuManager class. + /// + /// The data manager needed by the menus inside. public MenuManager(DataManager dataManager) : this(dataManager, new MainMenu(dataManager)) { } + #endregion + #region Methods + /// + /// Main loop. Loop while the menu call stack is not empty. + /// public void Loop() { ConsoleKeyInfo cki; @@ -57,5 +84,6 @@ namespace ConsoleApp } } while (MenuCallStack.Count > 0); } + #endregion } } diff --git a/MCTG/ConsoleApp/Program.cs b/MCTG/ConsoleApp/Program.cs index 3b9b798..d6aedee 100644 --- a/MCTG/ConsoleApp/Program.cs +++ b/MCTG/ConsoleApp/Program.cs @@ -25,6 +25,3 @@ DataManager dataMgr = new DataManager(allRecipe); MenuManager menuMgr = new MenuManager(dataMgr); menuMgr.Loop(); - -// press any key to quit -Console.ReadKey(); From 081fb725e1f1850ff1919acefdf21bc4139f9bdf Mon Sep 17 00:00:00 2001 From: Alexandre Agostinho Date: Sat, 13 May 2023 22:07:06 +0200 Subject: [PATCH 13/15] :rocket: correct CD image name --- .drone.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.drone.yml b/.drone.yml index f538cac..01a268d 100644 --- a/.drone.yml +++ b/.drone.yml @@ -100,7 +100,7 @@ steps: dockerfile: MCTG/Dockerfile context: MCTG/ registry: hub.codefirst.iut.uca.fr - repo: hub.codefirst.iut.uca.fr/alexandre.agostinho/cli-mctg + repo: hub.codefirst.iut.uca.fr/alexandre.agostinho/console-mctg username: from_secret: SECRET_REGISTRY_USERNAME password: @@ -111,7 +111,7 @@ steps: # image: hub.codefirst.iut.uca.fr/thomas.bellembois/codefirst-dockerproxy-clientdrone:latest # environment: # IMAGENAME: hub.codefirst.iut.uca.fr/alexandre.agostinho/sae-2.01:latest - # CONTAINERNAME: cli-mctg + # CONTAINERNAME: console-mctg # COMMAND: create # OVERWRITE: true # depends_on: [ docker-build-and-push ] From 1948c8e5792e376a1b650c560c510fd5064f101d Mon Sep 17 00:00:00 2001 From: Alexandre Agostinho Date: Sun, 14 May 2023 01:17:05 +0200 Subject: [PATCH 14/15] :adhesive_bandage: fix sonar issues --- MCTG/ConsoleApp/Menu/Entry.EntryStep.cs | 2 +- MCTG/ConsoleApp/Menu/Entry.cs | 10 +++++----- MCTG/ConsoleApp/Menu/Menu.cs | 8 ++++---- MCTG/ConsoleApp/Menu/PlainText.cs | 14 +++++++------- MCTG/ConsoleApp/Menu/SearcherRecipe.cs | 4 ++-- MCTG/ConsoleApp/Program.cs | 1 - MCTG/ConsoleApp/Stubs/Stub.cs | 4 ++-- MCTG/Tests/Model_UnitTests/RecipeCollection_UT.cs | 5 ++++- MCTG/Tests/Model_UnitTests/test_unit_user.cs | 4 ++-- 9 files changed, 27 insertions(+), 25 deletions(-) diff --git a/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs b/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs index ee9bdfb..b58a707 100644 --- a/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs +++ b/MCTG/ConsoleApp/Menu/Entry.EntryStep.cs @@ -14,7 +14,7 @@ namespace ConsoleApp.Menu public class EntryStep { #region Attributes & Properties - private Type _entryType; + private readonly Type _entryType; /// /// The entry description. This text is generally placed before the input field. diff --git a/MCTG/ConsoleApp/Menu/Entry.cs b/MCTG/ConsoleApp/Menu/Entry.cs index cb08dbb..6c63792 100644 --- a/MCTG/ConsoleApp/Menu/Entry.cs +++ b/MCTG/ConsoleApp/Menu/Entry.cs @@ -13,7 +13,7 @@ namespace ConsoleApp.Menu internal abstract partial class Entry : Menu { #region Attributes & Properties - private List _steps = new List(); + private List _steps; #endregion #region Constructors @@ -56,7 +56,7 @@ namespace ConsoleApp.Menu if (cki.Key == ConsoleKey.Escape) { if (CurrentSelected is null) - throw new Exception("Error: CurrentSelected is null."); + throw new ArgumentNullException("Error: CurrentSelected is null."); CurrentSelected.Input = InputStr.ToString(); DisableWriteMode(); @@ -76,7 +76,7 @@ namespace ConsoleApp.Menu public override void Update() { - if (_selectList == null || _selectList.Count == 0) + if (_selectList.Count == 0) { CurrentSelected = default; return; @@ -102,12 +102,12 @@ namespace ConsoleApp.Menu _screenDisplay.Append($"{_selectList[i].Line} {_selectList[i].Item.Input}"); if (CurrentLine == i && WriteMode) - _screenDisplay.Append(InputStr.ToString()); + _screenDisplay.Append(InputStr); _screenDisplay.AppendLine(); } - if (_selectList == null || _selectList.Count == 0) + if (_selectList.Count == 0) _screenDisplay.AppendLine("Empty..."); _screenDisplay.AppendLine( diff --git a/MCTG/ConsoleApp/Menu/Menu.cs b/MCTG/ConsoleApp/Menu/Menu.cs index 5f59e16..d556397 100644 --- a/MCTG/ConsoleApp/Menu/Menu.cs +++ b/MCTG/ConsoleApp/Menu/Menu.cs @@ -96,7 +96,7 @@ namespace ConsoleApp.Menu public virtual IMenu? Return() { if (CurrentSelected is null) - throw new Exception("Error: CurrentSelected is null."); + throw new ArgumentNullException("Error: CurrentSelected is null."); return (IMenu)CurrentSelected; } @@ -104,7 +104,7 @@ namespace ConsoleApp.Menu protected virtual List> SearchInSelection() { if (_allSelectors is null) - throw new Exception("Error: _allSelector is null."); + throw new ArgumentNullException("Error: _allSelector is null."); return _allSelectors.FindAll(x => x.Line.ToLower().Contains(InputStr.ToString().ToLower())); @@ -141,7 +141,7 @@ namespace ConsoleApp.Menu { _selectList = SearchInSelection(); - if (_selectList == null || _selectList.Count == 0) + if (_selectList.Count == 0) { CurrentSelected = default; return; @@ -173,7 +173,7 @@ namespace ConsoleApp.Menu _screenDisplay.AppendLine($"{_selectList[i].Line}"); } - if (_selectList == null || _selectList.Count == 0) + if (_selectList.Count == 0) _screenDisplay.AppendLine("Empty..."); _screenDisplay.AppendLine( diff --git a/MCTG/ConsoleApp/Menu/PlainText.cs b/MCTG/ConsoleApp/Menu/PlainText.cs index f18379e..5ad4fa9 100644 --- a/MCTG/ConsoleApp/Menu/PlainText.cs +++ b/MCTG/ConsoleApp/Menu/PlainText.cs @@ -34,13 +34,13 @@ namespace ConsoleApp.Menu public bool WriteMode { get; set; } public StringBuilder InputStr { get; set; } - public void DisableWriteMode() { return; } - public void EnableWriteMode() { return; } - public void SelectNext() { return; } - public void SelectPrevious() { return; } - public void ToggleWriteMode() { return; } - public void Update() { return; } - public void WriteMenuMode(ConsoleKeyInfo cki) { return; } + public void DisableWriteMode() { } + public void EnableWriteMode() { } + public void SelectNext() { } + public void SelectPrevious() { } + public void ToggleWriteMode() { } + public void Update() { } + public void WriteMenuMode(ConsoleKeyInfo cki) { } #endregion } } diff --git a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs index a04a041..af362f9 100644 --- a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs +++ b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs @@ -14,7 +14,7 @@ namespace ConsoleApp.Menu /// internal class SearcherRecipe : Menu { - private RecipeCollection _recipeCollectionOnSearch; + private readonly RecipeCollection _recipeCollectionOnSearch; public SearcherRecipe(RecipeCollection recipeCollection) : base("Search recipe") { @@ -37,7 +37,7 @@ namespace ConsoleApp.Menu public override IMenu? Return() { if (CurrentSelected == null) - throw new Exception("Error: CurrentSelected is null."); + throw new ArgumentNullException("Error: CurrentSelected is null."); return new PlainText(CurrentSelected.ToString()); } diff --git a/MCTG/ConsoleApp/Program.cs b/MCTG/ConsoleApp/Program.cs index d6aedee..eb526f6 100644 --- a/MCTG/ConsoleApp/Program.cs +++ b/MCTG/ConsoleApp/Program.cs @@ -13,7 +13,6 @@ Console.WriteLine("Hello, World!\n\n"); Stub stub = new Stub(); -List recipes = stub.LoadRecipes(); List recipeCollections = stub.LoadRecipeCollection(); RecipeCollection? allRecipe = recipeCollections.Find(x => x.Description.Equals("All")); diff --git a/MCTG/ConsoleApp/Stubs/Stub.cs b/MCTG/ConsoleApp/Stubs/Stub.cs index f116321..6824430 100644 --- a/MCTG/ConsoleApp/Stubs/Stub.cs +++ b/MCTG/ConsoleApp/Stubs/Stub.cs @@ -10,7 +10,7 @@ namespace ConsoleApp { internal struct Stub { - public List LoadRecipes() + public static List LoadRecipes() { List stub = new List(); stub.AddRange(new[] @@ -81,7 +81,7 @@ namespace ConsoleApp } - public List ConstrucList() + public static List ConstrucList() { List Users = new List(); diff --git a/MCTG/Tests/Model_UnitTests/RecipeCollection_UT.cs b/MCTG/Tests/Model_UnitTests/RecipeCollection_UT.cs index 36008b1..3f09b70 100644 --- a/MCTG/Tests/Model_UnitTests/RecipeCollection_UT.cs +++ b/MCTG/Tests/Model_UnitTests/RecipeCollection_UT.cs @@ -22,7 +22,10 @@ namespace Model_UnitTests new Recipe(title: "Gateau aux cerises", id: 3) }); - Assert.Equal(2, recipes.ResearchByName("chocolat").FirstOrDefault().Id); + Recipe? recipe = recipes.ResearchByName("chocolat").FirstOrDefault(); + + Assert.NotNull(recipe); + Assert.Equal(2, recipe.Id); } } } diff --git a/MCTG/Tests/Model_UnitTests/test_unit_user.cs b/MCTG/Tests/Model_UnitTests/test_unit_user.cs index 943afa0..1756e20 100644 --- a/MCTG/Tests/Model_UnitTests/test_unit_user.cs +++ b/MCTG/Tests/Model_UnitTests/test_unit_user.cs @@ -12,8 +12,8 @@ namespace Model_UnitTests [Fact] public void TestConstructUser() { - User user = new User("Bob","Dylan", "bd@gmail.com"); - //Assert. + User? user = new User("Bob","Dylan", "bd@gmail.com"); + Assert.NotNull(user); } } } From 30cd623229077201cf74b5c1e9a7449650463ea9 Mon Sep 17 00:00:00 2001 From: Alexandre Agostinho Date: Sun, 14 May 2023 01:44:56 +0200 Subject: [PATCH 15/15] fix sonar issues bis :) --- MCTG/ConsoleApp/Menu/Entry.cs | 2 +- MCTG/ConsoleApp/Menu/Menu.cs | 4 +-- MCTG/ConsoleApp/Menu/PlainText.cs | 36 +++++++++++++++++++++----- MCTG/ConsoleApp/Menu/SearcherRecipe.cs | 2 +- MCTG/ConsoleApp/Program.cs | 4 +-- MCTG/ConsoleApp/Stubs/Stub.cs | 2 +- 6 files changed, 35 insertions(+), 15 deletions(-) diff --git a/MCTG/ConsoleApp/Menu/Entry.cs b/MCTG/ConsoleApp/Menu/Entry.cs index 6c63792..3a84fff 100644 --- a/MCTG/ConsoleApp/Menu/Entry.cs +++ b/MCTG/ConsoleApp/Menu/Entry.cs @@ -56,7 +56,7 @@ namespace ConsoleApp.Menu if (cki.Key == ConsoleKey.Escape) { if (CurrentSelected is null) - throw new ArgumentNullException("Error: CurrentSelected is null."); + throw new ArgumentNullException("CurrentSelected"); CurrentSelected.Input = InputStr.ToString(); DisableWriteMode(); diff --git a/MCTG/ConsoleApp/Menu/Menu.cs b/MCTG/ConsoleApp/Menu/Menu.cs index d556397..68962db 100644 --- a/MCTG/ConsoleApp/Menu/Menu.cs +++ b/MCTG/ConsoleApp/Menu/Menu.cs @@ -96,7 +96,7 @@ namespace ConsoleApp.Menu public virtual IMenu? Return() { if (CurrentSelected is null) - throw new ArgumentNullException("Error: CurrentSelected is null."); + throw new ArgumentNullException("CurrentSelected"); return (IMenu)CurrentSelected; } @@ -104,7 +104,7 @@ namespace ConsoleApp.Menu protected virtual List> SearchInSelection() { if (_allSelectors is null) - throw new ArgumentNullException("Error: _allSelector is null."); + throw new ArgumentNullException("_allSelectors"); return _allSelectors.FindAll(x => x.Line.ToLower().Contains(InputStr.ToString().ToLower())); diff --git a/MCTG/ConsoleApp/Menu/PlainText.cs b/MCTG/ConsoleApp/Menu/PlainText.cs index 5ad4fa9..d5deee1 100644 --- a/MCTG/ConsoleApp/Menu/PlainText.cs +++ b/MCTG/ConsoleApp/Menu/PlainText.cs @@ -34,13 +34,35 @@ namespace ConsoleApp.Menu public bool WriteMode { get; set; } public StringBuilder InputStr { get; set; } - public void DisableWriteMode() { } - public void EnableWriteMode() { } - public void SelectNext() { } - public void SelectPrevious() { } - public void ToggleWriteMode() { } - public void Update() { } - public void WriteMenuMode(ConsoleKeyInfo cki) { } + + public void DisableWriteMode() + { + // Plain text does not need to do anything for this. + } + public void EnableWriteMode() + { + // Plain text does not need to do anything for this. + } + public void SelectNext() + { + // Plain text does not need to do anything for this. + } + public void SelectPrevious() + { + // Plain text does not need to do anything for this. + } + public void ToggleWriteMode() + { + // Plain text does not need to do anything for this. + } + public void Update() + { + // Plain text does not need to do anything for this. + } + public void WriteMenuMode(ConsoleKeyInfo cki) + { + // Plain text does not need to do anything for this. + } #endregion } } diff --git a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs index af362f9..b7dea49 100644 --- a/MCTG/ConsoleApp/Menu/SearcherRecipe.cs +++ b/MCTG/ConsoleApp/Menu/SearcherRecipe.cs @@ -37,7 +37,7 @@ namespace ConsoleApp.Menu public override IMenu? Return() { if (CurrentSelected == null) - throw new ArgumentNullException("Error: CurrentSelected is null."); + throw new ArgumentNullException("CurrentSelected"); return new PlainText(CurrentSelected.ToString()); } diff --git a/MCTG/ConsoleApp/Program.cs b/MCTG/ConsoleApp/Program.cs index eb526f6..a60cdcd 100644 --- a/MCTG/ConsoleApp/Program.cs +++ b/MCTG/ConsoleApp/Program.cs @@ -11,9 +11,7 @@ Console.WriteLine("Hello, World!\n\n"); // TESTS: -Stub stub = new Stub(); - -List recipeCollections = stub.LoadRecipeCollection(); +List recipeCollections = Stub.LoadRecipeCollection(); RecipeCollection? allRecipe = recipeCollections.Find(x => x.Description.Equals("All")); if (allRecipe == null) diff --git a/MCTG/ConsoleApp/Stubs/Stub.cs b/MCTG/ConsoleApp/Stubs/Stub.cs index 6824430..689a013 100644 --- a/MCTG/ConsoleApp/Stubs/Stub.cs +++ b/MCTG/ConsoleApp/Stubs/Stub.cs @@ -67,7 +67,7 @@ namespace ConsoleApp return stub; } - public List LoadRecipeCollection() + public static List LoadRecipeCollection() { List stub = new List(); stub.AddRange(new[]