mirror of
https://github.com/mihonapp/mihon.git
synced 2025-11-13 20:48:56 +01:00
ChaptersSettingsSheet: Single source of truth and use new manga class (#7342)
Currently breaks initial settings state until the source of truth is properly updated.
This commit is contained in:
@@ -305,11 +305,7 @@ class MangaController :
|
||||
}
|
||||
.launchIn(viewScope)
|
||||
|
||||
settingsSheet = ChaptersSettingsSheet(router, presenter) { group ->
|
||||
if (group is ChaptersSettingsSheet.Filter.FilterGroup) {
|
||||
updateFilterIconState()
|
||||
}
|
||||
}
|
||||
settingsSheet = ChaptersSettingsSheet(router, presenter)
|
||||
|
||||
trackSheet = TrackSheet(this, manga!!, (activity as MainActivity).supportFragmentManager)
|
||||
|
||||
@@ -873,6 +869,7 @@ class MangaController :
|
||||
}
|
||||
|
||||
updateFabVisibility()
|
||||
updateFilterIconState()
|
||||
}
|
||||
|
||||
private fun fetchChaptersFromSource(manualFetch: Boolean = false) {
|
||||
|
||||
@@ -6,35 +6,51 @@ import android.util.AttributeSet
|
||||
import android.view.View
|
||||
import androidx.core.view.isVisible
|
||||
import com.bluelinelabs.conductor.Router
|
||||
import eu.kanade.domain.manga.model.Manga
|
||||
import eu.kanade.domain.manga.model.toTriStateGroupState
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||
import eu.kanade.tachiyomi.data.database.models.toDomainManga
|
||||
import eu.kanade.tachiyomi.ui.manga.MangaPresenter
|
||||
import eu.kanade.tachiyomi.util.view.popupMenu
|
||||
import eu.kanade.tachiyomi.widget.ExtendedNavigationView
|
||||
import eu.kanade.tachiyomi.widget.ExtendedNavigationView.Item.TriStateGroup.State
|
||||
import eu.kanade.tachiyomi.widget.sheet.TabbedBottomSheetDialog
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.MainScope
|
||||
import kotlinx.coroutines.cancel
|
||||
|
||||
class ChaptersSettingsSheet(
|
||||
private val router: Router,
|
||||
private val presenter: MangaPresenter,
|
||||
private val onGroupClickListener: (ExtendedNavigationView.Group) -> Unit,
|
||||
) : TabbedBottomSheetDialog(router.activity!!) {
|
||||
|
||||
val filters = Filter(router.activity!!)
|
||||
private val sort = Sort(router.activity!!)
|
||||
private val display = Display(router.activity!!)
|
||||
private lateinit var scope: CoroutineScope
|
||||
|
||||
private var manga: Manga? = null
|
||||
|
||||
val filters = Filter(context)
|
||||
private val sort = Sort(context)
|
||||
private val display = Display(context)
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
filters.onGroupClicked = onGroupClickListener
|
||||
sort.onGroupClicked = onGroupClickListener
|
||||
display.onGroupClicked = onGroupClickListener
|
||||
|
||||
binding.menu.isVisible = true
|
||||
binding.menu.setOnClickListener { it.post { showPopupMenu(it) } }
|
||||
}
|
||||
|
||||
override fun onAttachedToWindow() {
|
||||
super.onAttachedToWindow()
|
||||
scope = MainScope()
|
||||
// TODO: Listen to changes
|
||||
updateManga()
|
||||
}
|
||||
|
||||
override fun onDetachedFromWindow() {
|
||||
super.onDetachedFromWindow()
|
||||
scope.cancel()
|
||||
}
|
||||
|
||||
override fun getTabViews(): List<View> = listOf(
|
||||
filters,
|
||||
sort,
|
||||
@@ -47,6 +63,10 @@ class ChaptersSettingsSheet(
|
||||
R.string.action_display,
|
||||
)
|
||||
|
||||
private fun updateManga() {
|
||||
manga = presenter.manga.toDomainManga()
|
||||
}
|
||||
|
||||
private fun showPopupMenu(view: View) {
|
||||
view.popupMenu(
|
||||
menuRes = R.menu.default_chapter_filter,
|
||||
@@ -79,6 +99,10 @@ class ChaptersSettingsSheet(
|
||||
return filterGroup.items.any { it.state != State.IGNORE.value }
|
||||
}
|
||||
|
||||
override fun updateView() {
|
||||
filterGroup.updateModels()
|
||||
}
|
||||
|
||||
inner class FilterGroup : Group {
|
||||
|
||||
private val downloaded = Item.TriStateGroup(R.string.action_filter_downloaded, this)
|
||||
@@ -90,14 +114,20 @@ class ChaptersSettingsSheet(
|
||||
override val footer: Item? = null
|
||||
|
||||
override fun initModels() {
|
||||
if (presenter.forceDownloaded()) {
|
||||
val manga = manga ?: return
|
||||
if (manga.forceDownloaded()) {
|
||||
downloaded.state = State.INCLUDE.value
|
||||
downloaded.enabled = false
|
||||
} else {
|
||||
downloaded.state = presenter.onlyDownloaded().value
|
||||
downloaded.state = manga.downloadedFilter.toTriStateGroupState().value
|
||||
}
|
||||
unread.state = presenter.onlyUnread().value
|
||||
bookmarked.state = presenter.onlyBookmarked().value
|
||||
unread.state = manga.unreadFilter.toTriStateGroupState().value
|
||||
bookmarked.state = manga.bookmarkedFilter.toTriStateGroupState().value
|
||||
}
|
||||
|
||||
fun updateModels() {
|
||||
initModels()
|
||||
adapter.notifyItemRangeChanged(0, 3)
|
||||
}
|
||||
|
||||
override fun onItemClicked(item: Item) {
|
||||
@@ -108,7 +138,6 @@ class ChaptersSettingsSheet(
|
||||
State.EXCLUDE.value -> State.IGNORE
|
||||
else -> throw Exception("Unknown State")
|
||||
}
|
||||
item.state = newState.value
|
||||
when (item) {
|
||||
downloaded -> presenter.setDownloadedFilter(newState)
|
||||
unread -> presenter.setUnreadFilter(newState)
|
||||
@@ -116,8 +145,9 @@ class ChaptersSettingsSheet(
|
||||
else -> {}
|
||||
}
|
||||
|
||||
initModels()
|
||||
adapter.notifyItemChanged(items.indexOf(item), item)
|
||||
// TODO: Remove
|
||||
updateManga()
|
||||
updateView()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -128,8 +158,14 @@ class ChaptersSettingsSheet(
|
||||
inner class Sort @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
|
||||
Settings(context, attrs) {
|
||||
|
||||
private val group = SortGroup()
|
||||
|
||||
init {
|
||||
setGroups(listOf(SortGroup()))
|
||||
setGroups(listOf(group))
|
||||
}
|
||||
|
||||
override fun updateView() {
|
||||
group.updateModels()
|
||||
}
|
||||
|
||||
inner class SortGroup : Group {
|
||||
@@ -143,8 +179,9 @@ class ChaptersSettingsSheet(
|
||||
override val footer: Item? = null
|
||||
|
||||
override fun initModels() {
|
||||
val sorting = presenter.manga.sorting
|
||||
val order = if (presenter.manga.sortDescending()) {
|
||||
val manga = manga ?: return
|
||||
val sorting = manga.sorting
|
||||
val order = if (manga.sortDescending()) {
|
||||
Item.MultiSort.SORT_DESC
|
||||
} else {
|
||||
Item.MultiSort.SORT_ASC
|
||||
@@ -158,29 +195,23 @@ class ChaptersSettingsSheet(
|
||||
if (sorting == Manga.CHAPTER_SORTING_UPLOAD_DATE) order else Item.MultiSort.SORT_NONE
|
||||
}
|
||||
|
||||
override fun onItemClicked(item: Item) {
|
||||
items.forEachIndexed { i, multiSort ->
|
||||
multiSort.state = if (multiSort == item) {
|
||||
when (item.state) {
|
||||
Item.MultiSort.SORT_NONE -> Item.MultiSort.SORT_ASC
|
||||
Item.MultiSort.SORT_ASC -> Item.MultiSort.SORT_DESC
|
||||
Item.MultiSort.SORT_DESC -> Item.MultiSort.SORT_ASC
|
||||
else -> throw Exception("Unknown state")
|
||||
}
|
||||
} else {
|
||||
Item.MultiSort.SORT_NONE
|
||||
}
|
||||
adapter.notifyItemChanged(i, multiSort)
|
||||
}
|
||||
fun updateModels() {
|
||||
initModels()
|
||||
adapter.notifyItemRangeChanged(0, 3)
|
||||
}
|
||||
|
||||
override fun onItemClicked(item: Item) {
|
||||
when (item) {
|
||||
source -> presenter.setSorting(Manga.CHAPTER_SORTING_SOURCE)
|
||||
chapterNum -> presenter.setSorting(Manga.CHAPTER_SORTING_NUMBER)
|
||||
uploadDate -> presenter.setSorting(Manga.CHAPTER_SORTING_UPLOAD_DATE)
|
||||
source -> presenter.setSorting(Manga.CHAPTER_SORTING_SOURCE.toInt())
|
||||
chapterNum -> presenter.setSorting(Manga.CHAPTER_SORTING_NUMBER.toInt())
|
||||
uploadDate -> presenter.setSorting(Manga.CHAPTER_SORTING_UPLOAD_DATE.toInt())
|
||||
else -> throw Exception("Unknown sorting")
|
||||
}
|
||||
|
||||
// TODO: Remove
|
||||
presenter.reverseSortOrder()
|
||||
updateManga()
|
||||
updateView()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -191,8 +222,14 @@ class ChaptersSettingsSheet(
|
||||
inner class Display @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
|
||||
Settings(context, attrs) {
|
||||
|
||||
private val group = DisplayGroup()
|
||||
|
||||
init {
|
||||
setGroups(listOf(DisplayGroup()))
|
||||
setGroups(listOf(group))
|
||||
}
|
||||
|
||||
override fun updateView() {
|
||||
group.updateModels()
|
||||
}
|
||||
|
||||
inner class DisplayGroup : Group {
|
||||
@@ -205,25 +242,29 @@ class ChaptersSettingsSheet(
|
||||
override val footer: Item? = null
|
||||
|
||||
override fun initModels() {
|
||||
val mode = presenter.manga.displayMode
|
||||
val mode = manga?.displayMode ?: return
|
||||
displayTitle.checked = mode == Manga.CHAPTER_DISPLAY_NAME
|
||||
displayChapterNum.checked = mode == Manga.CHAPTER_DISPLAY_NUMBER
|
||||
}
|
||||
|
||||
fun updateModels() {
|
||||
initModels()
|
||||
adapter.notifyItemRangeChanged(0, 2)
|
||||
}
|
||||
|
||||
override fun onItemClicked(item: Item) {
|
||||
item as Item.Radio
|
||||
if (item.checked) return
|
||||
|
||||
items.forEachIndexed { index, radio ->
|
||||
radio.checked = item == radio
|
||||
adapter.notifyItemChanged(index, radio)
|
||||
}
|
||||
|
||||
when (item) {
|
||||
displayTitle -> presenter.setDisplayMode(Manga.CHAPTER_DISPLAY_NAME)
|
||||
displayChapterNum -> presenter.setDisplayMode(Manga.CHAPTER_DISPLAY_NUMBER)
|
||||
displayTitle -> presenter.setDisplayMode(Manga.CHAPTER_DISPLAY_NAME.toInt())
|
||||
displayChapterNum -> presenter.setDisplayMode(Manga.CHAPTER_DISPLAY_NUMBER.toInt())
|
||||
else -> throw NotImplementedError("Unknown display mode")
|
||||
}
|
||||
|
||||
// TODO: Remove
|
||||
updateManga()
|
||||
updateView()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -246,6 +287,9 @@ class ChaptersSettingsSheet(
|
||||
addView(recycler)
|
||||
}
|
||||
|
||||
open fun updateView() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adapter of the recycler view.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user