mirror of
https://github.com/null2264/yokai.git
synced 2025-06-21 10:44:42 +00:00
Option to disable outline for covers
This commit is contained in:
parent
694778515c
commit
7cc73ba503
20 changed files with 84 additions and 18 deletions
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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() ?: ""
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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) ->
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue