您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
161 行
3.8 KiB
161 行
3.8 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace UIWidgets.ui
|
|
{
|
|
public class StyledRuns
|
|
{
|
|
private readonly List<TextStyle> styles = new List<TextStyle>();
|
|
private readonly List<IndexedRun> runs = new List<IndexedRun>();
|
|
|
|
public class RunIterator
|
|
{
|
|
private int _charIndex;
|
|
private int _runIndex;
|
|
private StyledRuns _runs;
|
|
|
|
public void nextTo(int index)
|
|
{
|
|
if (_charIndex > index)
|
|
{
|
|
throw new ArgumentException("can to move back");
|
|
}
|
|
_charIndex = index;
|
|
while (_runIndex < _runs.size)
|
|
{
|
|
var run = _runs.getRun(_runIndex);
|
|
if (run.start <= _charIndex && _charIndex < run.end)
|
|
{
|
|
break;
|
|
}
|
|
_runIndex++;
|
|
}
|
|
}
|
|
|
|
public Run run
|
|
{
|
|
get { return _runs.getRun(_runIndex); }
|
|
}
|
|
|
|
public int charIndex
|
|
{
|
|
get { return _charIndex; }
|
|
}
|
|
|
|
public int runIndex
|
|
{
|
|
get { return _runIndex; }
|
|
}
|
|
|
|
public bool end
|
|
{
|
|
get
|
|
{
|
|
return runIndex >= _runs.size;
|
|
}
|
|
}
|
|
|
|
internal RunIterator(StyledRuns runs)
|
|
{
|
|
_charIndex = 0;
|
|
_runIndex = 0;
|
|
_runs = runs;
|
|
}
|
|
|
|
|
|
}
|
|
public class Run
|
|
{
|
|
public readonly TextStyle style;
|
|
public readonly int start;
|
|
public readonly int end;
|
|
|
|
public Run(TextStyle style, int start, int end)
|
|
{
|
|
this.style = style;
|
|
this.start = start;
|
|
this.end = end;
|
|
}
|
|
}
|
|
|
|
public class IndexedRun
|
|
{
|
|
public readonly int styleIndex = 0;
|
|
public readonly int start;
|
|
public int end;
|
|
|
|
public IndexedRun(int styleIndex, int start, int end)
|
|
{
|
|
this.styleIndex = styleIndex;
|
|
this.start = start;
|
|
this.end = end;
|
|
}
|
|
}
|
|
|
|
public StyledRuns()
|
|
{
|
|
}
|
|
|
|
public StyledRuns(StyledRuns other)
|
|
{
|
|
styles = new List<TextStyle>(other.styles);
|
|
runs = new List<IndexedRun>(other.runs);
|
|
}
|
|
|
|
public int addStyle(TextStyle style)
|
|
{
|
|
var styleIndex = styles.Count;
|
|
styles.Add( style);
|
|
return styleIndex;
|
|
|
|
}
|
|
|
|
public TextStyle getStyle(int index)
|
|
{
|
|
return styles[index];
|
|
}
|
|
|
|
public void startRun(int styleIndex, int start)
|
|
{
|
|
endRunIfNeeded(start);
|
|
runs.Add(new IndexedRun(styleIndex, start, start));
|
|
|
|
}
|
|
|
|
public void endRunIfNeeded(int end)
|
|
{
|
|
var lastIndex = runs.Count - 1;
|
|
if (lastIndex < 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var run = runs[lastIndex];
|
|
if (run.start == end)
|
|
{
|
|
runs.RemoveAt(lastIndex);
|
|
}
|
|
else
|
|
{
|
|
run.end = end;
|
|
}
|
|
}
|
|
|
|
public Run getRun(int index)
|
|
{
|
|
var run = runs[index];
|
|
return new Run(styles[run.styleIndex], run.start, run.end);
|
|
}
|
|
|
|
public RunIterator iterator()
|
|
{
|
|
return new RunIterator(this);
|
|
}
|
|
|
|
public int size
|
|
{
|
|
get { return runs.Count; }
|
|
}
|
|
}
|
|
}
|