void DrawConditionLine(float xOffset, float xScrollIndex, TimelineTrack timeline, float yOffset) { foreach (var tack in timeline.tackPoints_) { if (!tack.IsExistTack_) { continue; } var start = tack.start_; var span = tack.span_; var startPos = xOffset + xScrollIndex + (start * WindowSettings.TACK_FRAME_WIDTH); var length = span * WindowSettings.TACK_FRAME_WIDTH; var tex = tack.GetColorTex(); // draw background. if (tack.IsActive()) { var condtionLineBgRect = new Rect(startPos, yOffset - 1, length, WindowSettings.CONDITION_INSPECTOR_CONDITIONLINE_HEIGHT + 2); GUI.DrawTexture(condtionLineBgRect, WindowSettings.conditionLineBgTex); } else { var condtionLineBgRect = new Rect(startPos, yOffset + 1, length, WindowSettings.CONDITION_INSPECTOR_CONDITIONLINE_HEIGHT - 2); GUI.DrawTexture(condtionLineBgRect, WindowSettings.conditionLineBgTex); } // fill color. var condtionLineRect = new Rect(startPos + 1, yOffset, length - 2, WindowSettings.CONDITION_INSPECTOR_CONDITIONLINE_HEIGHT); GUI.DrawTexture(condtionLineRect, tex); } }
Rect DrawConditionInspector(float xScrollIndex, float yIndex, float inspectorWidth) { var width = inspectorWidth - WindowSettings.TIMELINE_CONDITIONBOX_SPAN; var height = yIndex; var assumedHeight = height + WindowSettings.CONDITION_INSPECTOR_FRAMECOUNT_HEIGHT + WindowSettings.CONDITION_INSPECTOR_FRAMELINE_HEIGHT + AssumeConditionLineHeight(); GUI.BeginGroup(new Rect(WindowSettings.TIMELINE_CONDITIONBOX_SPAN, height, width, assumedHeight)); { var internalHeight = 0f; // count & frame in header. { TimelineTrack.DrawFrameBG(xScrollIndex, internalHeight, width, WindowSettings.CONDITION_INSPECTOR_FRAMELINE_HEIGHT, true); internalHeight = internalHeight + WindowSettings.CONDITION_INSPECTOR_FRAMECOUNT_HEIGHT + WindowSettings.CONDITION_INSPECTOR_FRAMELINE_HEIGHT; } if (HasValidScore()) { var currentScore = GetActiveScore(); var timelines = currentScore.timelineTracks_; foreach (var timeline in timelines) { if (!timeline.IsExistTimeline_) { continue; } internalHeight = internalHeight + WindowSettings.CONDITION_INSPECTOR_CONDITIONLINE_SPAN; DrawConditionLine(0, xScrollIndex, timeline, internalHeight); internalHeight = internalHeight + WindowSettings.CONDITION_INSPECTOR_CONDITIONLINE_HEIGHT; } if (timelines.Any()) { // add footer. internalHeight = internalHeight + WindowSettings.CONDITION_INSPECTOR_CONDITIONLINE_SPAN; } } } GUI.EndGroup(); return(new Rect(0, 0, inspectorWidth, assumedHeight)); }
void UpdateTimelineTrackTitle(TimelineTrack timelineTrack) { //var newTitle = EditorGUILayout.TextField("title", timelineTrack.title_); //var charManager = EditorGUILayout.ObjectField("charManager", timelineTrack.charManager, typeof(JMCharManager),true); TimelineType timelineType = (TimelineType)timelineTrack.timelineType_; EditorGUILayout.LabelField("type : " + timelineType.ToString()); //if (newTitle != timelineTrack.title_) //{ // timelineTrack.BeforeSave(); // timelineTrack.title_ = newTitle; // timelineTrack.Save(); //} //if (charManager != timelineTrack.charManager) //{ // timelineTrack.charManager = charManager as JMCharManager; //} }
//スコアファイルを単体JSONに分ける ScoreComponent LoadScore(Dictionary <string, object> deserialized) { var scoreTimelines = deserialized[TimeFlowShikiSettings.TIMEFLOWSHIKI_DATA_SCORE_TIMELINES] as List <object>; var currentTimelines = new List <TimelineTrack>(); foreach (var scoreTimeline in scoreTimelines) { var scoreTimelineDict = scoreTimeline as Dictionary <string, object>; var timelineTacks = scoreTimelineDict[TimeFlowShikiSettings.TIMEFLOWSHIKI_DATA_TIMELINE_TACKS] as List <object>; var currentTacks = new List <TackPoint>(); foreach (var timelineTack in timelineTacks) { var timelineTacksDict = timelineTack as Dictionary <string, object>; var newTack = new TackPoint(currentTacks.Count, timelineTacksDict); currentTacks.Add(newTack); } var newTimeline = new TimelineTrack(currentTimelines.Count, scoreTimelineDict, currentTacks); currentTimelines.Add(newTimeline); } var newScore = new ScoreComponent(deserialized, currentTimelines); return(newScore); }
void Emit(OnTrackEvent onTrackEvent) { var type = onTrackEvent.eventType; // tack events. switch (type) { case OnTrackEvent.EventType.EVENT_UNSELECTED: { manipulateTargets = new ManipulateTargets(new List <string>()); Undo.RecordObject(this, "Unselect"); var activeAuto = GetActiveScore(); activeAuto.DeactivateAllObjects(); activeAuto.SetScoreInspector(); parent_.RepaintAllWindow(); return; } case OnTrackEvent.EventType.EVENT_OBJECT_SELECTED: { manipulateTargets = new ManipulateTargets(new List <string> { onTrackEvent.activeObjectId }); var activeAuto = GetActiveScore(); Undo.RecordObject(this, "Select"); activeAuto.ActivateObjectsAndDeactivateOthers(manipulateTargets.activeObjectIds); parent_.RepaintAllWindow(); return; } //各種タイムライン case OnTrackEvent.EventType.EVENT_SCORE_ADDTIMELINE_POS: case OnTrackEvent.EventType.EVENT_SCORE_ADDTIMELINE_TRANSFORM: case OnTrackEvent.EventType.EVENT_SCORE_ADDTIMELINE_MOVE: case OnTrackEvent.EventType.EVENT_SCORE_ADDTIMELINE_COLOR: case OnTrackEvent.EventType.EVENT_SCORE_ADDTIMELINE_EFFECT: case OnTrackEvent.EventType.EVENT_SCORE_ADDTIMELINE_PASSIVE: { int timelineType = 0; //各種タイムライン switch (type) { case OnTrackEvent.EventType.EVENT_SCORE_ADDTIMELINE_POS: timelineType = (int)TimelineType.TL_POS; break; case OnTrackEvent.EventType.EVENT_SCORE_ADDTIMELINE_TRANSFORM: timelineType = (int)TimelineType.TL_TRANSFORM; break; case OnTrackEvent.EventType.EVENT_SCORE_ADDTIMELINE_MOVE: timelineType = (int)TimelineType.TL_MOVE; break; case OnTrackEvent.EventType.EVENT_SCORE_ADDTIMELINE_COLOR: timelineType = (int)TimelineType.TL_COLOR; break; case OnTrackEvent.EventType.EVENT_SCORE_ADDTIMELINE_EFFECT: timelineType = (int)TimelineType.TL_EFFECT; break; case OnTrackEvent.EventType.EVENT_SCORE_ADDTIMELINE_PASSIVE: timelineType = (int)TimelineType.TL_PASSIVE; break; } var activeAuto = GetActiveScore(); var tackPoints = new List <TackPoint>(); var newTimeline = new TimelineTrack(activeAuto.timelineTracks_.Count, timelineType, tackPoints); var newTimelineId = newTimeline.timelineId_; Undo.RecordObject(this, "Add Timeline"); //activeAuto.timelineTracks.Add(newTimeline); string id = MethodBase.GetCurrentMethod().Name; Action action = () => { activeAuto.timelineTracks_.Add(newTimeline); }; Action undo = () => { activeAuto.DeleteObjectById(newTimelineId, false); }; ARIMotionMainWindow.scoreCmd_.Do(new MotionCommand(id, action, undo)); parent_.NeedSave(); return; } case OnTrackEvent.EventType.EVENT_SCORE_BEFORESAVE: { Undo.RecordObject(this, "Update Score Title"); return; } case OnTrackEvent.EventType.EVENT_SCORE_SAVE: { parent_.NeedSave(); return; } /* * timeline events. */ case OnTrackEvent.EventType.EVENT_TIMELINE_ADDTACK: { eventStacks_.Add(onTrackEvent.Copy()); return; } case OnTrackEvent.EventType.EVENT_TIMELINE_PASTETACK: { eventStacks_.Add(onTrackEvent.Copy()); return; } case OnTrackEvent.EventType.EVENT_TIMELINE_DELETE: { var targetTimelineId = onTrackEvent.activeObjectId; var activeAuto = GetActiveScore(); Undo.RecordObject(this, "Delete Timeline"); string id = MethodBase.GetCurrentMethod().Name; Action action = () => { activeAuto.DeleteObjectById(targetTimelineId, false); }; Action undo = () => { activeAuto.DeleteObjectById(targetTimelineId, true); }; ARIMotionMainWindow.scoreCmd_.Do(new MotionCommand(id, action, undo)); //activeAuto.DeleteObjectById(targetTimelineId); parent_.NeedSave(); return; } case OnTrackEvent.EventType.EVENT_TIMELINE_BEFORESAVE: { Undo.RecordObject(this, "Update Timeline Title"); return; } case OnTrackEvent.EventType.EVENT_TIMELINE_SAVE: { parent_.NeedSave(); return; } /* * tack events. */ case OnTrackEvent.EventType.EVENT_TACK_MOVING: { var movingTackId = onTrackEvent.activeObjectId; var activeAuto = GetActiveScore(); activeAuto.SetMovingTackToTimelimes(movingTackId); break; } case OnTrackEvent.EventType.EVENT_TACK_MOVED: { Undo.RecordObject(this, "Move Tack"); return; } case OnTrackEvent.EventType.EVENT_TACK_MOVED_AFTER: { var targetTackId = onTrackEvent.activeObjectId; var activeAuto = GetActiveScore(); var activeTimelineIndex = activeAuto.GetTackContainedTimelineIndex(targetTackId); if (0 <= activeTimelineIndex) { //タックの移動後処理 activeAuto.timelineTracks_[activeTimelineIndex].UpdateByTackMoved(targetTackId); //Repaint(); parent_.NeedSave(); } return; } case OnTrackEvent.EventType.EVENT_TACK_DELETED: { var targetTackId = onTrackEvent.activeObjectId; var activeAuto = GetActiveScore(); Undo.RecordObject(this, "Delete Tack"); string id = MethodBase.GetCurrentMethod().Name; Action action = () => { activeAuto.DeleteObjectById(targetTackId, false); activeAuto.SqueezeTack(); }; Action undo = () => { activeAuto.DeleteObjectById(targetTackId, true); activeAuto.SqueezeTack(); }; ARIMotionMainWindow.scoreCmd_.Do(new MotionCommand(id, action, undo)); //Repaint(); parent_.NeedSave(); return; } case OnTrackEvent.EventType.EVENT_TACK_COPY: { var targetTackId = onTrackEvent.activeObjectId; var activeAuto = GetActiveScore(); clipTack_ = activeAuto.GetTackById(targetTackId); return; } case OnTrackEvent.EventType.EVENT_TACK_BEFORESAVE: { Undo.RecordObject(this, "Update Tack Title"); return; } case OnTrackEvent.EventType.EVENT_TACK_SAVE: { parent_.NeedSave(); return; } case OnTrackEvent.EventType.EVENT_TACK_CHANGE: { parent_.NeedSave(); parent_.subWindow_.SetupPartsData(false); //サブウインドウにも反映させる parent_.RepaintAllWindow(); return; } default: { //親に投げる ParentEmit(onTrackEvent); //Debug.LogError("no match type:" + type); break; } } }
//マウス入力イベント設定 void HandlingMouseEvent() { var repaint = false; var useEvent = false; switch (Event.current.type) { // mouse event handling. case EventType.MouseDown: { var touchedFrameCount = TimelineTrack.GetFrameOnTimelineFromAbsolutePosX(scrollPos_ + (Event.current.mousePosition.x - WindowSettings.TIMELINE_CONDITIONBOX_SPAN)); if (touchedFrameCount < 0) { touchedFrameCount = 0; } selectedPos_ = touchedFrameCount * WindowSettings.TACK_FRAME_WIDTH; selectedFrame_ = touchedFrameCount; repaint = true; Emit(new OnTrackEvent(OnTrackEvent.EventType.EVENT_UNSELECTED, null)); useEvent = true; break; } case EventType.ContextClick: { ShowContextMenu(); useEvent = true; break; } case EventType.MouseUp: { // right click. if (Event.current.button == 1) { ShowContextMenu(); } else { var touchedFrameCount = TimelineTrack.GetFrameOnTimelineFromAbsolutePosX(scrollPos_ + (Event.current.mousePosition.x - WindowSettings.TIMELINE_CONDITIONBOX_SPAN)); if (touchedFrameCount < 0) { touchedFrameCount = 0; } selectedPos_ = touchedFrameCount * WindowSettings.TACK_FRAME_WIDTH; selectedFrame_ = touchedFrameCount; repaint = true; } useEvent = true; break; } case EventType.MouseDrag: { var pos = scrollPos_ + (Event.current.mousePosition.x - WindowSettings.TIMELINE_CONDITIONBOX_SPAN); if (pos < 0) { pos = 0; } selectedPos_ = pos - ((WindowSettings.TACK_FRAME_WIDTH / 2f) - 1f); selectedFrame_ = TimelineTrack.GetFrameOnTimelineFromAbsolutePosX(pos); FocusToFrame(selectedFrame_); repaint = true; useEvent = true; break; } // scroll event handling. case EventType.ScrollWheel: { if (0 != Event.current.delta.x) { scrollPos_ = scrollPos_ + (Event.current.delta.x * 2); if (scrollPos_ < 0) { scrollPos_ = 0; } repaint = true; } useEvent = true; break; } // key event handling. case EventType.KeyDown: { switch (Event.current.keyCode) { case KeyCode.LeftArrow: { if (manipulateTargets.activeObjectIds.Count == 0) { selectedFrame_ = selectedFrame_ - 1; if (selectedFrame_ < 0) { selectedFrame_ = 0; } selectedPos_ = selectedFrame_ * WindowSettings.TACK_FRAME_WIDTH; repaint = true; FocusToFrame(selectedFrame_); } manipulateEvents_.keyLeft = true; useEvent = true; break; } case KeyCode.RightArrow: { if (manipulateTargets.activeObjectIds.Count == 0) { selectedFrame_ = selectedFrame_ + 1; selectedPos_ = selectedFrame_ * WindowSettings.TACK_FRAME_WIDTH; repaint = true; FocusToFrame(selectedFrame_); } manipulateEvents_.keyRight = true; useEvent = true; break; } case KeyCode.UpArrow: { manipulateEvents_.keyUp = true; useEvent = true; break; } case KeyCode.DownArrow: { manipulateEvents_.keyDown = true; useEvent = true; break; } case KeyCode.S: parent_.SaveData2(true); break; case KeyCode.L: parent_.ReloadSavedData(); break; case KeyCode.Z: ARIMotionMainWindow.scoreCmd_.Undo(); //Undo repaint = true; break; case KeyCode.Y: ARIMotionMainWindow.scoreCmd_.Redo(); //Redo repaint = true; break; //case KeyCode.Keypad1: //case KeyCode.Keypad2: //case KeyCode.Keypad3: //case KeyCode.Keypad4: //case KeyCode.Keypad5: //case KeyCode.Keypad6: //case KeyCode.Keypad7: //case KeyCode.Keypad8: //case KeyCode.Keypad9: //case KeyCode.Keypad0: // { // manipulateEvents_.SetKeyNum(Event.current.keyCode); // useEvent = true; // break; // } } break; } } // update cursor pos cursorPos_ = selectedPos_ - scrollPos_; if (repaint) { //HandleUtility.Repaint(); parent_.RepaintAllWindow(); //repaint = false; } if (eventStacks_.Any()) { foreach (var onTrackEvent in eventStacks_) { EmitAfterDraw(onTrackEvent); } eventStacks_.Clear(); parent_.NeedSave(); } if (useEvent) { Event.current.Use(); } }
//キー入力によるスパンの変更 void ChangeStartAll(bool isForwerd) { if (!HasValidScore()) { return; } var score = GetActiveScore(); if (manipulateTargets.activeObjectIds.Any()) { if (manipulateTargets.activeObjectIds.Count == 1) { var activeId = manipulateTargets.activeObjectIds[0]; List <TackPoint> tackPoints = null; if (IsTimelineId(activeId)) { TimelineTrack timelineTrack = score.TimelineById(activeId); tackPoints = timelineTrack.tackPoints_; } else if (IsTackId(activeId)) { var tack = score.TackById(activeId); tackPoints = score.TimelinesByType((TimelineType)tack.timelineType_); } if (tackPoints != null) { Undo.RecordObject(this, "ChangeSpan"); List <Action> cmdDo = new List <Action>(); List <Action> cmdUndo = new List <Action>(); string id = MethodBase.GetCurrentMethod().Name; foreach (var item in tackPoints) { TackPoint tack = item; int newStart = (isForwerd) ? item.start_ - 1 : item.start_ + 1; int lastStart = item.start_; Action action = () => { tack.UpdatePos(newStart, tack.span_); score.SqueezeTack(); }; Action undo = () => { tack.UpdatePos(lastStart, tack.span_); score.SqueezeTack(); }; //コマンドPos cmdDo.Add(action); cmdUndo.Add(undo); } cmdDo.Add(() => score.SqueezeTack()); cmdUndo.Add(() => score.SqueezeTack()); if (cmdDo.Any()) { ARIMotionMainWindow.tackCmd_.Do(new MotionCommand(id, () => { foreach (var cmd in cmdDo) { cmd(); } }, () => { foreach (var cmd in cmdUndo) { cmd(); } })); } Emit(new OnTrackEvent(OnTrackEvent.EventType.EVENT_TACK_SAVE, null)); parent_.RepaintAllWindow(); } } else { // select multiple objects. } } }
public void UpdateTimelineTrack(TimelineTrack timelineTrack) { this.timelineTrack = timelineTrack; }