mirror of
https://github.com/Suwayomi/TachideskJUI.git
synced 2025-12-10 06:42:05 +01:00
Start seperating current chapter from UI
This commit is contained in:
@@ -25,6 +25,7 @@ import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.widthIn
|
||||
import androidx.compose.material.Icon
|
||||
import androidx.compose.material.IconButton
|
||||
import androidx.compose.material.ModalBottomSheetLayout
|
||||
@@ -64,6 +65,7 @@ import ca.gosyer.jui.ui.base.navigation.Toolbar
|
||||
import ca.gosyer.jui.ui.reader.model.Navigation
|
||||
import ca.gosyer.jui.ui.reader.model.PageMove
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderChapter
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderItem
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderPage
|
||||
import ca.gosyer.jui.ui.reader.navigation.EdgeNavigation
|
||||
import ca.gosyer.jui.ui.reader.navigation.KindlishNavigation
|
||||
@@ -159,9 +161,7 @@ fun ReaderMenu(
|
||||
BoxWithConstraints {
|
||||
if (maxWidth > 720.dp) {
|
||||
WideReaderMenu(
|
||||
previousChapter = previousChapter,
|
||||
chapter = chapter,
|
||||
nextChapter = nextChapter,
|
||||
pages = pages,
|
||||
readerModes = readerModes,
|
||||
readerMode = readerMode,
|
||||
@@ -233,10 +233,8 @@ fun ReaderMenu(
|
||||
|
||||
@Composable
|
||||
fun WideReaderMenu(
|
||||
previousChapter: ReaderChapter?,
|
||||
chapter: ReaderChapter,
|
||||
nextChapter: ReaderChapter?,
|
||||
pages: ImmutableList<ReaderPage>,
|
||||
pages: ImmutableList<ReaderItem>,
|
||||
readerModes: ImmutableList<String>,
|
||||
readerMode: String,
|
||||
continuous: Boolean,
|
||||
@@ -292,9 +290,6 @@ fun WideReaderMenu(
|
||||
Modifier.padding(start = sideMenuSize).fillMaxSize()
|
||||
) {
|
||||
ReaderLayout(
|
||||
previousChapter = previousChapter,
|
||||
chapter = chapter,
|
||||
nextChapter = nextChapter,
|
||||
pages = pages,
|
||||
continuous = continuous,
|
||||
direction = direction,
|
||||
@@ -320,7 +315,7 @@ fun ThinReaderMenu(
|
||||
previousChapter: ReaderChapter?,
|
||||
chapter: ReaderChapter,
|
||||
nextChapter: ReaderChapter?,
|
||||
pages: ImmutableList<ReaderPage>,
|
||||
pages: ImmutableList<ReaderItem>,
|
||||
readerModes: ImmutableList<String>,
|
||||
readerMode: String,
|
||||
continuous: Boolean,
|
||||
@@ -365,9 +360,6 @@ fun ThinReaderMenu(
|
||||
) {
|
||||
Box {
|
||||
ReaderLayout(
|
||||
previousChapter = previousChapter,
|
||||
chapter = chapter,
|
||||
nextChapter = nextChapter,
|
||||
pages = pages,
|
||||
continuous = continuous,
|
||||
direction = direction,
|
||||
@@ -427,10 +419,7 @@ fun ThinReaderMenu(
|
||||
|
||||
@Composable
|
||||
fun ReaderLayout(
|
||||
previousChapter: ReaderChapter?,
|
||||
chapter: ReaderChapter,
|
||||
nextChapter: ReaderChapter?,
|
||||
pages: ImmutableList<ReaderPage>,
|
||||
pages: ImmutableList<ReaderItem>,
|
||||
continuous: Boolean,
|
||||
direction: Direction,
|
||||
padding: Int,
|
||||
@@ -464,9 +453,6 @@ fun ReaderLayout(
|
||||
padding = padding,
|
||||
currentPage = currentPage,
|
||||
currentPageOffset = currentPageOffset,
|
||||
previousChapter = previousChapter,
|
||||
currentChapter = chapter,
|
||||
nextChapter = nextChapter,
|
||||
loadingModifier = loadingModifier,
|
||||
pageContentScale = if (fitSize) {
|
||||
if (direction == Direction.Up || direction == Direction.Down) {
|
||||
@@ -488,9 +474,6 @@ fun ReaderLayout(
|
||||
direction = direction,
|
||||
currentPage = currentPage,
|
||||
pages = pages,
|
||||
previousChapter = previousChapter,
|
||||
currentChapter = chapter,
|
||||
nextChapter = nextChapter,
|
||||
loadingModifier = loadingModifier,
|
||||
pageContentScale = imageScale.toContentScale(),
|
||||
pageEmitterHolder = pageEmitterHolder,
|
||||
|
||||
@@ -30,7 +30,9 @@ import ca.gosyer.jui.ui.reader.model.MoveTo
|
||||
import ca.gosyer.jui.ui.reader.model.Navigation
|
||||
import ca.gosyer.jui.ui.reader.model.PageMove
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderChapter
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderItem
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderPage
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderPageSeparator
|
||||
import ca.gosyer.jui.ui.reader.model.ViewerChapters
|
||||
import ca.gosyer.jui.uicore.prefs.asStateIn
|
||||
import ca.gosyer.jui.uicore.vm.ContextWrapper
|
||||
@@ -89,7 +91,7 @@ class ReaderMenuViewModel @Inject constructor(
|
||||
private val _state = MutableStateFlow<ReaderChapter.State>(ReaderChapter.State.Wait)
|
||||
val state = _state.asStateFlow()
|
||||
|
||||
private val _pages = MutableStateFlow<ImmutableList<ReaderPage>>(persistentListOf())
|
||||
private val _pages = MutableStateFlow<ImmutableList<ReaderItem>>(persistentListOf())
|
||||
val pages = _pages.asStateFlow()
|
||||
|
||||
private val _currentPage = MutableStateFlow(1)
|
||||
@@ -251,28 +253,28 @@ class ReaderMenuViewModel @Inject constructor(
|
||||
)
|
||||
val pages = loader.loadChapter(chapter)
|
||||
viewerChapters.currChapter.value = chapter
|
||||
scope.launchDefault {
|
||||
val chapters = getChapters.asFlow(mangaId)
|
||||
.catch {
|
||||
log.warn(it) { "Error getting chapter list" }
|
||||
// TODO: 2022-07-01 Error toast
|
||||
emit(emptyList())
|
||||
}
|
||||
.single()
|
||||
|
||||
val nextChapter = chapters.find { it.index == chapterIndex + 1 }
|
||||
if (nextChapter != null) {
|
||||
viewerChapters.nextChapter.value = ReaderChapter(
|
||||
nextChapter
|
||||
)
|
||||
}
|
||||
val prevChapter = chapters.find { it.index == chapterIndex - 1 }
|
||||
if (prevChapter != null) {
|
||||
viewerChapters.prevChapter.value = ReaderChapter(
|
||||
prevChapter
|
||||
)
|
||||
val chapters = getChapters.asFlow(mangaId)
|
||||
.catch {
|
||||
log.warn(it) { "Error getting chapter list" }
|
||||
// TODO: 2022-07-01 Error toast
|
||||
emit(emptyList())
|
||||
}
|
||||
.single()
|
||||
|
||||
val nextChapter = chapters.find { it.index == chapterIndex + 1 }
|
||||
if (nextChapter != null) {
|
||||
viewerChapters.nextChapter.value = ReaderChapter(
|
||||
nextChapter
|
||||
)
|
||||
}
|
||||
val prevChapter = chapters.find { it.index == chapterIndex - 1 }
|
||||
if (prevChapter != null) {
|
||||
viewerChapters.prevChapter.value = ReaderChapter(
|
||||
prevChapter
|
||||
)
|
||||
}
|
||||
|
||||
val lastPageRead = chapter.chapter.lastPageRead
|
||||
if (lastPageRead != 0) {
|
||||
_currentPage.value = lastPageRead.coerceAtMost(chapter.chapter.pageCount!!)
|
||||
@@ -291,14 +293,16 @@ class ReaderMenuViewModel @Inject constructor(
|
||||
pages
|
||||
.filterIsInstance<PagesState.Success>()
|
||||
.onEach { (pageList) ->
|
||||
_pages.value = pageList.toImmutableList()
|
||||
val prevSeparator = ReaderPageSeparator(viewerChapters.prevChapter.value, chapter)
|
||||
val nextSeparator = ReaderPageSeparator(chapter, viewerChapters.nextChapter.value)
|
||||
_pages.value = (_pages.value.ifEmpty { listOf(prevSeparator) } + pageList + nextSeparator).toImmutableList()
|
||||
pageList.getOrNull(_currentPage.value - 1)?.let { chapter.pageLoader?.loadPage(it) }
|
||||
}
|
||||
.launchIn(chapter.scope)
|
||||
|
||||
_currentPage
|
||||
.onEach { index ->
|
||||
_pages.value.getOrNull(_currentPage.value - 1)?.let { chapter.pageLoader?.loadPage(it) }
|
||||
(_pages.value.getOrNull(_currentPage.value - 1) as? ReaderPage)?.let { chapter.pageLoader?.loadPage(it) }
|
||||
if (index == _pages.value.size) {
|
||||
markChapterRead(chapter)
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ data class ReaderPage(
|
||||
val status: MutableStateFlow<Status>,
|
||||
val error: MutableStateFlow<String?>,
|
||||
val chapter: ReaderChapter
|
||||
) {
|
||||
) : ReaderItem() {
|
||||
enum class Status {
|
||||
QUEUE,
|
||||
WORKING,
|
||||
|
||||
@@ -37,8 +37,9 @@ import ca.gosyer.jui.ui.reader.ChapterSeparator
|
||||
import ca.gosyer.jui.ui.reader.ReaderImage
|
||||
import ca.gosyer.jui.ui.reader.model.MoveTo
|
||||
import ca.gosyer.jui.ui.reader.model.PageMove
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderChapter
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderItem
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderPage
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderPageSeparator
|
||||
import ca.gosyer.jui.uicore.components.HorizontalScrollbar
|
||||
import ca.gosyer.jui.uicore.components.VerticalScrollbar
|
||||
import ca.gosyer.jui.uicore.components.rememberScrollbarAdapter
|
||||
@@ -52,15 +53,12 @@ import kotlinx.coroutines.flow.mapLatest
|
||||
@Composable
|
||||
fun ContinuousReader(
|
||||
modifier: Modifier,
|
||||
pages: ImmutableList<ReaderPage>,
|
||||
pages: ImmutableList<ReaderItem>,
|
||||
direction: Direction,
|
||||
maxSize: Int,
|
||||
padding: Int,
|
||||
currentPage: Int,
|
||||
currentPageOffset: Int,
|
||||
previousChapter: ReaderChapter?,
|
||||
currentChapter: ReaderChapter,
|
||||
nextChapter: ReaderChapter?,
|
||||
loadingModifier: Modifier,
|
||||
pageContentScale: ContentScale,
|
||||
pageEmitterHolder: StableHolder<SharedFlow<PageMove>>,
|
||||
@@ -123,7 +121,7 @@ fun ContinuousReader(
|
||||
Direction.Up -> PaddingValues(top = padding.dp)
|
||||
Direction.Down -> PaddingValues(bottom = padding.dp)
|
||||
}
|
||||
fun retry(index: Int) { pages.find { it.index == index }?.let { retry(it) } }
|
||||
fun retry(index: Int) { pages.find { it is ReaderPage && it.index == index }?.let { retry(it as ReaderPage) } }
|
||||
|
||||
when (direction) {
|
||||
Direction.Down, Direction.Up -> {
|
||||
@@ -137,9 +135,6 @@ fun ContinuousReader(
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
.padding(contentPadding),
|
||||
pages = pages,
|
||||
previousChapter = previousChapter,
|
||||
currentChapter = currentChapter,
|
||||
nextChapter = nextChapter,
|
||||
imageModifier = imageModifier,
|
||||
loadingModifier = loadingModifier,
|
||||
pageContentScale = pageContentScale,
|
||||
@@ -165,9 +160,6 @@ fun ContinuousReader(
|
||||
modifier = Modifier.fillMaxHeight()
|
||||
.padding(contentPadding),
|
||||
pages = pages,
|
||||
previousChapter = previousChapter,
|
||||
currentChapter = currentChapter,
|
||||
nextChapter = nextChapter,
|
||||
imageModifier = imageModifier,
|
||||
loadingModifier = loadingModifier,
|
||||
pageContentScale = pageContentScale,
|
||||
@@ -187,34 +179,36 @@ fun ContinuousReader(
|
||||
|
||||
private fun LazyListScope.items(
|
||||
modifier: Modifier,
|
||||
pages: ImmutableList<ReaderPage>,
|
||||
previousChapter: ReaderChapter?,
|
||||
currentChapter: ReaderChapter,
|
||||
nextChapter: ReaderChapter?,
|
||||
pages: ImmutableList<ReaderItem>,
|
||||
imageModifier: Modifier,
|
||||
loadingModifier: Modifier,
|
||||
pageContentScale: ContentScale,
|
||||
retry: (Int) -> Unit
|
||||
) {
|
||||
item {
|
||||
ChapterSeparator(previousChapter, currentChapter)
|
||||
}
|
||||
items(pages) { image ->
|
||||
Box(modifier, contentAlignment = Alignment.Center) {
|
||||
ReaderImage(
|
||||
imageIndex = image.index,
|
||||
drawableHolder = image.bitmap.collectAsState().value,
|
||||
progress = image.progress.collectAsState().value,
|
||||
status = image.status.collectAsState().value,
|
||||
error = image.error.collectAsState().value,
|
||||
imageModifier = imageModifier,
|
||||
loadingModifier = loadingModifier,
|
||||
contentScale = pageContentScale,
|
||||
retry = retry
|
||||
)
|
||||
items(
|
||||
pages,
|
||||
key = {
|
||||
when (it) {
|
||||
is ReaderPage -> it.chapter.chapter.index to it.index
|
||||
is ReaderPageSeparator -> it.previousChapter?.chapter?.index to it.nextChapter?.chapter?.index
|
||||
}
|
||||
}
|
||||
) { image ->
|
||||
when (image) {
|
||||
is ReaderPage -> Box(modifier, contentAlignment = Alignment.Center) {
|
||||
ReaderImage(
|
||||
imageIndex = image.index,
|
||||
drawableHolder = image.bitmap.collectAsState().value,
|
||||
progress = image.progress.collectAsState().value,
|
||||
status = image.status.collectAsState().value,
|
||||
error = image.error.collectAsState().value,
|
||||
imageModifier = imageModifier,
|
||||
loadingModifier = loadingModifier,
|
||||
contentScale = pageContentScale,
|
||||
retry = retry
|
||||
)
|
||||
}
|
||||
is ReaderPageSeparator -> ChapterSeparator(previousChapter = image.previousChapter, nextChapter = image.nextChapter)
|
||||
}
|
||||
}
|
||||
item {
|
||||
ChapterSeparator(previousChapter = currentChapter, nextChapter = nextChapter)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,8 +18,9 @@ import ca.gosyer.jui.ui.reader.ChapterSeparator
|
||||
import ca.gosyer.jui.ui.reader.ReaderImage
|
||||
import ca.gosyer.jui.ui.reader.model.MoveTo
|
||||
import ca.gosyer.jui.ui.reader.model.PageMove
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderChapter
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderItem
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderPage
|
||||
import ca.gosyer.jui.ui.reader.model.ReaderPageSeparator
|
||||
import com.google.accompanist.pager.HorizontalPager
|
||||
import com.google.accompanist.pager.VerticalPager
|
||||
import com.google.accompanist.pager.rememberPagerState
|
||||
@@ -33,10 +34,7 @@ fun PagerReader(
|
||||
parentModifier: Modifier,
|
||||
direction: Direction,
|
||||
currentPage: Int,
|
||||
pages: ImmutableList<ReaderPage>,
|
||||
previousChapter: ReaderChapter?,
|
||||
currentChapter: ReaderChapter,
|
||||
nextChapter: ReaderChapter?,
|
||||
pages: ImmutableList<ReaderItem>,
|
||||
loadingModifier: Modifier,
|
||||
pageContentScale: ContentScale,
|
||||
pageEmitterHolder: StableHolder<SharedFlow<PageMove>>,
|
||||
@@ -77,11 +75,11 @@ fun PagerReader(
|
||||
}
|
||||
}
|
||||
val modifier = parentModifier then Modifier.fillMaxSize()
|
||||
fun retry(index: Int) { pages.find { it.index == index }?.let { retry(it) } }
|
||||
fun retry(index: Int) { pages.find { it is ReaderPage && it.index == index }?.let { retry(it as ReaderPage) } }
|
||||
|
||||
if (direction == Direction.Down || direction == Direction.Up) {
|
||||
VerticalPager(
|
||||
count = pages.size + 2,
|
||||
count = pages.size,
|
||||
state = state,
|
||||
reverseLayout = direction == Direction.Up,
|
||||
modifier = modifier
|
||||
@@ -89,9 +87,6 @@ fun PagerReader(
|
||||
HandlePager(
|
||||
pages = pages,
|
||||
page = it,
|
||||
previousChapter = previousChapter,
|
||||
currentChapter = currentChapter,
|
||||
nextChapter = nextChapter,
|
||||
loadingModifier = loadingModifier,
|
||||
pageContentScale = pageContentScale,
|
||||
retry = ::retry
|
||||
@@ -99,7 +94,7 @@ fun PagerReader(
|
||||
}
|
||||
} else {
|
||||
HorizontalPager(
|
||||
count = pages.size + 2,
|
||||
count = pages.size,
|
||||
state = state,
|
||||
reverseLayout = direction == Direction.Left,
|
||||
modifier = modifier
|
||||
@@ -107,9 +102,6 @@ fun PagerReader(
|
||||
HandlePager(
|
||||
pages = pages,
|
||||
page = it,
|
||||
previousChapter = previousChapter,
|
||||
currentChapter = currentChapter,
|
||||
nextChapter = nextChapter,
|
||||
loadingModifier = loadingModifier,
|
||||
pageContentScale = pageContentScale,
|
||||
retry = ::retry
|
||||
@@ -120,20 +112,14 @@ fun PagerReader(
|
||||
|
||||
@Composable
|
||||
fun HandlePager(
|
||||
pages: ImmutableList<ReaderPage>,
|
||||
pages: ImmutableList<ReaderItem>,
|
||||
page: Int,
|
||||
previousChapter: ReaderChapter?,
|
||||
currentChapter: ReaderChapter,
|
||||
nextChapter: ReaderChapter?,
|
||||
loadingModifier: Modifier,
|
||||
pageContentScale: ContentScale,
|
||||
retry: (Int) -> Unit
|
||||
) {
|
||||
when (page) {
|
||||
0 -> ChapterSeparator(previousChapter, currentChapter)
|
||||
pages.size + 1 -> ChapterSeparator(currentChapter, nextChapter)
|
||||
else -> {
|
||||
val image = pages[page - 1]
|
||||
when (val image = pages[page]) {
|
||||
is ReaderPage -> {
|
||||
ReaderImage(
|
||||
imageIndex = image.index,
|
||||
drawableHolder = image.bitmap.collectAsState().value,
|
||||
@@ -145,5 +131,6 @@ fun HandlePager(
|
||||
contentScale = pageContentScale
|
||||
)
|
||||
}
|
||||
is ReaderPageSeparator -> ChapterSeparator(image.previousChapter, image.nextChapter)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user