/// <summary> /// A colored rectangle that acts like a button. /// </summary> public static bool Box(this Data.Selection selection, ref bool IsPressed, Event e, Color normal, Color hovered, Color pressed, Action onPressed = null) { var wasPressed = false; var color = normal; selection.immediate.rect.Draw().Selection().Area(ref IsPressed, false, out wasPressed, e, () => { color = normal; }, () => { }, () => { color = pressed; }); if (IsPressed) { EditorGUI.DrawRect(selection.immediate.rect, pressed); onPressed?.Invoke(); } else { if (e.Mouse().Is().Inside(selection.immediate.rect)) { EditorGUI.DrawRect(selection.immediate.rect, hovered); } else { EditorGUI.DrawRect(selection.immediate.rect, normal); } } return(IsPressed); }
/// <summary> /// A rect that has callbacks for when its hovered, pressed, or doing nothing. /// </summary> public static void Area(this Data.Selection selection, ref bool isBeingPressed, bool isActiveSelection, out bool wasPressed, Event e, Action normal, Action active, Action pressed) { bool justReleased = false; wasPressed = false; if (e.type == EventType.MouseDown) { isBeingPressed = true; } if (e.type == EventType.MouseUp) { if (isBeingPressed == true) { justReleased = true; } isBeingPressed = false; } if (isActiveSelection) { active?.Invoke(); isBeingPressed = false; } else { if (e.Mouse().Is().Inside(selection.immediate.rect)) { if (isBeingPressed) { pressed.Invoke(); } else { if (justReleased) { normal.Invoke(); wasPressed = true; isBeingPressed = false; } else { active?.Invoke(); isBeingPressed = false; } } } else { isBeingPressed = false; normal?.Invoke(); } } }