Option to disable outline for covers

This commit is contained in:
Jays2Kings 2021-10-16 14:29:23 -04:00
parent 694778515c
commit 7cc73ba503
20 changed files with 84 additions and 18 deletions

View file

@ -177,6 +177,8 @@ object PreferenceKeys {
const val uniformGrid = "uniform_grid"
const val outlineOnCovers = "outline_on_covers"
const val dateFormat = "app_date_format"
const val defaultCategory = "default_category"

View file

@ -263,6 +263,8 @@ class PreferencesHelper(val context: Context) {
fun uniformGrid() = flowPrefs.getBoolean(Keys.uniformGrid, true)
fun outlineOnCovers() = flowPrefs.getBoolean(Keys.outlineOnCovers, true)
fun downloadBadge() = flowPrefs.getBoolean(Keys.downloadBadge, false)
fun filterDownloaded() = flowPrefs.getInt(Keys.filterDownloaded, 0)

View file

@ -30,6 +30,8 @@ class LibraryCategoryAdapter(val controller: LibraryController) :
var showNumber = preferences.categoryNumberOfItems().get()
var showOutline = preferences.outlineOnCovers().get()
val hasActiveFilters: Boolean
get() = controller.hasActiveFilters

View file

@ -45,6 +45,7 @@ import com.bluelinelabs.conductor.ControllerChangeType
import com.github.florent37.viewtooltip.ViewTooltip
import com.google.android.material.snackbar.BaseTransientBottomBar
import com.google.android.material.snackbar.Snackbar
import com.tfcporciuncula.flow.Preference
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.SelectableAdapter
import eu.davidea.flexibleadapter.items.IFlexible
@ -906,7 +907,6 @@ class LibraryController(
}
}
@SuppressLint("NotifyDataSetChanged")
private fun setPreferenceFlows() {
listOf(
preferences.libraryLayout(),
@ -920,16 +920,17 @@ class LibraryController(
}
.launchIn(viewScope)
}
preferences.hideStartReadingButton().asFlow()
preferences.hideStartReadingButton().register()
preferences.outlineOnCovers().register { adapter.showOutline = it }
preferences.categoryNumberOfItems().register { adapter.showNumber = it }
}
@SuppressLint("NotifyDataSetChanged")
private fun <T> Preference<T>.register(onChanged: ((T) -> Unit)? = null) {
asFlow()
.drop(1)
.onEach {
adapter.notifyDataSetChanged()
}
.launchIn(viewScope)
preferences.categoryNumberOfItems().asFlow()
.drop(1)
.onEach {
adapter.showNumber = it
onChanged?.invoke(it)
adapter.notifyDataSetChanged()
}
.launchIn(viewScope)

View file

@ -13,6 +13,7 @@ import eu.kanade.tachiyomi.data.image.coil.loadManga
import eu.kanade.tachiyomi.databinding.MangaGridItemBinding
import eu.kanade.tachiyomi.util.lang.highlightText
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.view.setCards
/**
* Class used to hold the displayed data of a manga in the library, like the cover or the title.
@ -78,7 +79,9 @@ class LibraryGridHolder(
}
setUnreadBadge(binding.unreadDownloadBadge.badgeView, item)
setCards(adapter.showOutline, binding.card, binding.unreadDownloadBadge.badgeView)
setReadingButton(item)
setSelected(adapter.isSelected(flexibleAdapterPosition))
// Update the cover.
if (item.manga.thumbnail_url == null) binding.coverThumbnail.clear()
@ -101,7 +104,11 @@ class LibraryGridHolder(
fun setSelected(isSelected: Boolean) {
with(binding) {
card.strokeWidth = if (isSelected) 3.dpToPx else 1.dpToPx
card.strokeWidth = when {
isSelected -> 3.dpToPx
adapter.showOutline -> 1.dpToPx
else -> 0
}
arrayOf(card, unreadDownloadBadge.root, title, subtitle).forEach {
it.isSelected = isSelected
}

View file

@ -10,6 +10,7 @@ import eu.kanade.tachiyomi.data.image.coil.loadManga
import eu.kanade.tachiyomi.databinding.MangaListItemBinding
import eu.kanade.tachiyomi.util.lang.highlightText
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.view.setCards
/**
* Class used to hold the displayed data of a manga in the library, like the cover or the binding.title.
@ -67,6 +68,7 @@ class LibraryListHolder(
// Update the binding.title of the manga.
binding.title.text = item.manga.title.highlightText(item.filter, color)
setUnreadBadge(binding.unreadDownloadBadge.badgeView, item)
setCards(adapter.showOutline, binding.card, binding.unreadDownloadBadge.badgeView)
val authorArtist = if (item.manga.author == item.manga.artist || item.manga.artist.isNullOrBlank()) {
item.manga.author?.trim() ?: ""

View file

@ -32,6 +32,7 @@ class LibraryDisplayView @JvmOverloads constructor(context: Context, attrs: Attr
override fun initGeneralPreferences() {
binding.displayGroup.bindToPreference(preferences.libraryLayout())
binding.uniformGrid.bindToPreference(preferences.uniformGrid())
binding.outlineOnCovers.bindToPreference(preferences.outlineOnCovers())
binding.gridSeekbar.value = ((preferences.gridSize().get() + .5f) * 2f).roundToInt().toFloat()
binding.resetGridSize.setOnClickListener {
binding.gridSeekbar.value = 3f

View file

@ -23,6 +23,7 @@ class RecentMangaAdapter(val delegate: RecentsInterface) :
var showTitleFirst = preferences.showTitleFirstInRecents().get()
var showUpdatedTime = preferences.showUpdatedTime().get()
var uniformCovers = preferences.uniformGrid().get()
var showOutline = preferences.outlineOnCovers().get()
val viewType: Int
get() = delegate.getViewType()
@ -47,6 +48,7 @@ class RecentMangaAdapter(val delegate: RecentsInterface) :
preferences.showTitleFirstInRecents().register { showTitleFirst = it }
preferences.showUpdatedTime().register { showUpdatedTime = it }
preferences.uniformGrid().register { uniformCovers = it }
preferences.outlineOnCovers().register { showOutline = it }
}
private fun <T> Preference<T>.register(onChanged: (T) -> Unit) {

View file

@ -16,6 +16,7 @@ import eu.kanade.tachiyomi.util.chapter.ChapterUtil
import eu.kanade.tachiyomi.util.isLocal
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.timeSpanFromNow
import eu.kanade.tachiyomi.util.view.setCards
class RecentMangaHolder(
view: View,
@ -82,6 +83,8 @@ class RecentMangaHolder(
}
}
}
setCards(adapter.showOutline, binding.card, null)
binding.removeHistory.isVisible = item.mch.history.id != null && showRemoveHistory
val chapterName = if (item.mch.manga.hideChapterTitle(adapter.preferences)) {
val number = adapter.decimalFormat.format(item.chapter.chapter_number.toDouble())

View file

@ -24,5 +24,6 @@ class RecentsGeneralView @JvmOverloads constructor(context: Context, attrs: Attr
binding.showReadInAll.bindToPreference(preferences.showReadInAllRecents())
binding.showTitleFirst.bindToPreference(preferences.showTitleFirstInRecents())
binding.uniformCovers.bindToPreference(preferences.uniformGrid())
binding.outlineOnCovers.bindToPreference(preferences.outlineOnCovers())
}
}

View file

@ -6,7 +6,6 @@ import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import coil.Coil
import coil.clear
import coil.imageLoader
import coil.request.ImageRequest
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.items.IFlexible
@ -14,6 +13,7 @@ import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.image.coil.CoverViewTarget
import eu.kanade.tachiyomi.databinding.MangaGridItemBinding
import eu.kanade.tachiyomi.ui.library.LibraryCategoryAdapter
import eu.kanade.tachiyomi.util.view.setCards
/**
* Class used to hold the displayed data of a manga in the library, like the cover or the title.
@ -27,7 +27,8 @@ import eu.kanade.tachiyomi.ui.library.LibraryCategoryAdapter
class BrowseSourceGridHolder(
private val view: View,
private val adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>,
compact: Boolean
compact: Boolean,
showOutline: Boolean
) : BrowseSourceHolder(view, adapter) {
private val binding = MangaGridItemBinding.bind(view)
@ -38,6 +39,7 @@ class BrowseSourceGridHolder(
binding.compactTitle.isVisible = false
binding.gradient.isVisible = false
}
setCards(showOutline, binding.card, binding.unreadDownloadBadge.badgeView)
}
/**

View file

@ -23,7 +23,8 @@ import eu.kanade.tachiyomi.widget.AutofitRecyclerView
class BrowseSourceItem(
val manga: Manga,
private val catalogueAsList: Preference<Boolean>,
private val catalogueListType: Preference<Int>
private val catalogueListType: Preference<Int>,
private val outlineOnCovers: Preference<Boolean>
) :
AbstractFlexibleItem<BrowseSourceHolder>() {
@ -79,9 +80,9 @@ class BrowseSourceItem(
(parent.itemWidth / 3f * 3.7f).toInt()
)
}
BrowseSourceGridHolder(view, adapter, listType == 1)
BrowseSourceGridHolder(view, adapter, listType == 1, outlineOnCovers.get())
} else {
BrowseSourceListHolder(view, adapter)
BrowseSourceListHolder(view, adapter, outlineOnCovers.get())
}
}

View file

@ -11,6 +11,7 @@ import eu.davidea.flexibleadapter.items.IFlexible
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.image.coil.CoverViewTarget
import eu.kanade.tachiyomi.databinding.MangaListItemBinding
import eu.kanade.tachiyomi.util.view.setCards
/**
* Class used to hold the displayed data of a manga in the catalogue, like the cover or the title.
@ -20,11 +21,19 @@ import eu.kanade.tachiyomi.databinding.MangaListItemBinding
* @param adapter the adapter handling this holder.
* @constructor creates a new catalogue holder.
*/
class BrowseSourceListHolder(private val view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>) :
class BrowseSourceListHolder(
private val view: View,
adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>,
showOutline: Boolean
) :
BrowseSourceHolder(view, adapter) {
private val binding = MangaListItemBinding.bind(view)
init {
setCards(showOutline, binding.card, binding.unreadDownloadBadge.badgeView)
}
/**
* Method called from [CatalogueAdapter.onBindViewHolder]. It updates the data for this
* holder with the given manga.

View file

@ -167,6 +167,7 @@ open class BrowseSourcePresenter(
val browseAsList = prefs.browseAsList()
val sourceListType = prefs.libraryLayout()
val outlineCovers = prefs.outlineOnCovers()
// Prepare the pager.
pagerSubscription?.let { remove(it) }
@ -174,7 +175,7 @@ open class BrowseSourcePresenter(
.observeOn(Schedulers.io())
.map { it.first to it.second.map { networkToLocalManga(it, sourceId) } }
.doOnNext { initializeMangas(it.second) }
.map { it.first to it.second.map { BrowseSourceItem(it, browseAsList, sourceListType) } }
.map { it.first to it.second.map { BrowseSourceItem(it, browseAsList, sourceListType, outlineCovers) } }
.observeOn(AndroidSchedulers.mainThread())
.subscribeReplay(
{ view, (page, mangas) ->

View file

@ -410,6 +410,16 @@ fun MaterialCardView.makeShapeCorners(
.build()
}
fun setCards(
showOutline: Boolean,
mainCard: MaterialCardView,
badgeView: MaterialCardView?
) {
badgeView?.strokeWidth = if (showOutline) 0.75f.dpToPx.toInt() else 0
badgeView?.cardElevation = if (showOutline) 0f else 3f.dpToPx
mainCard.strokeWidth = if (showOutline) 1.dpToPx else 0
}
val View.backgroundColor
get() = (background as? ColorDrawable)?.color

View file

@ -102,6 +102,14 @@
android:layout_marginEnd="12dp"
android:text="@string/uniform_grid_covers" />
<com.google.android.material.checkbox.MaterialCheckBox
android:id="@+id/outline_on_covers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginEnd="12dp"
android:text="@string/show_outline_around_covers" />
<com.google.android.material.button.MaterialButton
android:id="@+id/reorder_filters_button"
android:layout_marginStart="8dp"

View file

@ -32,6 +32,8 @@
android:id="@+id/front_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false"
android:clipChildren="false"
android:layout_gravity="center_vertical"
android:background="@drawable/list_item_selector"
android:minHeight="@dimen/material_component_lists_single_line_with_avatar_height">
@ -196,7 +198,7 @@
app:barrierDirection="bottom"
app:constraint_referenced_ids="space,card_layout" />
<View
<Space
android:id="@+id/padding"
android:layout_width="0dp"
android:layout_height="6dp"

View file

@ -55,5 +55,13 @@
android:text="@string/uniform_covers"
android:textColor="?android:attr/textColorPrimary"
android:layout_marginTop="8dp" />
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/outline_on_covers"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_outline_around_covers"
android:textColor="?android:attr/textColorPrimary"
android:layout_marginTop="8dp" />
</LinearLayout>
</eu.kanade.tachiyomi.ui.recents.options.RecentsGeneralView>

View file

@ -4,6 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/badge_view"
app:strokeColor="@color/library_stroke_selector"
app:strokeWidth="0.75dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardElevation="0dp"

View file

@ -178,6 +178,7 @@
<string name="hide_start_reading_button">Hide start reading button</string>
<string name="badges">Badges</string>
<string name="uniform_grid_covers">Uniform grid covers</string>
<string name="show_outline_around_covers">Show outline around covers</string>
<string name="grid_size">Grid size</string>
<string name="_per_row">%d per row</string>
<string name="hide_unread_badges">Hide unread badges</string>