mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 06:17:57 +01:00 
			
		
		
		
	Merge branch 'feature/webtoon-margins' of git://github.com/jleehey/tachiyomi into jleehey-feature/webtoon-margins
# Conflicts: # app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderSettingsSheet.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonConfig.kt # app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonPageHolder.kt # app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceDSL.kt # app/src/main/res/values/strings.xml
This commit is contained in:
		| @@ -57,6 +57,8 @@ object PreferenceKeys { | ||||
|  | ||||
|     const val readWithVolumeKeysInverted = "reader_volume_keys_inverted" | ||||
|  | ||||
|     const val marginRatioWebtoon = "margin_ratio_webtoon" | ||||
|  | ||||
|     const val portraitColumns = "pref_library_columns_portrait_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 marginRatioWebtoon() = rxPrefs.getFloat(Keys.marginRatioWebtoon, 0f) | ||||
|  | ||||
|     fun readWithTapping() = rxPrefs.getBoolean(Keys.readWithTapping, true) | ||||
|  | ||||
|     fun readWithLongTap() = rxPrefs.getBoolean(Keys.readWithLongTap, true) | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import android.os.Build | ||||
| import android.os.Bundle | ||||
| import android.widget.CompoundButton | ||||
| import android.widget.Spinner | ||||
| import androidx.annotation.ArrayRes | ||||
| import androidx.core.widget.NestedScrollView | ||||
| import com.f2prateek.rx.preferences.Preference | ||||
| 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.keepscreen | ||||
| 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.pager_prefs_group | ||||
| 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() | ||||
|  | ||||
|         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) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 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 | ||||
|         private set | ||||
|  | ||||
|     var marginRatio = 0f | ||||
|         private set | ||||
|  | ||||
|     init { | ||||
|         preferences.readWithTapping() | ||||
|                 .register({ tappingEnabled = it }) | ||||
| @@ -58,6 +61,9 @@ class WebtoonConfig(preferences: PreferencesHelper = Injekt.get()) { | ||||
|  | ||||
|         preferences.alwaysShowChapterTransition() | ||||
|                 .register({ alwaysShowChapterTransition = it }) | ||||
|  | ||||
|         preferences.marginRatioWebtoon() | ||||
|             .register({ marginRatio = it }, { imagePropertyChangedListener?.invoke() }) | ||||
|     } | ||||
|  | ||||
|     fun unsubscribe() { | ||||
|   | ||||
| @@ -2,9 +2,11 @@ package eu.kanade.tachiyomi.ui.reader.viewer.webtoon | ||||
|  | ||||
| import android.annotation.SuppressLint | ||||
| import android.content.Intent | ||||
| import android.content.res.Resources | ||||
| import android.graphics.drawable.Drawable | ||||
| import android.net.Uri | ||||
| import android.view.Gravity | ||||
| import android.view.View | ||||
| import android.view.ViewGroup | ||||
| import android.view.ViewGroup.LayoutParams.MATCH_PARENT | ||||
| import android.view.ViewGroup.LayoutParams.WRAP_CONTENT | ||||
| @@ -128,6 +130,10 @@ class WebtoonPageHolder( | ||||
|             if (!viewer.isContinuous) { | ||||
|                 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.addView(recycler) | ||||
|  | ||||
|         config.imagePropertyChangedListener = { adapter.notifyDataSetChanged() } | ||||
|     } | ||||
|  | ||||
|     private fun checkAllowPreload(page: ReaderPage?): Boolean { | ||||
|   | ||||
| @@ -146,6 +146,17 @@ class SettingsReaderController : SettingsController() { | ||||
|                 titleRes = R.string.pref_crop_borders | ||||
|                 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 { | ||||
|   | ||||
| @@ -14,6 +14,7 @@ import androidx.preference.PreferenceScreen | ||||
| import androidx.preference.SwitchPreferenceCompat | ||||
| import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat | ||||
| 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.SwitchPreferenceCategory | ||||
|  | ||||
| @@ -53,6 +54,10 @@ inline fun PreferenceGroup.intListPreference(block: (@DSL IntListPreference).() | ||||
|     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 { | ||||
|     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 | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user