void DrawMeter(SerializedProperty meterProp) { SerializedProperty startBarProp = meterProp.FindPropertyRelative("StartBar"); SerializedProperty tempoProp = meterProp.FindPropertyRelative("Tempo"); SerializedProperty unitPerBarProp = meterProp.FindPropertyRelative("UnitPerBar"); SerializedProperty unitPerBeatProp = meterProp.FindPropertyRelative("UnitPerBeat"); SerializedProperty numeratorProp = meterProp.FindPropertyRelative("Numerator"); SerializedProperty denominatorProp = meterProp.FindPropertyRelative("Denominator"); int startBar = startBarProp.intValue; double tempo = tempoProp.doubleValue; int unitPerBar = unitPerBarProp.intValue; int unitPerBeat = unitPerBeatProp.intValue; int numerator = numeratorProp.intValue; int denominator = denominatorProp.intValue; meterProp.isExpanded = EditorGUILayout.Foldout(meterProp.isExpanded, string.Format("Meter {0}~ ({1}/{2}, {3:F2})", startBar, numerator, denominator, tempo)); if (meterProp.isExpanded) { EditorGUI.indentLevel++; EditorGUILayout.PropertyField(startBarProp); EditorGUILayout.PropertyField(tempoProp); if (showUnitPerBarBeat_) { EditorGUILayout.PropertyField(unitPerBeatProp); EditorGUILayout.PropertyField(unitPerBarProp); if (unitPerBar != unitPerBarProp.intValue || unitPerBeat != unitPerBeatProp.intValue) { MusicMeter.CalcMeterByUnits(unitPerBeatProp.intValue, unitPerBarProp.intValue, out numerator, out denominator); numeratorProp.intValue = numerator; denominatorProp.intValue = denominator; } } else { EditorGUILayout.BeginHorizontal(); { EditorGUILayout.LabelField("Meter", GUILayout.Width(EditorGUIUtility.labelWidth - 4)); EditorGUIUtility.labelWidth = 1; EditorGUILayout.PropertyField(numeratorProp, GUILayout.Width(55)); denominatorProp.intValue = EditorGUILayout.IntPopup("/", denominatorProp.intValue, MeterDenominatorCandidatesString, MeterDenominatorCandidates); EditorGUIUtility.labelWidth = 0; if (numerator != numeratorProp.intValue || denominator != denominatorProp.intValue) { MusicMeter.CalcMeterByFraction(numeratorProp.intValue, denominatorProp.intValue, out unitPerBeat, out unitPerBar); unitPerBeatProp.intValue = unitPerBeat; unitPerBarProp.intValue = unitPerBar; } } EditorGUILayout.EndHorizontal(); } EditorGUI.indentLevel--; } }
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { Init(property); var fieldRect = position; fieldRect.height = GetPropertyHeight(property, label); using (new EditorGUI.PropertyScope(fieldRect, label, property)) { //int startBar = _property.StartBar.intValue; double tempo = _property.Tempo.doubleValue; int unitPerBar = _property.UnitPerBar.intValue; int unitPerBeat = _property.UnitPerBeat.intValue; int numerator = _property.Numerator.intValue; int denominator = _property.Denominator.intValue; fieldRect.height = EditorGUIUtility.singleLineHeight; property.isExpanded = EditorGUI.Foldout(fieldRect, property.isExpanded, string.Format("{0} ({1}/{2}, {3:F2})", label.text, numerator, denominator, tempo)); if (property.isExpanded) { EditorGUI.indentLevel++; //fieldRect.y += EditorGUIUtility.singleLineHeight; //EditorGUI.PropertyField(fieldRect, _property.StartBar); fieldRect.y += EditorGUIUtility.singleLineHeight; EditorGUI.PropertyField(fieldRect, _property.Tempo); fieldRect.y += EditorGUIUtility.singleLineHeight; showUnitPerBarBeat_ = EditorGUI.Toggle(fieldRect, "Show Meter In UnitPerBar/Beat", showUnitPerBarBeat_); if (showUnitPerBarBeat_) { fieldRect.y += EditorGUIUtility.singleLineHeight; EditorGUI.PropertyField(fieldRect, _property.UnitPerBeat); fieldRect.y += EditorGUIUtility.singleLineHeight; EditorGUI.PropertyField(fieldRect, _property.UnitPerBar); if (unitPerBar != _property.UnitPerBar.intValue || unitPerBeat != _property.UnitPerBeat.intValue) { MusicMeter.CalcMeterByUnits(_property.UnitPerBeat.intValue, _property.UnitPerBar.intValue, out numerator, out denominator); _property.Numerator.intValue = numerator; _property.Denominator.intValue = denominator; } } else { fieldRect.y += EditorGUIUtility.singleLineHeight; fieldRect = EditorGUI.PrefixLabel(fieldRect, GUIUtility.GetControlID(FocusType.Passive), new GUIContent("Meter")); fieldRect.x -= 16; fieldRect.width = 55; EditorGUI.PropertyField(fieldRect, _property.Numerator, GUIContent.none); fieldRect.x += 60; fieldRect.width = 60; _property.Denominator.intValue = EditorGUI.IntPopup(fieldRect, _property.Denominator.intValue, MeterDenominatorCandidatesString, MeterDenominatorCandidates); if (numerator != _property.Numerator.intValue || denominator != _property.Denominator.intValue) { MusicMeter.CalcMeterByFraction(_property.Numerator.intValue, _property.Denominator.intValue, out unitPerBeat, out unitPerBar); _property.UnitPerBeat.intValue = unitPerBeat; _property.UnitPerBar.intValue = unitPerBar; } } EditorGUI.indentLevel--; } } }