|
|
|
@ -16,6 +16,7 @@ import io.legado.app.ui.book.read.PhotoDialog |
|
|
|
|
import io.legado.app.ui.book.read.page.entities.TextChar |
|
|
|
|
import io.legado.app.ui.book.read.page.entities.TextLine |
|
|
|
|
import io.legado.app.ui.book.read.page.entities.TextPage |
|
|
|
|
import io.legado.app.ui.book.read.page.entities.TextPos |
|
|
|
|
import io.legado.app.ui.book.read.page.provider.ChapterProvider |
|
|
|
|
import io.legado.app.ui.book.read.page.provider.ImageProvider |
|
|
|
|
import io.legado.app.ui.book.read.page.provider.TextPageFactory |
|
|
|
@ -36,8 +37,8 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at |
|
|
|
|
} |
|
|
|
|
private var callBack: CallBack |
|
|
|
|
private val visibleRect = RectF() |
|
|
|
|
private val selectStart = Pos(0, 0, 0) |
|
|
|
|
private val selectEnd = Pos(0, 0, 0) |
|
|
|
|
private val selectStart = TextPos(0, 0, 0) |
|
|
|
|
private val selectEnd = TextPos(0, 0, 0) |
|
|
|
|
var textPage: TextPage = TextPage() |
|
|
|
|
private set |
|
|
|
|
|
|
|
|
@ -240,7 +241,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at |
|
|
|
|
*/ |
|
|
|
|
fun selectStartMove(x: Float, y: Float) { |
|
|
|
|
touch(x, y) { relativePos, _, relativeOffset, lineIndex, textLine, charIndex, textChar -> |
|
|
|
|
val pos = Pos(relativePos, lineIndex, charIndex) |
|
|
|
|
val pos = TextPos(relativePos, lineIndex, charIndex) |
|
|
|
|
if (selectStart.compare(pos) != 0) { |
|
|
|
|
if (pos.compare(selectEnd) <= 0) { |
|
|
|
|
selectStart.upData(pos = pos) |
|
|
|
@ -260,7 +261,7 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at |
|
|
|
|
*/ |
|
|
|
|
fun selectEndMove(x: Float, y: Float) { |
|
|
|
|
touch(x, y) { relativePos, _, relativeOffset, lineIndex, textLine, charIndex, textChar -> |
|
|
|
|
val pos = Pos(relativePos, lineIndex, charIndex) |
|
|
|
|
val pos = TextPos(relativePos, lineIndex, charIndex) |
|
|
|
|
if (pos.compare(selectEnd) != 0) { |
|
|
|
|
if (pos.compare(selectStart) >= 0) { |
|
|
|
|
selectEnd.upData(pos) |
|
|
|
@ -345,15 +346,15 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at |
|
|
|
|
|
|
|
|
|
private fun upSelectChars() { |
|
|
|
|
val last = if (callBack.isScroll) 2 else 0 |
|
|
|
|
val charPos = Pos(0, 0, 0) |
|
|
|
|
val textPos = TextPos(0, 0, 0) |
|
|
|
|
for (relativePos in 0..last) { |
|
|
|
|
charPos.relativePos = relativePos |
|
|
|
|
textPos.relativePos = relativePos |
|
|
|
|
for ((lineIndex, textLine) in relativePage(relativePos).textLines.withIndex()) { |
|
|
|
|
charPos.lineIndex = lineIndex |
|
|
|
|
textPos.lineIndex = lineIndex |
|
|
|
|
for ((charIndex, textChar) in textLine.textChars.withIndex()) { |
|
|
|
|
charPos.charIndex = charIndex |
|
|
|
|
textPos.charIndex = charIndex |
|
|
|
|
textChar.selected = |
|
|
|
|
charPos.compare(selectStart) >= 0 && charPos.compare(selectEnd) <= 0 |
|
|
|
|
textPos.compare(selectStart) >= 0 && textPos.compare(selectEnd) <= 0 |
|
|
|
|
textChar.isSearchResult = textChar.selected && callBack.isSelectingSearchResult |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -383,17 +384,17 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fun getSelectedText(): String { |
|
|
|
|
val pos = Pos(0, 0, 0) |
|
|
|
|
val textPos = TextPos(0, 0, 0) |
|
|
|
|
val builder = StringBuilder() |
|
|
|
|
for (relativePos in selectStart.relativePos..selectEnd.relativePos) { |
|
|
|
|
val textPage = relativePage(relativePos) |
|
|
|
|
pos.relativePos = relativePos |
|
|
|
|
textPos.relativePos = relativePos |
|
|
|
|
textPage.textLines.forEachIndexed { lineIndex, textLine -> |
|
|
|
|
pos.lineIndex = lineIndex |
|
|
|
|
textPos.lineIndex = lineIndex |
|
|
|
|
textLine.textChars.forEachIndexed { charIndex, textChar -> |
|
|
|
|
pos.charIndex = charIndex |
|
|
|
|
val compareStart = pos.compare(selectStart) |
|
|
|
|
val compareEnd = pos.compare(selectEnd) |
|
|
|
|
textPos.charIndex = charIndex |
|
|
|
|
val compareStart = textPos.compare(selectStart) |
|
|
|
|
val compareEnd = textPos.compare(selectEnd) |
|
|
|
|
if (compareStart >= 0 && compareEnd <= 0) { |
|
|
|
|
builder.append(textChar.charData) |
|
|
|
|
if ( |
|
|
|
@ -442,31 +443,6 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private data class Pos( |
|
|
|
|
var relativePos: Int, |
|
|
|
|
var lineIndex: Int, |
|
|
|
|
var charIndex: Int |
|
|
|
|
) { |
|
|
|
|
|
|
|
|
|
fun upData(pos: Pos) { |
|
|
|
|
relativePos = pos.relativePos |
|
|
|
|
lineIndex = pos.lineIndex |
|
|
|
|
charIndex = pos.charIndex |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fun compare(pos: Pos): Int { |
|
|
|
|
return when { |
|
|
|
|
relativePos < pos.relativePos -> -3 |
|
|
|
|
relativePos > pos.relativePos -> 3 |
|
|
|
|
lineIndex < pos.lineIndex -> -2 |
|
|
|
|
lineIndex > pos.lineIndex -> 2 |
|
|
|
|
charIndex < pos.charIndex -> -1 |
|
|
|
|
charIndex > pos.charIndex -> 1 |
|
|
|
|
else -> 0 |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
interface CallBack { |
|
|
|
|
fun upSelectedStart(x: Float, y: Float, top: Float) |
|
|
|
|
fun upSelectedEnd(x: Float, y: Float) |
|
|
|
|