Exemplo n.º 1
0
        /// <summary>
        /// Initialized an instance of add form with a num pad.
        /// </summary>
        ///
        /// <returns></returns>
        public AddView(Action <Item> localUnplacedEvent, Action <Item> baseUnplacedEvent,
                       string storageName = "", bool limited = true, Grid partialUnplacedGrid = null)
        {
            BackgroundColor = ContentManager.ThemeColor;
            ContentManager.AddOnBackgroundChangeListener(c => BackgroundColor = c);

            item = new Item().SetItem(-1, -1, -1, 1, "product", ContentManager.addIcon);
            Grid currentGrid = new Grid();

            Vector2D <int> selectGridIndex = new Vector2D <int>(0, 5);

            presetSelectGrid            = GridManager.InitializeGrid("Partial Preset Grid", 2, 1, formIconWidthHeight, formIconWidthHeight);
            presetSelectGrid.RowSpacing = form_icon_margin; presetSelectGrid.ColumnSpacing = form_icon_margin;
            presetScrollView            = new ScrollView()
            {
                Content = presetSelectGrid, Orientation = ScrollOrientation.Horizontal, Margin = new Thickness(0, form_grid_spacing)
            };
            defaultSelectGrid            = GridManager.InitializeGrid("Partial Default Grid", 2, 1, formIconWidthHeight, formIconWidthHeight);
            defaultSelectGrid.RowSpacing = form_icon_margin; defaultSelectGrid.ColumnSpacing = form_icon_margin;
            GridManager.AddGridItem(defaultSelectGrid, ContentManager.GeneralIcons, true, GridOrganizer.OrganizeMode.VerticalLeft);
            defaultScrollView = new ScrollView()
            {
                Content = defaultSelectGrid, Orientation = ScrollOrientation.Horizontal, Margin = new Thickness(0, form_grid_spacing)
            };

            foreach (IconLayout icon in ContentManager.GeneralIcons)
            {
                icon.OnClickIconAction = (imageButton) =>
                {
                    toggleIconSelect(imageButton, defaultSelectGrid); item.Icon = icon.GetImageSource();
                };
            }

            autoDetectLabel = new Label()
            {
                FontSize = 15, TextColor = Color.Black, BackgroundColor = Color.White, IsVisible = false, AnchorX = 0
            };

            Grid form = new Grid()
            {
                BackgroundColor = ContentManager.ThemeColor,
                RowSpacing      = form_grid_spacing,
                ColumnSpacing   = form_grid_spacing,
                RowDefinitions  =
                {
                    new RowDefinition()
                    {
                        Height = GridLength.Star
                    },
                    new RowDefinition()
                    {
                        Height = GridLength.Star
                    },
                    new RowDefinition()
                    {
                        Height = GridLength.Star
                    },
                    new RowDefinition()
                    {
                        Height = GridLength.Star
                    },
                    new RowDefinition()
                    {
                        Height = GridLength.Star
                    }
                },
                ColumnDefinitions =
                {
                    new ColumnDefinition()
                    {
                        Width = 120
                    },
                    new ColumnDefinition()
                }
            };

            ContentManager.AddOnBackgroundChangeListener(c => form.BackgroundColor = c);

            void ClearText(Button button)
            {
                button.Text = "";
                toggleSelect(selectorIndex, formSelector, selectedColor, unselectedColor);
            }

            nameInput = new Entry()
            {
                HeightRequest   = form_height_proportional * ContentManager.screenHeight / form_grid_row_count, Placeholder = "Product",
                BackgroundColor = unselectedColor, PlaceholderColor = Color.Black, Margin = new Thickness(0, form_label_horizontal_margin, form_label_horizontal_margin, 0)
            };
            nameInput.Unfocused += (obj, args) => { nameInput.BackgroundColor = unselectedColor; item.Name = nameInput.Text; autoDetectExpiration(nameInput.Text); if (imageSelectorIndex == 0)
                                                    {
                                                        changeSelectedIcon();
                                                    }
            };
            nameInput.Focused   += (obj, args) => { nameInput.BackgroundColor = selectedColor; };
            nameInput.Completed += (obj, args) => { item.Name = nameInput.Text; if (imageSelectorIndex == 0)
                                                    {
                                                        changeSelectedIcon();
                                                    }
            };
            var nameLabel = new Label()
            {
                Text = "Name: ", FontSize = form_label_font_size, TextColor = Color.Black, Margin = new Thickness(form_label_horizontal_margin, 0), VerticalTextAlignment = TextAlignment.Center
            };
            var dateLabel = new Label()
            {
                Text = "Exp. Date: ", FontSize = form_label_font_size, TextColor = Color.Black, Margin = new Thickness(form_label_horizontal_margin, 0), VerticalTextAlignment = TextAlignment.Center
            };
            var amountLabel = new Label()
            {
                Text = "Amount: ", FontSize = form_label_font_size, TextColor = Color.Black, Margin = new Thickness(form_label_horizontal_margin, 0), VerticalTextAlignment = TextAlignment.Center
            };
            var iconLabel = new Label()
            {
                Text = "Icon: ", FontSize = form_label_font_size, TextColor = Color.Black, HeightRequest = formGridRowHeight, VerticalTextAlignment = TextAlignment.Center
            };
            var dateMonth = new Button()
            {
                BorderColor = Color.Black, BorderWidth = form_input_border_width, BackgroundColor = Color.Transparent, TextColor = Color.Black
            };

            dateMonth.Clicked += (obj, arg) => { selectorIndex = 0; ClearText(dateMonth); };
            var dateDay = new Button()
            {
                BorderColor = Color.Black, BorderWidth = form_input_border_width, BackgroundColor = Color.Transparent, TextColor = Color.Black
            };

            dateDay.Clicked += (obj, arg) => { selectorIndex = 1; ClearText(dateDay); };
            var dateYear = new Button()
            {
                BorderColor = Color.Black, BorderWidth = form_input_border_width, TextColor = Color.Black
            };

            dateYear.Clicked += (obj, arg) => { selectorIndex = 2; ClearText(dateYear); };
            var amountInput = new Button()
            {
                BorderColor = Color.Black, BorderWidth = form_input_border_width, BackgroundColor = Color.Transparent,
                Margin      = new Thickness(0, 0, form_label_horizontal_margin, 0), TextColor = Color.Black
            };

            amountInput.Clicked += (obj, arg) => { selectorIndex = 3; ClearText(amountInput); };
            Grid expGrid = GridManager.InitializeGrid(1, 3, GridLength.Star, GridLength.Star);

            expGrid.ColumnSpacing = form_grid_spacing;
            expGrid.Margin        = new Thickness(0, 0, form_label_horizontal_margin, 0);
            GridManager.AddGridItem(expGrid, new List <View>()
            {
                dateMonth, dateDay, dateYear
            }, true);

            var iconSelect1 = new Button()
            {
                HeightRequest = formGridRowHeight, Text = "Preset", TextColor = Color.Black, CornerRadius = form_icon_select_border_radius,
                BorderColor   = Color.Black, BorderWidth = 2
            };

            iconSelect1.Clicked += (obj, arg) =>
            {
                imageSelectorIndex = 0; toggleSelect(0, imageSelector, selectedColor, unselectedColor);

                defaultScrollView.IsVisible = false;
                presetScrollView.IsVisible  = true;
                changeSelectedIcon();
            };
            var iconSelect2 = new Button()
            {
                HeightRequest = formGridRowHeight, Text = "General", TextColor = Color.Black, CornerRadius = form_icon_select_border_radius,
                BorderColor   = Color.Black, BorderWidth = 2
            };

            iconSelect2.Clicked += (obj, arg) =>
            {
                imageSelectorIndex          = 1; toggleSelect(1, imageSelector, selectedColor, unselectedColor);
                defaultScrollView.IsVisible = true;
                presetScrollView.IsVisible  = false;
                Console.WriteLine("AddView 144 default select grid children length " + defaultSelectGrid.Children.Count + " " + ((Grid)defaultScrollView.Content).Children.Count);
            };

            Grid iconLabelGrid = GridManager.InitializeGrid(3, 1, GridLength.Star, GridLength.Star);

            GridManager.AddGridItem(iconLabelGrid, new List <View>()
            {
                iconLabel, iconSelect1, iconSelect2
            }, false);
            iconLabelGrid.Margin = new Thickness(form_label_horizontal_margin, form_grid_spacing);

            void toggleSelect(int index, List <Button> buttonList, Color colorTo, Color normal)
            {
                foreach (var button in buttonList)
                {
                    button.BackgroundColor = normal;
                }
                buttonList[index].BackgroundColor = colorTo;
            }

            formSelector.Add(dateMonth);
            formSelector.Add(dateDay);
            formSelector.Add(dateYear);
            formSelector.Add(amountInput);
            imageSelector.Add(iconSelect1);
            imageSelector.Add(iconSelect2);

            form.Children.Add(nameLabel, 0, 0);
            form.Children.Add(nameInput, 1, 0);
            form.Children.Add(dateLabel, 0, 1);
            form.Children.Add(expGrid, 1, 1);
            form.Children.Add(amountLabel, 0, 2);
            form.Children.Add(amountInput, 1, 2);
            form.Children.Add(presetScrollView, 1, 3);
            form.Children.Add(defaultScrollView, 1, 3);
            form.Children.Add(iconLabelGrid, 0, 3);
            Grid.SetRowSpan(presetScrollView, 2);
            Grid.SetRowSpan(iconLabelGrid, 2);
            Grid.SetRowSpan(defaultScrollView, 2);

            void setItem(int newText, int index)
            {
                switch (selectorIndex)
                {
                case 0: item.expMonth = newText; break;

                case 1: item.expDay = newText; break;

                case 2: item.expYear = newText; break;

                case 3: item.Amount = newText; break;
                }
            }

            void changeText(string addedText)
            {
                // limiting digits: month / day: 2 digits. Year: 4 digits. Amount : 3 digits.
                int    limit   = selectorIndex == 2 ? 4 : selectorIndex == 3 ? 3 : 2;
                string oldText = formSelector[selectorIndex].Text ?? "";
                string newText = oldText;

                if (oldText.Length < limit)
                {
                    toggleSelect(selectorIndex, formSelector, selectedColor, unselectedColor);
                    newText = oldText + addedText;
                    formSelector[selectorIndex].Text = newText;
                    if (oldText.Length == limit - 1 && selectorIndex < formSelector.Count - 1)
                    {
                        var inputInt = int.Parse(newText);
                        switch (selectorIndex)
                        {
                        case 0:
                            if (inputInt > 12)
                            {
                                newText = "12";
                            }
                            if (int.Parse(newText.ToCharArray()[0].ToString()) == 0)
                            {
                                newText.Remove(0, 1);
                            }
                            if (inputInt <= 0)
                            {
                                newText = "1";
                            }
                            break;

                        case 1:
                            var text = formSelector[0].Text ?? "1";
                            if (int.Parse(text.ToCharArray()[0].ToString()) == 0)
                            {
                                text.Remove(0, 1);
                            }
                            var maxDay = DateCalculator.GetMonthList()[int.Parse(text) - 1];
                            if (inputInt > maxDay)
                            {
                                newText = maxDay.ToString();
                            }
                            if (inputInt <= 0)
                            {
                                newText = "1";
                            }
                            break;

                        case 3:
                            if (inputInt < 0)
                            {
                                newText = "1";
                            }
                            break;
                        }
                        formSelector[selectorIndex].Text = newText;
                        setItem(int.Parse(newText), selectorIndex);
                        selectorIndex++;
                        toggleSelect(selectorIndex, formSelector, selectedColor, unselectedColor);
                    }
                    else
                    {
                        setItem(int.Parse(newText), selectorIndex);
                    }
                }
                else if (selectorIndex < formSelector.Count - 1)
                {
                    newText = oldText + addedText;
                    formSelector[selectorIndex].Text = newText;
                    setItem(int.Parse(newText), selectorIndex);
                    selectorIndex++; toggleSelect(selectorIndex, formSelector, selectedColor, unselectedColor);
                }
            }

            Grid numPadGrid = GridManager.InitializeGrid(4, 3, GridLength.Star, GridLength.Star);

            numPadGrid.BackgroundColor = ContentManager.ThemeColor;
            ContentManager.AddOnBackgroundChangeListener(c => numPadGrid.BackgroundColor = c);
            numPadGrid.Margin        = new Thickness(form_label_horizontal_margin, 0);
            numPadGrid.RowSpacing    = numpad_spacing;
            numPadGrid.ColumnSpacing = numpad_spacing;

            List <View> numPadList = new List <View>();

            for (int i = 1; i < 10; i++)
            {
                var button = new Button()
                {
                    Text = i.ToString(), TextColor = Color.Black, Margin = new Thickness(0), BackgroundColor = numpadBackground, FontSize = numpad_font_size
                };
                int index = i;
                button.Clicked += (obj, arg) => changeText(index.ToString());
                numPadList.Add(button);
            }

            var numpadBottomLeftEmptyBuffer = new Button()
            {
                IsVisible = false
            };
            var zeroButton = new Button()
            {
                Text = "0", TextColor = Color.Black, FontSize = numpad_font_size, BackgroundColor = numpadBackground
            };

            zeroButton.Clicked += (obj, arg) => changeText("0");

            numPadList.Add(numpadBottomLeftEmptyBuffer);
            numPadList.Add(zeroButton);

            numPadGrid.OrganizeGrid(numPadList, GridOrganizer.OrganizeMode.HorizontalLeft);

            var scanButton = new Button()
            {
                Text = "Scan", TextColor = Color.Black, FontAttributes = FontAttributes.Bold, BackgroundColor = numpadBackground
            };
            var exitButton = new Button()
            {
                Text = "Exit", BackgroundColor = Color.WhiteSmoke, TextColor = Color.Black, Margin = new Thickness(5), BorderColor = Color.Black, BorderWidth = 1
            };
            var newFormButton = new Button()
            {
                BackgroundColor = Color.WhiteSmoke, Text = "Add", TextColor = Color.Black, Margin = new Thickness(5), BorderColor = Color.Black, BorderWidth = 1
            };

            manualEditLayout = new AbsoluteLayout()
            {
                HorizontalOptions = LayoutOptions.Center,
                HeightRequest     = ContentManager.screenHeight,
                WidthRequest      = ContentManager.screenWidth,
                BackgroundColor   = ContentManager.ThemeColor,
                Children          =
                {
                    form,
                    autoDetectLabel,
                    numPadGrid,
                    scanButton,
                    newFormButton,
                    exitButton
                }
            };

            scanButton.Clicked += (o, a) =>
            {
                ContentManager.pageController.ToScanPage(this);
            };
            async void OnNewItemAdded(object obj, EventArgs args)
            {
                var animatedImage = new Image()
                {
                    Source = item.Icon.Substring(6), Aspect = Aspect.Fill
                };

                manualEditLayout.Children.Add(animatedImage, new Rectangle(0.5, 0.9, 100, 100), AbsoluteLayoutFlags.PositionProportional);
                await animatedImage.QuadraticFlight(15, 75, -80, 30, (v) => { animatedImage.TranslationX = -v.X; animatedImage.TranslationY = -v.Y; }, 1500, easing : Easing.Linear);
            }

            newFormButton.Clicked += OnNewItemAdded;
            newFormButton.Clicked += (obj, args) =>
            {
                Item itemInstance = new Item().SetItem(item.expYear, item.expMonth, item.expDay, item.Amount, item.Name, item.Icon);
                Console.WriteLine("Addview 309 item icon " + itemInstance.Icon + " " + item.Icon);
                itemInstance.SetDaysUntilExpiration();
                newItem.Add(itemInstance);
                if (ContentManager.isLocal)
                {
                    localUnplacedEvent?.Invoke(itemInstance);
                }
                else
                {
                    Console.WriteLine("Addview 302 base unplace storage");
                    baseUnplacedEvent?.Invoke(itemInstance);
                }
                ResetForm();
            };

            AbsoluteLayout.SetLayoutBounds(autoDetectLabel, new Rectangle(0, 0, 1, .06));
            AbsoluteLayout.SetLayoutFlags(autoDetectLabel, AbsoluteLayoutFlags.All);
            AbsoluteLayout.SetLayoutBounds(form, new Rectangle(0, 0, 1, form_height_proportional));
            AbsoluteLayout.SetLayoutFlags(form, AbsoluteLayoutFlags.All);
            AbsoluteLayout.SetLayoutBounds(numPadGrid, new Rectangle(.5, .7, 1, numpad_height_proportional));
            AbsoluteLayout.SetLayoutFlags(numPadGrid, AbsoluteLayoutFlags.All);
            AbsoluteLayout.SetLayoutBounds(scanButton, new Rectangle(.5, .88, .5, .08));
            AbsoluteLayout.SetLayoutFlags(scanButton, AbsoluteLayoutFlags.All);
            AbsoluteLayout.SetLayoutBounds(newFormButton, new Rectangle(0, 1, 0.5, .1));
            AbsoluteLayout.SetLayoutFlags(newFormButton, AbsoluteLayoutFlags.All);
            AbsoluteLayout.SetLayoutBounds(exitButton, new Rectangle(1, 1, 0.5, .1));
            AbsoluteLayout.SetLayoutFlags(exitButton, AbsoluteLayoutFlags.All);

            exitButton.Clicked += (obj, args) =>
            {
                List <ItemLayout> newItemLayouts      = new List <ItemLayout>();
                List <ItemLayout> newItemLayoutsCopy  = new List <ItemLayout>();
                List <ItemLayout> newItemLayoutsCopy2 = new List <ItemLayout>();

                SaveInput(newItemLayouts, newItemLayoutsCopy, newItemLayoutsCopy2);

                if (partialUnplacedGrid != null)
                {
                    GridManager.AddGridItem(partialUnplacedGrid, newItemLayoutsCopy2, false);
                }

                newItemLayouts.Clear();
                newItemLayoutsCopy.Clear();
                newItemLayoutsCopy2.Clear();
                ResetForm();
                newItem.Clear();
                ContentManager.pageController.ReturnToPrevious();
            };

            Content = manualEditLayout;
        }