HeavenStudioPlus/Assets/Scripts/LevelEditor/BoxSelection.cs

200 lines
6.5 KiB
C#
Raw Normal View History

2022-01-13 03:59:54 +00:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Starpelly;
2022-01-13 03:59:54 +00:00
2022-03-14 14:21:05 +00:00
using HeavenStudio.Editor.Track;
2022-03-14 14:21:05 +00:00
namespace HeavenStudio.Editor
2022-01-13 03:59:54 +00:00
{
public class BoxSelection : MonoBehaviour
{
[SerializeField] private RectTransform boxVisual;
[SerializeField] private RectTransform timelineContent;
2022-01-13 03:59:54 +00:00
private Rect selectionBox;
private Vector2 startPosition = Vector2.zero;
private Vector2 endPosition = Vector2.zero;
public bool selecting = false;
private bool clickedInTimeline = false;
2022-02-03 22:20:26 +00:00
private TMPro.TMP_Text sizeText;
2022-07-02 02:03:15 +00:00
private RectTransform text;
private float timelineLastX;
2022-02-03 22:20:26 +00:00
2022-01-13 03:59:54 +00:00
public static BoxSelection instance { get; private set; }
private void Awake()
{
instance = this;
}
private void Start()
{
DrawVisual();
Color boxCol = EditorTheme.theme.properties.BoxSelectionCol.Hex2RGB();
boxVisual.GetComponent<Image>().color = new Color(boxCol.r, boxCol.g, boxCol.b, 0.3f);
2022-01-16 19:23:46 +00:00
boxVisual.transform.GetChild(0).GetComponent<Image>().color = EditorTheme.theme.properties.BoxSelectionOutlineCol.Hex2RGB();
2022-02-03 22:20:26 +00:00
sizeText = boxVisual.transform.GetChild(1).GetComponent<TMPro.TMP_Text>();
2022-07-02 02:03:15 +00:00
text = boxVisual.transform.GetChild(1).GetComponent<RectTransform>();
2022-01-13 03:59:54 +00:00
}
private void Update()
{
if (Editor.instance == null) return;
2022-07-02 02:03:15 +00:00
float deltaTimelineX = timelineContent.transform.localPosition.x - timelineLastX;
Camera camera = Editor.instance.EditorCamera;
Vector3 scale = Editor.instance.MainCanvas.transform.localScale;
boxVisual.transform.localScale = new Vector2(0.01f/scale.x, 1f/scale.y);
text.transform.localScale = scale;
if (Selections.instance.eventsSelected.Count > 0 && Timeline.instance.InteractingWithEvents())
2022-01-13 03:59:54 +00:00
{
startPosition = Vector2.zero;
endPosition = Vector2.zero;
DrawVisual();
2022-01-13 03:59:54 +00:00
return;
}
if (Conductor.instance.NotStopped() || !Timeline.instance.timelineState.selected)
{
startPosition = Vector2.zero;
endPosition = Vector2.zero;
DrawVisual();
return;
}
2022-07-02 02:03:15 +00:00
float beatLen = boxVisual.rect.width * boxVisual.transform.localScale.x;
if (beatLen >= 0.5f)
sizeText.text = $"{string.Format("{0:0.000}", beatLen)}";
2022-02-03 07:28:14 +00:00
else
2022-07-02 02:03:15 +00:00
sizeText.text = string.Empty;
2022-02-03 07:28:14 +00:00
2022-01-13 03:59:54 +00:00
// click
if (Input.GetMouseButtonDown(0))
{
clickedInTimeline = Timeline.instance.CheckIfMouseInTimeline();
2022-01-16 19:23:46 +00:00
startPosition = MousePosition();
2022-01-13 03:59:54 +00:00
selectionBox = new Rect();
}
// dragging
if (Input.GetMouseButton(0) && clickedInTimeline)
2022-01-13 03:59:54 +00:00
{
2022-07-02 02:03:15 +00:00
startPosition.x += deltaTimelineX * scale.x;
2022-01-16 19:23:46 +00:00
endPosition = MousePosition();
2022-01-13 03:59:54 +00:00
DrawSelection();
2022-07-02 02:03:15 +00:00
SelectEvents(); //kek
DrawVisual();
2022-01-13 03:59:54 +00:00
}
// release click
if (Input.GetMouseButtonUp(0))
{
startPosition = Vector2.zero;
endPosition = Vector2.zero;
SelectEvents();
DrawVisual();
2022-01-13 03:59:54 +00:00
}
2022-07-02 02:03:15 +00:00
timelineLastX = timelineContent.transform.localPosition.x;
2022-01-13 03:59:54 +00:00
}
private void DrawVisual()
{
Vector2 boxStart = startPosition;
Vector2 boxEnd = endPosition;
Vector2 boxCenter = (boxStart + boxEnd) / 2;
boxVisual.position = boxCenter;
Vector2 boxSize = new Vector2(Mathf.Abs(boxStart.x - boxEnd.x), Mathf.Abs(boxStart.y - boxEnd.y));
2022-07-02 02:03:15 +00:00
boxVisual.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, boxSize.x);
boxVisual.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, boxSize.y);
2022-01-13 03:59:54 +00:00
}
private void DrawSelection()
{
// X
2022-01-16 19:23:46 +00:00
if (MousePosition().x < startPosition.x)
2022-01-13 03:59:54 +00:00
{
// dragging left
2022-01-16 19:23:46 +00:00
selectionBox.xMin = MousePosition().x;
2022-01-13 03:59:54 +00:00
selectionBox.xMax = startPosition.x;
}
else
{
// dragging right
selectionBox.xMin = startPosition.x;
2022-01-16 19:23:46 +00:00
selectionBox.xMax = MousePosition().x;
2022-01-13 03:59:54 +00:00
}
// Y
2022-01-16 19:23:46 +00:00
if (MousePosition().y < startPosition.y)
2022-01-13 03:59:54 +00:00
{
// dragging down
2022-01-16 19:23:46 +00:00
selectionBox.yMin = MousePosition().y;
2022-01-13 03:59:54 +00:00
selectionBox.yMax = startPosition.y;
}
else
{
// dragging up
selectionBox.yMin = startPosition.y;
2022-01-16 19:23:46 +00:00
selectionBox.yMax = MousePosition().y;
2022-01-13 03:59:54 +00:00
}
}
private void SelectEvents()
{
if (!Input.GetKey(KeyCode.LeftShift) && !Timeline.instance.InteractingWithEvents() && Editor.instance.canSelect) Selections.instance.DeselectAll();
2022-01-13 03:59:54 +00:00
int selected = 0;
for (int i = 0; i < GameManager.instance.Beatmap.entities.Count; i++)
{
TimelineEventObj e = GameManager.instance.Beatmap.entities[i].eventObj;
2022-01-16 19:23:46 +00:00
if (selectionBox.Overlaps(GetWorldRect(e.GetComponent<RectTransform>())))
2022-01-13 03:59:54 +00:00
{
Selections.instance.DragSelect(e);
selected++;
2022-01-16 19:23:46 +00:00
}
2022-01-13 03:59:54 +00:00
}
selecting = selected > 0;
}
2022-01-16 19:23:46 +00:00
public Vector3 MousePosition()
2022-01-13 03:59:54 +00:00
{
2022-02-03 22:20:26 +00:00
var mousePos = Editor.instance.EditorCamera.ScreenToWorldPoint(Input.mousePosition);
// var mousePos = new Vector2();
2022-07-02 02:03:15 +00:00
// RectTransformUtility.ScreenPointToLocalPointInRectangle(timelineContent, Input.mousePosition, Editor.instance.EditorCamera, out mousePos);
2022-01-16 19:23:46 +00:00
return new Vector3(mousePos.x, mousePos.y, 0);
}
public Rect GetWorldRect(RectTransform rectTransform)
{
Vector3[] corners = new Vector3[4];
rectTransform.GetWorldCorners(corners);
// Get the bottom left corner.
Vector3 position = corners[0];
Vector2 size = new Vector2(
rectTransform.lossyScale.x * rectTransform.rect.size.x,
rectTransform.lossyScale.y * rectTransform.rect.size.y);
return new Rect(position, size);
2022-01-13 03:59:54 +00:00
}
}
}