diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagController.kt index a361be990..ffd7e2ff2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagController.kt @@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.category.genre import android.view.LayoutInflater import android.view.Menu +import android.view.MenuInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup @@ -9,6 +10,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.afollestad.materialdialogs.MaterialDialog import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.snackbar.Snackbar import eu.davidea.flexibleadapter.FlexibleAdapter @@ -43,6 +45,8 @@ class SortTagController : */ private var actionMode: ActionMode? = null + private var shownHelpDialog = false + /** * Adapter containing category items. */ @@ -68,6 +72,10 @@ class SortTagController : return resources?.getString(R.string.action_edit_tags) } + init { + setHasOptionsMenu(true) + } + /** * Returns the view of this controller. * @@ -91,6 +99,7 @@ class SortTagController : binding.recycler.layoutManager = LinearLayoutManager(view.context) binding.recycler.setHasFixedSize(true) binding.recycler.adapter = adapter + adapter?.isHandleDragEnabled = true adapter?.isPermanentDelete = false actionFabScrollListener = actionFab?.shrinkOnScroll(binding.recycler) @@ -102,7 +111,12 @@ class SortTagController : fab.setIconResource(R.drawable.ic_add_24dp) fab.clicks() .onEach { - SortTagCreateDialog(this@SortTagController).showDialog(router, null) + if (!shownHelpDialog) { + shownHelpDialog = true + helpDialog(true) + } else { + SortTagCreateDialog(this@SortTagController).showDialog(router, null) + } } .launchIn(scope) } @@ -145,6 +159,21 @@ class SortTagController : } } + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.sort_tags, menu) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.action_help -> { + shownHelpDialog = true + helpDialog() + } + else -> return false + } + return true + } + /** * Called when action mode is first created. The menu supplied will be used to generate action * buttons for the action mode. @@ -202,11 +231,27 @@ class SortTagController : ) mode.finish() } + R.id.action_help -> { + shownHelpDialog = true + helpDialog() + } else -> return false } return true } + private fun helpDialog(hasPositive: Boolean = false) { + MaterialDialog(activity!!) + .title(R.string.add_tag) + .message(R.string.action_add_tags_message) + .positiveButton(android.R.string.ok) { + if (hasPositive) { + SortTagCreateDialog(this@SortTagController).showDialog(router, null) + } + } + .show() + } + /** * Called when an action mode is about to be exited and destroyed. * diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagCreateDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagCreateDialog.kt index f1d9689d4..e501ed296 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagCreateDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagCreateDialog.kt @@ -32,7 +32,6 @@ class SortTagCreateDialog(bundle: Bundle? = null) : DialogController(bundle) override fun onCreateDialog(savedViewState: Bundle?): Dialog { return MaterialDialog(activity!!) .title(R.string.action_add_category) - .message(R.string.action_add_tags_message) .negativeButton(android.R.string.cancel) .input( hint = resources?.getString(R.string.name), diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagHolder.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagHolder.kt index 2e19cb616..4caa83849 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagHolder.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagHolder.kt @@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.category.genre import android.view.View import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder +import kotlinx.android.synthetic.main.categories_item.reorder import kotlinx.android.synthetic.main.categories_item.title /** @@ -11,13 +12,27 @@ import kotlinx.android.synthetic.main.categories_item.title * @param adapter The adapter containing this holder. */ class SortTagHolder(view: View, val adapter: SortTagAdapter) : BaseFlexibleViewHolder(view, adapter) { + + init { + setDragHandleView(reorder) + } + /** * Binds this holder with the given category. * * @param tag The tag to bind. */ fun bind(tag: String) { - // Set capitalized title. title.text = tag } + + /** + * Called when an item is released. + * + * @param position The position of the released item. + */ + override fun onItemReleased(position: Int) { + super.onItemReleased(position) + adapter.onItemReleaseListener.onItemReleased(position) + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagItem.kt index 858b6218f..b5521e75d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/genre/SortTagItem.kt @@ -60,6 +60,9 @@ class SortTagItem(val tag: String) : AbstractFlexibleItem() { override fun equals(other: Any?): Boolean { if (this === other) return true + if (other is SortTagItem) { + return tag == other.tag + } return false } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsLibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsLibraryController.kt index 30d17b159..561791d73 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsLibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsLibraryController.kt @@ -264,6 +264,9 @@ class SettingsLibraryController : SettingsController() { titleRes = R.string.pref_tag_sorting val count = preferences.sortTagsForLibrary().get().size summary = resources!!.getQuantityString(R.plurals.pref_tag_sorting_desc, count, count) + onClick { + router.pushController(SortTagController().withFadeTransaction()) + } } } @@ -279,10 +282,6 @@ class SettingsLibraryController : SettingsController() { titleRes = R.string.skip_pre_migration summaryRes = R.string.pref_skip_pre_migration_summary defaultValue = false - - onClick { - router.pushController(SortTagController().withFadeTransaction()) - } } } } diff --git a/app/src/main/res/menu/sort_tags.xml b/app/src/main/res/menu/sort_tags.xml new file mode 100644 index 000000000..a68881ada --- /dev/null +++ b/app/src/main/res/menu/sort_tags.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings_sy.xml b/app/src/main/res/values/strings_sy.xml index af97a0b0d..683d0295d 100644 --- a/app/src/main/res/values/strings_sy.xml +++ b/app/src/main/res/values/strings_sy.xml @@ -294,7 +294,7 @@ Tag sorting list Add tag - Read this! Tags must be exact, there are no partial matches, you cannot do netorare to filter out female:netorare or similar!\nThe style for namespace tags is "female: sole female" without quotes!\nAdding multiple variants of the same tag is supported, so feel free to do "tag: netorare" for NHentai and "female: netorare" for E-Hentai! + Read this! Tags must be exact, there are no partial matches, you cannot do netorare to filter out female:netorare or similar!\nThe style for namespace tags is\n\"female: sole female\"\nwithout quotes!\nAdding multiple variants of the same tag is supported, so feel free to do \"tag: netorare\" for NHentai and \"female: netorare\" for E-Hentai! Edit tags You have no tags. Tap the plus button to create one for sorting your library by tags This tag exists!