private void AddSwitchToSuggestions()
        {
            var firstElement = new ApplicationRobotAction(ApplicationRobotActionTarget.Suggestion, 0, 0, false);

            var actions = new List <ApplicationRobotAction>();

            for (var index = 1; index < _model.SuggestionLists.Count; index++)
            {
                var element = new ApplicationRobotAction(ApplicationRobotActionTarget.Suggestion, index, 0, false);
                actions.Add(element);
            }

            for (var index = 0; index < _model.SuggestionLists.Count; index++)
            {
                var list  = _model.SuggestionLists[index];
                var count = list.Count();
                if (1 < count)
                {
                    var element = new ApplicationRobotAction(ApplicationRobotActionTarget.Suggestion, index, list.Count() - 1, false);
                    actions.Add(element);
                }
            }

            AddRectangle(() => { _switchTarget = ApplicationRobotActionTarget.Suggestion; ShowSwitchInterface(); }, firstElement, actions.ToArray());
        }
        private async Task ShowSwitchInterfaceAsync()
        {
            await Task.Delay(200);

            _switchTarget = ApplicationRobotActionTarget.Interstitial;
            ShowSwitchInterface();
        }
        private void AddSwitchToHead()
        {
            var headElement = new ApplicationRobotAction(ApplicationRobotActionTarget.Head, 0, 0, false);
            var tailElement = new ApplicationRobotAction(ApplicationRobotActionTarget.Tail, _model.TailItems.Count - 1, 0, false);

            AddRectangle(() => { _switchTarget = ApplicationRobotActionTarget.Head; ShowSwitchInterface(); }, headElement, tailElement);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="target"></param>
        /// <param name="index"></param>
        /// <param name="subIndex"></param>
        /// <param name="isComplete"></param>
        public ApplicationRobotAction(ApplicationRobotActionTarget target,
                                      int index,
                                      int subIndex,
                                      bool isComplete)
        {
            Debug.Assert(0 <= index);
            Debug.Assert(target == ApplicationRobotActionTarget.Suggestion || subIndex == 0);

            Target     = target;
            Index      = index;
            SubIndex   = subIndex;
            IsComplete = isComplete;
        }
        internal SwitchInterface(IApplicationHost host, ISuperPanel <FrameworkElement, Size, Rect> panel, Canvas targetCanvas)
        {
            _host       = host;
            _panel      = panel;
            _model      = host.Model;
            SwitchPanel = targetCanvas;

            _switchTimer.Tick += OnSwitchTimerTick;

            _model.ApplicationModelUpdate += OnApplicationModelUpdate;

            Debug.WriteLine("Enter switch mode");
            _switchTarget = ApplicationRobotActionTarget.Interstitial;
            ShowSwitchInterface();
        }
        private void ShowSwitchInterface()
        {
            _switchClickCount     = 0;
            _switchTimer.Interval = TimeSpan.FromSeconds(10);
            _switchTimer.Start();

            SwitchPanel.Children.Clear();
            _targets.Clear();

            switch (_switchTarget)
            {
            case ApplicationRobotActionTarget.Head:
            {
                AddSwitchToInterstitials();

                AddSwitchToSuggestions();

                for (var index = 0; index < _model.HeadItems.Count; index++)
                {
                    var element = new ApplicationRobotAction(ApplicationRobotActionTarget.Head, index, 0, false);
                    AddRectangle(element);
                }

                for (var index = 0; index < _model.TailItems.Count; index++)
                {
                    var element = new ApplicationRobotAction(ApplicationRobotActionTarget.Tail, index, 0, false);
                    AddRectangle(element);
                }
            }
            break;

            case ApplicationRobotActionTarget.Tail:
            {
                AddSwitchToSuggestions();

                var list = _model.SuggestionLists[_switchSuggestionListsIndex];
                for (var subIndex = 0; subIndex < list.Count(); subIndex++)
                {
                    var element = new ApplicationRobotAction(ApplicationRobotActionTarget.Suggestion, _switchSuggestionListsIndex, subIndex, false);
                    AddRectangle(element);
                }
            }
            break;

            case ApplicationRobotActionTarget.Suggestion:
            {
                AddSwitchToHead();

                AddSwitchToInterstitials();

                for (var index = 0; index < _model.SuggestionLists.Count; index++)
                {
                    var element = new ApplicationRobotAction(ApplicationRobotActionTarget.Suggestion, index, 0, false);

                    var list  = _model.SuggestionLists[index];
                    var count = list.Count();

                    if (1 < count)
                    {
                        var lastElement = new ApplicationRobotAction(ApplicationRobotActionTarget.Suggestion, index, count - 1, false);

                        var uncapturedIndex = index;
                        AddRectangle(() => { _switchTarget = ApplicationRobotActionTarget.Tail; _switchSuggestionListsIndex = uncapturedIndex; ShowSwitchInterface(); }, element, lastElement);
                    }
                    else
                    {
                        AddRectangle(element);
                    }
                }
            }
            break;

            case ApplicationRobotActionTarget.Interstitial:
            default:
            {
                Debug.Assert(_switchTarget == ApplicationRobotActionTarget.Interstitial);

                AddSwitchToSuggestions();

                AddSwitchToHead();

                for (var index = 0; index < _model.SuggestionInterstitials.Count; index++)
                {
                    var element = new ApplicationRobotAction(ApplicationRobotActionTarget.Interstitial, index, 0, false);
                    AddRectangle(element);
                }
            }
            break;
            }
        }
 private void AddSwitchToInterstitials()
 {
     AddRectangle(() => { _switchTarget = ApplicationRobotActionTarget.Interstitial; ShowSwitchInterface(); },
                  new ApplicationRobotAction(ApplicationRobotActionTarget.Interstitial, 0, 0, false),
                  new ApplicationRobotAction(ApplicationRobotActionTarget.Interstitial, _model.SuggestionInterstitials.Count - 1, 0, false));
 }
 private ApplicationRobotAction(ApplicationRobotActionTarget target,
                                int index)
     : this(target, index, 0, false)
 {
 }
 private ApplicationRobotAction(ApplicationRobotActionTarget target,
                                int index,
                                bool isComplete)
     : this(target, index, 0, isComplete)
 {
 }