using System;
using System.Collections.Generic;
namespace MergeHub.Models
{
///
/// 한 행 안에서 그려질 선 하나.
/// 행의 위쪽 경계 FromLane 에서 들어와 아래쪽 경계 ToLane 으로 나간다.
/// FromLane == ToLane 이면 수직선(그 레인을 그냥 통과), 다르면 합류/분기 사선이다.
///
public sealed class GraphEdge
{
public GraphEdge(int fromLane, int toLane, int colorIndex)
{
FromLane = fromLane;
ToLane = toLane;
ColorIndex = colorIndex;
}
public int FromLane { get; }
public int ToLane { get; }
public int ColorIndex { get; }
}
/// 커밋 한 개가 차지하는 그래프 행.
public sealed class GraphRow
{
public GraphRow(int lane, int colorIndex, IReadOnlyList edges, bool isMerge)
{
Lane = lane;
ColorIndex = colorIndex;
Edges = edges;
IsMerge = isMerge;
}
/// 점(커밋)이 찍히는 레인.
public int Lane { get; }
public int ColorIndex { get; }
public IReadOnlyList Edges { get; }
/// 부모가 둘 이상 - 속을 비운 점으로 그린다.
public bool IsMerge { get; }
/// 목록 전체에서 쓰인 최대 레인 수. 열 너비를 맞추는 데 쓴다.
public int LaneCount { get; set; } = 1;
}
/// 커밋 목록에 바인딩되는 항목 - 커밋 정보 + 그 커밋이 그려질 그래프 행.
public sealed class CommitNode
{
public CommitNode(CommitInfo commit, GraphRow graph)
{
Commit = commit;
Graph = graph;
}
public CommitInfo Commit { get; }
public GraphRow Graph { get; }
}
}