Start seperating current chapter from UI

This commit is contained in:
Syer10
2022-11-17 19:45:43 -05:00
parent ac04b034dd
commit 3c102ce1ef
5 changed files with 71 additions and 103 deletions

View File

@@ -25,6 +25,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.widthIn
import androidx.compose.material.Icon import androidx.compose.material.Icon
import androidx.compose.material.IconButton import androidx.compose.material.IconButton
import androidx.compose.material.ModalBottomSheetLayout 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.Navigation
import ca.gosyer.jui.ui.reader.model.PageMove import ca.gosyer.jui.ui.reader.model.PageMove
import ca.gosyer.jui.ui.reader.model.ReaderChapter 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.ReaderPage
import ca.gosyer.jui.ui.reader.navigation.EdgeNavigation import ca.gosyer.jui.ui.reader.navigation.EdgeNavigation
import ca.gosyer.jui.ui.reader.navigation.KindlishNavigation import ca.gosyer.jui.ui.reader.navigation.KindlishNavigation
@@ -159,9 +161,7 @@ fun ReaderMenu(
BoxWithConstraints { BoxWithConstraints {
if (maxWidth > 720.dp) { if (maxWidth > 720.dp) {
WideReaderMenu( WideReaderMenu(
previousChapter = previousChapter,
chapter = chapter, chapter = chapter,
nextChapter = nextChapter,
pages = pages, pages = pages,
readerModes = readerModes, readerModes = readerModes,
readerMode = readerMode, readerMode = readerMode,
@@ -233,10 +233,8 @@ fun ReaderMenu(
@Composable @Composable
fun WideReaderMenu( fun WideReaderMenu(
previousChapter: ReaderChapter?,
chapter: ReaderChapter, chapter: ReaderChapter,
nextChapter: ReaderChapter?, pages: ImmutableList<ReaderItem>,
pages: ImmutableList<ReaderPage>,
readerModes: ImmutableList<String>, readerModes: ImmutableList<String>,
readerMode: String, readerMode: String,
continuous: Boolean, continuous: Boolean,
@@ -292,9 +290,6 @@ fun WideReaderMenu(
Modifier.padding(start = sideMenuSize).fillMaxSize() Modifier.padding(start = sideMenuSize).fillMaxSize()
) { ) {
ReaderLayout( ReaderLayout(
previousChapter = previousChapter,
chapter = chapter,
nextChapter = nextChapter,
pages = pages, pages = pages,
continuous = continuous, continuous = continuous,
direction = direction, direction = direction,
@@ -320,7 +315,7 @@ fun ThinReaderMenu(
previousChapter: ReaderChapter?, previousChapter: ReaderChapter?,
chapter: ReaderChapter, chapter: ReaderChapter,
nextChapter: ReaderChapter?, nextChapter: ReaderChapter?,
pages: ImmutableList<ReaderPage>, pages: ImmutableList<ReaderItem>,
readerModes: ImmutableList<String>, readerModes: ImmutableList<String>,
readerMode: String, readerMode: String,
continuous: Boolean, continuous: Boolean,
@@ -365,9 +360,6 @@ fun ThinReaderMenu(
) { ) {
Box { Box {
ReaderLayout( ReaderLayout(
previousChapter = previousChapter,
chapter = chapter,
nextChapter = nextChapter,
pages = pages, pages = pages,
continuous = continuous, continuous = continuous,
direction = direction, direction = direction,
@@ -427,10 +419,7 @@ fun ThinReaderMenu(
@Composable @Composable
fun ReaderLayout( fun ReaderLayout(
previousChapter: ReaderChapter?, pages: ImmutableList<ReaderItem>,
chapter: ReaderChapter,
nextChapter: ReaderChapter?,
pages: ImmutableList<ReaderPage>,
continuous: Boolean, continuous: Boolean,
direction: Direction, direction: Direction,
padding: Int, padding: Int,
@@ -464,9 +453,6 @@ fun ReaderLayout(
padding = padding, padding = padding,
currentPage = currentPage, currentPage = currentPage,
currentPageOffset = currentPageOffset, currentPageOffset = currentPageOffset,
previousChapter = previousChapter,
currentChapter = chapter,
nextChapter = nextChapter,
loadingModifier = loadingModifier, loadingModifier = loadingModifier,
pageContentScale = if (fitSize) { pageContentScale = if (fitSize) {
if (direction == Direction.Up || direction == Direction.Down) { if (direction == Direction.Up || direction == Direction.Down) {
@@ -488,9 +474,6 @@ fun ReaderLayout(
direction = direction, direction = direction,
currentPage = currentPage, currentPage = currentPage,
pages = pages, pages = pages,
previousChapter = previousChapter,
currentChapter = chapter,
nextChapter = nextChapter,
loadingModifier = loadingModifier, loadingModifier = loadingModifier,
pageContentScale = imageScale.toContentScale(), pageContentScale = imageScale.toContentScale(),
pageEmitterHolder = pageEmitterHolder, pageEmitterHolder = pageEmitterHolder,

View File

@@ -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.Navigation
import ca.gosyer.jui.ui.reader.model.PageMove import ca.gosyer.jui.ui.reader.model.PageMove
import ca.gosyer.jui.ui.reader.model.ReaderChapter 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.ReaderPage
import ca.gosyer.jui.ui.reader.model.ReaderPageSeparator
import ca.gosyer.jui.ui.reader.model.ViewerChapters import ca.gosyer.jui.ui.reader.model.ViewerChapters
import ca.gosyer.jui.uicore.prefs.asStateIn import ca.gosyer.jui.uicore.prefs.asStateIn
import ca.gosyer.jui.uicore.vm.ContextWrapper import ca.gosyer.jui.uicore.vm.ContextWrapper
@@ -89,7 +91,7 @@ class ReaderMenuViewModel @Inject constructor(
private val _state = MutableStateFlow<ReaderChapter.State>(ReaderChapter.State.Wait) private val _state = MutableStateFlow<ReaderChapter.State>(ReaderChapter.State.Wait)
val state = _state.asStateFlow() val state = _state.asStateFlow()
private val _pages = MutableStateFlow<ImmutableList<ReaderPage>>(persistentListOf()) private val _pages = MutableStateFlow<ImmutableList<ReaderItem>>(persistentListOf())
val pages = _pages.asStateFlow() val pages = _pages.asStateFlow()
private val _currentPage = MutableStateFlow(1) private val _currentPage = MutableStateFlow(1)
@@ -251,7 +253,7 @@ class ReaderMenuViewModel @Inject constructor(
) )
val pages = loader.loadChapter(chapter) val pages = loader.loadChapter(chapter)
viewerChapters.currChapter.value = chapter viewerChapters.currChapter.value = chapter
scope.launchDefault {
val chapters = getChapters.asFlow(mangaId) val chapters = getChapters.asFlow(mangaId)
.catch { .catch {
log.warn(it) { "Error getting chapter list" } log.warn(it) { "Error getting chapter list" }
@@ -272,7 +274,7 @@ class ReaderMenuViewModel @Inject constructor(
prevChapter prevChapter
) )
} }
}
val lastPageRead = chapter.chapter.lastPageRead val lastPageRead = chapter.chapter.lastPageRead
if (lastPageRead != 0) { if (lastPageRead != 0) {
_currentPage.value = lastPageRead.coerceAtMost(chapter.chapter.pageCount!!) _currentPage.value = lastPageRead.coerceAtMost(chapter.chapter.pageCount!!)
@@ -291,14 +293,16 @@ class ReaderMenuViewModel @Inject constructor(
pages pages
.filterIsInstance<PagesState.Success>() .filterIsInstance<PagesState.Success>()
.onEach { (pageList) -> .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) } pageList.getOrNull(_currentPage.value - 1)?.let { chapter.pageLoader?.loadPage(it) }
} }
.launchIn(chapter.scope) .launchIn(chapter.scope)
_currentPage _currentPage
.onEach { index -> .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) { if (index == _pages.value.size) {
markChapterRead(chapter) markChapterRead(chapter)
} }

View File

@@ -19,7 +19,7 @@ data class ReaderPage(
val status: MutableStateFlow<Status>, val status: MutableStateFlow<Status>,
val error: MutableStateFlow<String?>, val error: MutableStateFlow<String?>,
val chapter: ReaderChapter val chapter: ReaderChapter
) { ) : ReaderItem() {
enum class Status { enum class Status {
QUEUE, QUEUE,
WORKING, WORKING,

View File

@@ -37,8 +37,9 @@ import ca.gosyer.jui.ui.reader.ChapterSeparator
import ca.gosyer.jui.ui.reader.ReaderImage import ca.gosyer.jui.ui.reader.ReaderImage
import ca.gosyer.jui.ui.reader.model.MoveTo import ca.gosyer.jui.ui.reader.model.MoveTo
import ca.gosyer.jui.ui.reader.model.PageMove 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.ReaderPage
import ca.gosyer.jui.ui.reader.model.ReaderPageSeparator
import ca.gosyer.jui.uicore.components.HorizontalScrollbar import ca.gosyer.jui.uicore.components.HorizontalScrollbar
import ca.gosyer.jui.uicore.components.VerticalScrollbar import ca.gosyer.jui.uicore.components.VerticalScrollbar
import ca.gosyer.jui.uicore.components.rememberScrollbarAdapter import ca.gosyer.jui.uicore.components.rememberScrollbarAdapter
@@ -52,15 +53,12 @@ import kotlinx.coroutines.flow.mapLatest
@Composable @Composable
fun ContinuousReader( fun ContinuousReader(
modifier: Modifier, modifier: Modifier,
pages: ImmutableList<ReaderPage>, pages: ImmutableList<ReaderItem>,
direction: Direction, direction: Direction,
maxSize: Int, maxSize: Int,
padding: Int, padding: Int,
currentPage: Int, currentPage: Int,
currentPageOffset: Int, currentPageOffset: Int,
previousChapter: ReaderChapter?,
currentChapter: ReaderChapter,
nextChapter: ReaderChapter?,
loadingModifier: Modifier, loadingModifier: Modifier,
pageContentScale: ContentScale, pageContentScale: ContentScale,
pageEmitterHolder: StableHolder<SharedFlow<PageMove>>, pageEmitterHolder: StableHolder<SharedFlow<PageMove>>,
@@ -123,7 +121,7 @@ fun ContinuousReader(
Direction.Up -> PaddingValues(top = padding.dp) Direction.Up -> PaddingValues(top = padding.dp)
Direction.Down -> PaddingValues(bottom = 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) { when (direction) {
Direction.Down, Direction.Up -> { Direction.Down, Direction.Up -> {
@@ -137,9 +135,6 @@ fun ContinuousReader(
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
.padding(contentPadding), .padding(contentPadding),
pages = pages, pages = pages,
previousChapter = previousChapter,
currentChapter = currentChapter,
nextChapter = nextChapter,
imageModifier = imageModifier, imageModifier = imageModifier,
loadingModifier = loadingModifier, loadingModifier = loadingModifier,
pageContentScale = pageContentScale, pageContentScale = pageContentScale,
@@ -165,9 +160,6 @@ fun ContinuousReader(
modifier = Modifier.fillMaxHeight() modifier = Modifier.fillMaxHeight()
.padding(contentPadding), .padding(contentPadding),
pages = pages, pages = pages,
previousChapter = previousChapter,
currentChapter = currentChapter,
nextChapter = nextChapter,
imageModifier = imageModifier, imageModifier = imageModifier,
loadingModifier = loadingModifier, loadingModifier = loadingModifier,
pageContentScale = pageContentScale, pageContentScale = pageContentScale,
@@ -187,20 +179,23 @@ fun ContinuousReader(
private fun LazyListScope.items( private fun LazyListScope.items(
modifier: Modifier, modifier: Modifier,
pages: ImmutableList<ReaderPage>, pages: ImmutableList<ReaderItem>,
previousChapter: ReaderChapter?,
currentChapter: ReaderChapter,
nextChapter: ReaderChapter?,
imageModifier: Modifier, imageModifier: Modifier,
loadingModifier: Modifier, loadingModifier: Modifier,
pageContentScale: ContentScale, pageContentScale: ContentScale,
retry: (Int) -> Unit retry: (Int) -> Unit
) { ) {
item { items(
ChapterSeparator(previousChapter, currentChapter) pages,
key = {
when (it) {
is ReaderPage -> it.chapter.chapter.index to it.index
is ReaderPageSeparator -> it.previousChapter?.chapter?.index to it.nextChapter?.chapter?.index
} }
items(pages) { image -> }
Box(modifier, contentAlignment = Alignment.Center) { ) { image ->
when (image) {
is ReaderPage -> Box(modifier, contentAlignment = Alignment.Center) {
ReaderImage( ReaderImage(
imageIndex = image.index, imageIndex = image.index,
drawableHolder = image.bitmap.collectAsState().value, drawableHolder = image.bitmap.collectAsState().value,
@@ -213,8 +208,7 @@ private fun LazyListScope.items(
retry = retry retry = retry
) )
} }
is ReaderPageSeparator -> ChapterSeparator(previousChapter = image.previousChapter, nextChapter = image.nextChapter)
} }
item {
ChapterSeparator(previousChapter = currentChapter, nextChapter = nextChapter)
} }
} }

View File

@@ -18,8 +18,9 @@ import ca.gosyer.jui.ui.reader.ChapterSeparator
import ca.gosyer.jui.ui.reader.ReaderImage import ca.gosyer.jui.ui.reader.ReaderImage
import ca.gosyer.jui.ui.reader.model.MoveTo import ca.gosyer.jui.ui.reader.model.MoveTo
import ca.gosyer.jui.ui.reader.model.PageMove 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.ReaderPage
import ca.gosyer.jui.ui.reader.model.ReaderPageSeparator
import com.google.accompanist.pager.HorizontalPager import com.google.accompanist.pager.HorizontalPager
import com.google.accompanist.pager.VerticalPager import com.google.accompanist.pager.VerticalPager
import com.google.accompanist.pager.rememberPagerState import com.google.accompanist.pager.rememberPagerState
@@ -33,10 +34,7 @@ fun PagerReader(
parentModifier: Modifier, parentModifier: Modifier,
direction: Direction, direction: Direction,
currentPage: Int, currentPage: Int,
pages: ImmutableList<ReaderPage>, pages: ImmutableList<ReaderItem>,
previousChapter: ReaderChapter?,
currentChapter: ReaderChapter,
nextChapter: ReaderChapter?,
loadingModifier: Modifier, loadingModifier: Modifier,
pageContentScale: ContentScale, pageContentScale: ContentScale,
pageEmitterHolder: StableHolder<SharedFlow<PageMove>>, pageEmitterHolder: StableHolder<SharedFlow<PageMove>>,
@@ -77,11 +75,11 @@ fun PagerReader(
} }
} }
val modifier = parentModifier then Modifier.fillMaxSize() 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) { if (direction == Direction.Down || direction == Direction.Up) {
VerticalPager( VerticalPager(
count = pages.size + 2, count = pages.size,
state = state, state = state,
reverseLayout = direction == Direction.Up, reverseLayout = direction == Direction.Up,
modifier = modifier modifier = modifier
@@ -89,9 +87,6 @@ fun PagerReader(
HandlePager( HandlePager(
pages = pages, pages = pages,
page = it, page = it,
previousChapter = previousChapter,
currentChapter = currentChapter,
nextChapter = nextChapter,
loadingModifier = loadingModifier, loadingModifier = loadingModifier,
pageContentScale = pageContentScale, pageContentScale = pageContentScale,
retry = ::retry retry = ::retry
@@ -99,7 +94,7 @@ fun PagerReader(
} }
} else { } else {
HorizontalPager( HorizontalPager(
count = pages.size + 2, count = pages.size,
state = state, state = state,
reverseLayout = direction == Direction.Left, reverseLayout = direction == Direction.Left,
modifier = modifier modifier = modifier
@@ -107,9 +102,6 @@ fun PagerReader(
HandlePager( HandlePager(
pages = pages, pages = pages,
page = it, page = it,
previousChapter = previousChapter,
currentChapter = currentChapter,
nextChapter = nextChapter,
loadingModifier = loadingModifier, loadingModifier = loadingModifier,
pageContentScale = pageContentScale, pageContentScale = pageContentScale,
retry = ::retry retry = ::retry
@@ -120,20 +112,14 @@ fun PagerReader(
@Composable @Composable
fun HandlePager( fun HandlePager(
pages: ImmutableList<ReaderPage>, pages: ImmutableList<ReaderItem>,
page: Int, page: Int,
previousChapter: ReaderChapter?,
currentChapter: ReaderChapter,
nextChapter: ReaderChapter?,
loadingModifier: Modifier, loadingModifier: Modifier,
pageContentScale: ContentScale, pageContentScale: ContentScale,
retry: (Int) -> Unit retry: (Int) -> Unit
) { ) {
when (page) { when (val image = pages[page]) {
0 -> ChapterSeparator(previousChapter, currentChapter) is ReaderPage -> {
pages.size + 1 -> ChapterSeparator(currentChapter, nextChapter)
else -> {
val image = pages[page - 1]
ReaderImage( ReaderImage(
imageIndex = image.index, imageIndex = image.index,
drawableHolder = image.bitmap.collectAsState().value, drawableHolder = image.bitmap.collectAsState().value,
@@ -145,5 +131,6 @@ fun HandlePager(
contentScale = pageContentScale contentScale = pageContentScale
) )
} }
is ReaderPageSeparator -> ChapterSeparator(image.previousChapter, image.nextChapter)
} }
} }