Batch select sources for pre migrations

Select none/all, pinned sources, enabled sources from the list
This commit is contained in:
Jay 2020-05-23 17:07:52 -04:00
parent a3305171d6
commit 59c2da3f91
7 changed files with 100 additions and 11 deletions

View File

@ -2,6 +2,9 @@ package eu.kanade.tachiyomi.ui.migration.manga.design
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.FrameLayout import android.widget.FrameLayout
@ -18,9 +21,9 @@ import eu.kanade.tachiyomi.source.online.HttpSource
import eu.kanade.tachiyomi.ui.base.controller.BaseController import eu.kanade.tachiyomi.ui.base.controller.BaseController
import eu.kanade.tachiyomi.ui.migration.manga.process.MigrationListController import eu.kanade.tachiyomi.ui.migration.manga.process.MigrationListController
import eu.kanade.tachiyomi.ui.migration.manga.process.MigrationProcedureConfig import eu.kanade.tachiyomi.ui.migration.manga.process.MigrationProcedureConfig
import eu.kanade.tachiyomi.util.view.applyWindowInsetsForController
import eu.kanade.tachiyomi.util.view.doOnApplyWindowInsets import eu.kanade.tachiyomi.util.view.doOnApplyWindowInsets
import eu.kanade.tachiyomi.util.view.expand import eu.kanade.tachiyomi.util.view.expand
import eu.kanade.tachiyomi.util.view.liftAppbarWith
import eu.kanade.tachiyomi.util.view.marginBottom import eu.kanade.tachiyomi.util.view.marginBottom
import eu.kanade.tachiyomi.util.view.updateLayoutParams import eu.kanade.tachiyomi.util.view.updateLayoutParams
import eu.kanade.tachiyomi.util.view.updatePaddingRelative import eu.kanade.tachiyomi.util.view.updatePaddingRelative
@ -41,7 +44,7 @@ class PreMigrationController(bundle: Bundle? = null) : BaseController(bundle), F
private var dialog: BottomSheetDialog? = null private var dialog: BottomSheetDialog? = null
override fun getTitle() = view?.context?.getString(R.string.select_target_sources) override fun getTitle() = view?.context?.getString(R.string.select_sources)
override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View { override fun inflateView(inflater: LayoutInflater, container: ViewGroup): View {
return inflater.inflate(R.layout.pre_migration_controller, container, false) return inflater.inflate(R.layout.pre_migration_controller, container, false)
@ -49,7 +52,7 @@ class PreMigrationController(bundle: Bundle? = null) : BaseController(bundle), F
override fun onViewCreated(view: View) { override fun onViewCreated(view: View) {
super.onViewCreated(view) super.onViewCreated(view)
view.applyWindowInsetsForController() liftAppbarWith(recycler)
val ourAdapter = adapter ?: MigrationSourceAdapter( val ourAdapter = adapter ?: MigrationSourceAdapter(
getEnabledSources().map { MigrationSourceItem(it, isEnabled(it.id.toString())) }, getEnabledSources().map { MigrationSourceItem(it, isEnabled(it.id.toString())) },
@ -68,9 +71,13 @@ class PreMigrationController(bundle: Bundle? = null) : BaseController(bundle), F
fab?.updateLayoutParams<ViewGroup.MarginLayoutParams> { fab?.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = fabBaseMarginBottom + insets.systemWindowInsetBottom bottomMargin = fabBaseMarginBottom + insets.systemWindowInsetBottom
} }
// offset the recycler by the fab's inset + some inset on top v.post {
v.updatePaddingRelative(bottom = padding.bottom + (fab?.marginBottom ?: 0) + // offset the recycler by the fab's inset + some inset on top
fabBaseMarginBottom + (fab?.height ?: 0)) v.updatePaddingRelative(
bottom = insets.systemWindowInsetBottom + (fab?.marginBottom
?: 0) + (fab?.height ?: 0)
)
}
} }
fab.setOnClickListener { fab.setOnClickListener {
@ -151,6 +158,40 @@ class PreMigrationController(bundle: Bundle? = null) : BaseController(bundle), F
else sourcesSaved.split("/").contains(id) else sourcesSaved.split("/").contains(id)
} }
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.pre_migration, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_select_all, R.id.action_select_none -> {
adapter?.currentItems?.forEach {
it.sourceEnabled = item.itemId == R.id.action_select_all
}
adapter?.notifyDataSetChanged()
}
R.id.action_match_enabled, R.id.action_match_pinned -> {
val enabledSources = if (item.itemId == R.id.action_match_enabled) {
prefs.hiddenSources().getOrDefault().mapNotNull { it.toLongOrNull() }
} else {
prefs.pinnedCatalogues().get()?.mapNotNull { it.toLongOrNull() } ?: emptyList()
}
val items = adapter?.currentItems?.toList() ?: return true
items.forEach {
it.sourceEnabled = if (item.itemId == R.id.action_match_enabled) {
it.source.id !in enabledSources
} else {
it.source.id in enabledSources
}
}
val sortedItems = items.sortedBy { it.source.name }.sortedBy { !it.sourceEnabled }
adapter?.updateDataSet(sortedItems)
}
else -> return super.onOptionsItemSelected(item)
}
return true
}
companion object { companion object {
private const val MANGA_IDS_EXTRA = "manga_ids" private const val MANGA_IDS_EXTRA = "manga_ids"

View File

@ -38,7 +38,7 @@ import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.launchUI import eu.kanade.tachiyomi.util.system.launchUI
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener
import eu.kanade.tachiyomi.util.view.applyWindowInsetsForController import eu.kanade.tachiyomi.util.view.liftAppbarWith
import eu.kanade.tachiyomi.util.view.withFadeTransaction import eu.kanade.tachiyomi.util.view.withFadeTransaction
import kotlinx.android.synthetic.main.migration_list_controller.* import kotlinx.android.synthetic.main.migration_list_controller.*
import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CancellationException
@ -95,7 +95,7 @@ class MigrationListController(bundle: Bundle? = null) : BaseController(bundle),
override fun onViewCreated(view: View) { override fun onViewCreated(view: View) {
super.onViewCreated(view) super.onViewCreated(view)
view.applyWindowInsetsForController() liftAppbarWith(recycler)
setTitle() setTitle()
val config = this.config ?: return val config = this.config ?: return

View File

@ -0,0 +1,11 @@
<!-- drawable/select_all.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/actionBarTintColor"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:pathData="M9,9H15V15H9M7,17H17V7H7M15,5H17V3H15M15,21H17V19H15M19,17H21V15H19M19,9H21V7H19M19,21A2,2 0 0,0 21,19H19M19,13H21V11H19M11,21H13V19H11M9,3H7V5H9M3,17H5V15H3M5,21V19H3A2,2 0 0,0 5,21M19,3V5H21A2,2 0 0,0 19,3M13,3H11V5H13M3,9H5V7H3M7,21H9V19H7M3,13H5V11H3M3,5H5V3A2,2 0 0,0 3,5Z" />
</vector>

View File

@ -0,0 +1,11 @@
<!-- drawable/select_off.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?attr/actionBarTintColor"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#000"
android:pathData="M1,4.27L2.28,3L21,21.72L19.73,23L17,20.27V21H15V19H15.73L5,8.27V9H3V7H3.73L1,4.27M20,3A1,1 0 0,1 21,4V5H19V3H20M15,5V3H17V5H15M11,5V3H13V5H11M7,5V3H9V5H7M11,21V19H13V21H11M7,21V19H9V21H7M4,21A1,1 0 0,1 3,20V19H5V21H4M3,15H5V17H3V15M21,15V17H19V15H21M3,11H5V13H3V11M21,11V13H19V11H21M21,7V9H19V7H21Z" />
</vector>

View File

@ -6,10 +6,10 @@
android:id="@+id/action_copy_manga" android:id="@+id/action_copy_manga"
android:icon="@drawable/ic_content_copy_24dp" android:icon="@drawable/ic_content_copy_24dp"
android:title="@string/copy" android:title="@string/copy"
app:showAsAction="always" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/action_migrate_manga" android:id="@+id/action_migrate_manga"
android:icon="@drawable/ic_done_all_24dp" android:icon="@drawable/ic_done_all_24dp"
android:title="@string/migrate" android:title="@string/migrate"
app:showAsAction="always" /> app:showAsAction="ifRoom" />
</menu> </menu>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_select_none"
android:icon="@drawable/ic_select_none_24dp"
android:title="@string/select_none"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_select_all"
android:icon="@drawable/ic_select_all_24dp"
android:title="@string/select_all"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_match_enabled"
android:icon="@drawable/ic_browse_24dp"
android:title="@string/match_enabled_sources"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_match_pinned"
android:icon="@drawable/ic_pin_24dp"
android:title="@string/match_pinned_sources"
app:showAsAction="ifRoom" />
</menu>

View File

@ -423,7 +423,7 @@
<string name="add_tracking">Add tracking</string> <string name="add_tracking">Add tracking</string>
<!-- Migration --> <!-- Migration -->
<string name="select_target_sources">Select target sources</string> <string name="select_sources">Select sources</string>
<string name="source_migration">Source migration</string> <string name="source_migration">Source migration</string>
<string name="migration">Migration</string> <string name="migration">Migration</string>
<string name="skip_pre_migration">Skip pre-migration</string> <string name="skip_pre_migration">Skip pre-migration</string>
@ -738,6 +738,7 @@
<string name="save">Save</string> <string name="save">Save</string>
<string name="search">Search</string> <string name="search">Search</string>
<string name="select_all">Select all</string> <string name="select_all">Select all</string>
<string name="select_none">Select none</string>
<string name="share">Share</string> <string name="share">Share</string>
<string name="sort">Sort</string> <string name="sort">Sort</string>
<string name="sort_and_filter">Sort &amp; Filter</string> <string name="sort_and_filter">Sort &amp; Filter</string>