bykovme/nswallet

View on GitHub
src/NSWallet/NSWallet/ViewModel/MainScreen/ItemCreation/MainScreenChooseIconViewModel.cs

Summary

Maintainability
C
1 day
Test Coverage
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using NSWallet.Helpers;
using NSWallet.Shared;
using Xamarin.Forms;

using System.Linq;
using NSWallet.Enums;
using NSWallet.NetStandard.Helpers;

namespace NSWallet
{
    public class MainScreenChooseIconViewModel : ViewModel
    {
        INavigation navigation;
        NSWItemType itemType;
        bool isEdit;
        List<ItemList> savedList { get; set; }

        public MainScreenChooseIconViewModel(INavigation navigation, NSWItemType itemType, bool isEdit, string name)
        {
            this.itemType = itemType;
            this.navigation = navigation;
            this.isEdit = isEdit;
            NameProperty = name;

            savedList = new List<ItemList>();
            Items = new List<ItemList>(getItems());
            Folders = new List<ItemModel>();
        }

        public string Title {
            get {
                switch (itemType) {
                    case NSWItemType.Item: return TR.Tr("new_item_icon") + String.Format(" '{0}'", NameProperty);
                    case NSWItemType.Folder: return TR.Tr("new_folder_icon") + String.Format(" '{0}'", NameProperty);
                    default: return null;
                }
            }
        }

        object selectedItem;
        public object SelectedItem {
            get { return items; }
            set {
                if (selectedItem == value)
                    return;

                selectedItem = value;

                CreateCommand.Execute(selectedItem);

                OnPropertyChanged("SelectedItem");
            }
        }

        string searchText;
        public string SearchText {
            get { return searchText; }
            set {
                if (searchText == value)
                    return;
                searchText = value;
                if (searchText != null) {
                    if (searchText.Length > 0) {
                        searchCommand(searchText);
                    } else {
                        Items = new List<ItemList>(savedList);
                    }
                } else {
                    Items = new List<ItemList>(savedList);
                }
                OnPropertyChanged("SearchText");
            }
        }

        void searchCommand(string text)
        {
            Items = new List<ItemList>(searchByText(text));
        }

        List<ItemList> searchByText(string text)
        {
            var loweredText = text.ToLower();
            var searchResult = new List<ItemList>();
            foreach (var item in savedList) {
                var itemList = new ItemList();
                if (item != null) {
                    foreach (var innerItem in item) {
                        var name = innerItem.Name;
                        if (name != null) {
                            if (name.ToLower().Contains(loweredText)) {
                                itemList.Title = item.Title;
                                itemList.Add(new ItemModel {
                                    Icon = innerItem.Icon,
                                    Name = innerItem.Name,
                                    TechName = innerItem.TechName,
                                    IsCircle = innerItem.IsCircle,
                                    IsNotCircle = innerItem.IsNotCircle
                                });
                            }
                        }
                    }
                }
                if (itemList.Count > 0) {
                    searchResult.Add(itemList);
                }
            }
            return searchResult;
        }

        string nameProperty;
        public string NameProperty {
            get { return nameProperty; }
            set {
                if (nameProperty == value)
                    return;
                nameProperty = value;
                OnPropertyChanged("NameProperty");
            }
        }

        List<ItemList> items;
        public List<ItemList> Items {
            get {
                return items;
            }
            set {
                if (items == value)
                    return;
                items = value;
                OnPropertyChanged("Items");
            }
        }

