Merge branch 'jleehey-feature/webtoon-margins' into pr/2349
This commit is contained in:
commit
a63d165dd3
12 changed files with 119 additions and 1 deletions
|
@ -57,6 +57,8 @@ object PreferenceKeys {
|
||||||
|
|
||||||
const val readWithVolumeKeysInverted = "reader_volume_keys_inverted"
|
const val readWithVolumeKeysInverted = "reader_volume_keys_inverted"
|
||||||
|
|
||||||
|
const val marginRatioWebtoon = "margin_ratio_webtoon"
|
||||||
|
|
||||||
const val portraitColumns = "pref_library_columns_portrait_key"
|
const val portraitColumns = "pref_library_columns_portrait_key"
|
||||||
|
|
||||||
const val landscapeColumns = "pref_library_columns_landscape_key"
|
const val landscapeColumns = "pref_library_columns_landscape_key"
|
||||||
|
|
|
@ -107,6 +107,8 @@ class PreferencesHelper(val context: Context) {
|
||||||
|
|
||||||
fun cropBordersWebtoon() = rxPrefs.getBoolean(Keys.cropBordersWebtoon, false)
|
fun cropBordersWebtoon() = rxPrefs.getBoolean(Keys.cropBordersWebtoon, false)
|
||||||
|
|
||||||
|
fun marginRatioWebtoon() = rxPrefs.getFloat(Keys.marginRatioWebtoon, 0f)
|
||||||
|
|
||||||
fun readWithTapping() = rxPrefs.getBoolean(Keys.readWithTapping, true)
|
fun readWithTapping() = rxPrefs.getBoolean(Keys.readWithTapping, true)
|
||||||
|
|
||||||
fun readWithLongTap() = rxPrefs.getBoolean(Keys.readWithLongTap, true)
|
fun readWithLongTap() = rxPrefs.getBoolean(Keys.readWithLongTap, true)
|
||||||
|
|
|
@ -4,6 +4,7 @@ import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.widget.CompoundButton
|
import android.widget.CompoundButton
|
||||||
import android.widget.Spinner
|
import android.widget.Spinner
|
||||||
|
import androidx.annotation.ArrayRes
|
||||||
import androidx.core.widget.NestedScrollView
|
import androidx.core.widget.NestedScrollView
|
||||||
import com.f2prateek.rx.preferences.Preference
|
import com.f2prateek.rx.preferences.Preference
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
|
@ -23,6 +24,7 @@ import kotlinx.android.synthetic.main.reader_settings_sheet.cutout_short
|
||||||
import kotlinx.android.synthetic.main.reader_settings_sheet.fullscreen
|
import kotlinx.android.synthetic.main.reader_settings_sheet.fullscreen
|
||||||
import kotlinx.android.synthetic.main.reader_settings_sheet.keepscreen
|
import kotlinx.android.synthetic.main.reader_settings_sheet.keepscreen
|
||||||
import kotlinx.android.synthetic.main.reader_settings_sheet.long_tap
|
import kotlinx.android.synthetic.main.reader_settings_sheet.long_tap
|
||||||
|
import kotlinx.android.synthetic.main.reader_settings_sheet.margin_ratio_webtoon
|
||||||
import kotlinx.android.synthetic.main.reader_settings_sheet.page_transitions
|
import kotlinx.android.synthetic.main.reader_settings_sheet.page_transitions
|
||||||
import kotlinx.android.synthetic.main.reader_settings_sheet.pager_prefs_group
|
import kotlinx.android.synthetic.main.reader_settings_sheet.pager_prefs_group
|
||||||
import kotlinx.android.synthetic.main.reader_settings_sheet.rotation_mode
|
import kotlinx.android.synthetic.main.reader_settings_sheet.rotation_mode
|
||||||
|
@ -112,6 +114,7 @@ class ReaderSettingsSheet(private val activity: ReaderActivity) : BottomSheetDia
|
||||||
webtoon_prefs_group.visible()
|
webtoon_prefs_group.visible()
|
||||||
|
|
||||||
crop_borders_webtoon.bindToPreference(preferences.cropBordersWebtoon())
|
crop_borders_webtoon.bindToPreference(preferences.cropBordersWebtoon())
|
||||||
|
margin_ratio_webtoon.bindToFloatPreference(preferences.marginRatioWebtoon(), R.array.webtoon_margin_ratio_values)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -131,4 +134,18 @@ class ReaderSettingsSheet(private val activity: ReaderActivity) : BottomSheetDia
|
||||||
}
|
}
|
||||||
setSelection(pref.getOrDefault() - offset, false)
|
setSelection(pref.getOrDefault() - offset, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Binds a spinner to a float preference. The position of the spinner item must
|
||||||
|
* correlate with the [floatValues] resource item (in arrays.xml), which is a <string-array>
|
||||||
|
* of float values that will be parsed here and applied to the preference.
|
||||||
|
*/
|
||||||
|
private fun Spinner.bindToFloatPreference(pref: Preference<Float>, @ArrayRes floatValuesResource: Int) {
|
||||||
|
val floatValues = resources.getStringArray(floatValuesResource).map { it.toFloatOrNull() }
|
||||||
|
onItemSelectedListener = IgnoreFirstSpinnerListener { position ->
|
||||||
|
pref.set(floatValues[position])
|
||||||
|
}
|
||||||
|
setSelection(floatValues.indexOf(pref.getOrDefault()), false)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,9 @@ class WebtoonConfig(preferences: PreferencesHelper = Injekt.get()) {
|
||||||
var alwaysShowChapterTransition = true
|
var alwaysShowChapterTransition = true
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
var marginRatio = 0f
|
||||||
|
private set
|
||||||
|
|
||||||
init {
|
init {
|
||||||
preferences.readWithTapping()
|
preferences.readWithTapping()
|
||||||
.register({ tappingEnabled = it })
|
.register({ tappingEnabled = it })
|
||||||
|
@ -58,6 +61,9 @@ class WebtoonConfig(preferences: PreferencesHelper = Injekt.get()) {
|
||||||
|
|
||||||
preferences.alwaysShowChapterTransition()
|
preferences.alwaysShowChapterTransition()
|
||||||
.register({ alwaysShowChapterTransition = it })
|
.register({ alwaysShowChapterTransition = it })
|
||||||
|
|
||||||
|
preferences.marginRatioWebtoon()
|
||||||
|
.register({ marginRatio = it }, { imagePropertyChangedListener?.invoke() })
|
||||||
}
|
}
|
||||||
|
|
||||||
fun unsubscribe() {
|
fun unsubscribe() {
|
||||||
|
|
|
@ -2,9 +2,11 @@ package eu.kanade.tachiyomi.ui.reader.viewer.webtoon
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.content.res.Resources
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.view.Gravity
|
import android.view.Gravity
|
||||||
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
|
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
|
||||||
|
@ -128,6 +130,10 @@ class WebtoonPageHolder(
|
||||||
if (!viewer.isContinuous) {
|
if (!viewer.isContinuous) {
|
||||||
bottomMargin = 15.dpToPx
|
bottomMargin = 15.dpToPx
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val margin = Resources.getSystem().displayMetrics.widthPixels * viewer.config.marginRatio
|
||||||
|
marginEnd = margin.toInt()
|
||||||
|
marginStart = margin.toInt()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -121,6 +121,8 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr
|
||||||
|
|
||||||
frame.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
|
frame.layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
|
||||||
frame.addView(recycler)
|
frame.addView(recycler)
|
||||||
|
|
||||||
|
config.imagePropertyChangedListener = { adapter.notifyDataSetChanged() }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkAllowPreload(page: ReaderPage?): Boolean {
|
private fun checkAllowPreload(page: ReaderPage?): Boolean {
|
||||||
|
|
|
@ -146,6 +146,17 @@ class SettingsReaderController : SettingsController() {
|
||||||
titleRes = R.string.pref_crop_borders
|
titleRes = R.string.pref_crop_borders
|
||||||
defaultValue = false
|
defaultValue = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
floatListPreference {
|
||||||
|
key = Keys.marginRatioWebtoon
|
||||||
|
titleRes = R.string.pref_reader_margin
|
||||||
|
entriesRes = arrayOf(R.string.webtoon_margin_ratio_0,
|
||||||
|
R.string.webtoon_margin_ratio_10, R.string.webtoon_margin_ratio_15,
|
||||||
|
R.string.webtoon_margin_ratio_20, R.string.webtoon_margin_ratio_25)
|
||||||
|
entryValues = arrayOf("0", "0.1", "0.15", "0.2", "0.25")
|
||||||
|
defaultValue = "0"
|
||||||
|
summary = "%s"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
preferenceCategory {
|
preferenceCategory {
|
||||||
|
|
|
@ -14,6 +14,7 @@ import androidx.preference.PreferenceScreen
|
||||||
import androidx.preference.SwitchPreferenceCompat
|
import androidx.preference.SwitchPreferenceCompat
|
||||||
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
|
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
|
||||||
import eu.kanade.tachiyomi.widget.preference.BadgePreference
|
import eu.kanade.tachiyomi.widget.preference.BadgePreference
|
||||||
|
import eu.kanade.tachiyomi.widget.preference.FloatListPreference
|
||||||
import eu.kanade.tachiyomi.widget.preference.IntListPreference
|
import eu.kanade.tachiyomi.widget.preference.IntListPreference
|
||||||
import eu.kanade.tachiyomi.widget.preference.SwitchPreferenceCategory
|
import eu.kanade.tachiyomi.widget.preference.SwitchPreferenceCategory
|
||||||
|
|
||||||
|
@ -53,6 +54,10 @@ inline fun PreferenceGroup.intListPreference(block: (@DSL IntListPreference).()
|
||||||
return initThenAdd(IntListPreference(context), block).also(::initDialog)
|
return initThenAdd(IntListPreference(context), block).also(::initDialog)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline fun PreferenceGroup.floatListPreference(block: (@DSL FloatListPreference).() -> Unit): FloatListPreference {
|
||||||
|
return initThenAdd(FloatListPreference(context), block).also(::initDialog)
|
||||||
|
}
|
||||||
|
|
||||||
inline fun PreferenceGroup.multiSelectListPreference(block: (@DSL MultiSelectListPreference).() -> Unit): MultiSelectListPreference {
|
inline fun PreferenceGroup.multiSelectListPreference(block: (@DSL MultiSelectListPreference).() -> Unit): MultiSelectListPreference {
|
||||||
return initThenAdd(MultiSelectListPreference(context), block).also(::initDialog)
|
return initThenAdd(MultiSelectListPreference(context), block).also(::initDialog)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
package eu.kanade.tachiyomi.widget.preference
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import androidx.preference.ListPreference
|
||||||
|
|
||||||
|
class FloatListPreference @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
|
||||||
|
ListPreference(context, attrs) {
|
||||||
|
|
||||||
|
override fun persistString(value: String?): Boolean {
|
||||||
|
return value != null && persistFloat(value.toFloat())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getPersistedString(defaultReturnValue: String?): String? {
|
||||||
|
// When the underlying preference is using a PreferenceDataStore, there's no way (for now)
|
||||||
|
// to check if a value is in the store, so we use a most likely unused value as workaround
|
||||||
|
val defaultIntValue = Float.NEGATIVE_INFINITY
|
||||||
|
|
||||||
|
val value = getPersistedFloat(defaultIntValue)
|
||||||
|
return if (value != defaultIntValue) {
|
||||||
|
value.toString()
|
||||||
|
} else {
|
||||||
|
defaultReturnValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -256,6 +256,25 @@
|
||||||
android:textColor="?android:attr/textColorSecondary"
|
android:textColor="?android:attr/textColorSecondary"
|
||||||
app:layout_constraintTop_toBottomOf="@id/webtoon_prefs" />
|
app:layout_constraintTop_toBottomOf="@id/webtoon_prefs" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/margin_ratio_text"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/pref_reader_margin"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toLeftOf="@id/verticalcenter"
|
||||||
|
app:layout_constraintBaseline_toBaselineOf="@id/margin_ratio_webtoon"/>
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatSpinner
|
||||||
|
android:id="@+id/margin_ratio_webtoon"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:entries="@array/webtoon_margin_ratio"
|
||||||
|
app:layout_constraintLeft_toRightOf="@id/verticalcenter"
|
||||||
|
app:layout_constraintRight_toRightOf="@id/spinner_end"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/crop_borders_webtoon"/>
|
||||||
|
|
||||||
<!-- Groups of preferences -->
|
<!-- Groups of preferences -->
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.Group
|
<androidx.constraintlayout.widget.Group
|
||||||
|
@ -271,7 +290,7 @@
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
app:constraint_referenced_ids="webtoon_prefs,crop_borders_webtoon" />
|
app:constraint_referenced_ids="webtoon_prefs,crop_borders_webtoon,margin_ratio_text,margin_ratio_webtoon" />
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.Guideline
|
<androidx.constraintlayout.widget.Guideline
|
||||||
android:id="@+id/verticalcenter"
|
android:id="@+id/verticalcenter"
|
||||||
|
|
|
@ -54,6 +54,22 @@
|
||||||
<item>@string/scale_type_smart_fit</item>
|
<item>@string/scale_type_smart_fit</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="webtoon_margin_ratio">
|
||||||
|
<item>@string/webtoon_margin_ratio_0</item>
|
||||||
|
<item>@string/webtoon_margin_ratio_10</item>
|
||||||
|
<item>@string/webtoon_margin_ratio_15</item>
|
||||||
|
<item>@string/webtoon_margin_ratio_20</item>
|
||||||
|
<item>@string/webtoon_margin_ratio_25</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="webtoon_margin_ratio_values">
|
||||||
|
<item>0.0</item>
|
||||||
|
<item>0.1</item>
|
||||||
|
<item>0.15</item>
|
||||||
|
<item>0.2</item>
|
||||||
|
<item>0.25</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
<string-array name="image_scale_type_values">
|
<string-array name="image_scale_type_values">
|
||||||
<item>1</item>
|
<item>1</item>
|
||||||
<item>2</item>
|
<item>2</item>
|
||||||
|
|
|
@ -241,6 +241,7 @@
|
||||||
<string name="pref_read_with_tapping">Tapping</string>
|
<string name="pref_read_with_tapping">Tapping</string>
|
||||||
<string name="pref_read_with_long_tap">Long tap dialog</string>
|
<string name="pref_read_with_long_tap">Long tap dialog</string>
|
||||||
<string name="pref_reader_theme">Background color</string>
|
<string name="pref_reader_theme">Background color</string>
|
||||||
|
<string name="pref_reader_margin">Margin ratio</string>
|
||||||
<string name="white_background">White</string>
|
<string name="white_background">White</string>
|
||||||
<string name="black_background">Black</string>
|
<string name="black_background">Black</string>
|
||||||
<string name="pref_viewer_type">Default viewer</string>
|
<string name="pref_viewer_type">Default viewer</string>
|
||||||
|
@ -278,6 +279,11 @@
|
||||||
<string name="color_filter_a_value">A</string>
|
<string name="color_filter_a_value">A</string>
|
||||||
<string name="pref_always_show_chapter_transition">Always show chapter transition</string>
|
<string name="pref_always_show_chapter_transition">Always show chapter transition</string>
|
||||||
<string name="pref_category_reading">Reading</string>
|
<string name="pref_category_reading">Reading</string>
|
||||||
|
<string name="webtoon_margin_ratio_0">No margin</string>
|
||||||
|
<string name="webtoon_margin_ratio_10">10%</string>
|
||||||
|
<string name="webtoon_margin_ratio_15">15%</string>
|
||||||
|
<string name="webtoon_margin_ratio_20">20%</string>
|
||||||
|
<string name="webtoon_margin_ratio_25">25%</string>
|
||||||
|
|
||||||
<!-- Downloads section -->
|
<!-- Downloads section -->
|
||||||
<string name="pref_download_directory">Download location</string>
|
<string name="pref_download_directory">Download location</string>
|
||||||
|
|
Reference in a new issue