using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Globalization; using System.Linq; using Xamarin.Forms; using Xamarin.Forms.Xaml; using XF.Material.Forms; namespace InABox.Mobile { public class ToolGridLayoutChangedEventArgs : EventArgs { public int RowCount { get; private set; } public int ColCount { get; private set; } public ToolGridLayoutChangedEventArgs(int rowcount, int colcount) { RowCount = rowcount; ColCount = colcount; } } public delegate void ToolGridLayoutChangedEvent(object sender, ToolGridLayoutChangedEventArgs args); public class ToolGridViewModel : BindableObject { public IList Items { get; private set; } public IList VisibleItems { get; private set; } public int Columns { get; set; } public ToolGridViewModel() { Columns = 4; Items = new ObservableCollection(); VisibleItems = new ObservableCollection(); ((ObservableCollection)Items).CollectionChanged += (sender, args) => { VisibleItems.Clear(); DoLayout(); }; } private void DoLayout() { int iRow = 0; int iCol = 0; foreach (var item in Items.Where(x => x.IsVisible)) { item.Row = iRow; item.Column = iCol; VisibleItems.Add(item); iCol++; if (iCol == Columns) { iRow++; iCol = 0; } } LayoutChanged?.Invoke(this,new ToolGridLayoutChangedEventArgs(iRow,Columns)); } public Color BackgroundColor { get; set; } public event ToolGridLayoutChangedEvent LayoutChanged; } [XamlCompilation(XamlCompilationOptions.Compile)] public partial class MobileToolGrid { public IList Items => _viewModel.Items; public MobileToolGrid() { InitializeComponent(); BindableLayout.SetItemsSource(_flexgrid, _viewModel.VisibleItems); } private readonly BindableProperty BorderColorProperty = BindableProperty.Create( nameof(BorderColor), typeof(Color), typeof(MobileToolGrid), Material.Color.SecondaryVariant ); public Color BorderColor { get => (Color)GetValue(BorderColorProperty); set => SetValue(BorderColorProperty, value); } private void ImageTapped(object sender, EventArgs e) { if ((sender is Image image) && (image.BindingContext is MobileMobileToolItem item) && item.IsEnabled) item.DoTap(); } private void _viewModel_OnLayoutChanged(object sender, ToolGridLayoutChangedEventArgs args) { _flexgrid.RowDefinitions.Clear(); for (int i=0; i< args.RowCount; i++) _flexgrid.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto}); _flexgrid.ColumnDefinitions.Clear(); for (int i=0; i< args.ColCount; i++) _flexgrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Star}); } } }