public void SetData(ActionData actionData) { m_ActionData = actionData; if (m_ActionData.GetType().IsSubclassOf(typeof(DurationActionData))) { m_DurationActionData = (DurationActionData)m_ActionData; } m_DataDrawer = new ObjectDrawer("Action Data", m_ActionData); m_ActionBriefName = string.Empty; var nameAttrs = m_ActionData.GetType().GetCustomAttributes(typeof(ActionBriefName), false); if (nameAttrs != null && nameAttrs.Length > 0) { m_ActionBriefName = ((ActionBriefName)nameAttrs[0]).Name; } }
public void OnDrawGUI(Rect rect) { LineSetting setting = LineSetting.Setting; Rect itemRect = Rect.zero; itemRect.x = Data.FireTime * setting.WidthForSecond - setting.ScrollPosX; itemRect.y = rect.y; itemRect.height = setting.TracklineHeight; itemRect.width = MIN_ACTION_WIDTH; DurationActionData durationActionData = null; if (Data is DurationActionData) { durationActionData = (DurationActionData)Data; itemRect.width = Mathf.Max(itemRect.width, durationActionData.DurationTime * setting.WidthForSecond); } else { itemRect.x -= itemRect.width * 0.5f; } GUI.Label(itemRect, BriefName, IsSelected ? "flow node 6" : "flow node 5"); int eventBtn = Event.current.button; EventType eventType = Event.current.type; bool isContains = itemRect.Contains(Event.current.mousePosition); Rect leftRect = new Rect(itemRect.x, itemRect.y, MIN_ACTION_WIDTH * 0.5f, itemRect.height); Rect rightRect = new Rect(itemRect.x + itemRect.width - MIN_ACTION_WIDTH * 0.5f, itemRect.y, MIN_ACTION_WIDTH * 0.5f, itemRect.height); bool isInLeftRect = false; bool isInRightRect = false; if (durationActionData != null && !durationActionData.IsFixedDurationTime) { EGUI.DrawAreaLine(leftRect, Color.yellow); EGUI.DrawAreaLine(rightRect, Color.yellow); EditorGUIUtility.AddCursorRect(leftRect, MouseCursor.ResizeHorizontal); EditorGUIUtility.AddCursorRect(rightRect, MouseCursor.ResizeHorizontal); isInLeftRect = leftRect.Contains(Event.current.mousePosition); isInRightRect = rightRect.Contains(Event.current.mousePosition); } if (eventBtn == 0) { if (eventType == EventType.MouseDown && isContains) { if (durationActionData != null) { if (isInLeftRect) { dragType = ActionDragType.ItemLeft; } else if (isInRightRect) { dragType = ActionDragType.ItemRight; } else { dragType = ActionDragType.Item; } } else { dragType = ActionDragType.Item; } IsSelected = true; Event.current.Use(); } else if (dragType != ActionDragType.None && eventType == EventType.MouseUp) { dragType = ActionDragType.None; Event.current.Use(); } else if (dragType != ActionDragType.None && IsSelected && eventType == EventType.MouseDrag) { Vector2 deltaPos = Event.current.delta; float deltaTime = deltaPos.x / setting.WidthForSecond; if (dragType == ActionDragType.ItemLeft) { if (Data.FireTime < durationActionData.DurationTime + Data.FireTime || deltaTime < 0) { Data.FireTime += deltaTime; durationActionData.DurationTime -= deltaTime; } } else if (dragType == ActionDragType.ItemRight) { durationActionData.DurationTime += deltaTime; } else if (dragType == ActionDragType.Item) { Data.FireTime += deltaTime; } float timeLength = ParentDrawer.ParentDrawer.Data.TimeLength; if (Data.FireTime < 0) { Data.FireTime = 0; } else if (Data.FireTime > timeLength) { Data.FireTime = timeLength; } if (durationActionData != null) { durationActionData.DurationTime = Mathf.Max(0.0f, durationActionData.DurationTime); float endTime = durationActionData.FireTime + durationActionData.DurationTime; if (endTime > timeLength) { durationActionData.DurationTime = Mathf.Min(durationActionData.DurationTime, timeLength - durationActionData.FireTime); } } Event.current.Use(); } } else if (eventBtn == 1 && isContains && eventType == EventType.MouseUp) { IsSelected = true; GenericMenu menu = new GenericMenu(); menu.AddItem(new GUIContent("Copy"), false, () => { string actionJson = JsonConvert.SerializeObject(Data, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All, }); setting.CopiedActionData = actionJson; }); menu.AddSeparator(""); menu.AddItem(new GUIContent("Delete"), false, () => { ParentDrawer.OnActionDelete(this); }); menu.ShowAsContext(); Event.current.Use(); } }