|
@@ -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.
|
|
|
*/
|