mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-30 22:07:57 +01:00 
			
		
		
		
	Ability to order sources by library count when migrating (#6000)
* order sources by library count when migrating (closes #4703) * Use plain menu instead of full-on sheet
This commit is contained in:
		| @@ -151,6 +151,9 @@ object PreferenceKeys { | ||||
|     const val librarySortingMode = "library_sorting_mode" | ||||
|     const val librarySortingDirection = "library_sorting_ascending" | ||||
|  | ||||
|     const val migrationSortingMode = "pref_migration_sorting" | ||||
|     const val migrationSortingDirection = "pref_migration_direction" | ||||
|  | ||||
|     const val automaticExtUpdates = "automatic_ext_updates" | ||||
|  | ||||
|     const val showNsfwSource = "show_nsfw_source" | ||||
|   | ||||
| @@ -12,6 +12,7 @@ import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceValues.ThemeMode.system | ||||
| import eu.kanade.tachiyomi.data.track.TrackService | ||||
| import eu.kanade.tachiyomi.data.track.anilist.Anilist | ||||
| import eu.kanade.tachiyomi.ui.browse.migration.sources.MigrationSourcesController | ||||
| import eu.kanade.tachiyomi.ui.library.setting.DisplayModeSetting | ||||
| import eu.kanade.tachiyomi.ui.library.setting.SortDirectionSetting | ||||
| import eu.kanade.tachiyomi.ui.library.setting.SortModeSetting | ||||
| @@ -267,6 +268,9 @@ class PreferencesHelper(val context: Context) { | ||||
|     fun librarySortingMode() = flowPrefs.getEnum(Keys.librarySortingMode, SortModeSetting.ALPHABETICAL) | ||||
|     fun librarySortingAscending() = flowPrefs.getEnum(Keys.librarySortingDirection, SortDirectionSetting.ASCENDING) | ||||
|  | ||||
|     fun migrationSortingMode() = flowPrefs.getEnum(Keys.migrationSortingMode, MigrationSourcesController.SortSetting.ALPHABETICAL) | ||||
|     fun migrationSortingDirection() = flowPrefs.getEnum(Keys.migrationSortingDirection, MigrationSourcesController.DirectionSetting.ASCENDING) | ||||
|  | ||||
|     fun automaticExtUpdates() = flowPrefs.getBoolean(Keys.automaticExtUpdates, true) | ||||
|  | ||||
|     fun showNsfwSource() = flowPrefs.getBoolean(Keys.showNsfwSource, true) | ||||
|   | ||||
| @@ -9,16 +9,20 @@ import androidx.recyclerview.widget.LinearLayoutManager | ||||
| import dev.chrisbanes.insetter.applyInsetter | ||||
| import eu.davidea.flexibleadapter.FlexibleAdapter | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.databinding.MigrationSourcesControllerBinding | ||||
| import eu.kanade.tachiyomi.ui.base.controller.NucleusController | ||||
| import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction | ||||
| import eu.kanade.tachiyomi.ui.browse.migration.manga.MigrationMangaController | ||||
| import eu.kanade.tachiyomi.util.system.openInBrowser | ||||
| import uy.kohesive.injekt.injectLazy | ||||
|  | ||||
| class MigrationSourcesController : | ||||
|     NucleusController<MigrationSourcesControllerBinding, MigrationSourcesPresenter>(), | ||||
|     FlexibleAdapter.OnItemClickListener { | ||||
|  | ||||
|     private val preferences: PreferencesHelper by injectLazy() | ||||
|  | ||||
|     private var adapter: SourceAdapter? = null | ||||
|  | ||||
|     init { | ||||
| @@ -56,12 +60,31 @@ class MigrationSourcesController : | ||||
|     } | ||||
|  | ||||
|     override fun onOptionsItemSelected(item: MenuItem): Boolean { | ||||
|         when (item.itemId) { | ||||
|         when (val itemId = item.itemId) { | ||||
|             R.id.action_source_migration_help -> activity?.openInBrowser(HELP_URL) | ||||
|             R.id.asc_alphabetical, R.id.desc_alphabetical -> { | ||||
|                 setSortingDirection(SortSetting.ALPHABETICAL, itemId == R.id.asc_alphabetical) | ||||
|             } | ||||
|             R.id.asc_count, R.id.desc_count -> { | ||||
|                 setSortingDirection(SortSetting.TOTAL, itemId == R.id.asc_count) | ||||
|             } | ||||
|         } | ||||
|         return super.onOptionsItemSelected(item) | ||||
|     } | ||||
|  | ||||
|     private fun setSortingDirection(sortSetting: SortSetting, isAscending: Boolean) { | ||||
|         val direction = if (isAscending) { | ||||
|             DirectionSetting.ASCENDING | ||||
|         } else { | ||||
|             DirectionSetting.DESCENDING | ||||
|         } | ||||
|  | ||||
|         preferences.migrationSortingDirection().set(direction) | ||||
|         preferences.migrationSortingMode().set(sortSetting) | ||||
|  | ||||
|         presenter.requestSortUpdate() | ||||
|     } | ||||
|  | ||||
|     fun setSources(sourcesWithManga: List<SourceItem>) { | ||||
|         // Show empty view if needed | ||||
|         if (sourcesWithManga.isNotEmpty()) { | ||||
| @@ -79,6 +102,16 @@ class MigrationSourcesController : | ||||
|         parentController!!.router.pushController(controller.withFadeTransaction()) | ||||
|         return false | ||||
|     } | ||||
|  | ||||
|     enum class DirectionSetting { | ||||
|         ASCENDING, | ||||
|         DESCENDING; | ||||
|     } | ||||
|  | ||||
|     enum class SortSetting { | ||||
|         ALPHABETICAL, | ||||
|         TOTAL; | ||||
|     } | ||||
| } | ||||
|  | ||||
| private const val HELP_URL = "https://tachiyomi.org/help/guides/source-migration/" | ||||
|   | ||||
| @@ -1,25 +1,38 @@ | ||||
| package eu.kanade.tachiyomi.ui.browse.migration.sources | ||||
|  | ||||
| import android.os.Bundle | ||||
| import com.jakewharton.rxrelay.BehaviorRelay | ||||
| import eu.kanade.tachiyomi.data.database.DatabaseHelper | ||||
| import eu.kanade.tachiyomi.data.database.models.Manga | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.source.LocalSource | ||||
| import eu.kanade.tachiyomi.source.SourceManager | ||||
| import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter | ||||
| import eu.kanade.tachiyomi.util.lang.combineLatest | ||||
| import rx.android.schedulers.AndroidSchedulers | ||||
| import rx.schedulers.Schedulers | ||||
| import uy.kohesive.injekt.Injekt | ||||
| import uy.kohesive.injekt.api.get | ||||
| import uy.kohesive.injekt.injectLazy | ||||
| import java.text.Collator | ||||
| import java.util.Collections | ||||
| import java.util.Locale | ||||
|  | ||||
| class MigrationSourcesPresenter( | ||||
|     private val sourceManager: SourceManager = Injekt.get(), | ||||
|     private val db: DatabaseHelper = Injekt.get() | ||||
| ) : BasePresenter<MigrationSourcesController>() { | ||||
|  | ||||
|     private val preferences: PreferencesHelper by injectLazy() | ||||
|  | ||||
|     private val sortRelay = BehaviorRelay.create(Unit) | ||||
|  | ||||
|     override fun onCreate(savedState: Bundle?) { | ||||
|         super.onCreate(savedState) | ||||
|  | ||||
|         db.getFavoriteMangas() | ||||
|             .asRxObservable() | ||||
|             .combineLatest(sortRelay.observeOn(Schedulers.io())) { sources, _ -> sources } | ||||
|             .observeOn(AndroidSchedulers.mainThread()) | ||||
|             .map { findSourcesWithManga(it) } | ||||
|             .subscribeLatestCache(MigrationSourcesController::setSources) | ||||
| @@ -34,7 +47,36 @@ class MigrationSourcesPresenter( | ||||
|                 val source = sourceManager.getOrStub(it.key) | ||||
|                 SourceItem(source, it.value.size, header) | ||||
|             } | ||||
|             .sortedBy { it.source.name.lowercase() } | ||||
|             .sortedWith(sortFn()) | ||||
|             .toList() | ||||
|     } | ||||
|  | ||||
|     fun sortFn(): java.util.Comparator<SourceItem> { | ||||
|         val sort by lazy { | ||||
|             preferences.migrationSortingMode().get() | ||||
|         } | ||||
|         val direction by lazy { | ||||
|             preferences.migrationSortingDirection().get() | ||||
|         } | ||||
|  | ||||
|         val locale = Locale.getDefault() | ||||
|         val collator = Collator.getInstance(locale).apply { | ||||
|             strength = Collator.PRIMARY | ||||
|         } | ||||
|         val sortFn: (SourceItem, SourceItem) -> Int = { a, b -> | ||||
|             when (sort) { | ||||
|                 MigrationSourcesController.SortSetting.ALPHABETICAL -> collator.compare(a.source.name.lowercase(locale), b.source.name.lowercase(locale)) | ||||
|                 MigrationSourcesController.SortSetting.TOTAL -> a.mangaCount.compareTo(b.mangaCount) | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return when (direction) { | ||||
|             MigrationSourcesController.DirectionSetting.ASCENDING -> Comparator(sortFn) | ||||
|             MigrationSourcesController.DirectionSetting.DESCENDING -> Collections.reverseOrder(sortFn) | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fun requestSortUpdate() { | ||||
|         sortRelay.call(Unit) | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user