fix alot of issues with draggable strumlines (dragging broken af rn tho)

This commit is contained in:
lunarcleint
2023-09-01 19:52:46 -07:00
parent 19468c381f
commit 691825af6a
4 changed files with 98 additions and 96 deletions
+47 -64
View File
@@ -1,5 +1,6 @@
package funkin.editors.charter;
import funkin.editors.charter.CharterStrumline;
import funkin.editors.charter.CharterBackdrop.EventBackdrop;
import funkin.backend.system.framerate.Framerate;
import haxe.Json;
@@ -553,8 +554,8 @@ class Charter extends UIState {
case DRAG:
if (FlxG.mouse.pressed) {
selection.loop(function (n:CharterNote) {
n.setPosition(n.id * 40 + (mousePos.x - dragStartPos.x), n.step * 40 + (mousePos.y - dragStartPos.y));
n.snappedToStrumline = false;
n.setPosition(n.id * 40 + (mousePos.x - dragStartPos.x), n.step * 40 + (mousePos.y - dragStartPos.y));
n.cursor = HAND;
}, function (e:CharterEvent) {
e.y = e.step * 40 + (mousePos.y - dragStartPos.y) - 17;
@@ -611,7 +612,7 @@ class Charter extends UIState {
} else {
if (mouseOnGrid) {
var note = new CharterNote();
note.updatePos(FlxG.keys.pressed.SHIFT ? (mousePos.y / 40) : Math.floor(mousePos.y / 40), id, 0, 0);
note.updatePos(FlxG.keys.pressed.SHIFT ? (mousePos.y / 40) : Math.floor(mousePos.y / 40), id % 4, 0, 0, strumLines.members[Std.int(id/4)]);
notesGroup.add(note);
selection = [note];
sortNotes();
@@ -620,7 +621,6 @@ class Charter extends UIState {
}
}
} else if (gridBackdropDummy.hoveredByChild) {
// TODO: NOTE DRAGGING
if (FlxG.mouse.pressed && (Math.abs(mousePos.x - dragStartPos.x) > 5 || Math.abs(mousePos.y - dragStartPos.y) > 5)) {
var noteHovered:Bool = false;
for(n in selection)
@@ -741,18 +741,10 @@ class Charter extends UIState {
var cStr = new CharterStrumline(strL);
strumLines.insert(strumLineID, cStr);
// Push forward notes that are infront of the strumLine
for (note in notesGroup.members) {
if (Std.int(note.id / 4) >= strumLineID)
note.updatePos(note.step, note.id + 4, note.susLength, note.type);
}
var noteOffset = (strumLines.members.indexOf(cStr)) * 4;
for(note in strL.notes) {
var n = new CharterNote();
var t = Conductor.getStepForTime(note.time);
n.updatePos(t, noteOffset + note.id, Conductor.getStepForTime(note.time + note.sLen) - t, note.type);
n.updatePos(t, note.id, Conductor.getStepForTime(note.time + note.sLen) - t, note.type, cStr);
notesGroup.add(n);
}
sortNotes();
@@ -762,45 +754,28 @@ class Charter extends UIState {
}
public function deleteStrumline(strumLineID:Int, addToUndo:Bool = true) {
var undoNotes:Array<ChartNote> = [];
removeStrumlineFromSelection(strumLineID);
var i = 0;
while(i < notesGroup.members.length) {
var note = notesGroup.members[i];
if (note.strumLineID == strumLineID) {
undoNotes.push(buildNote(note));
deleteSingleSelection(note, false);
} else i++;
}
var strL = strumLines.members[strumLineID].strumLine;
strumLines.members[strumLineID].destroy();
strumLines.members.remove(strumLines.members[strumLineID]);
var deletedstrumNotes:Array<CharterNote> = [];
// Delete this strums notes
var i = 0; // thanks yosh!!!!! (deleteNote removes a index)
while(i < notesGroup.members.length) {
var note = notesGroup.members[i];
if (Std.int(note.id / 4) == strumLineID) { // thanks neo lol!!!!!
deletedstrumNotes.push(note);
deleteSingleSelection(note, false);
} else
i++;
}
// Push back strumline notes that are infront
for (note in notesGroup.members) {
if (Std.int(note.id / 4) > strumLineID)
note.updatePos(note.step, note.id - 4, note.susLength, note.type);
}
sortNotes();
// Undo shit
if (addToUndo) {
var newStrL = Reflect.copy(strL);
newStrL.notes.clear();
newStrL.notes = undoNotes;
for (note in deletedstrumNotes) {
var time = Conductor.getTimeForStep(note.step);
newStrL.notes.push({
type: note.type,
time: time,
sLen: Conductor.getTimeForStep(note.step + note.susLength) - time,
id: note.id % 4
});
}
undos.addToUndo(CDeleteStrumLine(strumLineID, newStrL));
}
}
@@ -819,6 +794,8 @@ class Charter extends UIState {
}));
}
public function orderStrumline() {}
public inline function deleteStrumlineFromData(strL:ChartStrumLine)
deleteStrumline(getStrumlineID(strL));
@@ -839,7 +816,7 @@ class Charter extends UIState {
while(i < selection.length) {
if (selection[i] is CharterNote) {
var note = cast (selection[i], CharterNote);
if (Std.int(note.id / 4) == strumLineID)
if (note.strumLineID == strumLineID)
selection.remove(note);
else i++;
}
@@ -1021,7 +998,7 @@ class Charter extends UIState {
for (s in selection)
if (s is CharterNote) {
var note:CharterNote = cast(s, CharterNote);
CNote(note.step - minStep, note.id, note.susLength, note.type);
CNote(note.step - minStep, note.id, note.strumLineID, note.susLength, note.type);
} else if (s is CharterEvent) {
var event = cast(s,CharterEvent);
CEvent(event.step - minStep, [for (event in event.events) Reflect.copy(event)]);
@@ -1035,13 +1012,13 @@ class Charter extends UIState {
var sObjects:Array<ICharterSelectable> = [];
for(c in clipboard) {
switch(c) {
case CNote(step, id, sLen, type):
case CNote(step, id, strumLineID, susLength, type):
var note = new CharterNote();
note.updatePos(minStep + step + 1, id, sLen, type);
note.updatePos(minStep + step, id, susLength, type, strumLines.members[Std.int(FlxMath.bound(strumLineID, 0, strumLines.length-1))]);
notesGroup.add(note);
sObjects.push(note);
case CEvent(step, events):
var event = new CharterEvent(minStep + step + 1, events);
var event = new CharterEvent(minStep + step, events);
event.refreshEventIcons();
eventsGroup.add(event);
sObjects.push(event);
@@ -1064,6 +1041,8 @@ class Charter extends UIState {
}
function _edit_undo(_) {
if (strumLines.isDragging) return;
selection = [];
var undo = undos.undo();
switch(undo) {
@@ -1072,6 +1051,8 @@ class Charter extends UIState {
createStrumline(strumLineID, strumLine, false);
case CCreateStrumLine(strumLineID, strumLine):
deleteStrumline(strumLineID, false);
case COrderStrumLine(strumLine, oldID, newID):
strumLines.orderStrumline(strumLine, oldID);
case CEditStrumLine(strumLineID, oldStrumLine, newStrumLine):
strumLines.members[strumLineID].strumLine = oldStrumLine;
strumLines.members[strumLineID].updateInfo();
@@ -1098,6 +1079,8 @@ class Charter extends UIState {
}
function _edit_redo(_) {
if (strumLines.isDragging) return;
selection = [];
var redo = undos.redo();
switch(redo) {
@@ -1106,6 +1089,8 @@ class Charter extends UIState {
deleteStrumline(strumLineID, false);
case CCreateStrumLine(strumLineID, strumLine):
createStrumline(strumLineID, strumLine, false);
case COrderStrumLine(strumLine, oldID, newID):
strumLines.orderStrumline(strumLine, newID);
case CEditStrumLine(strumLineID, oldStrumLine, newStrumLine):
strumLines.members[strumLineID].strumLine = newStrumLine;
strumLines.members[strumLineID].updateInfo();
@@ -1236,12 +1221,7 @@ class Charter extends UIState {
var n:CharterNote = cast(s, CharterNote);
var old:Float = n.susLength;
n.updatePos(n.step, n.id, Math.max(n.susLength + change, 0));
{
before: old,
after: n.susLength,
note: n
};
{before: old, after: n.susLength, note: n};
}
}
]));
@@ -1256,6 +1236,16 @@ class Charter extends UIState {
FlxG.switchState(new PlayState());
}
public inline function buildNote(note:CharterNote):ChartNote {
var time = Conductor.getTimeForStep(note.step);
return {
type: note.type,
time: time,
sLen: Conductor.getTimeForStep(note.step + note.susLength) - time,
id: note.id
};
}
public function buildChart() {
PlayState.SONG.strumLines = [];
for(s in strumLines) {
@@ -1263,16 +1253,8 @@ class Charter extends UIState {
PlayState.SONG.strumLines.push(s.strumLine);
}
for(n in notesGroup.members) {
var strLineID = Std.int(n.id / 4);
if (PlayState.SONG.strumLines[strLineID] != null) {
var time = Conductor.getTimeForStep(n.step);
PlayState.SONG.strumLines[strLineID].notes.push({
type: n.type,
time: time,
sLen: Conductor.getTimeForStep(n.step + n.susLength) - time,
id: n.id % 4
});
}
if (PlayState.SONG.strumLines[n.strumLineID] != null)
PlayState.SONG.strumLines[n.strumLineID].notes.push(buildNote(n));
}
buildEvents();
}
@@ -1297,23 +1279,24 @@ class Charter extends UIState {
}
public inline function hitsoundsEnabled(id:Int)
return strumLines.members[Std.int(id / 4)] != null && strumLines.members[Std.int(id / 4)].hitsounds;
return strumLines.members[id] != null && strumLines.members[id].hitsounds;
}
enum CharterChange {
CCreateStrumLine(strumLineID:Int, strumLine:ChartStrumLine);
CEditStrumLine(strumLineID:Int, oldStrumLine:ChartStrumLine, newStrumLine:ChartStrumLine);
COrderStrumLine(strumLine:CharterStrumline, oldID:Int, newID:Int);
CDeleteStrumLine(strumLineID:Int, strumLine:ChartStrumLine);
CCreateSelection(selection:Selection);
CDeleteSelection(selection:Selection);
CSelectionDrag(selection:Selection, change:FlxPoint);
CEditStrumLine(strumLineID:Int, oldStrumLine:ChartStrumLine, newStrumLine:ChartStrumLine);
CEditSustains(notes:Array<NoteSustainChange>);
CEditEvent(event:CharterEvent, oldEvents:Array<ChartEvent>, newEvents:Array<ChartEvent>);
CEditChartData(oldData:{stage:String, speed:Float}, newData:{stage:String, speed:Float});
}
enum CharterCopyboardObject {
CNote(step:Float, id:Int, susLength:Float, type:Int);
CNote(step:Float, id:Int, strumLineID:Int, susLength:Float, type:Int);
CEvent(step:Float, events:Array<ChartEvent>);
}
@@ -107,7 +107,7 @@ class CharterBackdrop extends FlxBackdrop {
// Draw notes
notesGroup.forEach((n) -> {
if(n.exists && n.visible && (Math.floor(n.id/4) == _)) {
if(n.exists && n.visible) {
n.cameras = cameras;
n.draw();
}
+17 -24
View File
@@ -23,9 +23,6 @@ class CharterNote extends UISprite implements ICharterSelectable {
public var selected:Bool = false;
public var draggable:Bool = true;
public var snappedToStrumline:Bool = true;
public var strumLine:CharterStrumline = null;
public function new() {
super();
antialiasing = true;
@@ -51,29 +48,28 @@ class CharterNote extends UISprite implements ICharterSelectable {
UIState.state.updateRectButtonHandler(this, __rect, onHovered);
}
public var step:Float;
public var id:Int;
public var susLength:Float;
public var type:Int;
public var realId:Int;
@:isVar public var id(get, set):Int;
function set_id(d:Int) {
strumLine = Charter.instance.strumLines.members[Math.floor(d / 4)];
if (strumLine != null)
alpha = strumLine.strumLine.visible ? 1 : 0.4;
realId = d;
return id = d % 4;
}
public var strumLine:CharterStrumline;
public var strumLineID(get, never):Int;
public function get_strumLineID():Int
return strumLine == null ? -1 : Charter.instance.strumLines.members.indexOf(strumLine);
function get_id():Int
return id + 4 * Charter.instance.strumLines.members.indexOf(strumLine);
public var snappedToStrumline:Bool = true;
public function updatePos(step:Float, id:Int, susLength:Float = 0, type:Int = 0) {
public var fullID(get, never):Int; // instead of %4 get fullID (for mousepos stuff)
public function get_fullID():Int
return (strumLineID * 4) + id;
public function updatePos(step:Float, id:Int, susLength:Float = 0, type:Int = 0, ?strumLine:CharterStrumline) {
this.step = step;
this.id = id;
this.susLength = susLength;
this.type = type;
this.strumLine = strumLine;
y = step * 40;
sustainSpr.scale.set(10, (40 * susLength));
@@ -132,8 +128,8 @@ class CharterNote extends UISprite implements ICharterSelectable {
sustainSpr.follow(this, 15, 20);
if (__passed != (__passed = step < Conductor.curStepFloat)) {
alpha = __passed ? 0.6 : 1;
if (__passed && FlxG.sound.music.playing && Charter.instance.hitsoundsEnabled(id))
alpha = (__passed ? 0.8 : 1) - (!strumLine.strumLine.visible ? .6 : 0);
if (__passed && FlxG.sound.music.playing && Charter.instance.hitsoundsEnabled(strumLineID))
Charter.instance.hitsound.replay();
}
if(sustainSpr.exists)
@@ -156,18 +152,15 @@ class CharterNote extends UISprite implements ICharterSelectable {
}
public function handleDrag(change:FlxPoint) {
var newID:Int = id + Std.int(change.y);
var newID:Int = fullID + Std.int(change.y);
if (newID > ((Charter.instance.strumLines.members.length*4)-1)) newID %= 4;
else if (newID < 0) newID = (Charter.instance.strumLines.members.length*4) + newID % 4;
updatePos(step + change.x, newID, susLength, type);
Charter.instance.notesGroup.remove(this);
Charter.instance.notesGroup.add(this);
updatePos(step + change.x, newID % 4, susLength, type, Charter.instance.strumLines.members[Std.int(newID/4)]);
}
public override function draw() {
if (snappedToStrumline)
if (snappedToStrumline)
x = (strumLine != null ? strumLine.button.x : 0) + (id % 4) * 40;
drawMembers();
@@ -1,5 +1,6 @@
package funkin.editors.charter;
import funkin.backend.chart.ChartData.ChartStrumLine;
import funkin.backend.chart.EventsData;
import flixel.util.FlxSort;
@@ -9,6 +10,9 @@ class CharterStrumLineGroup extends FlxTypedGroup<CharterStrumline> {
var draggingOffset:Float = 0;
public var draggable:Bool = false;
public var isDragging(get, never):Bool;
public function get_isDragging():Bool
return draggingObj != null;
public override function update(elapsed:Float) {
var mousePos = FlxG.mouse.getWorldPosition(cameras[0], FlxPoint.get());
@@ -29,7 +33,7 @@ class CharterStrumLineGroup extends FlxTypedGroup<CharterStrumline> {
this.sort(function(o, a, b) return FlxSort.byValues(o, a.x, b.x), -1);
for (i=>strum in members)
if (!strum.dragging) strum.x = CoolUtil.fpsLerp(strum.x, 160 * i, 0.3);
if (!strum.dragging) strum.x = CoolUtil.fpsLerp(strum.x, 160 * i, 0.225);
if (Charter.instance.eventsBackdrop != null)
Charter.instance.eventsBackdrop.x = members[0].button.x - Charter.instance.eventsBackdrop.width;
@@ -42,15 +46,38 @@ class CharterStrumLineGroup extends FlxTypedGroup<CharterStrumline> {
finishDrag();
mousePos.put();
super.update(elapsed);
}
inline function finishDrag() {
draggingObj.dragging = false;
draggingObj = null;
public function orderStrumline(strumLine:CharterStrumline, newID:Int) {
__pastStrumlines = members.copy();
// Fix Events that use strumline param
members.remove(strumLine);
members.insert(newID, strumLine);
for (i=>strum in members)
strum.x = 160 * i;
finishDrag(false);
}
public function finishDrag(?addToUndo:Bool = true) {
if (draggingObj != null)
draggingObj.dragging = false;
// Undo
if (addToUndo) {
var oldID = __pastStrumlines.indexOf(draggingObj);
var newID = members.indexOf(draggingObj);
Charter.instance.undos.addToUndo(COrderStrumLine(draggingObj, oldID, newID));
}
draggingObj = null;
fixEvents();
}
public inline function fixEvents() {
for (i in Charter.instance.eventsGroup.members) {
for (j in i.events) {
var paramTypes:Array<EventParamInfo> = EventsData.getEventParams(j.name);
@@ -60,7 +87,6 @@ class CharterStrumLineGroup extends FlxTypedGroup<CharterStrumline> {
}
}
}
__pastStrumlines = null;
}