public static void AddObjectToCurrentEditor(SongObject songObject, ChartEditor editor, bool update = true)
    {
        switch (songObject.classID)
        {
        case ((int)SongObject.ID.Note):
            PlaceNote.AddObjectToCurrentChart((Note)songObject, editor, update);
            break;

        case ((int)SongObject.ID.Starpower):
            PlaceStarpower.AddObjectToCurrentChart((Starpower)songObject, editor, update);
            break;

        case ((int)SongObject.ID.BPM):
            PlaceBPM.AddObjectToCurrentSong((BPM)songObject, editor, update);
            break;

        case ((int)SongObject.ID.Section):
            PlaceSection.AddObjectToCurrentSong((Section)songObject, editor, update);
            break;

        case ((int)SongObject.ID.TimeSignature):
            PlaceTimesignature.AddObjectToCurrentSong((TimeSignature)songObject, editor, update);
            break;

        case ((int)SongObject.ID.Event):
            PlaceEvent.AddObjectToCurrentSong((Event)songObject, editor, update);
            break;

        case ((int)SongObject.ID.ChartEvent):
            PlaceChartEvent.AddObjectToCurrentChart((ChartEvent)songObject, editor, update);
            break;

        default:
            break;
        }
    }
示例#2
0
    public void AddSongObjects()
    {
        List <ActionHistory.Action> record       = new List <ActionHistory.Action>();
        List <ActionHistory.Action> deleteRecord = new List <ActionHistory.Action>();

        // Need to remember to undo/redo. This current will only work once object pools are implemented.
        // Check to see what the current offset is to decide how to record
        // Will also need to check for overwrites
        // All relative to the original notes

        bool moved = false;

        for (int i = 0; i < movingSongObjects.Count; ++i)
        {
            ActionHistory.Action overwriteRecord;

            if (movingSongObjects[i] != originalSongObjects[i])
            {
                moved = true;
                deleteRecord.Add(new ActionHistory.Delete(originalSongObjects[i]));
            }

            switch ((SongObject.ID)movingSongObjects[i].classID)
            {
            case (SongObject.ID.Note):
                record.AddRange(PlaceNote.AddObjectToCurrentChart((Note)movingSongObjects[i], editor, false, false));         // Capping
                break;

            case (SongObject.ID.Starpower):
                record.AddRange(PlaceStarpower.AddObjectToCurrentChart((Starpower)movingSongObjects[i], editor, false, false));           // Capping
                break;

            case (SongObject.ID.ChartEvent):
                overwriteRecord = PlaceSongObject.OverwriteActionHistory((ChartEvent)movingSongObjects[i], editor.currentChart.events);
                if (record != null)
                {
                    record.Add(overwriteRecord);
                }
                editor.currentChart.Add((ChartEvent)movingSongObjects[i], false);
                break;

            case (SongObject.ID.BPM):
                overwriteRecord = PlaceSongObject.OverwriteActionHistory((BPM)movingSongObjects[i], editor.currentSong.bpms);
                if (record != null)
                {
                    record.Add(overwriteRecord);
                }
                BPM bpm = (BPM)movingSongObjects[i];
                editor.currentSong.Add(bpm, false);
                if (bpm.anchor != null)
                {
                    bpm.anchor = bpm.song.LiveTickToTime(bpm.tick, bpm.song.resolution);
                }

                ChartEditor.GetInstance().songObjectPoolManager.SetAllPoolsDirty();
                break;

            case (SongObject.ID.TimeSignature):
                overwriteRecord = PlaceSongObject.OverwriteActionHistory((TimeSignature)movingSongObjects[i], editor.currentSong.timeSignatures);
                if (record != null)
                {
                    record.Add(overwriteRecord);
                }
                editor.currentSong.Add((TimeSignature)movingSongObjects[i], false);
                break;

            case (SongObject.ID.Section):
                overwriteRecord = PlaceSongObject.OverwriteActionHistory((Section)movingSongObjects[i], editor.currentSong.sections);
                if (record != null)
                {
                    record.Add(overwriteRecord);
                }
                editor.currentSong.Add((Section)movingSongObjects[i], false);
                break;

            case (SongObject.ID.Event):
                overwriteRecord = PlaceSongObject.OverwriteActionHistory((Event)movingSongObjects[i], editor.currentSong.events);
                if (record != null)
                {
                    record.Add(overwriteRecord);
                }
                editor.currentSong.Add((Event)movingSongObjects[i], false);
                break;

            default:
                break;
            }
        }

        editor.currentSelectedObjects = movingSongObjects.ToArray();

        if (moved)
        {
            editor.actionHistory.Insert(deleteRecord.ToArray());                // In case user removes a bpm from an anchor area
            editor.actionHistory.Insert(bpmAnchorRecord.ToArray());

            editor.currentSong.UpdateCache();
            editor.currentChart.UpdateCache();

            editor.actionHistory.Insert(record.ToArray());
            editor.actionHistory.Insert(editor.FixUpBPMAnchors().ToArray());    // In case user moves a bpm into an anchor area
        }

        editor.currentSong.UpdateCache();
        editor.currentChart.UpdateCache();

        Reset();
    }
    // Paste the clipboard data into the chart, overwriting anything else in the process
    public void Paste(uint chartLocationToPaste)
    {
        //if (System.Windows.Forms.Clipboard.GetDataObject().GetFormats().Length > 0 &&
        //    !(
        //        System.Windows.Forms.Clipboard.ContainsText(TextDataFormat.UnicodeText) &&
        //        System.Windows.Forms.Clipboard.ContainsText(TextDataFormat.Text) &&
        //        System.Windows.Forms.Clipboard.GetText() == "")
        //    )     // Something else is pasted on the clipboard instead of Moonscraper stuff.
        //    return;

        FileStream fs = null;

        clipboard = null;
        try
        {
            // Read clipboard data from a file instead of the actual clipboard because the actual clipboard doesn't work for whatever reason
            fs = new FileStream(CLIPBOARD_FILE_LOCATION, FileMode.Open);
            BinaryFormatter formatter = new BinaryFormatter();

            clipboard = (Clipboard)formatter.Deserialize(fs);
        }
        catch (System.Exception e)
        {
            Logger.LogException(e, "Failed to read from clipboard file");
            clipboard = null;
        }
        finally
        {
            if (fs != null)
            {
                fs.Close();
            }
            else
            {
                Debug.LogError("Filestream when reading clipboard data failed to initialise");
            }
        }

        if (Globals.applicationMode == Globals.ApplicationMode.Editor && clipboard != null && clipboard.data.Length > 0)
        {
            List <ActionHistory.Action> record = new List <ActionHistory.Action>();
            Rect collisionRect = clipboard.GetCollisionRect(chartLocationToPaste, editor.currentSong);
            if (clipboard.areaChartPosMin > clipboard.areaChartPosMax)
            {
                Debug.LogError("Clipboard minimum (" + clipboard.areaChartPosMin + ") is greater than clipboard the max (" + clipboard.areaChartPosMax + ")");
            }
            uint colliderChartDistance = TickFunctions.TickScaling(clipboard.areaChartPosMax - clipboard.areaChartPosMin, clipboard.resolution, editor.currentSong.resolution);

            viewModeController.ToggleSongViewMode(!clipboard.data[0].GetType().IsSubclassOf(typeof(ChartObject)));

            // Overwrite any objects in the clipboard space
            if (clipboard.data[0].GetType().IsSubclassOf(typeof(ChartObject)))
            {
                foreach (ChartObject chartObject in editor.currentChart.chartObjects)
                {
                    if (chartObject.tick >= chartLocationToPaste && chartObject.tick <= (chartLocationToPaste + colliderChartDistance) && PrefabGlobals.HorizontalCollisionCheck(PrefabGlobals.GetCollisionRect(chartObject), collisionRect))
                    {
                        chartObject.Delete(false);

                        record.Add(new ActionHistory.Delete(chartObject));
                    }
                }
            }
            else
            {
                // Overwrite synctrack, leave sections alone
                foreach (SyncTrack syncObject in editor.currentSong.syncTrack)
                {
                    if (syncObject.tick >= chartLocationToPaste && syncObject.tick <= (chartLocationToPaste + colliderChartDistance) && PrefabGlobals.HorizontalCollisionCheck(PrefabGlobals.GetCollisionRect(syncObject), collisionRect))
                    {
                        syncObject.Delete(false);

                        record.Add(new ActionHistory.Delete(syncObject));
                    }
                }
            }

            editor.currentChart.UpdateCache();
            editor.currentSong.UpdateCache();

            uint maxLength = editor.currentSong.TimeToTick(editor.currentSong.length, editor.currentSong.resolution);

            // Paste the new objects in
            foreach (SongObject clipboardSongObject in clipboard.data)
            {
                SongObject objectToAdd = clipboardSongObject.Clone();

                objectToAdd.tick = chartLocationToPaste +
                                   TickFunctions.TickScaling(clipboardSongObject.tick, clipboard.resolution, editor.currentSong.resolution) -
                                   TickFunctions.TickScaling(clipboard.areaChartPosMin, clipboard.resolution, editor.currentSong.resolution);

                if (objectToAdd.tick >= maxLength)
                {
                    break;
                }

                if (objectToAdd.GetType() == typeof(Note))
                {
                    Note note = (Note)objectToAdd;

                    if (clipboard.instrument == Song.Instrument.GHLiveGuitar || clipboard.instrument == Song.Instrument.GHLiveBass)
                    {
                        // Pasting from a ghl track
                        if (!Globals.ghLiveMode)
                        {
                            if (note.ghliveGuitarFret == Note.GHLiveGuitarFret.Open)
                            {
                                note.guitarFret = Note.GuitarFret.Open;
                            }
                            else if (note.ghliveGuitarFret == Note.GHLiveGuitarFret.White3)
                            {
                                continue;
                            }
                        }
                    }
                    else if (Globals.ghLiveMode)
                    {
                        // Pasting onto a ghl track
                        if (note.guitarFret == Note.GuitarFret.Open)
                        {
                            note.ghliveGuitarFret = Note.GHLiveGuitarFret.Open;
                        }
                    }

                    note.length = TickFunctions.TickScaling(note.length, clipboard.resolution, editor.currentSong.resolution);

                    record.AddRange(PlaceNote.AddObjectToCurrentChart(note, editor, false));
                }
                else if (objectToAdd.GetType() == typeof(Starpower))
                {
                    Starpower sp = (Starpower)objectToAdd;
                    sp.length = TickFunctions.TickScaling(sp.length, clipboard.resolution, editor.currentSong.resolution);

                    record.AddRange(PlaceStarpower.AddObjectToCurrentChart(sp, editor, false));
                }
                else
                {
                    PlaceSongObject.AddObjectToCurrentEditor(objectToAdd, editor, false);

                    record.Add(new ActionHistory.Add(objectToAdd));
                }
            }
            editor.currentChart.UpdateCache();
            editor.currentSong.UpdateCache();
            editor.actionHistory.Insert(record.ToArray());
            editor.actionHistory.Insert(editor.FixUpBPMAnchors().ToArray());
        }
        // 0 objects in clipboard, don't bother pasting
    }