Gaps between pages in webtoon mode #833

master
Koitharu 2 years ago
parent fe588c08e2
commit 0e20bf4afe
Signed by: Koitharu
GPG Key ID: 676DEE768C17A9D7

@ -82,7 +82,7 @@ afterEvaluate {
} }
dependencies { dependencies {
//noinspection GradleDependency //noinspection GradleDependency
implementation('com.github.KotatsuApp:kotatsu-parsers:44ea9fe709') { implementation('com.github.KotatsuApp:kotatsu-parsers:fb387dbcd9') {
exclude group: 'org.json', module: 'json' exclude group: 'org.json', module: 'json'
} }

@ -405,9 +405,13 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
val isRelatedMangaEnabled: Boolean val isRelatedMangaEnabled: Boolean
get() = prefs.getBoolean(KEY_RELATED_MANGA, true) get() = prefs.getBoolean(KEY_RELATED_MANGA, true)
val isWebtoonZoomEnable: Boolean val isWebtoonZoomEnabled: Boolean
get() = prefs.getBoolean(KEY_WEBTOON_ZOOM, true) get() = prefs.getBoolean(KEY_WEBTOON_ZOOM, true)
var isWebtoonGapsEnabled: Boolean
get() = prefs.getBoolean(KEY_WEBTOON_GAPS, false)
set(value) = prefs.edit { putBoolean(KEY_WEBTOON_GAPS, value) }
@get:FloatRange(from = 0.0, to = 0.5) @get:FloatRange(from = 0.0, to = 0.5)
val defaultWebtoonZoomOut: Float val defaultWebtoonZoomOut: Float
get() = prefs.getInt(KEY_WEBTOON_ZOOM_OUT, 0).coerceIn(0, 50) / 100f get() = prefs.getInt(KEY_WEBTOON_ZOOM_OUT, 0).coerceIn(0, 50) / 100f
@ -618,6 +622,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) {
const val KEY_LOCAL_LIST_ORDER = "local_order" const val KEY_LOCAL_LIST_ORDER = "local_order"
const val KEY_HISTORY_ORDER = "history_order" const val KEY_HISTORY_ORDER = "history_order"
const val KEY_FAVORITES_ORDER = "fav_order" const val KEY_FAVORITES_ORDER = "fav_order"
const val KEY_WEBTOON_GAPS = "webtoon_gaps"
const val KEY_WEBTOON_ZOOM = "webtoon_zoom" const val KEY_WEBTOON_ZOOM = "webtoon_zoom"
const val KEY_WEBTOON_ZOOM_OUT = "webtoon_zoom_out" const val KEY_WEBTOON_ZOOM_OUT = "webtoon_zoom_out"
const val KEY_PREFETCH_CONTENT = "prefetch_content" const val KEY_PREFETCH_CONTENT = "prefetch_content"

@ -15,6 +15,7 @@ import org.koitharu.kotatsu.core.ui.list.AdapterDelegateClickListenerAdapter
import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener import org.koitharu.kotatsu.core.ui.list.OnListItemClickListener
import org.koitharu.kotatsu.core.util.ext.enqueueWith import org.koitharu.kotatsu.core.util.ext.enqueueWith
import org.koitharu.kotatsu.core.util.ext.newImageRequest import org.koitharu.kotatsu.core.util.ext.newImageRequest
import org.koitharu.kotatsu.core.util.ext.recyclerView
import org.koitharu.kotatsu.core.util.ext.setOnContextClickListenerCompat import org.koitharu.kotatsu.core.util.ext.setOnContextClickListenerCompat
import org.koitharu.kotatsu.core.util.ext.setProgressIcon import org.koitharu.kotatsu.core.util.ext.setProgressIcon
import org.koitharu.kotatsu.core.util.ext.source import org.koitharu.kotatsu.core.util.ext.source
@ -64,6 +65,7 @@ fun exploreRecommendationItemAD(
val adapter = BaseListAdapter<MangaListModel>() val adapter = BaseListAdapter<MangaListModel>()
.addDelegate(ListItemType.MANGA_LIST, recommendationMangaItemAD(coil, itemClickListener, lifecycleOwner)) .addDelegate(ListItemType.MANGA_LIST, recommendationMangaItemAD(coil, itemClickListener, lifecycleOwner))
binding.pager.adapter = adapter binding.pager.adapter = adapter
binding.pager.recyclerView?.isNestedScrollingEnabled = false
binding.dots.bindToViewPager(binding.pager) binding.dots.bindToViewPager(binding.pager)
bind { bind {

@ -130,6 +130,12 @@ class ReaderViewModel @Inject constructor(
val isWebtoonZooEnabled = observeIsWebtoonZoomEnabled() val isWebtoonZooEnabled = observeIsWebtoonZoomEnabled()
.stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Lazily, false) .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Lazily, false)
val isWebtoonGapsEnabled = settings.observeAsStateFlow(
scope = viewModelScope + Dispatchers.Default,
key = AppSettings.KEY_WEBTOON_GAPS,
valueProducer = { isWebtoonGapsEnabled },
)
val defaultWebtoonZoomOut = observeIsWebtoonZoomEnabled().flatMapLatest { val defaultWebtoonZoomOut = observeIsWebtoonZoomEnabled().flatMapLatest {
if (it) { if (it) {
observeWebtoonZoomOut() observeWebtoonZoomOut()
@ -455,7 +461,7 @@ class ReaderViewModel @Inject constructor(
private fun observeIsWebtoonZoomEnabled() = settings.observeAsFlow( private fun observeIsWebtoonZoomEnabled() = settings.observeAsFlow(
key = AppSettings.KEY_WEBTOON_ZOOM, key = AppSettings.KEY_WEBTOON_ZOOM,
valueProducer = { isWebtoonZoomEnable }, valueProducer = { isWebtoonZoomEnabled },
) )
private fun observeWebtoonZoomOut() = settings.observeAsFlow( private fun observeWebtoonZoomOut() = settings.observeAsFlow(

@ -0,0 +1,30 @@
package org.koitharu.kotatsu.reader.ui.pager.webtoon
import android.content.Context
import android.graphics.Rect
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import org.koitharu.kotatsu.R
class WebtoonGapsDecoration : RecyclerView.ItemDecoration() {
private var gapSize = -1
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
super.getItemOffsets(outRect, view, parent, state)
val position = parent.getChildAdapterPosition(view)
if (position > 0) {
outRect.top = getGap(parent.context)
}
}
private fun getGap(context: Context): Int {
return if (gapSize == -1) {
context.resources.getDimensionPixelOffset(R.dimen.webtoon_pages_gap).also {
gapSize = it
}
} else {
gapSize
}
}
}

@ -16,6 +16,7 @@ import org.koitharu.kotatsu.core.ui.list.lifecycle.RecyclerViewLifecycleDispatch
import org.koitharu.kotatsu.core.util.ext.findCenterViewPosition import org.koitharu.kotatsu.core.util.ext.findCenterViewPosition
import org.koitharu.kotatsu.core.util.ext.firstVisibleItemPosition import org.koitharu.kotatsu.core.util.ext.firstVisibleItemPosition
import org.koitharu.kotatsu.core.util.ext.observe import org.koitharu.kotatsu.core.util.ext.observe
import org.koitharu.kotatsu.core.util.ext.removeItemDecoration
import org.koitharu.kotatsu.databinding.FragmentReaderWebtoonBinding import org.koitharu.kotatsu.databinding.FragmentReaderWebtoonBinding
import org.koitharu.kotatsu.reader.domain.PageLoader import org.koitharu.kotatsu.reader.domain.PageLoader
import org.koitharu.kotatsu.reader.ui.ReaderState import org.koitharu.kotatsu.reader.ui.ReaderState
@ -59,6 +60,13 @@ class WebtoonReaderFragment : BaseReaderFragment<FragmentReaderWebtoonBinding>()
viewModel.defaultWebtoonZoomOut.take(1).observe(viewLifecycleOwner) { viewModel.defaultWebtoonZoomOut.take(1).observe(viewLifecycleOwner) {
binding.frame.zoom = 1f - it binding.frame.zoom = 1f - it
} }
viewModel.isWebtoonGapsEnabled.observe(viewLifecycleOwner) {
val rv = binding.recyclerView
rv.removeItemDecoration(WebtoonGapsDecoration::class.java)
if (it) {
rv.addItemDecoration(WebtoonGapsDecoration())
}
}
viewModel.readerSettings.observe(viewLifecycleOwner) { viewModel.readerSettings.observe(viewLifecycleOwner) {
it.applyBackground(binding.root) it.applyBackground(binding.root)
} }

@ -43,6 +43,7 @@
<dimen name="explore_grid_width">120dp</dimen> <dimen name="explore_grid_width">120dp</dimen>
<dimen name="chapter_grid_width">80dp</dimen> <dimen name="chapter_grid_width">80dp</dimen>
<dimen name="side_card_offset">8dp</dimen> <dimen name="side_card_offset">8dp</dimen>
<dimen name="webtoon_pages_gap">24dp</dimen>
<dimen name="search_suggestions_manga_height">124dp</dimen> <dimen name="search_suggestions_manga_height">124dp</dimen>
<dimen name="search_suggestions_manga_spacing">4dp</dimen> <dimen name="search_suggestions_manga_spacing">4dp</dimen>

@ -653,4 +653,6 @@
<string name="missing_storage_permission">There is no permission to access manga on external storage</string> <string name="missing_storage_permission">There is no permission to access manga on external storage</string>
<string name="last_used">Last used</string> <string name="last_used">Last used</string>
<string name="show_updated">Show updated</string> <string name="show_updated">Show updated</string>
<string name="webtoon_gaps">Gaps in webtoon mode</string>
<string name="webtoon_gaps_summary">Show vertical gaps between pages in webtoon mode</string>
</resources> </resources>

@ -44,6 +44,12 @@
android:summary="@string/reader_zoom_buttons_summary" android:summary="@string/reader_zoom_buttons_summary"
android:title="@string/reader_zoom_buttons" /> android:title="@string/reader_zoom_buttons" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:key="webtoon_gaps"
android:summary="@string/webtoon_gaps_summary"
android:title="@string/webtoon_gaps" />
<Preference <Preference
android:key="reader_tap_actions" android:key="reader_tap_actions"
android:persistent="false" android:persistent="false"

Loading…
Cancel
Save