From b8129ff4f6a37d329606929cdc390bafd732217d Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Sat, 11 Jul 2020 18:34:16 -0400 Subject: [PATCH] Rewrite and enable genre tag editing --- .../tachiyomi/ui/manga/EditMangaDialog.kt | 73 +++++++++++---- .../ui/manga/MangaAllInOnePresenter.kt | 22 ++--- app/src/main/res/layout/edit_manga_dialog.xml | 92 ++++++++++++------- app/src/main/res/values/strings_extra.xml | 2 + 4 files changed, 129 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt index 10504bf45..d28e36ac1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/EditMangaDialog.kt @@ -2,10 +2,16 @@ package eu.kanade.tachiyomi.ui.manga import android.app.Dialog import android.os.Bundle +import android.text.InputType import android.view.View +import androidx.core.view.children import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.customview.customView +import com.afollestad.materialdialogs.input.getInputField +import com.afollestad.materialdialogs.input.input import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.google.android.material.chip.Chip +import com.google.android.material.chip.ChipGroup import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Manga @@ -14,7 +20,8 @@ import eu.kanade.tachiyomi.data.glide.toMangaThumbnail import eu.kanade.tachiyomi.source.LocalSource import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.util.lang.chop -import eu.kanade.tachiyomi.util.view.setChips +import eu.kanade.tachiyomi.util.system.getResourceColor +import exh.util.trimOrNull import kotlinx.android.synthetic.main.edit_manga_dialog.view.manga_artist import kotlinx.android.synthetic.main.edit_manga_dialog.view.manga_author import kotlinx.android.synthetic.main.edit_manga_dialog.view.manga_cover @@ -33,7 +40,7 @@ class EditMangaDialog : DialogController { // private var customCoverUri: Uri? = null - private var willResetCover = false + // private var willResetCover = false private val infoController get() = targetController as MangaAllInOneController @@ -77,7 +84,7 @@ class EditMangaDialog : DialogController { .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .centerCrop() .into(view.manga_cover) - // view.manga_cover.loadAny(manga) + val isLocal = manga.source == LocalSource.ID if (isLocal) { @@ -88,7 +95,7 @@ class EditMangaDialog : DialogController { view.manga_author.append(manga.author ?: "") view.manga_artist.append(manga.artist ?: "") view.manga_description.append(manga.description ?: "") - view.manga_genres_tags.setChips(manga.genre?.split(", ") ?: emptyList()) + view.manga_genres_tags.setChips(manga.genre?.split(",")?.map { it.trim() } ?: emptyList()) } else { if (manga.title != manga.originalTitle) { view.title.append(manga.title) @@ -102,7 +109,7 @@ class EditMangaDialog : DialogController { if (manga.description != manga.originalDescription) { view.manga_description.append(manga.description ?: "") } - view.manga_genres_tags.setChips(manga.genre?.split(", ") ?: emptyList()) + view.manga_genres_tags.setChips(manga.genre?.split(",")?.map { it.trim() } ?: emptyList()) view.title.hint = "${resources?.getString(R.string.title)}: ${manga.originalTitle}" if (manga.originalAuthor != null) { @@ -139,7 +146,7 @@ class EditMangaDialog : DialogController { else dialogView?.manga_genres_tags?.setChips(manga.originalGenre?.split(", ")) } -/* fun updateCover(uri: Uri) { + /*fun updateCover(uri: Uri) { willResetCover = false dialogView!!.manga_cover.loadAny(uri) customCoverUri = uri @@ -154,25 +161,57 @@ class EditMangaDialog : DialogController { infoController.presenter.updateMangaInfo( dialogView?.title?.text.toString(), dialogView?.manga_author?.text.toString(), dialogView?.manga_artist?.text.toString(), - dialogView?.manga_description?.text.toString() + dialogView?.manga_description?.text.toString(), dialogView?.manga_genres_tags?.getTextStrings() ) - // , - // dialogView?.manga_genres_tags?.tags) } - private fun getAllChips() { - dialogView?.manga_genres_tags?.childCount + private fun ChipGroup.setChips(items: List?) { + removeAllViews() - /*for (i in 0 until dialogView?.manga_genres_tags?.childCount) { - val child: View = getChildAt(i) - if (child is Chip) { - if (child.isChecked) { - checkedIds.add(child.getId()) + items?.forEach { item -> + val chip = Chip(context).apply { + text = item + + isCloseIconVisible = true + closeIcon?.setTint(context.getResourceColor(R.attr.colorAccent)) + setOnCloseIconClickListener { + removeView(this) } } - }*/ + + addView(chip) + } + + val addTagChip = Chip(context).apply { + setText(R.string.add_tag) + + chipIcon = context.getDrawable(R.drawable.ic_add_24dp) + chipIcon?.setTint(context.getResourceColor(R.attr.colorAccent)) + textStartPadding = 0F + + setOnClickListener { + MaterialDialog(context) + .title(R.string.add_tag) + .input(inputType = InputType.TYPE_CLASS_TEXT) + .positiveButton(android.R.string.ok) { + val newTag = it.getInputField().text.toString().trimOrNull() + + if (items != null && newTag != null) setChips(items + listOf(newTag)) + else if (newTag != null) setChips(listOf(newTag)) + } + .negativeButton(android.R.string.cancel) + .show() + } + } + addView(addTagChip) } + private fun ChipGroup.getTextStrings(): List? = children.mapNotNull { + if (it is Chip && !it.text.toString().contains(context.getString(R.string.add_tag), ignoreCase = true)) { + it.text.toString() + } else null + }.toList() + private companion object { const val KEY_MANGA = "manga_id" } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOnePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOnePresenter.kt index 188f6322e..dd1fd4cdc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOnePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaAllInOnePresenter.kt @@ -204,31 +204,31 @@ class MangaAllInOnePresenter( title: String?, author: String?, artist: String?, - description: String? - // tags: Array? + description: String?, + tags: List? ) { if (manga.source == LocalSource.ID) { manga.title = if (title.isNullOrBlank()) manga.url else title.trim() manga.author = author?.trimOrNull() manga.artist = artist?.trimOrNull() manga.description = description?.trimOrNull() - /*val tagsString = tags?.joinToString(", ") { it.capitalize() }*/ - /*manga.genre = if (tags.isNullOrEmpty()) null else tagsString?.trim()*/ + val tagsString = tags?.joinToString(", ") + manga.genre = if (tags.isNullOrEmpty()) null else tagsString?.trim() LocalSource(downloadManager.context).updateMangaInfo(manga) db.updateMangaInfo(manga).executeAsBlocking() } else { - /*val genre = if (!tags.isNullOrEmpty() && tags.joinToString(", ") != manga.genre) { - tags.map { it.capitalize() }.toTypedArray() - } else { - null - }*/ + val genre = if (!tags.isNullOrEmpty() && tags.joinToString(", ") != manga.genre) { + tags.toTypedArray() + } else { + null + } val manga = CustomMangaManager.MangaJson( manga.id!!, title?.trimOrNull(), author?.trimOrNull(), artist?.trimOrNull(), - description?.trimOrNull() - // genre + description?.trimOrNull(), + genre ) customMangaManager.saveMangaInfo(manga) } diff --git a/app/src/main/res/layout/edit_manga_dialog.xml b/app/src/main/res/layout/edit_manga_dialog.xml index d017868e4..b4cf7cd4e 100644 --- a/app/src/main/res/layout/edit_manga_dialog.xml +++ b/app/src/main/res/layout/edit_manga_dialog.xml @@ -35,44 +35,72 @@ android:layout_marginStart="16dp" android:text="@string/reset_cover" />--> - - + android:layout_marginEnd="16dp"> - + - + + + android:layout_marginEnd="16dp"> + + + + + + + + + + + + + + + + + android:text="@string/reset_tags" /> Display language code next to name No source categories available Invalid category name + Add Tag See Recommendations @@ -135,5 +136,6 @@ Manhua Comic Webtoon + Reset Tags \ No newline at end of file