Moved "Show all categories" to display settings

Alos fixing some small library visual bugs
This commit is contained in:
Jay 2020-05-11 23:51:48 -04:00
parent f091a9bb51
commit f1acafc89f
6 changed files with 60 additions and 89 deletions

View File

@ -83,6 +83,9 @@ class DisplayBottomSheet(private val controller: LibraryController) : BottomShee
controller.reattachAdapter() controller.reattachAdapter()
if (sheetBehavior.isCollapsed()) dismiss() if (sheetBehavior.isCollapsed()) dismiss()
} }
show_all.bindToPreference(preferences.showAllCategories()) {
controller.presenter.getLibrary()
}
uniform_grid.bindToPreference(preferences.uniformGrid()) { uniform_grid.bindToPreference(preferences.uniformGrid()) {
controller.reattachAdapter() controller.reattachAdapter()
} }
@ -116,6 +119,17 @@ class DisplayBottomSheet(private val controller: LibraryController) : BottomShee
} }
} }
/**
* Binds a checkbox or switch view with a boolean preference.
*/
private fun CompoundButton.bindToPreference(pref: com.tfcporciuncula.flow.Preference<Boolean>, block: (() -> Unit)? = null) {
isChecked = pref.get()
setOnCheckedChangeListener { _, isChecked ->
pref.set(isChecked)
block?.invoke()
}
}
/** /**
* Binds a radio group with a int preference. * Binds a radio group with a int preference.
*/ */

View File

