Esempio n. 1
0
        /// <summary>
        /// Renders the autocomplete dialog inside the given <paramref name="view"/> at the
        /// given point.
        /// </summary>
        /// <param name="view">The view the overlay should be rendered into</param>
        /// <param name="renderAt"></param>
        public void RenderOverlay(View view, Point renderAt)
        {
            if (!Visible || !view.HasFocus || Suggestions.Count == 0)
            {
                return;
            }

            view.Move(renderAt.X, renderAt.Y);

            // don't overspill vertically
            var height = Math.Min(view.Bounds.Height - renderAt.Y, MaxHeight);

            var toRender = Suggestions.Skip(ScrollOffset).Take(height).ToArray();

            if (toRender.Length == 0)
            {
                return;
            }

            var width = Math.Min(MaxWidth, toRender.Max(s => s.Length));

            // don't overspill horizontally
            width = Math.Min(view.Bounds.Width - renderAt.X, width);

            for (int i = 0; i < toRender.Length; i++)
            {
                if (i == SelectedIdx - ScrollOffset)
                {
                    Application.Driver.SetAttribute(ColorScheme.Focus);
                }
                else
                {
                    Application.Driver.SetAttribute(ColorScheme.Normal);
                }

                view.Move(renderAt.X, renderAt.Y + i);

                var text = TextFormatter.ClipOrPad(toRender[i], width);

                Application.Driver.AddStr(text);
            }
        }