Switch-Toolbox/Switch_Toolbox_Library/Forms/Custom/STComboBox.cs
KillzXGaming 157ff75b79 Add model cycling if multiple models are active in an editor.
Models can be cycled in the same editor. The active one now gets properly set. You can adjust the combo box to preview multiple models in the scene.
Fixed a bug where some models would project on the top of the screen as duplicates.
2019-06-06 15:40:32 -04:00

273 lines
8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Reflection;
namespace Switch_Toolbox.Library.Forms
{
public class STComboBox : ComboBox
{
public static ComboBoxStyle STDropDownStyle = ComboBoxStyle.DropDown;
private Brush BorderBrush = new SolidBrush(FormThemes.BaseTheme.ComboBoxBackColor);
private Brush ArrowBrush = new SolidBrush(SystemColors.ControlText);
private Brush DropButtonBrush = new SolidBrush(SystemColors.Control);
private Color _borderColor
{
get
{
if (Enabled)
return FormThemes.BaseTheme.ComboBoxBorderColor;
else
return FormThemes.BaseTheme.DisabledBorderColor;
}
}
private ButtonBorderStyle _borderStyle = ButtonBorderStyle.Solid;
private static int WM_PAINT = 0x000F;
private Color _ButtonColor = SystemColors.Control;
public Color ButtonColor
{
get { return _ButtonColor; }
set
{
_ButtonColor = value;
DropButtonBrush = new SolidBrush(this.ButtonColor);
this.Invalidate();
}
}
public STComboBox()
{
ButtonColor = FormThemes.BaseTheme.ComboBoxBackColor;
ForeColor = FormThemes.BaseTheme.FormForeColor;
BackColor = FormThemes.BaseTheme.ComboBoxBackColor;
DropDownStyle = ComboBoxStyle.DropDown;
if (FormThemes.ActivePreset == FormThemes.Preset.White)
DropDownStyle = ComboBoxStyle.DropDownList;
ReadOnly = true;
/* Resize += (s, e) =>
{
if (!IsHandleCreated)
return;
SelectionLength = 0;
};*/
InitializeComponent();
}
private dynamic value;
public string GetSelectedText()
{
return GetItemText(SelectedItem);
}
public void SelectItemByText(string text)
{
SelectedIndex = FindStringExact(text);
}
public void Bind(Type EnumType, object Object, string PropertyName, bool IsReset = true)
{
if (IsReset)
DataBindings.Clear();
DataSource = Enum.GetValues(EnumType);
return;
if (IsReset)
DataBindings.Clear();
DataSource = Enum.GetValues(EnumType);
DataBindings.Add(new Binding("SelectedValue", Object, PropertyName, true, DataSourceUpdateMode.OnPropertyChanged));
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case 0xf:
if (FormThemes.ActivePreset != FormThemes.Preset.White)
{
Graphics g = this.CreateGraphics();
Pen p = new Pen(Color.Black);
g.FillRectangle(BorderBrush, this.ClientRectangle);
//Draw the background of the dropdown button
Rectangle rect = new Rectangle(this.Width - 17, 0, 17, this.Height);
g.FillRectangle(DropButtonBrush, rect);
//Create the path for the arrow
System.Drawing.Drawing2D.GraphicsPath pth = new System.Drawing.Drawing2D.GraphicsPath();
PointF TopLeft = new PointF(this.Width - 13, (this.Height - 5) / 2);
PointF TopRight = new PointF(this.Width - 6, (this.Height - 5) / 2);
PointF Bottom = new PointF(this.Width - 9, (this.Height + 2) / 2);
pth.AddLine(TopLeft, TopRight);
pth.AddLine(TopRight, Bottom);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//Determine the arrow's color.
ArrowBrush = new SolidBrush(FormThemes.BaseTheme.ComboBoxArrowColor);
//Draw the arrow
g.FillPath(ArrowBrush, pth);
}
break;
default:
break;
}
}
[Category("Appearance")]
public Color BorderColor
{
get { return _borderColor; }
set
{
Invalidate(); // causes control to be redrawn
}
}
[Category("Appearance")]
public ButtonBorderStyle BorderStyle
{
get { return _borderStyle; }
set
{
_borderStyle = value;
Invalidate();
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
var backBrush = new SolidBrush(BorderColor);
var foreBrush = new SolidBrush(ForeColor);
e.Graphics.FillRectangle(backBrush, this.ClientRectangle);
e.Graphics.DrawString(this.Text, this.Font, foreBrush, this.Location);
}
protected override void OnLostFocus(System.EventArgs e)
{
base.OnLostFocus(e);
this.Invalidate();
}
protected override void OnGotFocus(System.EventArgs e)
{
base.OnGotFocus(e);
this.Invalidate();
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
this.Invalidate();
}
private void InitializeComponent()
{
this.SuspendLayout();
//
// STComboBox
//
this.SelectedIndexChanged += new System.EventHandler(this.STComboBox_SelectedIndexChanged);
this.DropDownStyleChanged += new System.EventHandler(this.STComboBox_DropDownStyleChanged);
this.DropDownClosed += new System.EventHandler(this.STComboBox_DropDownClosed);
this.TextChanged += new System.EventHandler(this.STComboBox_TextChanged);
this.EnabledChanged += new EventHandler(EnableDisplayCombo_EnabledChanged);
this.ResumeLayout(false);
}
void EnableDisplayCombo_EnabledChanged(object sender, EventArgs e)
{
if (this.Enabled)
this.DropDownStyle = ComboBoxStyle.DropDown;
else
this.DropDownStyle = ComboBoxStyle.DropDownList;
}
private void STComboBox_TextChanged(object sender, EventArgs e)
{
}
private bool _readOnly;
public bool ReadOnly
{
get { return _readOnly; }
set { _readOnly = value; }
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (_readOnly)
{
switch (e.KeyCode)
{
case Keys.Back:
case Keys.Delete:
e.SuppressKeyPress = true;
return;
}
}
base.OnKeyDown(e);
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (_readOnly)
{
e.Handled = true;
return;
}
base.OnKeyPress(e);
}
private void STComboBox_DropDownClosed(object sender, EventArgs e)
{
this.BeginInvoke(new Action(() => { Select(0, 0); }));
}
private void STComboBox_DropDownStyleChanged(object sender, EventArgs e)
{
if (FormThemes.ActivePreset != FormThemes.Preset.White)
DropDownStyle = ComboBoxStyle.DropDown;
}
private void STComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
if (SelectedIndex >= 0)
{
value = SelectedItem;
}
}
}
}