示例#1
0
    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);
    }
示例#2
0
    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;
    }
示例#3
0
    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);
    }
示例#4
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);
    }
示例#5
0
    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");
        }
    }
示例#6
0
    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());
    }
示例#7
0
    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);
    }
示例#8
0
 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());
    }
示例#10
0
    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());
    }