Fix grid size computing
This commit is contained in:
@@ -9,6 +9,7 @@ import androidx.appcompat.widget.PopupMenu
|
|||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
import org.koin.core.parameter.parametersOf
|
import org.koin.core.parameter.parametersOf
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
|
import org.koitharu.kotatsu.base.ui.list.ListSelectionController
|
||||||
import org.koitharu.kotatsu.core.ui.titleRes
|
import org.koitharu.kotatsu.core.ui.titleRes
|
||||||
import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesActivity
|
import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesActivity
|
||||||
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
||||||
@@ -48,26 +49,26 @@ class FavouritesListFragment : MangaListFragment(), PopupMenu.OnMenuItemClickLis
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
|
override fun onCreateActionMode(controller: ListSelectionController, mode: ActionMode, menu: Menu): Boolean {
|
||||||
mode.menuInflater.inflate(R.menu.mode_favourites, menu)
|
mode.menuInflater.inflate(R.menu.mode_favourites, menu)
|
||||||
return super.onCreateActionMode(mode, menu)
|
return super.onCreateActionMode(controller, mode, menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
|
override fun onPrepareActionMode(controller: ListSelectionController, mode: ActionMode, menu: Menu): Boolean {
|
||||||
menu.findItem(R.id.action_save)?.isVisible = selectedItems.none {
|
menu.findItem(R.id.action_save)?.isVisible = selectedItems.none {
|
||||||
it.source == MangaSource.LOCAL
|
it.source == MangaSource.LOCAL
|
||||||
}
|
}
|
||||||
return super.onPrepareActionMode(mode, menu)
|
return super.onPrepareActionMode(controller, mode, menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
|
override fun onActionItemClicked(controller: ListSelectionController, mode: ActionMode, item: MenuItem): Boolean {
|
||||||
return when (item.itemId) {
|
return when (item.itemId) {
|
||||||
R.id.action_remove -> {
|
R.id.action_remove -> {
|
||||||
viewModel.removeFromFavourites(selectedItemsIds)
|
viewModel.removeFromFavourites(selectedItemsIds)
|
||||||
mode.finish()
|
mode.finish()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
else -> super.onActionItemClicked(mode, item)
|
else -> super.onActionItemClicked(controller, mode, item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import androidx.appcompat.view.ActionMode
|
|||||||
import org.koin.android.ext.android.get
|
import org.koin.android.ext.android.get
|
||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
|
import org.koitharu.kotatsu.base.ui.list.ListSelectionController
|
||||||
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
import org.koitharu.kotatsu.utils.ext.addMenuProvider
|
import org.koitharu.kotatsu.utils.ext.addMenuProvider
|
||||||
@@ -27,26 +28,26 @@ class HistoryListFragment : MangaListFragment() {
|
|||||||
|
|
||||||
override fun onScrolledToEnd() = Unit
|
override fun onScrolledToEnd() = Unit
|
||||||
|
|
||||||
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
|
override fun onCreateActionMode(controller: ListSelectionController, mode: ActionMode, menu: Menu): Boolean {
|
||||||
mode.menuInflater.inflate(R.menu.mode_history, menu)
|
mode.menuInflater.inflate(R.menu.mode_history, menu)
|
||||||
return super.onCreateActionMode(mode, menu)
|
return super.onCreateActionMode(controller, mode, menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
|
override fun onPrepareActionMode(controller: ListSelectionController, mode: ActionMode, menu: Menu): Boolean {
|
||||||
menu.findItem(R.id.action_save)?.isVisible = selectedItems.none {
|
menu.findItem(R.id.action_save)?.isVisible = selectedItems.none {
|
||||||
it.source == MangaSource.LOCAL
|
it.source == MangaSource.LOCAL
|
||||||
}
|
}
|
||||||
return super.onPrepareActionMode(mode, menu)
|
return super.onPrepareActionMode(controller, mode, menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
|
override fun onActionItemClicked(controller: ListSelectionController, mode: ActionMode, item: MenuItem): Boolean {
|
||||||
return when (item.itemId) {
|
return when (item.itemId) {
|
||||||
R.id.action_remove -> {
|
R.id.action_remove -> {
|
||||||
viewModel.removeFromHistory(selectedItemsIds)
|
viewModel.removeFromHistory(selectedItemsIds)
|
||||||
mode.finish()
|
mode.finish()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
else -> super.onActionItemClicked(mode, item)
|
else -> super.onActionItemClicked(controller, mode, item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,13 +53,13 @@ abstract class MangaListFragment :
|
|||||||
PaginationScrollListener.Callback,
|
PaginationScrollListener.Callback,
|
||||||
MangaListListener,
|
MangaListListener,
|
||||||
SwipeRefreshLayout.OnRefreshListener,
|
SwipeRefreshLayout.OnRefreshListener,
|
||||||
ListSelectionController.Callback,
|
ListSelectionController.Callback2,
|
||||||
FastScroller.FastScrollListener {
|
FastScroller.FastScrollListener {
|
||||||
|
|
||||||
private var listAdapter: MangaListAdapter? = null
|
private var listAdapter: MangaListAdapter? = null
|
||||||
private var paginationListener: PaginationScrollListener? = null
|
private var paginationListener: PaginationScrollListener? = null
|
||||||
private var selectionController: ListSelectionController? = null
|
private var selectionController: ListSelectionController? = null
|
||||||
private val spanResolver = MangaListSpanResolver()
|
private var spanResolver: MangaListSpanResolver? = null
|
||||||
private val spanSizeLookup = SpanSizeLookup()
|
private val spanSizeLookup = SpanSizeLookup()
|
||||||
private val listCommitCallback = Runnable {
|
private val listCommitCallback = Runnable {
|
||||||
spanSizeLookup.invalidateCache()
|
spanSizeLookup.invalidateCache()
|
||||||
@@ -82,6 +82,7 @@ abstract class MangaListFragment :
|
|||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
listAdapter = onCreateAdapter()
|
listAdapter = onCreateAdapter()
|
||||||
|
spanResolver = MangaListSpanResolver(view.resources)
|
||||||
selectionController = ListSelectionController(
|
selectionController = ListSelectionController(
|
||||||
activity = requireActivity(),
|
activity = requireActivity(),
|
||||||
decoration = MangaSelectionDecoration(view.context),
|
decoration = MangaSelectionDecoration(view.context),
|
||||||
@@ -116,6 +117,7 @@ abstract class MangaListFragment :
|
|||||||
listAdapter = null
|
listAdapter = null
|
||||||
paginationListener = null
|
paginationListener = null
|
||||||
selectionController = null
|
selectionController = null
|
||||||
|
spanResolver = null
|
||||||
spanSizeLookup.invalidateCache()
|
spanSizeLookup.invalidateCache()
|
||||||
super.onDestroyView()
|
super.onDestroyView()
|
||||||
}
|
}
|
||||||
@@ -230,7 +232,7 @@ abstract class MangaListFragment :
|
|||||||
|
|
||||||
private fun onGridScaleChanged(scale: Float) {
|
private fun onGridScaleChanged(scale: Float) {
|
||||||
spanSizeLookup.invalidateCache()
|
spanSizeLookup.invalidateCache()
|
||||||
spanResolver.setGridSize(scale, binding.recyclerView)
|
spanResolver?.setGridSize(scale, binding.recyclerView)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onListModeChanged(mode: ListMode) {
|
private fun onListModeChanged(mode: ListMode) {
|
||||||
@@ -255,7 +257,7 @@ abstract class MangaListFragment :
|
|||||||
addItemDecoration(SpacingItemDecoration(spacing))
|
addItemDecoration(SpacingItemDecoration(spacing))
|
||||||
}
|
}
|
||||||
ListMode.GRID -> {
|
ListMode.GRID -> {
|
||||||
layoutManager = FitHeightGridLayoutManager(context, spanResolver.spanCount).also {
|
layoutManager = FitHeightGridLayoutManager(context, checkNotNull(spanResolver).spanCount).also {
|
||||||
it.spanSizeLookup = spanSizeLookup
|
it.spanSizeLookup = spanSizeLookup
|
||||||
}
|
}
|
||||||
val spacing = resources.getDimensionPixelOffset(R.dimen.grid_spacing)
|
val spacing = resources.getDimensionPixelOffset(R.dimen.grid_spacing)
|
||||||
@@ -268,17 +270,11 @@ abstract class MangaListFragment :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
|
override fun onCreateActionMode(controller: ListSelectionController, mode: ActionMode, menu: Menu): Boolean {
|
||||||
return menu.isNotEmpty()
|
return menu.isNotEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
@CallSuper
|
override fun onActionItemClicked(controller: ListSelectionController, mode: ActionMode, item: MenuItem): Boolean {
|
||||||
override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
|
|
||||||
mode.title = selectionController?.count?.toString()
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
|
|
||||||
return when (item.itemId) {
|
return when (item.itemId) {
|
||||||
R.id.action_select_all -> {
|
R.id.action_select_all -> {
|
||||||
val ids = listAdapter?.items?.mapNotNull {
|
val ids = listAdapter?.items?.mapNotNull {
|
||||||
@@ -306,7 +302,7 @@ abstract class MangaListFragment :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSelectionChanged(count: Int) {
|
override fun onSelectionChanged(controller: ListSelectionController, count: Int) {
|
||||||
binding.recyclerView.invalidateItemDecorations()
|
binding.recyclerView.invalidateItemDecorations()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,22 @@
|
|||||||
package org.koitharu.kotatsu.list.ui
|
package org.koitharu.kotatsu.list.ui
|
||||||
|
|
||||||
|
import android.content.res.Resources
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.recyclerview.widget.GridLayoutManager
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
import org.koitharu.kotatsu.R
|
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
import org.koitharu.kotatsu.R
|
||||||
|
|
||||||
class MangaListSpanResolver : View.OnLayoutChangeListener {
|
class MangaListSpanResolver(
|
||||||
|
resources: Resources,
|
||||||
|
) : View.OnLayoutChangeListener {
|
||||||
|
|
||||||
var spanCount = 3
|
var spanCount = 3
|
||||||
private set
|
private set
|
||||||
|
|
||||||
private var gridWidth = -1f
|
private val gridWidth = resources.getDimension(R.dimen.preferred_grid_width)
|
||||||
|
private val spacing = resources.getDimension(R.dimen.grid_spacing)
|
||||||
private var cellWidth = -1f
|
private var cellWidth = -1f
|
||||||
|
|
||||||
override fun onLayoutChange(
|
override fun onLayoutChange(
|
||||||
@@ -24,15 +28,12 @@ class MangaListSpanResolver : View.OnLayoutChangeListener {
|
|||||||
oldLeft: Int,
|
oldLeft: Int,
|
||||||
oldTop: Int,
|
oldTop: Int,
|
||||||
oldRight: Int,
|
oldRight: Int,
|
||||||
oldBottom: Int
|
oldBottom: Int,
|
||||||
) {
|
) {
|
||||||
if (cellWidth <= 0f) {
|
if (cellWidth <= 0f) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
val rv = v as? RecyclerView ?: return
|
val rv = v as? RecyclerView ?: return
|
||||||
if (gridWidth < 0f) {
|
|
||||||
gridWidth = rv.resources.getDimension(R.dimen.preferred_grid_width)
|
|
||||||
}
|
|
||||||
val width = abs(right - left)
|
val width = abs(right - left)
|
||||||
if (width == 0) {
|
if (width == 0) {
|
||||||
return
|
return
|
||||||
@@ -41,17 +42,13 @@ class MangaListSpanResolver : View.OnLayoutChangeListener {
|
|||||||
(rv.layoutManager as? GridLayoutManager)?.spanCount = spanCount
|
(rv.layoutManager as? GridLayoutManager)?.spanCount = spanCount
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setGridSize(scaleFactor: Float, rv: RecyclerView?) {
|
fun setGridSize(scaleFactor: Float, rv: RecyclerView) {
|
||||||
if (gridWidth < 0f) {
|
cellWidth = (gridWidth * scaleFactor) + spacing
|
||||||
gridWidth = (rv ?: return).resources.getDimension(R.dimen.preferred_grid_width)
|
val lm = rv.layoutManager as? GridLayoutManager ?: return
|
||||||
}
|
val innerWidth = lm.width - lm.paddingEnd - lm.paddingStart
|
||||||
cellWidth = gridWidth * scaleFactor
|
if (innerWidth > 0) {
|
||||||
if (rv != null) {
|
resolveGridSpanCount(innerWidth)
|
||||||
val width = rv.width
|
lm.spanCount = spanCount
|
||||||
if (width != 0) {
|
|
||||||
resolveGridSpanCount(width)
|
|
||||||
(rv.layoutManager as? GridLayoutManager)?.spanCount = spanCount
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,4 +56,4 @@ class MangaListSpanResolver : View.OnLayoutChangeListener {
|
|||||||
val estimatedCount = (width / cellWidth).roundToInt()
|
val estimatedCount = (width / cellWidth).roundToInt()
|
||||||
spanCount = estimatedCount.coerceAtLeast(2)
|
spanCount = estimatedCount.coerceAtLeast(2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
|||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
|
import org.koitharu.kotatsu.base.ui.list.ListSelectionController
|
||||||
import org.koitharu.kotatsu.download.ui.service.DownloadService
|
import org.koitharu.kotatsu.download.ui.service.DownloadService
|
||||||
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
||||||
import org.koitharu.kotatsu.utils.ShareHelper
|
import org.koitharu.kotatsu.utils.ShareHelper
|
||||||
@@ -27,7 +28,7 @@ class LocalListFragment : MangaListFragment(), ActivityResultCallback<List<@JvmS
|
|||||||
override val viewModel by viewModel<LocalListViewModel>()
|
override val viewModel by viewModel<LocalListViewModel>()
|
||||||
private val importCall = registerForActivityResult(
|
private val importCall = registerForActivityResult(
|
||||||
ActivityResultContracts.OpenMultipleDocuments(),
|
ActivityResultContracts.OpenMultipleDocuments(),
|
||||||
this
|
this,
|
||||||
)
|
)
|
||||||
private var importSnackbar: Snackbar? = null
|
private var importSnackbar: Snackbar? = null
|
||||||
private val downloadReceiver = object : BroadcastReceiver() {
|
private val downloadReceiver = object : BroadcastReceiver() {
|
||||||
@@ -42,7 +43,7 @@ class LocalListFragment : MangaListFragment(), ActivityResultCallback<List<@JvmS
|
|||||||
super.onAttach(context)
|
super.onAttach(context)
|
||||||
context.registerReceiver(
|
context.registerReceiver(
|
||||||
downloadReceiver,
|
downloadReceiver,
|
||||||
IntentFilter(DownloadService.ACTION_DOWNLOAD_COMPLETE)
|
IntentFilter(DownloadService.ACTION_DOWNLOAD_COMPLETE),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,7 +74,7 @@ class LocalListFragment : MangaListFragment(), ActivityResultCallback<List<@JvmS
|
|||||||
Snackbar.make(
|
Snackbar.make(
|
||||||
binding.recyclerView,
|
binding.recyclerView,
|
||||||
R.string.operation_not_supported,
|
R.string.operation_not_supported,
|
||||||
Snackbar.LENGTH_SHORT
|
Snackbar.LENGTH_SHORT,
|
||||||
).show()
|
).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -83,12 +84,12 @@ class LocalListFragment : MangaListFragment(), ActivityResultCallback<List<@JvmS
|
|||||||
viewModel.importFiles(result)
|
viewModel.importFiles(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
|
override fun onCreateActionMode(controller: ListSelectionController, mode: ActionMode, menu: Menu): Boolean {
|
||||||
mode.menuInflater.inflate(R.menu.mode_local, menu)
|
mode.menuInflater.inflate(R.menu.mode_local, menu)
|
||||||
return super.onCreateActionMode(mode, menu)
|
return super.onCreateActionMode(controller, mode, menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
|
override fun onActionItemClicked(controller: ListSelectionController, mode: ActionMode, item: MenuItem): Boolean {
|
||||||
return when (item.itemId) {
|
return when (item.itemId) {
|
||||||
R.id.action_remove -> {
|
R.id.action_remove -> {
|
||||||
showDeletionConfirm(selectedItemsIds, mode)
|
showDeletionConfirm(selectedItemsIds, mode)
|
||||||
@@ -100,7 +101,7 @@ class LocalListFragment : MangaListFragment(), ActivityResultCallback<List<@JvmS
|
|||||||
mode.finish()
|
mode.finish()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
else -> super.onActionItemClicked(mode, item)
|
else -> super.onActionItemClicked(controller, mode, item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,4 +144,4 @@ class LocalListFragment : MangaListFragment(), ActivityResultCallback<List<@JvmS
|
|||||||
|
|
||||||
fun newInstance() = LocalListFragment()
|
fun newInstance() = LocalListFragment()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class PagesThumbnailsSheet :
|
|||||||
OnListItemClickListener<MangaPage> {
|
OnListItemClickListener<MangaPage> {
|
||||||
|
|
||||||
private lateinit var thumbnails: List<PageThumbnail>
|
private lateinit var thumbnails: List<PageThumbnail>
|
||||||
private val spanResolver = MangaListSpanResolver()
|
private var spanResolver: MangaListSpanResolver? = null
|
||||||
private var currentPageIndex = -1
|
private var currentPageIndex = -1
|
||||||
private var pageLoader: PageLoader? = null
|
private var pageLoader: PageLoader? = null
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ class PagesThumbnailsSheet :
|
|||||||
number = i + 1,
|
number = i + 1,
|
||||||
isCurrent = i == currentPageIndex,
|
isCurrent = i == currentPageIndex,
|
||||||
repository = repository,
|
repository = repository,
|
||||||
page = x
|
page = x,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -78,17 +78,17 @@ class PagesThumbnailsSheet :
|
|||||||
|
|
||||||
with(binding.recyclerView) {
|
with(binding.recyclerView) {
|
||||||
addItemDecoration(
|
addItemDecoration(
|
||||||
SpacingItemDecoration(resources.getDimensionPixelOffset(R.dimen.grid_spacing))
|
SpacingItemDecoration(resources.getDimensionPixelOffset(R.dimen.grid_spacing)),
|
||||||
)
|
)
|
||||||
adapter = PageThumbnailAdapter(
|
adapter = PageThumbnailAdapter(
|
||||||
dataSet = thumbnails,
|
dataSet = thumbnails,
|
||||||
coil = get(),
|
coil = get(),
|
||||||
scope = viewLifecycleScope,
|
scope = viewLifecycleScope,
|
||||||
loader = getPageLoader(),
|
loader = getPageLoader(),
|
||||||
clickListener = this@PagesThumbnailsSheet
|
clickListener = this@PagesThumbnailsSheet,
|
||||||
)
|
)
|
||||||
addOnLayoutChangeListener(spanResolver)
|
addOnLayoutChangeListener(spanResolver)
|
||||||
spanResolver.setGridSize(get<AppSettings>().gridSize / 100f, this)
|
spanResolver?.setGridSize(get<AppSettings>().gridSize / 100f, this)
|
||||||
if (currentPageIndex > 0) {
|
if (currentPageIndex > 0) {
|
||||||
val offset = resources.getDimensionPixelOffset(R.dimen.preferred_grid_width)
|
val offset = resources.getDimensionPixelOffset(R.dimen.preferred_grid_width)
|
||||||
(layoutManager as GridLayoutManager).scrollToPositionWithOffset(currentPageIndex, offset)
|
(layoutManager as GridLayoutManager).scrollToPositionWithOffset(currentPageIndex, offset)
|
||||||
@@ -98,6 +98,7 @@ class PagesThumbnailsSheet :
|
|||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
super.onDestroyView()
|
super.onDestroyView()
|
||||||
|
spanResolver = null
|
||||||
pageLoader?.close()
|
pageLoader?.close()
|
||||||
pageLoader = null
|
pageLoader = null
|
||||||
}
|
}
|
||||||
@@ -124,7 +125,7 @@ class PagesThumbnailsSheet :
|
|||||||
toolbar.subtitle = resources.getQuantityString(
|
toolbar.subtitle = resources.getQuantityString(
|
||||||
R.plurals.pages,
|
R.plurals.pages,
|
||||||
thumbnails.size,
|
thumbnails.size,
|
||||||
thumbnails.size
|
thumbnails.size,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
toolbar.subtitle = null
|
toolbar.subtitle = null
|
||||||
@@ -147,4 +148,4 @@ class PagesThumbnailsSheet :
|
|||||||
putInt(ARG_CURRENT, currentPage)
|
putInt(ARG_CURRENT, currentPage)
|
||||||
}.show(fm, TAG)
|
}.show(fm, TAG)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import androidx.core.view.MenuProvider
|
|||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
import org.koin.core.parameter.parametersOf
|
import org.koin.core.parameter.parametersOf
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
|
import org.koitharu.kotatsu.base.ui.list.ListSelectionController
|
||||||
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
||||||
import org.koitharu.kotatsu.list.ui.filter.FilterBottomSheet
|
import org.koitharu.kotatsu.list.ui.filter.FilterBottomSheet
|
||||||
import org.koitharu.kotatsu.main.ui.AppBarOwner
|
import org.koitharu.kotatsu.main.ui.AppBarOwner
|
||||||
@@ -38,9 +39,9 @@ class RemoteListFragment : MangaListFragment() {
|
|||||||
viewModel.loadNextPage()
|
viewModel.loadNextPage()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
|
override fun onCreateActionMode(controller: ListSelectionController, mode: ActionMode, menu: Menu): Boolean {
|
||||||
mode.menuInflater.inflate(R.menu.mode_remote, menu)
|
mode.menuInflater.inflate(R.menu.mode_remote, menu)
|
||||||
return super.onCreateActionMode(mode, menu)
|
return super.onCreateActionMode(controller, mode, menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFilterClick(view: View?) {
|
override fun onFilterClick(view: View?) {
|
||||||
@@ -51,7 +52,9 @@ class RemoteListFragment : MangaListFragment() {
|
|||||||
viewModel.resetFilter()
|
viewModel.resetFilter()
|
||||||
}
|
}
|
||||||
|
|
||||||
private inner class RemoteListMenuProvider : MenuProvider, SearchView.OnQueryTextListener,
|
private inner class RemoteListMenuProvider :
|
||||||
|
MenuProvider,
|
||||||
|
SearchView.OnQueryTextListener,
|
||||||
MenuItem.OnActionExpandListener {
|
MenuItem.OnActionExpandListener {
|
||||||
|
|
||||||
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
|
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import androidx.appcompat.view.ActionMode
|
|||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
import org.koin.core.parameter.parametersOf
|
import org.koin.core.parameter.parametersOf
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
|
import org.koitharu.kotatsu.base.ui.list.ListSelectionController
|
||||||
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
||||||
import org.koitharu.kotatsu.parsers.model.MangaSource
|
import org.koitharu.kotatsu.parsers.model.MangaSource
|
||||||
import org.koitharu.kotatsu.utils.ext.serializableArgument
|
import org.koitharu.kotatsu.utils.ext.serializableArgument
|
||||||
@@ -24,9 +25,9 @@ class SearchFragment : MangaListFragment() {
|
|||||||
viewModel.loadNextPage()
|
viewModel.loadNextPage()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
|
override fun onCreateActionMode(controller: ListSelectionController, mode: ActionMode, menu: Menu): Boolean {
|
||||||
mode.menuInflater.inflate(R.menu.mode_remote, menu)
|
mode.menuInflater.inflate(R.menu.mode_remote, menu)
|
||||||
return super.onCreateActionMode(mode, menu)
|
return super.onCreateActionMode(controller, mode, menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@@ -39,4 +40,4 @@ class SearchFragment : MangaListFragment() {
|
|||||||
putString(ARG_QUERY, query)
|
putString(ARG_QUERY, query)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import androidx.core.view.MenuProvider
|
|||||||
import com.google.android.material.snackbar.Snackbar
|
import com.google.android.material.snackbar.Snackbar
|
||||||
import org.koin.androidx.viewmodel.ext.android.viewModel
|
import org.koin.androidx.viewmodel.ext.android.viewModel
|
||||||
import org.koitharu.kotatsu.R
|
import org.koitharu.kotatsu.R
|
||||||
|
import org.koitharu.kotatsu.base.ui.list.ListSelectionController
|
||||||
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
import org.koitharu.kotatsu.list.ui.MangaListFragment
|
||||||
import org.koitharu.kotatsu.settings.SettingsActivity
|
import org.koitharu.kotatsu.settings.SettingsActivity
|
||||||
import org.koitharu.kotatsu.utils.ext.addMenuProvider
|
import org.koitharu.kotatsu.utils.ext.addMenuProvider
|
||||||
@@ -26,9 +27,9 @@ class SuggestionsFragment : MangaListFragment() {
|
|||||||
|
|
||||||
override fun onScrolledToEnd() = Unit
|
override fun onScrolledToEnd() = Unit
|
||||||
|
|
||||||
override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean {
|
override fun onCreateActionMode(controller: ListSelectionController, mode: ActionMode, menu: Menu): Boolean {
|
||||||
mode.menuInflater.inflate(R.menu.mode_remote, menu)
|
mode.menuInflater.inflate(R.menu.mode_remote, menu)
|
||||||
return super.onCreateActionMode(mode, menu)
|
return super.onCreateActionMode(controller, mode, menu)
|
||||||
}
|
}
|
||||||
|
|
||||||
private inner class SuggestionMenuProvider : MenuProvider {
|
private inner class SuggestionMenuProvider : MenuProvider {
|
||||||
@@ -59,4 +60,4 @@ class SuggestionsFragment : MangaListFragment() {
|
|||||||
|
|
||||||
fun newInstance() = SuggestionsFragment()
|
fun newInstance() = SuggestionsFragment()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user