// =====================================================================
// Copyright 2013-2017 Fluffy Underware
// All rights reserved
//
// http://www.fluffyunderware.com
// =====================================================================
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System;
namespace FluffyUnderware.DevToolsEditor
{
[System.Serializable]
public class EditorKeyBinding : IComparable
{
public static bool BindingsEnabled = true;
public enum MouseButtonEnum
{
None = -1,
Click = 0,
RClick = 1,
MClick = 2,
}
public string Name;
public string Description;
public KeyCode Key;
public bool Shift;
public bool Control;
public bool Alt;
public bool Command;
public MouseButtonEnum MouseButton;
public bool ShowInPrefs = true;
public EditorKeyBinding(string name, string description, KeyCode defKey = KeyCode.None, bool defShift = false, bool defControl = false, bool defAlt = false, bool defCommand = false, MouseButtonEnum defMouseButton = MouseButtonEnum.None)
{
Set(name, description, defKey, defShift, defControl, defAlt, defCommand, defMouseButton);
}
///
/// Creates a binding from it's serialized string from the user preferences
///
public EditorKeyBinding(string bindingString)
{
Set(bindingString);
}
///
/// Set the binding from it's serialized string from the user preferences
///
public void Set(string bindingString)
{
string[] s = bindingString.Split(',');
if (s.Length < 6) return;
Name = s[0];
Key = (KeyCode)System.Enum.Parse(typeof(KeyCode), s[1]);
Shift = bool.Parse(s[2]);
Control = bool.Parse(s[3]);
Alt = bool.Parse(s[4]);
Command = bool.Parse(s[5]);
MouseButton = (MouseButtonEnum)System.Enum.Parse(typeof(MouseButtonEnum), s[6]);
}
public void Set(string name, string description, KeyCode defKey = KeyCode.None, bool defShift = false, bool defControl = false, bool defAlt = false, bool defCommand = false, MouseButtonEnum defMouseButton = MouseButtonEnum.None)
{
Name = name;
Description = description;
Key = defKey;
Shift = defShift;
Control = defControl;
Alt = defAlt;
Command = defCommand;
MouseButton = defMouseButton;
}
public bool IsTriggered(Event e=null)
{
if (!BindingsEnabled)
return false;
if (e == null)
e = Event.current;
if ((e.type == EventType.MouseDown && e.button == (int)MouseButton) ||
(e.type == EventType.KeyDown && Key != KeyCode.None && e.keyCode == Key))
return (e.shift == Shift &&
e.control == Control &&
e.alt == Alt &&
e.command == Command);
else
return false;
}
public bool OnPreferencesGUI()
{
EditorGUI.BeginChangeCheck();
Key = (KeyCode)EditorGUILayout.EnumPopup(new GUIContent(Name), Key);
EditorGUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
Shift = GUILayout.Toggle(Shift, "Shift");
Control = GUILayout.Toggle(Control, "Ctrl");
Alt = GUILayout.Toggle(Alt, "Alt");
Command = GUILayout.Toggle(Command, "Cmd");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
MouseButton = (MouseButtonEnum)EditorGUILayout.EnumPopup(MouseButton);
EditorGUILayout.EndHorizontal();
return EditorGUI.EndChangeCheck();
}
public string ToTooltipString()
{
if (Key == KeyCode.None && MouseButton==MouseButtonEnum.None)
return string.Empty;
List s = new List();
if (Control)
s.Add("Ctrl");
if (Alt)
s.Add("Alt");
if (Shift)
s.Add("Shift");
if (Command)
s.Add("Cmd");
string res = string.Join("-", s.ToArray());
if (res.Length > 0)
res += "-";
if (Key != KeyCode.None)
return "(" + res + Key.ToString() + ")";
else
return "(" + res + MouseButton.ToString() + ")";
}
public string ToPrefsString()
{
return Name + "," + ((int)Key).ToString() + "," + Shift.ToString() + "," + Control.ToString() + "," + Alt.ToString() + "," + Command.ToString() + "," + ((int)MouseButton).ToString();
}
public int CompareTo(object obj)
{
return Name.CompareTo(((EditorKeyBinding)obj).Name);
}
public override bool Equals(object obj)
{
EditorKeyBinding o = (EditorKeyBinding)obj;
return (Name == o.Name &&
Key == o.Key &&
Shift == o.Shift &&
Control == o.Control &&
Alt == o.Alt &&
Command == o.Command &&
MouseButton == o.MouseButton);
}
public override int GetHashCode()
{
return Name.GetHashCode() ^ Key.GetHashCode() ^ Shift.GetHashCode() ^ Control.GetHashCode() ^ Alt.GetHashCode() ^ Command.GetHashCode() ^ MouseButton.GetHashCode();
}
}
}