private void RenderComboBox(ComboBox comboBox) { Point loc = comboBox.AbsoluteLocation(); ConsoleAdapter.Write(new string(' ', comboBox.Width)); ConsoleAdapter.MoveCursor(loc.Left, loc.Top); ConsoleAdapter.Write(comboBox.VisibleText); ConsoleAdapter.MoveCursor(loc.Left + comboBox.Width - 1, loc.Top); ConsoleColor saveColor = ConsoleAdapter.BackgroundColor; ConsoleAdapter.BackgroundColor = comboBox.ExpanderBackground; var expanded = comboBox.DroppedDown; ConsoleAdapter.Write(expanded ? '▲' : '▼'); ConsoleAdapter.BackgroundColor = saveColor; var initialCurosrTopPosition = loc.Top + 1; var itemLinesToDraw = comboBox.Items.Count > comboBox.VisibleItemsCount ? comboBox.VisibleItemsCount : comboBox.Items.Count; var expanderLocation = new Point { Left = loc.Left + 1, Top = initialCurosrTopPosition }; var expanderSize = new Size { Width = comboBox.Width - 1, Height = itemLinesToDraw }; if (expanded) { ConsoleAdapter.MoveCursor(loc.Left + comboBox.Width - 1, loc.Top); RenderBackgroundBox( expanderLocation, expanderSize, comboBox.BackgroundColor ); ConsoleAdapter.ForegroundColor = comboBox.ForegroundColor; ConsoleAdapter.BackgroundColor = comboBox.BackgroundColor; var startItem = comboBox.SelectedIndex >= comboBox.VisibleItemsCount ? comboBox.SelectedIndex - comboBox.VisibleItemsCount + 1 : 0; for (int i = startItem; i < startItem + itemLinesToDraw; i++) { ConsoleAdapter.MoveCursor(loc.Left + 1, initialCurosrTopPosition); if (comboBox.Items[i] == comboBox.Items[comboBox.SelectedIndex]) { ConsoleAdapter.BackgroundColor = RenderOptions.ColorScheme.FocusedBackgroundColor; ConsoleAdapter.ForegroundColor = comboBox.SelectedColor; } ConsoleAdapter.Write(comboBox.Items[i].Text); ConsoleAdapter.BackgroundColor = comboBox.BackgroundColor; ConsoleAdapter.ForegroundColor = comboBox.ForegroundColor; ++initialCurosrTopPosition; } if (comboBox.Items.Count > comboBox.VisibleItemsCount) { var rollerSize = (int)((comboBox.VisibleItemsCount / (float)comboBox.Items.Count) * (comboBox.VisibleItemsCount - 2)); var rollDiff = comboBox.Items.Count - comboBox.VisibleItemsCount; var rollerOffset = comboBox.SelectedIndex < comboBox.VisibleItemsCount ? 0 : (int)(((comboBox.SelectedIndex - comboBox.VisibleItemsCount + 1) / (float)rollDiff) * (comboBox.VisibleItemsCount - 2 - rollerSize)); RenderVerticalScroll( new Point() { Left = loc.Left + comboBox.Width - 1, Top = loc.Top + 1 }, comboBox.VisibleItemsCount, rollerSize, rollerOffset ); } } else { RenderBackgroundBox( expanderLocation, expanderSize, ScoreboardContext.Navigation.Current.Scoreboard.BackgroundColor ); var overlapped = GetOverlappedControls(expanderLocation, new Point { Left = expanderLocation.Left + expanderSize.Width, Top = expanderLocation.Top + expanderSize.Height }).Where(_ => _ != comboBox); RenderOverridedExcept(overlapped, comboBox); } }