        List<ItemList> getItems()
        {
            var itemList = new List<ItemList>();
            var groups = BL.GetGroups();
            var iconsPremade = IconGroups.GetIconsWithGroups();
            var iconsPremadeGroupped = iconsPremade.GroupBy(x => x.Value);
            var iconsCustom = BL.GetIcons();
            var iconsCustomGrouped = iconsCustom.GroupBy(x => x.GroupID);
            foreach (var group in groups) {

                var item = new ItemList {
                    Title = TR.Tr(group.Name)
                };

                var premadeIconsList = iconsPremadeGroupped.Where(x => x.Key == group.Name);

                foreach (var iconCategory in premadeIconsList) {
                    foreach (var icon in iconCategory) {
                        var key = icon.Key;
                        item.Add(new ItemModel {
                            Name = TR.Tr(key),
                            TechName = key,
                            Icon = ImageSource.FromStream(() => NSWRes.GetImage(IconHandler.GetPathForItemIcon(key))),
                            IsCircle = false,
                            IsNotCircle = true
                        });
                    }
                }

                var customIconList = iconsCustomGrouped.Where(x => x.Key == group.GroupID);

                foreach (var iconCategory in customIconList) {
                    foreach(var icon in iconCategory) {
                        if (!icon.Deleted) {
                            item.Add(new ItemModel {
                                Name = icon.Name,
                                TechName = icon.IconID,
                                Icon = ImageSource.FromStream(() => new System.IO.MemoryStream(icon.Icon)),
                                IsCircle = icon.IsCircle,
                                IsNotCircle = icon.IsNotCircle
                            });
                        }
                    }
                }

                item.Sort((x, y) => string.Compare(x.Name, y.Name));

                if (item.Count > 0) {
                    itemList.Add(item);
                }
            }

            itemList.Sort((x, y) => string.Compare(x.Title, y.Title));
            savedList = itemList;
            return itemList;
            //var itemList = new List<ItemList>();
            //var resources = NSWRes.GetResourceNames();
            //var iconCategories = IconGroups.GetIconsWithGroups();

            //var commonCategory = new ItemList();
            //commonCategory.Title = TR.Tr("category_common");
            //var internetCategory = new ItemList();
            //internetCategory.Title = TR.Tr("category_internet");
            //var travellingCategory = new ItemList();
            //travellingCategory.Title = TR.Tr("category_travelling");
            //var financesCategory = new ItemList();
            //financesCategory.Title = TR.Tr("category_finances");
            //var technologiesCategory = new ItemList();
            //technologiesCategory.Title = TR.Tr("category_technologies");
            //var socialCategory = new ItemList();
            //socialCategory.Title = TR.Tr("category_social");
            //var gamesCategory = new ItemList();
            //gamesCategory.Title = TR.Tr("category_games");
            //var cloudsCategory = new ItemList();
            //cloudsCategory.Title = TR.Tr("category_clouds");
            //var developmentCategory = new ItemList();
            //developmentCategory.Title = TR.Tr("category_development");

            //foreach (var res in resources) {
            //    if (res.StartsWith(NSWRes.GetRunspaceAssetsPath() + GConsts.ICONS_ITEMS_PATH + "icon_",
            //                       System.StringComparison.CurrentCulture)
            //        && res.EndsWith("_huge.png", System.StringComparison.CurrentCulture)) {
            //        var itemsCategories = new List<ItemModel>();

            //        if (res.Contains("document")) {
            //            commonCategory.Insert(0, new ItemModel {
            //                Name = TR.Tr(res.Substring(55, res.Length - 64)),
            //                TechName = res.Substring(55, res.Length - 64),
            //                Icon = ImageSource.FromStream(() => NSWRes.GetImage(res.Remove(0, 38)))
            //            });
            //        } else {
            //            var itemModel = new ItemModel {
            //                Name = TR.Tr(res.Substring(55, res.Length - 64)),
            //                TechName = res.Substring(55, res.Length - 64),
            //                Icon = ImageSource.FromStream(() => NSWRes.GetImage(res.Remove(0, 38)))
            //            };

            //            var techName = itemModel.TechName;
            //            var iconsWithGroups = IconGroups.GetIconsWithGroups();
            //            var group = iconsWithGroups[techName];
            //            if (group != null) {
            //                switch (group) {
            //                    case "category_common":
            //                        commonCategory.Add(itemModel);
            //                        break;
            //                    case "category_internet":
            //                        internetCategory.Add(itemModel);
            //                        break;
            //                    case "category_travelling":
            //                        travellingCategory.Add(itemModel);
            //                        break;
            //                    case "category_finances":
            //                        financesCategory.Add(itemModel);
            //                        break;
            //                    case "category_technologies":
            //                        technologiesCategory.Add(itemModel);
            //                        break;
            //                    case "category_social":
            //                        socialCategory.Add(itemModel);
            //                        break;
            //                    case "category_games":
            //                        gamesCategory.Add(itemModel);
            //                        break;
            //                    case "category_clouds":
            //                        cloudsCategory.Add(itemModel);
            //                        break;
            //                    case "category_development":
            //                        developmentCategory.Add(itemModel);
            //                        break;
            //                }
            //            }
            //        }
            //    }
            //}

            //var customImages = BL.GetIcons();
            //var groups = BL.GetGroups();
            //foreach (var customImage in customImages) {

            //    var group = groups.Find(x => x.GroupID == customImage.GroupID);

            //    var nswFormsIcon = new NSWFormsIconModel(customImage);

            //    var itemModel = new ItemModel {
            //        Icon = nswFormsIcon.Icon,
            //        Name = nswFormsIcon.Name,
            //        TechName = nswFormsIcon.IconID
            //    };

            //    if (group != null) {
            //        switch (group.Name) {
            //            case "category_common":
            //                commonCategory.Add(itemModel);
            //                break;
            //            case "category_internet":
            //                internetCategory.Add(itemModel);
            //                break;
            //            case "category_travelling":
            //                travellingCategory.Add(itemModel);
            //                break;
            //            case "category_finances":
            //                financesCategory.Add(itemModel);
            //                break;
            //            case "category_technologies":
            //                technologiesCategory.Add(itemModel);
            //                break;
            //            case "category_social":
            //                socialCategory.Add(itemModel);
            //                break;
            //            case "category_games":
            //                gamesCategory.Add(itemModel);
            //                break;
            //            case "category_clouds":
            //                cloudsCategory.Add(itemModel);
            //                break;
            //            case "category_development":
            //                developmentCategory.Add(itemModel);
            //                break;
            //        }
            //    }
            //}

            //commonCategory.Sort((x, y) => string.Compare(x.Name, y.Name));
            //itemList.Add(commonCategory);
            //internetCategory.Sort((x, y) => string.Compare(x.Name, y.Name));
            //itemList.Add(internetCategory);
            //travellingCategory.Sort((x, y) => string.Compare(x.Name, y.Name));
            //itemList.Add(travellingCategory);
            //financesCategory.Sort((x, y) => string.Compare(x.Name, y.Name));
            //itemList.Add(financesCategory);
            //technologiesCategory.Sort((x, y) => string.Compare(x.Name, y.Name));
            //itemList.Add(technologiesCategory);
            //socialCategory.Sort((x, y) => string.Compare(x.Name, y.Name));
            //itemList.Add(socialCategory);
            //gamesCategory.Sort((x, y) => string.Compare(x.Name, y.Name));
            //itemList.Add(gamesCategory);
            //cloudsCategory.Sort((x, y) => string.Compare(x.Name, y.Name));
            //itemList.Add(cloudsCategory);
            //developmentCategory.Sort((x, y) => string.Compare(x.Name, y.Name));
            //itemList.Add(developmentCategory);

            //itemList.Sort((x, y) => string.Compare(x.Title, y.Title));
            //savedList = itemList;
            //return itemList;
        }

