ui/wpf/UIcore/Container.cs

changeset 0
804d8803eade
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ui/wpf/UIcore/Container.cs	Wed Dec 09 11:32:01 2020 +0100
@@ -0,0 +1,321 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+
+namespace UI
+{
+    public interface Container
+    {
+        Layout Layout { get; set; }
+        
+        void Add(UIElement control, bool fill);
+    }
+
+    public class Layout
+    {
+        public bool? Fill { get; set; }
+        public bool Hexpand { get; set; }
+        public bool Vexpand { get; set; }
+        public bool NewLine { get; set; }
+        public int GridWidth { get; set; }
+        public String Label { get; set; }
+
+        public Layout()
+        {
+            Reset();
+        }
+
+        public bool IsFill(bool fill)
+        {
+            if (Fill != null)
+            {
+                
+                return (bool)Fill;
+            }
+            return fill;
+        }
+
+        public void Reset()
+        {
+            Fill = null;
+            Hexpand = false;
+            Vexpand = false;
+            NewLine = false;
+            GridWidth = 1;
+            Label = null;
+        }
+    }
+
+    public enum BoxOrientation
+    {
+        VERTICAL,
+        HORIZONTAL
+    }
+
+    public class BoxContainer : Grid, Container
+    {
+        public Layout Layout { get; set; }
+        
+        private BoxOrientation Orientation;
+        private int Spacing;
+
+        private int x = 0;
+        private int y = 0;
+
+        private bool filled = false;
+
+        public BoxContainer(BoxOrientation orientation, int margin, int spacing) : base()
+        {
+            Layout = new Layout();
+            Margin = new Thickness(margin);
+            Spacing = spacing;
+            
+            Orientation = orientation;
+            if(Orientation == BoxOrientation.HORIZONTAL)
+            {
+                RowDefinition row = new RowDefinition();
+                row.Height = new GridLength(1, GridUnitType.Star);
+                RowDefinitions.Add(row);
+            }
+            else
+            {
+                ColumnDefinition col = new ColumnDefinition();
+                col.Width = new GridLength(1, GridUnitType.Star);
+                ColumnDefinitions.Add(col);
+            }
+        }
+
+        public BoxContainer(Container parent, BoxOrientation orientation, int margin, int spacing) : this(orientation, margin, spacing)
+        {
+            parent.Add(this, true);
+        }
+        
+        public void Add(UIElement control, bool fill)
+        {
+            fill = Layout.IsFill(fill);
+            
+            if(Orientation == BoxOrientation.HORIZONTAL)
+            {
+                if(Spacing > 0)
+                {
+                    ColumnDefinition spaceCol = new ColumnDefinition();
+                    spaceCol.Width = new GridLength(Spacing, GridUnitType.Pixel);
+                    ColumnDefinitions.Add(spaceCol);
+                    x++;
+                }
+
+                ColumnDefinition col = new ColumnDefinition();
+                if(filled && fill)
+                {
+                    fill = false;
+                    Console.WriteLine("BoxContainer can only contain one filled control");
+                }
+                if(fill)
+                {
+                    col.Width = new GridLength(1, GridUnitType.Star);
+                    filled = true;
+                }
+                else
+                {
+                    col.Width = GridLength.Auto;
+                }
+                ColumnDefinitions.Add(col);
+            }
+            else
+            {
+                if (Spacing > 0)
+                {
+                    RowDefinition spaceRow = new RowDefinition();
+                    spaceRow.Height = new GridLength(Spacing, GridUnitType.Pixel);
+                    RowDefinitions.Add(spaceRow);
+                    y++;
+                }
+
+                RowDefinition row = new RowDefinition();
+                if (filled && fill)
+                {
+                    fill = false;
+                    Console.WriteLine("BoxContainer can only contain one filled control");
+                }
+                if(fill)
+                {
+                    row.Height = new GridLength(1, GridUnitType.Star);
+                    filled = true;
+                }
+                else
+                {
+                    row.Height = GridLength.Auto;
+                }
+                RowDefinitions.Add(row);
+            }
+
+            Grid.SetColumn(control, x);
+            Grid.SetRow(control, y);
+            Children.Add(control);
+
+            if(Orientation == BoxOrientation.HORIZONTAL)
+            {
+                x++;
+            }
+            else
+            {
+                y++;
+            }
+
+            Layout.Reset();
+        }
+    }
+    
+    public class GridContainer : Grid, Container
+    {
+        public Layout Layout { get; set; }
+
+        private int X = 0;
+        private int Y = 0;
+        private int CurrentWidth = 0;
+        private int CurrentHeight = 0;
+
+        private int ColSpacing;
+        private int RowSpacing;
+
+        public GridContainer(Container parent, int margin, int colspacing, int rowspacing) : base()
+        {
+            Layout = new Layout();
+
+            Margin = new Thickness(margin);
+            ColSpacing = colspacing;
+            RowSpacing = rowspacing;
+
+            parent.Add(this, true);
+        }
+
+        public void Add(UIElement control, bool fill)
+        {
+            if(Layout.NewLine)
+            {
+                X = 0;
+                Y++;
+            }
+
+            ColumnDefinition col;
+            RowDefinition row;
+            bool getcol = false;
+            if(X >= CurrentWidth)
+            {
+                if (ColSpacing > 0 && X != 0)
+                {
+                    ColumnDefinition spaceCol = new ColumnDefinition();
+                    spaceCol.Width = new GridLength(ColSpacing, GridUnitType.Pixel);
+                    ColumnDefinitions.Add(spaceCol);
+                    X++;
+                }
+
+                col = new ColumnDefinition();
+                col.Width = GridLength.Auto;
+                ColumnDefinitions.Add(col);
+
+                CurrentWidth = X + 1;
+            }
+            else
+            {
+                if (ColSpacing > 0 && X % 2 > 0)
+                {
+                    X++;
+                }
+                col = ColumnDefinitions.ElementAt(X);
+            }
+
+            if(getcol)
+            {
+                col = ColumnDefinitions.ElementAt(X);
+            }
+
+            if (Y >= CurrentHeight)
+            {
+                if (RowSpacing > 0 && Y != 0)
+                {
+                    RowDefinition spaceRow = new RowDefinition();
+                    spaceRow.Height = new GridLength(RowSpacing, GridUnitType.Pixel);
+                    RowDefinitions.Add(spaceRow);
+                    Y++;
+                }
+
+                row = new RowDefinition();
+                row.Height = GridLength.Auto;
+                RowDefinitions.Add(row);
+                CurrentHeight = Y + 1;
+            }
+            else
+            {
+                row = RowDefinitions.ElementAt(Y);
+            }
+
+            if(Layout.Hexpand)
+            {
+                col.Width = new GridLength(1, GridUnitType.Star);
+            }
+            if(Layout.Vexpand)
+            {
+                row.Height = new GridLength(1, GridUnitType.Star);
+            }
+
+            int gridwidth = Layout.GridWidth;
+            if(gridwidth > 1)
+            {
+                gridwidth++;
+            }
+
+            Grid.SetColumn(control, X);
+            Grid.SetRow(control, Y);
+            Grid.SetColumnSpan(control, gridwidth);
+            Children.Add(control);
+
+            Layout.Reset();
+            X += gridwidth;
+        }
+    }
+
+    public class ScrollViewerContainer : ScrollViewer, Container
+    {
+        public Layout Layout { get; set; }
+
+        public ScrollViewerContainer(Container parent) : base()
+        {
+            Layout = new Layout();
+
+            HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
+            VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
+
+            parent.Add(this, true);
+        }
+
+        public void Add(UIElement control, bool fill)
+        {
+            Content = control;
+        }
+    }
+
+    public class TabViewContainer : TabControl, Container
+    {
+        public Layout Layout { get; set; }
+
+        public TabViewContainer(Container parent) : base()
+        {
+            Layout = new Layout();
+            parent.Add(this, true);
+        }
+
+        public void Add(UIElement control, bool fill)
+        {
+            TabItem tab = new TabItem();
+            tab.Header = Layout.Label != null ? Layout.Label : "New Tab";
+            Items.Add(tab);
+            tab.Content = control;
+            Layout.Reset();
+        }
+    }
+}

mercurial