@ -242,7 +242,7 @@ class LibraryController(
return if (presenter.showAllCategories) { return if (presenter.showAllCategories) {
!recycler.canScrollVertically(-1) !recycler.canScrollVertically(-1)
} else { } else {
getVisibleHeader()?.category?.id == presenter.categories.firstOrNull()?.id getVisibleHeader()?.category?.order == presenter.categories.minBy { it.order }?.order
} }
} }
@ -250,7 +250,7 @@ class LibraryController(
return if (presenter.showAllCategories) { return if (presenter.showAllCategories) {
!recycler.canScrollVertically(1) !recycler.canScrollVertically(1)
} else { } else {
getVisibleHeader()?.category?.id == presenter.categories.lastOrNull()?.id getVisibleHeader()?.category?.order == presenter.categories.maxBy { it.order }?.order
} }
} }
@ -775,6 +775,7 @@ class LibraryController(
private fun onRefresh() { private fun onRefresh() {
activity?.invalidateOptionsMenu() activity?.invalidateOptionsMenu()
showCategories(false)
presenter.getLibrary() presenter.getLibrary()
destroyActionModeIfNeeded() destroyActionModeIfNeeded()
} }

View File

@ -33,16 +33,10 @@ class LibraryGestureDetector(private val controller: LibraryController) : Gestur
controller.filter_bottom_sheet.sheetBehavior?.hide() controller.filter_bottom_sheet.sheetBehavior?.hide()
} }
result = true result = true
} else if (abs(diffX) >= abs(diffY) && abs(diffX) > MainActivity.SWIPE_THRESHOLD && abs( } else if (abs(diffX) >= abs(diffY) && abs(diffX) > MainActivity.SWIPE_THRESHOLD * 3 && abs(
velocityX velocityX
) > MainActivity.SWIPE_VELOCITY_THRESHOLD ) > MainActivity.SWIPE_VELOCITY_THRESHOLD
) { ) {
// val transition = androidx.transition.AutoTransition()
// transition.duration = 150
androidx.transition.TransitionManager.beginDelayedTransition(
controller.library_layout
)
if (diffX <= 0) { if (diffX <= 0) {
controller.category_hopper_frame.updateLayoutParams<CoordinatorLayout.LayoutParams> { controller.category_hopper_frame.updateLayoutParams<CoordinatorLayout.LayoutParams> {
anchorGravity = anchorGravity =

View File

@ -1,41 +1,24 @@
package eu.kanade.tachiyomi.ui.library.category package eu.kanade.tachiyomi.ui.library.category
import android.view.View import android.view.View
import android.widget.CheckBox
import android.widget.TextView import android.widget.TextView
import com.mikepenz.fastadapter.FastAdapter import com.mikepenz.fastadapter.FastAdapter
import com.mikepenz.fastadapter.items.AbstractItem import com.mikepenz.fastadapter.items.AbstractItem
import com.tfcporciuncula.flow.Preference
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Category import eu.kanade.tachiyomi.data.database.models.Category
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
class CategoryItem(val category: Category) : AbstractItem<FastAdapter.ViewHolder<CategoryItem>>() { class CategoryItem(val category: Category) : AbstractItem<FastAdapter.ViewHolder<CategoryItem>>() {
/** defines the type defining this item. must be unique. preferably an id */ /** defines the type defining this item. must be unique. preferably an id */
override val type: Int = if (category.id == -1) { override val type: Int = R.id.category_text
R.id.auto_checkbox
} else {
R.id.category_text
}
/** defines the layout which will be used for this item in the list */ /** defines the layout which will be used for this item in the list */
override val layoutRes: Int = if (category.id == -1) { override val layoutRes: Int = R.layout.catergory_text_view
R.layout.auto_ext_checkbox
} else {
R.layout.catergory_text_view
}
override var identifier = category.id?.toLong() ?: -1L override var identifier = category.id?.toLong() ?: -1L
override fun getViewHolder(v: View): FastAdapter.ViewHolder<CategoryItem> { override fun getViewHolder(v: View): FastAdapter.ViewHolder<CategoryItem> {
return if (category.id == -1) { return ViewHolder(v)
ShowAllViewHolder(Injekt.get<PreferencesHelper>().showAllCategories(), v)
} else {
ViewHolder(v)
}
} }
class ViewHolder(view: View) : FastAdapter.ViewHolder<CategoryItem>(view) { class ViewHolder(view: View) : FastAdapter.ViewHolder<CategoryItem>(view) {
@ -49,19 +32,4 @@ class CategoryItem(val category: Category) : AbstractItem<FastAdapter.ViewHolder
categoryTitle.text = null categoryTitle.text = null
} }
} }
class ShowAllViewHolder(val pref: Preference<Boolean>, view: View) :
FastAdapter.ViewHolder<CategoryItem>(view) {
val checkbox: CheckBox? = view.findViewById(R.id.auto_checkbox)
init {
checkbox?.setText(R.string.show_all_categories)
}
override fun bindView(item: CategoryItem, payloads: List<Any>) {
checkbox?.isChecked = pref.get()
}
override fun unbindView(item: CategoryItem) {}
}
} }

View File

@ -2,18 +2,14 @@ package eu.kanade.tachiyomi.ui.library.category
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.CheckBox
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.mikepenz.fastadapter.FastAdapter import com.mikepenz.fastadapter.FastAdapter
import com.mikepenz.fastadapter.adapters.ItemAdapter import com.mikepenz.fastadapter.adapters.ItemAdapter
import com.mikepenz.fastadapter.listeners.CustomEventHook
import com.mikepenz.fastadapter.listeners.OnBindViewHolderListenerImpl import com.mikepenz.fastadapter.listeners.OnBindViewHolderListenerImpl
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Category import eu.kanade.tachiyomi.data.database.models.Category
import eu.kanade.tachiyomi.data.database.models.CategoryImpl
import eu.kanade.tachiyomi.util.view.marginBottom import eu.kanade.tachiyomi.util.view.marginBottom
class CategoryRecyclerView @JvmOverloads constructor( class CategoryRecyclerView @JvmOverloads constructor(
@ -27,9 +23,6 @@ class CategoryRecyclerView @JvmOverloads constructor(
var onShowAllClicked: (Boolean) -> Unit = { } var onShowAllClicked: (Boolean) -> Unit = { }
private val itemAdapter = ItemAdapter<CategoryItem>() private val itemAdapter = ItemAdapter<CategoryItem>()
var selectedCategory: Int = 0 var selectedCategory: Int = 0
val headerItem = CategoryItem(CategoryImpl().apply {
id = -1
})
init { init {
fastAdapter = FastAdapter.with(itemAdapter) fastAdapter = FastAdapter.with(itemAdapter)
@ -38,7 +31,7 @@ class CategoryRecyclerView @JvmOverloads constructor(
} }
fun setCategories(items: List<Category>) { fun setCategories(items: List<Category>) {
itemAdapter.set(listOf(headerItem) + items.map(::CategoryItem)) itemAdapter.set(items.map(::CategoryItem))
fastAdapter.onBindViewHolderListener = fastAdapter.onBindViewHolderListener =
(object : OnBindViewHolderListenerImpl<CategoryItem>() { (object : OnBindViewHolderListenerImpl<CategoryItem>() {
override fun onBindViewHolder( override fun onBindViewHolder(
@ -48,7 +41,7 @@ class CategoryRecyclerView @JvmOverloads constructor(
) { ) {
super.onBindViewHolder(viewHolder, position, payloads) super.onBindViewHolder(viewHolder, position, payloads)
(viewHolder as? CategoryItem.ViewHolder)?.categoryTitle?.isSelected = (viewHolder as? CategoryItem.ViewHolder)?.categoryTitle?.isSelected =
selectedCategory + 1 == position selectedCategory == position
} }
}) })
fastAdapter.onClickListener = { _, _, item, _ -> fastAdapter.onClickListener = { _, _, item, _ ->
@ -56,28 +49,13 @@ class CategoryRecyclerView @JvmOverloads constructor(
onCategoryClicked(item.category.order) onCategoryClicked(item.category.order)
true true
} }
fastAdapter.addEventHook(object : CustomEventHook<CategoryItem>() {
override fun onBind(viewHolder: ViewHolder): View? {
return if (viewHolder is CategoryItem.ShowAllViewHolder) {
viewHolder.checkbox
} else {
null
}
}
override fun attachEvent(view: View, viewHolder: ViewHolder) {
(view as? CheckBox)?.setOnCheckedChangeListener { _, isChecked ->
onShowAllClicked(isChecked)
}
}
})
} }
fun setCategories(selected: Int) { fun setCategories(selected: Int) {
selectedCategory = selected selectedCategory = selected
for (i in 0..manager.itemCount) { for (i in 0..manager.itemCount) {
(findViewHolderForAdapterPosition(i) as? CategoryItem.ViewHolder)?.categoryTitle?.isSelected = (findViewHolderForAdapterPosition(i) as? CategoryItem.ViewHolder)?.categoryTitle?.isSelected =
selectedCategory + 1 == i selectedCategory == i
} }
} }

View File

@ -3,8 +3,8 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/display_bottom_sheet" android:id="@+id/display_bottom_sheet"
android:layout_width="match_parent" android:layout_width="match_parent"
android:background="@drawable/bottom_sheet_rounded_background" android:layout_height="wrap_content"
android:layout_height="wrap_content"> android:background="@drawable/bottom_sheet_rounded_background">
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:id="@+id/settings_scroll_view" android:id="@+id/settings_scroll_view"
@ -29,6 +29,11 @@
android:paddingEnd="12dp" android:paddingEnd="12dp"
android:text="@string/display_as" /> android:text="@string/display_as" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RadioGroup <RadioGroup
android:id="@+id/display_group" android:id="@+id/display_group"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -55,6 +60,16 @@
android:text="@string/comfortable_grid" /> android:text="@string/comfortable_grid" />
</RadioGroup> </RadioGroup>
<com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/show_all"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp"
android:text="@string/show_all_categories" />
</LinearLayout>
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
style="@style/TextAppearance.MaterialComponents.Headline6" style="@style/TextAppearance.MaterialComponents.Headline6"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -95,6 +110,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="12dp" android:layout_marginStart="12dp"
android:text="@string/large" /> android:text="@string/large" />
<com.google.android.material.radiobutton.MaterialRadioButton <com.google.android.material.radiobutton.MaterialRadioButton
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"