using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Telegram.Bot.Types.ReplyMarkups; using TelegramBotBase.Base; namespace TelegramBotBase.Form { /// /// Base class for an buttons array /// public class ButtonForm { List> Buttons = new List>(); public IReplyMarkup Markup { get; set; } public ControlBase DependencyControl { get; set; } /// /// Contains the number of rows. /// public int Rows { get { return Buttons.Count; } } /// /// Contains the highest number of columns in an row. /// public int Cols { get { return Buttons.Select(a => a.Count).OrderByDescending(a => a).FirstOrDefault(); } } public List this[int row] { get { return Buttons[row]; } } public ButtonForm() { } public ButtonForm(ControlBase control) { this.DependencyControl = control; } public void AddButtonRow(IEnumerable row) { Buttons.Add(row.ToList()); } public void AddButtonRow(params ButtonBase[] row) { AddButtonRow(row.ToList()); } public void InsertButtonRow(int index, IEnumerable row) { Buttons.Insert(index, row.ToList()); } public void InsertButtonRow(int index, params ButtonBase[] row) { InsertButtonRow(index, row.ToList()); } public static T[][] SplitTo(IEnumerable items, int itemsPerRow = 2) { T[][] splitted = default(T[][]); try { var t = items.Select((a, index) => new { a, index }) .GroupBy(a => a.index / itemsPerRow) .Select(a => a.Select(b => b.a).ToArray()).ToArray(); splitted = t; } catch { } return splitted; } public int Count { get { if (this.Buttons.Count == 0) return 0; return this.Buttons.Select(a => a.ToArray()).ToList().Aggregate((a, b) => a.Union(b).ToArray()).Length; } } /// /// Add buttons splitted in the amount of columns (i.e. 2 per row...) /// /// /// public void AddSplitted(IEnumerable buttons, int buttonsPerRow = 2) { var sp = SplitTo(buttons, buttonsPerRow); foreach (var bl in sp) { AddButtonRow(bl); } } public List ToList() { return this.Buttons.Aggregate((a, b) => a.Union(b).ToList()); } public InlineKeyboardButton[][] ToInlineButtonArray() { var ikb = this.Buttons.Select(a => a.Select(b => b.ToInlineButton(this)).ToArray()).ToArray(); return ikb; } public KeyboardButton[][] ToReplyButtonArray() { var ikb = this.Buttons.Select(a => a.Select(b => b.ToKeyboardButton(this)).ToArray()).ToArray(); return ikb; } /// /// Returns the first Button with the given value. /// /// /// public ButtonBase GetButtonByValue(String value) { return this.ToList().Where(a => a.Value == value).FirstOrDefault(); } public static implicit operator InlineKeyboardMarkup(ButtonForm form) { if (form == null) return null; InlineKeyboardMarkup ikm = new InlineKeyboardMarkup(form.ToInlineButtonArray()); return ikm; } public static implicit operator ReplyKeyboardMarkup(ButtonForm form) { if (form == null) return null; ReplyKeyboardMarkup ikm = new ReplyKeyboardMarkup(form.ToReplyButtonArray()); return ikm; } /// /// Creates a copy of this form. /// /// public ButtonForm Duplicate() { var bf = new ButtonForm() { Markup = this.Markup, DependencyControl = this.DependencyControl }; foreach(var b in Buttons) { var lst = new List(); foreach(var b2 in b) { lst.Add(b2); } bf.Buttons.Add(lst); } return bf; } } }