// // Checkbox.cs: Checkbox control // // Authors: // Miguel de Icaza (miguel@gnome.org) // using System; using NStack; namespace Terminal.Gui { /// /// The shows an on/off toggle that the user can set /// public class CheckBox : View { ustring text; int hot_pos = -1; Rune hot_key; /// /// Toggled event, raised when the is toggled. /// /// /// Client code can hook up to this event, it is /// raised when the is activated either with /// the mouse or the keyboard. The passed bool contains the previous state. /// public event Action Toggled; /// /// Called when the property changes. Invokes the event. /// public virtual void OnToggled (bool previousChecked) { Toggled?.Invoke (previousChecked); } /// /// Initializes a new instance of based on the given text, using layout. /// public CheckBox () : this (string.Empty) { } /// /// Initializes a new instance of based on the given text, using layout. /// /// S. /// If set to true is checked. public CheckBox (ustring s, bool is_checked = false) : base () { Checked = is_checked; Text = s; CanFocus = true; Height = 1; Width = s.RuneCount + 4; } /// /// Initializes a new instance of using layout. /// /// /// The size of is computed based on the /// text length. This is not toggled. /// public CheckBox (int x, int y, ustring s) : this (x, y, s, false) { } /// /// Initializes a new instance of using layout. /// /// /// The size of is computed based on the /// text length. /// public CheckBox (int x, int y, ustring s, bool is_checked) : base (new Rect (x, y, s.Length + 4, 1)) { Checked = is_checked; Text = s; CanFocus = true; } /// /// The state of the /// public bool Checked { get; set; } /// /// The text displayed by this /// public new ustring Text { get { return text; } set { text = value; int i = 0; hot_pos = -1; hot_key = (char)0; foreach (Rune c in text) { //if (Rune.IsUpper (c)) { if (c == '_') { hot_key = text [i + 1]; HotKey = (Key)(char)hot_key.ToString ().ToUpper () [0]; text = text.ToString ().Replace ("_", ""); hot_pos = i; break; } i++; } } } /// public override void Redraw (Rect bounds) { Driver.SetAttribute (HasFocus ? ColorScheme.Focus : ColorScheme.Normal); Move (0, 0); Driver.AddRune (Checked ? Driver.Checked : Driver.UnChecked); Driver.AddRune (' '); Move (2, 0); Driver.AddStr (Text); if (hot_pos != -1) { Move (2 + hot_pos, 0); Driver.SetAttribute (HasFocus ? ColorScheme.HotFocus : ColorScheme.HotNormal); Driver.AddRune (hot_key); } } /// public override void PositionCursor () { Move (0, 0); } /// public override bool ProcessKey (KeyEvent kb) { if (kb.KeyValue == ' ') { var previousChecked = Checked; Checked = !Checked; OnToggled (previousChecked); SetNeedsDisplay (); return true; } return base.ProcessKey (kb); } /// public override bool ProcessHotKey (KeyEvent ke) { if (ke.Key == (Key.AltMask | HotKey)) { SetFocus (); var previousChecked = Checked; Checked = !Checked; OnToggled (previousChecked); SetNeedsDisplay (); return true; } return false; } /// public override bool MouseEvent (MouseEvent me) { if (!me.Flags.HasFlag (MouseFlags.Button1Clicked) || !CanFocus) return false; SetFocus (); var previousChecked = Checked; Checked = !Checked; OnToggled (previousChecked); SetNeedsDisplay (); return true; } /// public override bool OnEnter (View view) { Application.Driver.SetCursorVisibility (CursorVisibility.Invisible); return base.OnEnter (view); } } }