public virtual bool Update(Keys key, Func <char?> getKey, bool click, int mouseX, int mouseY) { if (!Visible) { return(false); } char?c; if (key == Keys.Tab) { if (CurrentlySelected == null && Inputs.Any()) { SelectFirstItem(); } else { CurrentlySelected?.Tab(); } } else if (key == Keys.Escape) { CurrentlySelected?.Escape(); } else if (key == Keys.PageUp) { CurrentlySelected?.PageUp(); } else if (key == Keys.PageDown) { CurrentlySelected?.PageDown(); } else if (key == Keys.Enter) { CurrentlySelected?.Enter(); } else if (key == Keys.Delete) { CurrentlySelected?.Delete(); } else if (key == Keys.Left) { CurrentlySelected?.CursorMoveLeft(); } else if (key == Keys.Right) { CurrentlySelected?.CursorMoveRight(); } else if (key == Keys.Up) { CurrentlySelected?.CursorMoveUp(); } else if (key == Keys.Down) { CurrentlySelected?.CursorMoveDown(); } else if (key == Keys.Back) { CurrentlySelected?.BackSpace(); } else if (key == Keys.Home) { CurrentlySelected?.CursorToStart(); } else if (key == Keys.End) { CurrentlySelected?.CursorToEnd(); } else if ((c = getKey?.Invoke()) != null) { CurrentlySelected?.AddLetter((char)c); // Letter(input.KeyChar); } else if (click) { var handled = false; foreach (var i in Inputs) { var rect = new Rectangle(i.PositionX, i.PositionY, i.Width, i.Height); if (rect.Contains(new Point(mouseX, mouseY))) { var mx = mouseX - i.PositionX; var my = mouseY - i.PositionY; if (i.Selectable) { CurrentlySelected = i; SetSelected(); } i.Click(mx, my); handled = true; } } Click(mouseX, mouseY, handled); } return(true); }