        List<ItemModel> folders;
        public List<ItemModel> Folders {
            get {
                var resources = NSWRes.GetResourceNames();

                foreach (var res in resources) {
                    if (res.StartsWith(NSWRes.GetRunspaceAssetsPath() + GConsts.ICONS_ITEMS_PATH + "icon_folder",
                                       System.StringComparison.CurrentCulture)) {
                        folders.Add(new ItemModel {
                            Name = TR.Tr(res.Substring(55, res.Length - 59)),
                            TechName = res.Substring(55, res.Length - 59),
                            Icon = ImageSource.FromStream(() => NSWRes.GetImage(res.Remove(0, 38)))
                        });
                    }
                }

                return folders;
            }
            set {
                if (folders == value)
                    return;

                folders = value;

                OnPropertyChanged("Folders");
            }
        }

        Command createCommand;
        public Command CreateCommand {
            get {
                return createCommand ?? (createCommand = new Command(ExecuteCreateCommand));
            }
        }

        protected void ExecuteCreateCommand(object item)
        {
            var itemObj = (ItemModel)item;
            string id = null;

            if (!isEdit) {
                if (itemType == NSWItemType.Item) {
                    id = BL.AddItem(NameProperty, itemObj.TechName, false);
                }

                if (itemType == NSWItemType.Folder) {
                    id = BL.AddItem(NameProperty, itemObj.TechName, true);
                }

                if (!string.IsNullOrEmpty(id)) {
                    BL.SetCurrentItemID(id);
                }

                MessagingCenter.Send<MainScreenChooseIconViewModel>(this, "/reloaditems");
            } else {
                var currentItemID = BL.CurrentItemID;



                BL.UpdateItemIcon(currentItemID, itemObj.TechName);

                MessagingCenter.Send<MainScreenChooseIconViewModel>(this, "/reloadicon");
            }

            navigation.PopModalAsync(true);
            navigation.PopModalAsync(true);
        }
    }
}