mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Split general and reading mode sheet settings
This commit is contained in:
		| @@ -3,22 +3,14 @@ package eu.kanade.tachiyomi.ui.reader.setting | ||||
| import android.content.Context | ||||
| import android.util.AttributeSet | ||||
| import android.view.LayoutInflater | ||||
| import android.widget.CompoundButton | ||||
| import android.widget.Spinner | ||||
| import androidx.annotation.ArrayRes | ||||
| import androidx.core.view.isVisible | ||||
| import androidx.core.widget.NestedScrollView | ||||
| import androidx.lifecycle.lifecycleScope | ||||
| import com.tfcporciuncula.flow.Preference | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.data.preference.asImmediateFlow | ||||
| import eu.kanade.tachiyomi.databinding.ReaderGeneralSettingsBinding | ||||
| import eu.kanade.tachiyomi.ui.reader.ReaderActivity | ||||
| import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerViewer | ||||
| import eu.kanade.tachiyomi.ui.reader.viewer.webtoon.WebtoonViewer | ||||
| import eu.kanade.tachiyomi.widget.IgnoreFirstSpinnerListener | ||||
| import kotlinx.coroutines.flow.launchIn | ||||
| import eu.kanade.tachiyomi.util.preference.bindToIntPreference | ||||
| import eu.kanade.tachiyomi.util.preference.bindToPreference | ||||
| import uy.kohesive.injekt.injectLazy | ||||
|  | ||||
| /** | ||||
| @@ -35,29 +27,12 @@ class ReaderGeneralSettings @JvmOverloads constructor(context: Context, attrs: A | ||||
|         addView(binding.root) | ||||
|  | ||||
|         initGeneralPreferences() | ||||
|  | ||||
|         when ((context as ReaderActivity).viewer) { | ||||
|             is PagerViewer -> initPagerPreferences() | ||||
|             is WebtoonViewer -> initWebtoonPreferences() | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Init general reader preferences. | ||||
|      */ | ||||
|     private fun initGeneralPreferences() { | ||||
|         binding.viewer.onItemSelectedListener = IgnoreFirstSpinnerListener { position -> | ||||
|             (context as ReaderActivity).presenter.setMangaViewer(position) | ||||
|  | ||||
|             val mangaViewer = (context as ReaderActivity).presenter.getMangaViewer() | ||||
|             if (mangaViewer == ReadingModeType.WEBTOON.prefValue || mangaViewer == ReadingModeType.CONTINUOUS_VERTICAL.prefValue) { | ||||
|                 initWebtoonPreferences() | ||||
|             } else { | ||||
|                 initPagerPreferences() | ||||
|             } | ||||
|         } | ||||
|         binding.viewer.setSelection((context as ReaderActivity).presenter.manga?.viewer ?: 0, false) | ||||
|  | ||||
|         binding.rotationMode.bindToPreference(preferences.rotation(), 1) | ||||
|         binding.backgroundColor.bindToIntPreference(preferences.readerTheme(), R.array.reader_themes_values) | ||||
|         binding.showPageNumber.bindToPreference(preferences.showPageNumber()) | ||||
| @@ -73,95 +48,4 @@ class ReaderGeneralSettings @JvmOverloads constructor(context: Context, attrs: A | ||||
|             binding.cutoutShort.bindToPreference(preferences.cutoutShort()) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Init the preferences for the pager reader. | ||||
|      */ | ||||
|     private fun initPagerPreferences() { | ||||
|         binding.webtoonPrefsGroup.root.isVisible = false | ||||
|         binding.pagerPrefsGroup.root.isVisible = true | ||||
|  | ||||
|         binding.pagerPrefsGroup.tappingPrefsGroup.isVisible = preferences.readWithTapping().get() | ||||
|  | ||||
|         binding.pagerPrefsGroup.tappingInverted.bindToPreference(preferences.pagerNavInverted()) | ||||
|  | ||||
|         binding.pagerPrefsGroup.pagerNav.bindToPreference(preferences.navigationModePager()) | ||||
|         binding.pagerPrefsGroup.scaleType.bindToPreference(preferences.imageScaleType(), 1) | ||||
|         binding.pagerPrefsGroup.zoomStart.bindToPreference(preferences.zoomStart(), 1) | ||||
|         binding.pagerPrefsGroup.cropBorders.bindToPreference(preferences.cropBorders()) | ||||
|  | ||||
|         // Makes so that dual page invert gets hidden away when turning of dual page split | ||||
|         binding.dualPageSplit.bindToPreference(preferences.dualPageSplitPaged()) | ||||
|         preferences.dualPageSplitPaged() | ||||
|             .asImmediateFlow { binding.dualPageInvert.isVisible = it } | ||||
|             .launchIn((context as ReaderActivity).lifecycleScope) | ||||
|         binding.dualPageInvert.bindToPreference(preferences.dualPageInvertPaged()) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Init the preferences for the webtoon reader. | ||||
|      */ | ||||
|     private fun initWebtoonPreferences() { | ||||
|         binding.pagerPrefsGroup.root.isVisible = false | ||||
|         binding.webtoonPrefsGroup.root.isVisible = true | ||||
|  | ||||
|         binding.webtoonPrefsGroup.tappingPrefsGroup.isVisible = preferences.readWithTapping().get() | ||||
|  | ||||
|         binding.webtoonPrefsGroup.tappingInverted.bindToPreference(preferences.webtoonNavInverted()) | ||||
|  | ||||
|         binding.webtoonPrefsGroup.webtoonNav.bindToPreference(preferences.navigationModeWebtoon()) | ||||
|         binding.webtoonPrefsGroup.cropBordersWebtoon.bindToPreference(preferences.cropBordersWebtoon()) | ||||
|         binding.webtoonPrefsGroup.webtoonSidePadding.bindToIntPreference(preferences.webtoonSidePadding(), R.array.webtoon_side_padding_values) | ||||
|  | ||||
|         // Makes so that dual page invert gets hidden away when turning of dual page split | ||||
|         binding.dualPageSplit.bindToPreference(preferences.dualPageSplitWebtoon()) | ||||
|         preferences.dualPageSplitWebtoon() | ||||
|             .asImmediateFlow { binding.dualPageInvert.isVisible = it } | ||||
|             .launchIn((context as ReaderActivity).lifecycleScope) | ||||
|         binding.dualPageInvert.bindToPreference(preferences.dualPageInvertWebtoon()) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Binds a checkbox or switch view with a boolean preference. | ||||
|      */ | ||||
|     private fun CompoundButton.bindToPreference(pref: Preference<Boolean>) { | ||||
|         isChecked = pref.get() | ||||
|         setOnCheckedChangeListener { _, isChecked -> pref.set(isChecked) } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Binds a spinner to an int preference with an optional offset for the value. | ||||
|      */ | ||||
|     private fun Spinner.bindToPreference(pref: Preference<Int>, offset: Int = 0) { | ||||
|         onItemSelectedListener = IgnoreFirstSpinnerListener { position -> | ||||
|             pref.set(position + offset) | ||||
|         } | ||||
|         setSelection(pref.get() - offset, false) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Binds a spinner to an enum preference. | ||||
|      */ | ||||
|     private inline fun <reified T : Enum<T>> Spinner.bindToPreference(pref: Preference<T>) { | ||||
|         val enumConstants = T::class.java.enumConstants | ||||
|  | ||||
|         onItemSelectedListener = IgnoreFirstSpinnerListener { position -> | ||||
|             enumConstants?.get(position)?.let { pref.set(it) } | ||||
|         } | ||||
|  | ||||
|         enumConstants?.indexOf(pref.get())?.let { setSelection(it, false) } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Binds a spinner to an int preference. The position of the spinner item must | ||||
|      * correlate with the [intValues] resource item (in arrays.xml), which is a <string-array> | ||||
|      * of int values that will be parsed here and applied to the preference. | ||||
|      */ | ||||
|     private fun Spinner.bindToIntPreference(pref: Preference<Int>, @ArrayRes intValuesResource: Int) { | ||||
|         val intValues = resources.getStringArray(intValuesResource).map { it.toIntOrNull() } | ||||
|         onItemSelectedListener = IgnoreFirstSpinnerListener { position -> | ||||
|             pref.set(intValues[position]!!) | ||||
|         } | ||||
|         setSelection(intValues.indexOf(pref.get()), false) | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,106 @@ | ||||
| package eu.kanade.tachiyomi.ui.reader.setting | ||||
|  | ||||
| import android.content.Context | ||||
| import android.util.AttributeSet | ||||
| import android.view.LayoutInflater | ||||
| import androidx.core.view.isVisible | ||||
| import androidx.core.widget.NestedScrollView | ||||
| import androidx.lifecycle.lifecycleScope | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.data.preference.asImmediateFlow | ||||
| import eu.kanade.tachiyomi.databinding.ReaderReadingModeSettingsBinding | ||||
| import eu.kanade.tachiyomi.ui.reader.ReaderActivity | ||||
| import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerViewer | ||||
| import eu.kanade.tachiyomi.ui.reader.viewer.webtoon.WebtoonViewer | ||||
| import eu.kanade.tachiyomi.util.preference.bindToIntPreference | ||||
| import eu.kanade.tachiyomi.util.preference.bindToPreference | ||||
| import eu.kanade.tachiyomi.widget.IgnoreFirstSpinnerListener | ||||
| import kotlinx.coroutines.flow.launchIn | ||||
| import uy.kohesive.injekt.injectLazy | ||||
|  | ||||
| /** | ||||
|  * Sheet to show reader and viewer preferences. | ||||
|  */ | ||||
| class ReaderReadingModeSettings @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : | ||||
|     NestedScrollView(context, attrs) { | ||||
|  | ||||
|     private val preferences: PreferencesHelper by injectLazy() | ||||
|  | ||||
|     private val binding = ReaderReadingModeSettingsBinding.inflate(LayoutInflater.from(context), this, false) | ||||
|  | ||||
|     init { | ||||
|         addView(binding.root) | ||||
|  | ||||
|         initGeneralPreferences() | ||||
|  | ||||
|         when ((context as ReaderActivity).viewer) { | ||||
|             is PagerViewer -> initPagerPreferences() | ||||
|             is WebtoonViewer -> initWebtoonPreferences() | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Init general reader preferences. | ||||
|      */ | ||||
|     private fun initGeneralPreferences() { | ||||
|         binding.viewer.onItemSelectedListener = IgnoreFirstSpinnerListener { position -> | ||||
|             (context as ReaderActivity).presenter.setMangaViewer(position) | ||||
|  | ||||
|             val mangaViewer = (context as ReaderActivity).presenter.getMangaViewer() | ||||
|             if (mangaViewer == ReadingModeType.WEBTOON.prefValue || mangaViewer == ReadingModeType.CONTINUOUS_VERTICAL.prefValue) { | ||||
|                 initWebtoonPreferences() | ||||
|             } else { | ||||
|                 initPagerPreferences() | ||||
|             } | ||||
|         } | ||||
|         binding.viewer.setSelection((context as ReaderActivity).presenter.manga?.viewer ?: 0, false) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Init the preferences for the pager reader. | ||||
|      */ | ||||
|     private fun initPagerPreferences() { | ||||
|         binding.webtoonPrefsGroup.root.isVisible = false | ||||
|         binding.pagerPrefsGroup.root.isVisible = true | ||||
|  | ||||
|         binding.pagerPrefsGroup.tappingPrefsGroup.isVisible = preferences.readWithTapping().get() | ||||
|  | ||||
|         binding.pagerPrefsGroup.tappingInverted.bindToPreference(preferences.pagerNavInverted()) | ||||
|  | ||||
|         binding.pagerPrefsGroup.pagerNav.bindToPreference(preferences.navigationModePager()) | ||||
|         binding.pagerPrefsGroup.scaleType.bindToPreference(preferences.imageScaleType(), 1) | ||||
|         binding.pagerPrefsGroup.zoomStart.bindToPreference(preferences.zoomStart(), 1) | ||||
|         binding.pagerPrefsGroup.cropBorders.bindToPreference(preferences.cropBorders()) | ||||
|  | ||||
|         // Makes so that dual page invert gets hidden away when turning of dual page split | ||||
|         binding.pagerPrefsGroup.dualPageSplit.bindToPreference(preferences.dualPageSplitPaged()) | ||||
|         preferences.dualPageSplitPaged() | ||||
|             .asImmediateFlow { binding.pagerPrefsGroup.dualPageInvert.isVisible = it } | ||||
|             .launchIn((context as ReaderActivity).lifecycleScope) | ||||
|         binding.pagerPrefsGroup.dualPageInvert.bindToPreference(preferences.dualPageInvertPaged()) | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Init the preferences for the webtoon reader. | ||||
|      */ | ||||
|     private fun initWebtoonPreferences() { | ||||
|         binding.pagerPrefsGroup.root.isVisible = false | ||||
|         binding.webtoonPrefsGroup.root.isVisible = true | ||||
|  | ||||
|         binding.webtoonPrefsGroup.tappingPrefsGroup.isVisible = preferences.readWithTapping().get() | ||||
|  | ||||
|         binding.webtoonPrefsGroup.tappingInverted.bindToPreference(preferences.webtoonNavInverted()) | ||||
|  | ||||
|         binding.webtoonPrefsGroup.webtoonNav.bindToPreference(preferences.navigationModeWebtoon()) | ||||
|         binding.webtoonPrefsGroup.cropBordersWebtoon.bindToPreference(preferences.cropBordersWebtoon()) | ||||
|         binding.webtoonPrefsGroup.webtoonSidePadding.bindToIntPreference(preferences.webtoonSidePadding(), R.array.webtoon_side_padding_values) | ||||
|  | ||||
|         // Makes so that dual page invert gets hidden away when turning of dual page split | ||||
|         binding.webtoonPrefsGroup.dualPageSplit.bindToPreference(preferences.dualPageSplitWebtoon()) | ||||
|         preferences.dualPageSplitWebtoon() | ||||
|             .asImmediateFlow { binding.webtoonPrefsGroup.dualPageInvert.isVisible = it } | ||||
|             .launchIn((context as ReaderActivity).lifecycleScope) | ||||
|         binding.webtoonPrefsGroup.dualPageInvert.bindToPreference(preferences.dualPageInvertWebtoon()) | ||||
|     } | ||||
| } | ||||
| @@ -8,16 +8,18 @@ import eu.kanade.tachiyomi.widget.sheet.TabbedBottomSheetDialog | ||||
|  | ||||
| class ReaderSettingsSheet(private val activity: ReaderActivity) : TabbedBottomSheetDialog(activity) { | ||||
|  | ||||
|     private val readingModeSettings = ReaderReadingModeSettings(activity) | ||||
|     private val generalSettings = ReaderGeneralSettings(activity) | ||||
|     private val colorFilterSettings = ReaderColorFilterSettings(activity) | ||||
|  | ||||
|     private val sheetBackgroundDim = window?.attributes?.dimAmount ?: 0.25f | ||||
|  | ||||
|     init { | ||||
|         val filterTabIndex = getTabViews().indexOf(colorFilterSettings) | ||||
|         binding.tabs.addOnTabSelectedListener(object : SimpleTabSelectedListener() { | ||||
|             // Remove dimmed backdrop so color filter changes can be previewed | ||||
|             override fun onTabSelected(tab: TabLayout.Tab?) { | ||||
|                 val isFilterTab = tab?.position == 1 | ||||
|                 val isFilterTab = tab?.position == filterTabIndex | ||||
|                 window?.setDimAmount(if (isFilterTab) 0f else sheetBackgroundDim) | ||||
|                 activity.setMenuVisibility(!isFilterTab) | ||||
|             } | ||||
| @@ -25,12 +27,14 @@ class ReaderSettingsSheet(private val activity: ReaderActivity) : TabbedBottomSh | ||||
|     } | ||||
|  | ||||
|     override fun getTabViews() = listOf( | ||||
|         readingModeSettings, | ||||
|         generalSettings, | ||||
|         colorFilterSettings, | ||||
|     ) | ||||
|  | ||||
|     override fun getTabTitles() = listOf( | ||||
|         R.string.action_settings, | ||||
|         R.string.pref_category_reading_mode, | ||||
|         R.string.pref_category_general, | ||||
|         R.string.custom_filter, | ||||
|     ) | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,51 @@ | ||||
| package eu.kanade.tachiyomi.util.preference | ||||
|  | ||||
| import android.widget.CompoundButton | ||||
| import android.widget.Spinner | ||||
| import androidx.annotation.ArrayRes | ||||
| import com.tfcporciuncula.flow.Preference | ||||
| import eu.kanade.tachiyomi.widget.IgnoreFirstSpinnerListener | ||||
|  | ||||
| /** | ||||
|  * Binds a checkbox or switch view with a boolean preference. | ||||
|  */ | ||||
| fun CompoundButton.bindToPreference(pref: Preference<Boolean>) { | ||||
|     isChecked = pref.get() | ||||
|     setOnCheckedChangeListener { _, isChecked -> pref.set(isChecked) } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Binds a spinner to an int preference with an optional offset for the value. | ||||
|  */ | ||||
| fun Spinner.bindToPreference(pref: Preference<Int>, offset: Int = 0) { | ||||
|     onItemSelectedListener = IgnoreFirstSpinnerListener { position -> | ||||
|         pref.set(position + offset) | ||||
|     } | ||||
|     setSelection(pref.get() - offset, false) | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Binds a spinner to an enum preference. | ||||
|  */ | ||||
| inline fun <reified T : Enum<T>> Spinner.bindToPreference(pref: Preference<T>) { | ||||
|     val enumConstants = T::class.java.enumConstants | ||||
|  | ||||
|     onItemSelectedListener = IgnoreFirstSpinnerListener { position -> | ||||
|         enumConstants?.get(position)?.let { pref.set(it) } | ||||
|     } | ||||
|  | ||||
|     enumConstants?.indexOf(pref.get())?.let { setSelection(it, false) } | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Binds a spinner to an int preference. The position of the spinner item must | ||||
|  * correlate with the [intValues] resource item (in arrays.xml), which is a <string-array> | ||||
|  * of int values that will be parsed here and applied to the preference. | ||||
|  */ | ||||
| fun Spinner.bindToIntPreference(pref: Preference<Int>, @ArrayRes intValuesResource: Int) { | ||||
|     val intValues = resources.getStringArray(intValuesResource).map { it.toIntOrNull() } | ||||
|     onItemSelectedListener = IgnoreFirstSpinnerListener { position -> | ||||
|         pref.set(intValues[position]!!) | ||||
|     } | ||||
|     setSelection(intValues.indexOf(pref.get()), false) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user