From 5c3242c511db655f7274166c6f2fc22a9c69df19 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sat, 29 Feb 2020 13:43:22 +0200 Subject: [PATCH] Grid size preference --- .../kotatsu/core/prefs/AppSettings.kt | 6 ++++++ .../kotatsu/ui/main/list/MangaListFragment.kt | 1 + .../ui/settings/AppearanceSettingsFragment.kt | 11 +++++++++- .../org/koitharu/kotatsu/utils/UiUtils.kt | 12 ++++++++++- .../delegates/prefs/IntPreferenceDelegate.kt | 20 +++++++++++++++++++ app/src/main/res/values/constants.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_appearance.xml | 14 ++++++++++++- 8 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/IntPreferenceDelegate.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 7ea5f3ada..071526599 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -7,6 +7,7 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.preference.PreferenceManager import org.koitharu.kotatsu.R import org.koitharu.kotatsu.utils.delegates.prefs.EnumPreferenceDelegate +import org.koitharu.kotatsu.utils.delegates.prefs.IntPreferenceDelegate import org.koitharu.kotatsu.utils.delegates.prefs.NullableStringPreferenceDelegate import org.koitharu.kotatsu.utils.delegates.prefs.StringIntPreferenceDelegate @@ -29,6 +30,11 @@ class AppSettings private constructor(resources: Resources, private val prefs: S AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM ) + val gridSize by IntPreferenceDelegate( + resources.getString(R.string.key_grid_size), + 100 + ) + private var sourcesOrderStr by NullableStringPreferenceDelegate(resources.getString(R.string.key_sources_order)) var sourcesOrder: List diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListFragment.kt index f5a7f239d..b0d248a41 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/list/MangaListFragment.kt @@ -175,6 +175,7 @@ abstract class MangaListFragment : BaseFragment(R.layout.fragment_list), Mang override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { when (key) { getString(R.string.key_list_mode) -> initListMode(settings.listMode) + getString(R.string.key_grid_size) -> UiUtils.SpanCountResolver.update(recyclerView) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt index 3db873c75..6d8ccdb3a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt @@ -7,6 +7,7 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.collection.arrayMapOf import androidx.preference.ListPreference import androidx.preference.Preference +import androidx.preference.SeekBarPreference import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.prefs.ListMode import org.koitharu.kotatsu.ui.common.BasePreferenceFragment @@ -20,7 +21,15 @@ class AppearanceSettingsFragment : BasePreferenceFragment(R.string.appearance), findPreference(R.string.key_list_mode)?.summary = listModes[settings.listMode]?.let(::getString) - findPreference(R.string.key_theme)?.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance() + findPreference(R.string.key_theme)?.summaryProvider = + ListPreference.SimpleSummaryProvider.getInstance() + findPreference(R.string.key_grid_size)?.run { + summary = "%d%%".format(value) + setOnPreferenceChangeListener { preference, newValue -> + preference.summary = "%d%%".format(newValue) + true + } + } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/UiUtils.kt b/app/src/main/java/org/koitharu/kotatsu/utils/UiUtils.kt index 1acec2160..49ad21f02 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/UiUtils.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/UiUtils.kt @@ -7,6 +7,8 @@ import androidx.annotation.ColorInt import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.utils.ext.measureWidth import kotlin.math.abs import kotlin.math.roundToInt @@ -24,7 +26,8 @@ object UiUtils { @JvmStatic fun resolveGridSpanCount(context: Context, width: Int = 0): Int { - val cellWidth = context.resources.getDimensionPixelSize(R.dimen.preferred_grid_width) + val scaleFactor = AppSettings(context).gridSize / 100f + val cellWidth = context.resources.getDimension(R.dimen.preferred_grid_width) * scaleFactor val screenWidth = (if (width <= 0) { context.resources.displayMetrics.widthPixels } else width).toDouble() @@ -49,5 +52,12 @@ object UiUtils { resolveGridSpanCount(rv.context, width) } + fun update(rv: RecyclerView) { + val width = rv.measureWidth() + if (width > 0) { + (rv.layoutManager as? GridLayoutManager)?.spanCount = + resolveGridSpanCount(rv.context, width) + } + } } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/IntPreferenceDelegate.kt b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/IntPreferenceDelegate.kt new file mode 100644 index 000000000..315292e10 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/utils/delegates/prefs/IntPreferenceDelegate.kt @@ -0,0 +1,20 @@ +package org.koitharu.kotatsu.utils.delegates.prefs + +import android.content.SharedPreferences +import androidx.core.content.edit +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + +class IntPreferenceDelegate(private val key: String, private val defValue: Int) : + ReadWriteProperty { + + override fun getValue(thisRef: SharedPreferences, property: KProperty<*>): Int { + return thisRef.getInt(key, defValue) ?: defValue + } + + override fun setValue(thisRef: SharedPreferences, property: KProperty<*>, value: Int) { + thisRef.edit { + putInt(key, value) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/values/constants.xml b/app/src/main/res/values/constants.xml index 2961171d3..7137d4688 100644 --- a/app/src/main/res/values/constants.xml +++ b/app/src/main/res/values/constants.xml @@ -4,6 +4,7 @@ theme sources_order pages_cache_clear + grid_size -1 1 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 61f42cac6..55246fe2d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -84,4 +84,5 @@ Webtoon Read mode Put items below to disable it + Grid size \ No newline at end of file diff --git a/app/src/main/res/xml/pref_appearance.xml b/app/src/main/res/xml/pref_appearance.xml index 407e22e52..bf94ba89f 100644 --- a/app/src/main/res/xml/pref_appearance.xml +++ b/app/src/main/res/xml/pref_appearance.xml @@ -9,13 +9,25 @@ android:entryValues="@array/values_theme" android:key="@string/key_theme" android:title="@string/theme" + app:allowDividerBelow="true" app:iconSpaceReserved="false" /> + + \ No newline at end of file