Inheritance: ViewModelBase, IAnimeData, IAnimeListItem
 private async void AnimeListPageGridViewOnItemClick(AnimeItemViewModel model)
 {
     await Task.Delay(75); //let's behold this ripple effect
     var args = ViewModelLocator.GeneralMain.GetCurrentListOrderParams();
     args.SelectedItemIndex = ViewModel.AnimeItems.IndexOf(model);
     model.NavigateDetails(null, args);
 }
        public static void BuildWatchedDialog(AnimeItemViewModel ViewModel,Action<AnimeItemViewModel, string> action = null,bool volumes = false)
        {
            _watchedDialogContext = ViewModel;
            _watchedDialogAction = action;
            var dialogBuilder = DialogPlus.NewDialog(MainActivity.CurrentContext);
            dialogBuilder.SetContentHolder(new ViewHolder(Resource.Layout.AnimeItemWatchedDialog));
            dialogBuilder.SetContentBackgroundResource(Resource.Color.BrushFlyoutBackground);
            dialogBuilder.SetOnDismissListener(new DialogDismissedListener(CleanupWatchedDialog));
            dialogBuilder.SetOnDismissListener(
                new DialogDismissedListener(() => ViewModelLocator.NavMgr.ResetOneTimeOverride()));
            ViewModelLocator.NavMgr.RegisterOneTimeMainOverride(new RelayCommand(CleanupWatchedDialog));
            _watchedDialog = dialogBuilder.Create();
            var view = _watchedDialog.HolderView;


            view.FindViewById<ImageButton>(Resource.Id.AnimeItemWatchedDialogAcceptButton)
                .SetCommand("Click", new RelayCommand(
                    () =>
                    {
                        if (!volumes)
                            ViewModel.OnFlyoutEpsKeyDown.Execute(null);
                        else
                            action.Invoke(_watchedDialogContext, _watchedDialog.HolderView.FindViewById<TextView>(
                                Resource.Id.AnimeItemWatchedDialogTextInput).Text);
                        CleanupWatchedDialog();
                    }));

            var grid = view.FindViewById<GridView>(Resource.Id.AnimeItemWatchedDialogEpisodesGridView);
            if (volumes)
            {

                grid.Adapter = new WatchedDialogAdapter(MainActivity.CurrentContext, ViewModel.MyVolumes,
                    ViewModel.AllVolumes);
                view.FindViewById<TextView>(Resource.Id.AnimeItemWatchedDialogTitleTextView).Text = "Read volumes";
            }
            else
            {
                var input = view.FindViewById<EditText>(Resource.Id.AnimeItemWatchedDialogTextInput);
                _watchedDialogBindings.Add(new Binding<string, string>(ViewModel, () => ViewModel.WatchedEpsInput, input,
                    () => input.Text, BindingMode.TwoWay));
                grid.Adapter = new WatchedDialogAdapter(MainActivity.CurrentContext, ViewModel.MyEpisodesFocused,
                    ViewModel.AllEpisodesFocused);
                view.FindViewById<TextView>(Resource.Id.AnimeItemWatchedDialogTitleTextView).Text =
                    ViewModel.WatchedEpsLabel;
            }

            grid.ItemClick += GridOnItemClick;
            _watchedDialog.Show();
        }
        public static DroppyMenuPopup BuildForAnimeItem(Context context, View parent, AnimeItemViewModel viewModel, Action<AnimeGridItemMoreFlyoutButtons> callback,bool forceSmall = false)
        {
            AnimeListPageFlyoutBuilder.ParamRelativeLayout = new ViewGroup.LayoutParams(300, 75);

            var droppyBuilder = new DroppyMenuPopup.Builder(context, parent);
            AnimeListPageFlyoutBuilder.InjectAnimation(droppyBuilder);


            var listener = new Action<int>(i => callback.Invoke((AnimeGridItemMoreFlyoutButtons)i));

            droppyBuilder.AddMenuItem(new DroppyMenuCustomItem(AnimeListPageFlyoutBuilder.BuildItem(context, "Copy to clipboard", listener, 0)));
            droppyBuilder.AddMenuItem(new DroppyMenuCustomItem(AnimeListPageFlyoutBuilder.BuildItem(context, "Open in browser", listener, 1)));
            if (!forceSmall && viewModel.Auth)
            {
                droppyBuilder.AddSeparator();
                droppyBuilder.AddMenuItem(new DroppyMenuCustomItem(AnimeListPageFlyoutBuilder.BuildItem(context, "Set status", listener, 2)));
                droppyBuilder.AddMenuItem(new DroppyMenuCustomItem(AnimeListPageFlyoutBuilder.BuildItem(context, "Set score", listener, 3)));
                droppyBuilder.AddMenuItem(new DroppyMenuCustomItem(AnimeListPageFlyoutBuilder.BuildItem(context, "Set watched", listener, 4)));
            }

            return droppyBuilder.Build();
        }
        //private StorageFile _originaPickedStorageFile;
        //private async void LoadSelectedImage()
        //{
        //    var fp = new FileOpenPicker();
        //    fp.ViewMode = PickerViewMode.Thumbnail;
        //    fp.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
        //    fp.FileTypeFilter.Add(".png");
        //    fp.FileTypeFilter.Add(".jpg");
        //    var file = await fp.PickSingleFileAsync();
        //    if (file != null)
        //    {
        //        _selectedImageOptionIndex = 1;
        //        ImagePreviewVisibility = Visibility.Visible;
        //        RaisePropertyChanged(() => SelectedImageOptionIndex);
        //    }
        //    _originaPickedStorageFile = file;
        //    var bmp = new BitmapImage();
        //    var bmp1 = new BitmapImage();
        //    using (var fs = (await file.OpenStreamForReadAsync()).AsRandomAccessStream())
        //    {
        //        bmp.SetSource(fs);
        //        fs.Seek(0);
        //        bmp1.SetSource(fs);
        //    }
        //    PreviewImageWide = bmp1;
        //    PreviewImageNormal = bmp;
        //}

        //public async void HidePinDialog()
        //{
        //    var sb = ViewModelLocator.Main.View.HidePinDialogStoryboard;
        //    sb.Completed += SbOnCompleted;
        //    sb.Begin();
        //}



        public void Load(AnimeItemViewModel data)
        {
            GeneralVisibility = Visibility.Visible;
            _lastCroppedFileName = null;
            _lastCroppedFileNameWide = null;
            EntryData = data;
            ResetCrop();
            ResetCrop(true);
            RaisePropertyChanged(() => EntryData);
        }
 private static void CleanupWatchedDialog()
 {
     ViewModelLocator.NavMgr.ResetOneTimeMainOverride();
     _watchedDialogBindings.ForEach(binding => binding.Detach());
     _watchedDialogBindings = new List<Binding>();
     _watchedDialog?.Dismiss();
     _watchedDialog = null;
     _watchedDialogContext = null;
     _watchedDialogAction = null;
 }