void FillClipboard(Song song) { Clipboard.SelectionArea area = new Clipboard.SelectionArea(); clipboard = new Clipboard(); clipboard.data = song.sections.ToArray(); clipboard.resolution = song.resolution; clipboard.instrument = MenuBar.currentInstrument; clipboard.SetCollisionArea(area, song); }
void UpdateSelectionAreaVisual(Transform areaTransform, Clipboard.SelectionArea area) { float minTickWorldPos = editor.currentSong.TickToWorldYPosition(area.tickMin); float maxTickWorldPos = editor.currentSong.TickToWorldYPosition(area.tickMax); Vector3 scale = new Vector3(area.width, maxTickWorldPos - minTickWorldPos, areaTransform.localScale.z); Vector3 position = new Vector3(area.xPos + (area.width / 2), (minTickWorldPos + maxTickWorldPos) / 2, areaTransform.position.z); areaTransform.localScale = scale; areaTransform.position = position; }
protected override void Awake() { base.Awake(); draggingArea = GetComponent <SpriteRenderer>(); prevSong = editor.currentSong; prevChart = editor.currentChart; data = new List <ChartObject>(); area = new Clipboard.SelectionArea(new Rect(), 0, 0); }
void Copy(IEnumerable data, Clipboard.SelectionArea area) { List <ChartObject> chartObjectsCopy = new List <ChartObject>(); foreach (ChartObject chartObject in data) { ChartObject objectToAdd = (ChartObject)chartObject.Clone(); chartObjectsCopy.Add(objectToAdd); } ClipboardObjectController.SetData(chartObjectsCopy.ToArray(), area, editor.currentSong); }
public static void SetData(SongObject[] data, Clipboard.SelectionArea area, Song song) { clipboard = new Clipboard(); clipboard.data = data; clipboard.resolution = song.resolution; clipboard.instrument = MenuBar.currentInstrument; clipboard.SetCollisionArea(area, song); //System.Windows.Forms.Clipboard.SetDataObject("", false); // Clear the clipboard to mimic the real clipboard. For some reason putting custom objects on the clipboard with this dll doesn't work. try { FileStream fs = null; try { fs = new FileStream(CLIPBOARD_FILE_LOCATION, FileMode.Create, FileAccess.ReadWrite); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fs, clipboard); } catch (SerializationException e) { Logger.LogException(e, "Failed to serialize"); } catch (System.Exception e) { Logger.LogException(e, "Failed to serialize in general"); } finally { if (fs != null) { fs.Close(); } else { Debug.LogError("Filestream when writing clipboard data failed to initialise"); } } } catch (System.Exception e) { Logger.LogException(e, "Failed to copy data"); } }
ChartObject[] ScanArea(Vector2 cornerA, Vector2 cornerB, uint minLimitInclusive, uint maxLimitNonInclusive) { Clipboard.SelectionArea area = new Clipboard.SelectionArea(cornerA, cornerB, minLimitInclusive, maxLimitNonInclusive); Rect areaRect = area.GetRect(editor.currentSong); List <ChartObject> chartObjectsList = new List <ChartObject>(); int index, length; var chartObjects = editor.currentChart.chartObjects; SongObjectHelper.GetRange(chartObjects, minLimitInclusive, maxLimitNonInclusive, out index, out length); for (int i = index; i < index + length; ++i) { if (chartObjects[i].tick < maxLimitNonInclusive && PrefabGlobals.HorizontalCollisionCheck(PrefabGlobals.GetCollisionRect(chartObjects[i]), areaRect)) { chartObjectsList.Add(chartObjects[i]); } } return(chartObjectsList.ToArray()); }
protected override void Update() { if (prevChart != editor.currentChart || prevSong != editor.currentSong) { reset(); } if (Globals.applicationMode == Globals.ApplicationMode.Editor) { UpdateSnappedPos(); // Update the corner positions if (Input.GetMouseButtonDown(0) && Mouse.world2DPosition != null) { initWorld2DPos = (Vector2)Mouse.world2DPosition; initWorld2DPos.y = editor.currentSong.TickToWorldYPosition(objectSnappedChartPos); startWorld2DChartPos = objectSnappedChartPos; Color col = Color.green; col.a = draggingArea.color.a; if (Globals.secondaryInputActive) { addMode = true; } else if (Globals.modifierInputActive) { addMode = false; col = Color.red; col.a = draggingArea.color.a; } else { addMode = true; data = new List <ChartObject>(); area = new Clipboard.SelectionArea(new Rect(), startWorld2DChartPos, endWorld2DChartPos); } draggingArea.color = col; userDraggingSelectArea = true; } if (Input.GetMouseButton(0) && Mouse.world2DPosition != null) { endWorld2DPos = (Vector2)Mouse.world2DPosition; endWorld2DPos.y = editor.currentSong.TickToWorldYPosition(objectSnappedChartPos); endWorld2DChartPos = objectSnappedChartPos; } UpdateSelectionAreaVisual(transform, initWorld2DPos, endWorld2DPos); UpdateSelectionAreaVisual(selectedArea, area); // User has finished creating a selection area if (Input.GetMouseButtonUp(0) && userDraggingSelectArea) { if (startWorld2DChartPos > endWorld2DChartPos) { if (addMode) { AddToSelection(ScanArea(initWorld2DPos, endWorld2DPos, endWorld2DChartPos, startWorld2DChartPos)); area += new Clipboard.SelectionArea(initWorld2DPos, endWorld2DPos, endWorld2DChartPos, startWorld2DChartPos); } else { RemoveFromSelection(ScanArea(initWorld2DPos, endWorld2DPos, endWorld2DChartPos, startWorld2DChartPos)); area -= new Clipboard.SelectionArea(initWorld2DPos, endWorld2DPos, endWorld2DChartPos, startWorld2DChartPos); } } else { if (addMode) { AddToSelection(ScanArea(initWorld2DPos, endWorld2DPos, startWorld2DChartPos, endWorld2DChartPos)); area += new Clipboard.SelectionArea(initWorld2DPos, endWorld2DPos, startWorld2DChartPos, endWorld2DChartPos); } else { RemoveFromSelection(ScanArea(initWorld2DPos, endWorld2DPos, startWorld2DChartPos, endWorld2DChartPos)); area -= new Clipboard.SelectionArea(initWorld2DPos, endWorld2DPos, startWorld2DChartPos, endWorld2DChartPos); } } selfAreaDisable(); userDraggingSelectArea = false; } // Handle copy and cut functions if (data.Count > 0) { if (ShortcutInput.GetInputDown(Shortcut.ClipboardCut)) { Cut(); } else if (ShortcutInput.GetInputDown(Shortcut.ClipboardCopy)) { Copy(data, area); } } } prevSong = editor.currentSong; prevChart = editor.currentChart; editor.SetCurrentSelectedObjects(data); }
public void reset() { selfAreaDisable(); data = new List <ChartObject>(); area = new Clipboard.SelectionArea(new Rect(), 0, 0); }
SongObject[] ScanArea(Vector2 cornerA, Vector2 cornerB, uint minLimitInclusive, uint maxLimitNonInclusive) { Clipboard.SelectionArea area = new Clipboard.SelectionArea(cornerA, cornerB, minLimitInclusive, maxLimitNonInclusive); Rect areaRect = area.GetRect(editor.currentSong); List <SongObject> chartObjectsList = new List <SongObject>(); if (Globals.viewMode == Globals.ViewMode.Chart) { int index, length; SongObjectHelper.GetRange(editor.currentChart.chartObjects, minLimitInclusive, maxLimitNonInclusive, out index, out length); for (int i = index; i < index + length; ++i) { ChartObject chartObject = editor.currentChart.chartObjects[i]; float offset = 0; if ((SongObject.ID)chartObject.classID == SongObject.ID.ChartEvent) { offset = ChartEventController.GetOffset(editor, (ChartEvent)chartObject); } if (chartObject.tick < maxLimitNonInclusive && PrefabGlobals.HorizontalCollisionCheck(PrefabGlobals.GetCollisionRect(chartObject, 0, offset), areaRect)) { chartObjectsList.Add(chartObject); } } } else { // Gather synctrack, sections and events int index, length; SongObjectHelper.GetRange(editor.currentSong.syncTrack, minLimitInclusive, maxLimitNonInclusive, out index, out length); // Synctrack for (int i = index; i < index + length; ++i) { SongObject chartObject = editor.currentSong.syncTrack[i]; if (chartObject.tick < maxLimitNonInclusive && PrefabGlobals.HorizontalCollisionCheck(PrefabGlobals.GetCollisionRect(chartObject), areaRect)) { chartObjectsList.Add(chartObject); } } SongObjectHelper.GetRange(editor.currentSong.eventsAndSections, minLimitInclusive, maxLimitNonInclusive, out index, out length); // Events and sections for (int i = index; i < index + length; ++i) { SongObject chartObject = editor.currentSong.eventsAndSections[i]; float offset = 0; if ((SongObject.ID)chartObject.classID == SongObject.ID.Event) { offset = EventController.GetOffset(editor, (Event)chartObject); } if (chartObject.tick < maxLimitNonInclusive && PrefabGlobals.HorizontalCollisionCheck(PrefabGlobals.GetCollisionRect(chartObject, 0, offset), areaRect)) { chartObjectsList.Add(chartObject); } } } return(chartObjectsList.ToArray()); }
public void Copy() { const float DEFAULT_LEFT = -2; const float DEFAULT_RIGHT = 2; var songObjectsCopy = new SongObject[selectedObjectsManager.currentSelectedObjects.Count]; float?left = null, right = null; float position = 0; bool containsNotes = false; // Scan through all the current objects to determine width of scanned area for (int i = 0; i < selectedObjectsManager.currentSelectedObjects.Count; ++i) { if (!containsNotes && selectedObjectsManager.currentSelectedObjects[i].GetType() == typeof(Note)) { containsNotes = true; } songObjectsCopy[i] = selectedObjectsManager.currentSelectedObjects[i].Clone(); position = SongObjectController.GetXPos(selectedObjectsManager.currentSelectedObjects[i]); if (left == null || position < left) { left = position; } if (right == null || position > right) { right = position; } } // Default collision size if (containsNotes) { if (left > DEFAULT_LEFT) { left = DEFAULT_LEFT; } if (right < DEFAULT_RIGHT) { right = DEFAULT_RIGHT; } } if (left == null) { left = DEFAULT_LEFT; } if (right == null) { right = DEFAULT_RIGHT; } Vector2 bottomLeft = Vector2.zero; Vector2 upperRight = Vector2.zero; var area = new Clipboard.SelectionArea(); if (selectedObjectsManager.currentSelectedObjects.Count > 0) { bottomLeft = new Vector2((float)left, currentSong.TickToWorldYPosition(songObjectsCopy[0].tick)); upperRight = new Vector2((float)right, currentSong.TickToWorldYPosition(songObjectsCopy[songObjectsCopy.Length - 1].tick)); area = new Clipboard.SelectionArea(bottomLeft, upperRight, songObjectsCopy[0].tick, songObjectsCopy[songObjectsCopy.Length - 1].tick); } ClipboardObjectController.SetData(songObjectsCopy, area, currentSong); }
SongObject[] ScanArea(Vector2 cornerA, Vector2 cornerB, uint minLimitInclusive, uint maxLimitNonInclusive) { Clipboard.SelectionArea area = new Clipboard.SelectionArea(cornerA, cornerB, minLimitInclusive, maxLimitNonInclusive); Rect areaRect = area.GetRect(editor.currentSong); List <SongObject> chartObjectsList = new List <SongObject>(); if (Globals.viewMode == Globals.ViewMode.Chart) { int index, length; SongObjectHelper.GetRange(editor.currentChart.chartObjects, minLimitInclusive, maxLimitNonInclusive, out index, out length); for (int i = index; i < index + length; ++i) { ChartObject chartObject = editor.currentChart.chartObjects[i]; float offset = 0; if ((SongObject.ID)chartObject.classID == SongObject.ID.Note) { // If the object is within a lane that is not currently included we need to skip over this note if (((Note)chartObject).ShouldBeCulledFromLanes(editor.laneInfo)) { continue; } } if (chartObject.tick < maxLimitNonInclusive && PrefabGlobals.HorizontalCollisionCheck(PrefabGlobals.GetCollisionRect(chartObject, 0, offset), areaRect)) { chartObjectsList.Add(chartObject); } } } else { // Gather synctrack, sections and events int index, length; SongObjectHelper.GetRange(editor.currentSong.syncTrack, minLimitInclusive, maxLimitNonInclusive, out index, out length); // Synctrack for (int i = index; i < index + length; ++i) { SongObject chartObject = editor.currentSong.syncTrack[i]; if (chartObject.tick < maxLimitNonInclusive && PrefabGlobals.HorizontalCollisionCheck(PrefabGlobals.GetCollisionRect(chartObject), areaRect)) { chartObjectsList.Add(chartObject); } } SongObjectHelper.GetRange(editor.currentSong.eventsAndSections, minLimitInclusive, maxLimitNonInclusive, out index, out length); // Events and sections for (int i = index; i < index + length; ++i) { SongObject chartObject = editor.currentSong.eventsAndSections[i]; float offset = 0; if (chartObject.tick < maxLimitNonInclusive && PrefabGlobals.HorizontalCollisionCheck(PrefabGlobals.GetCollisionRect(chartObject, 0, offset), areaRect)) { chartObjectsList.Add(chartObject); } } } return(chartObjectsList.ToArray()); }