Cover only grid added to library (#6528)

* No title grid added to library and source

* Else added to display title in case image is null or empty

* No title grid renamed and now only available in library

* Spanish strings about cover only grid removed

Co-authored-by: micaelagimenez <micaela.gimenez@ext.prosegur.com>
(cherry picked from commit 44b055c01986b6b4952ab4658e04cf236f922fa0)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceItem.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt
#	app/src/main/java/eu/kanade/tachiyomi/ui/library/setting/DisplayModeSetting.kt
This commit is contained in:
Mica 2022-02-12 15:03:22 -03:00 committed by Jobobby04
parent f133ddb14e
commit 5bad65c027
10 changed files with 187 additions and 63 deletions

View File

@ -358,7 +358,7 @@ open class BrowseSourceController(bundle: Bundle) :
(layoutManager as GridLayoutManager).spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return when (adapter?.getItemViewType(position)) {
R.layout.source_compact_grid_item, R.layout.source_comfortable_grid_item, null -> 1
R.layout.source_compact_grid_item, R.layout.source_comfortable_grid_item -> 1
else -> spanCount
}
}
@ -409,12 +409,9 @@ open class BrowseSourceController(bundle: Bundle) :
)
val displayItem = when (preferences.sourceDisplayMode().get()) {
DisplayModeSetting.COMPACT_GRID -> R.id.action_compact_grid
DisplayModeSetting.COMFORTABLE_GRID -> R.id.action_comfortable_grid
// SY -->
DisplayModeSetting.NO_TITLE_GRID -> R.id.action_no_title_grid
// SY <--
DisplayModeSetting.LIST -> R.id.action_list
DisplayModeSetting.COMFORTABLE_GRID -> R.id.action_comfortable_grid
else -> R.id.action_compact_grid
}
menu.findItem(displayItem).isChecked = true
// SY -->
@ -447,9 +444,6 @@ open class BrowseSourceController(bundle: Bundle) :
R.id.action_search -> expandActionViewFromInteraction = true
R.id.action_compact_grid -> setDisplayMode(DisplayModeSetting.COMPACT_GRID)
R.id.action_comfortable_grid -> setDisplayMode(DisplayModeSetting.COMFORTABLE_GRID)
// SY -->
R.id.action_no_title_grid -> setDisplayMode(DisplayModeSetting.NO_TITLE_GRID)
// SY <--
R.id.action_list -> setDisplayMode(DisplayModeSetting.LIST)
R.id.action_open_in_web_view -> openInWebView()
// SY -->

View File

@ -23,7 +23,7 @@ import exh.metadata.metadata.base.RaisedSearchMetadata
* @param adapter the adapter handling this holder.
* @constructor creates a new catalogue holder.
*/
class SourceComfortableGridHolder(private val view: View, private val adapter: FlexibleAdapter<*> /* SY --> */, private val hasTitle: Boolean /* SY <-- */) :
class SourceComfortableGridHolder(private val view: View, private val adapter: FlexibleAdapter<*>) :
SourceHolder<SourceComfortableGridItemBinding>(view, adapter) {
override val binding = SourceComfortableGridItemBinding.bind(view)
@ -37,9 +37,6 @@ class SourceComfortableGridHolder(private val view: View, private val adapter: F
override fun onSetValues(manga: Manga) {
// Set manga title
binding.title.text = manga.title
// SY -->
binding.title.isVisible = hasTitle
// SY <--
// Set alpha of thumbnail.
binding.thumbnail.alpha = if (manga.favorite) 0.3f else 1.0f

View File

@ -28,11 +28,15 @@ class SourceItem(val manga: Manga, private val displayMode: Preference<DisplayMo
// SY <--
override fun getLayoutRes(): Int {
return /* SY --> */ if (manga.isEhBasedManga() && preferences.enhancedEHentaiView().get()) R.layout.source_enhanced_ehentai_list_item
else /* SY <-- */ when (displayMode.get()) {
DisplayModeSetting.COMPACT_GRID -> R.layout.source_compact_grid_item
DisplayModeSetting.COMFORTABLE_GRID, /* SY --> */ DisplayModeSetting.NO_TITLE_GRID /* SY <-- */ -> R.layout.source_comfortable_grid_item
// SY -->
if (manga.isEhBasedManga() && preferences.enhancedEHentaiView().get()) {
return R.layout.source_enhanced_ehentai_list_item
}
// SY <--
return when (displayMode.get()) {
DisplayModeSetting.LIST -> R.layout.source_list_item
DisplayModeSetting.COMFORTABLE_GRID -> R.layout.source_comfortable_grid_item
else -> R.layout.source_compact_grid_item
}
}
@ -40,10 +44,28 @@ class SourceItem(val manga: Manga, private val displayMode: Preference<DisplayMo
view: View,
adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>
): SourceHolder<*> {
return /* SY --> */ if (manga.isEhBasedManga() && preferences.enhancedEHentaiView().get()) {
SourceEnhancedEHentaiListHolder(view, adapter)
} else /* SY <-- */ when (displayMode.get()) {
DisplayModeSetting.COMPACT_GRID -> {
// SY -->
if (manga.isEhBasedManga() && preferences.enhancedEHentaiView().get()) {
return SourceEnhancedEHentaiListHolder(view, adapter)
}
// SY <--
return when (displayMode.get()) {
DisplayModeSetting.LIST -> {
SourceListHolder(view, adapter)
}
DisplayModeSetting.COMFORTABLE_GRID -> {
val binding = SourceComfortableGridItemBinding.bind(view)
val parent = adapter.recyclerView as AutofitRecyclerView
val coverHeight = parent.itemWidth / 3 * 4
view.apply {
binding.card.layoutParams = ConstraintLayout.LayoutParams(
MATCH_PARENT,
coverHeight
)
}
SourceComfortableGridHolder(view, adapter)
}
else -> {
val binding = SourceCompactGridItemBinding.bind(view)
val parent = adapter.recyclerView as AutofitRecyclerView
val coverHeight = parent.itemWidth / 3 * 4
@ -60,21 +82,6 @@ class SourceItem(val manga: Manga, private val displayMode: Preference<DisplayMo
}
SourceCompactGridHolder(view, adapter)
}
DisplayModeSetting.COMFORTABLE_GRID /* SY --> */, DisplayModeSetting.NO_TITLE_GRID /* SY <-- */ -> {
val binding = SourceComfortableGridItemBinding.bind(view)
val parent = adapter.recyclerView as AutofitRecyclerView
val coverHeight = parent.itemWidth / 3 * 4
view.apply {
binding.card.layoutParams = ConstraintLayout.LayoutParams(
MATCH_PARENT,
coverHeight
)
}
SourceComfortableGridHolder(view, adapter, displayMode.get() != DisplayModeSetting.NO_TITLE_GRID)
}
DisplayModeSetting.LIST -> {
SourceListHolder(view, adapter)
}
}
}

View File

@ -24,10 +24,7 @@ import reactivecircus.flowbinding.android.view.clicks
*/
class LibraryComfortableGridHolder(
private val view: View,
adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>,
// SY -->
private val hasTitle: Boolean
// SY <--
adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>
) : LibraryHolder<SourceComfortableGridItemBinding>(view, adapter) {
override val binding = SourceComfortableGridItemBinding.bind(view)
@ -56,9 +53,6 @@ class LibraryComfortableGridHolder(
// SY <--
// Update the title of the manga.
binding.title.text = item.manga.title
// SY -->
binding.title.isVisible = hasTitle
// SY <--
// For rounded corners
binding.badges.leftBadges.clipToOutline = true

View File

@ -0,0 +1,60 @@
package eu.kanade.tachiyomi.ui.library
import android.view.View
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import coil.clear
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.items.IFlexible
import eu.kanade.tachiyomi.databinding.SourceCoverOnlyGridItemBinding
import eu.kanade.tachiyomi.util.view.loadAnyAutoPause
class LibraryCoverOnlyGridHolder(
view: View,
adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>
) : LibraryHolder<SourceCoverOnlyGridItemBinding>(view, adapter) {
override val binding = SourceCoverOnlyGridItemBinding.bind(view)
/**
* Method called from [LibraryCategoryAdapter.onBindViewHolder]. It updates the data for this
* holder with the given manga.
*
* @param item the manga item to bind.
*/
override fun onSetValues(item: LibraryItem) {
// For rounded corners
binding.badges.leftBadges.clipToOutline = true
binding.badges.rightBadges.clipToOutline = true
// Update the unread count and its visibility.
with(binding.badges.unreadText) {
isVisible = item.unreadCount > 0
text = item.unreadCount.toString()
}
// Update the download count and its visibility.
with(binding.badges.downloadText) {
isVisible = item.downloadCount > 0
text = item.downloadCount.toString()
}
// Update the source language and its visibility
with(binding.badges.languageText) {
isVisible = item.sourceLanguage.isNotEmpty()
text = item.sourceLanguage
}
// set local visibility if its local manga
binding.badges.localText.isVisible = item.isLocal
// For rounded corners
binding.card.clipToOutline = true
// Update the cover.
binding.thumbnail.clear()
if (!item.manga.thumbnail_url.isNullOrEmpty()) {
binding.thumbnail.loadAnyAutoPause(item.manga)
} else {
// Set manga title
binding.title.text = item.manga.title
}
}
}

View File

@ -15,6 +15,7 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.LibraryManga
import eu.kanade.tachiyomi.databinding.SourceComfortableGridItemBinding
import eu.kanade.tachiyomi.databinding.SourceCompactGridItemBinding
import eu.kanade.tachiyomi.databinding.SourceCoverOnlyGridItemBinding
import eu.kanade.tachiyomi.source.SourceManager
import eu.kanade.tachiyomi.ui.library.setting.DisplayModeSetting
import eu.kanade.tachiyomi.widget.AutofitRecyclerView
@ -51,13 +52,14 @@ class LibraryItem(
override fun getLayoutRes(): Int {
return when (getDisplayMode()) {
DisplayModeSetting.COMPACT_GRID -> R.layout.source_compact_grid_item
DisplayModeSetting.COMFORTABLE_GRID /* SY --> */, DisplayModeSetting.NO_TITLE_GRID /* SY <-- */ -> R.layout.source_comfortable_grid_item
DisplayModeSetting.COMFORTABLE_GRID -> R.layout.source_comfortable_grid_item
DisplayModeSetting.COVER_ONLY_GRID -> R.layout.source_cover_only_grid_item
DisplayModeSetting.LIST -> R.layout.source_list_item
}
}
override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): LibraryHolder<*> {
return when (val displayMode = getDisplayMode()) {
return when (getDisplayMode()) {
DisplayModeSetting.COMPACT_GRID -> {
val binding = SourceCompactGridItemBinding.bind(view)
val parent = adapter.recyclerView as AutofitRecyclerView
@ -72,7 +74,7 @@ class LibraryItem(
}
LibraryCompactGridHolder(view, adapter)
}
DisplayModeSetting.COMFORTABLE_GRID /* SY --> */, DisplayModeSetting.NO_TITLE_GRID /* SY <-- */ -> {
DisplayModeSetting.COMFORTABLE_GRID -> {
val binding = SourceComfortableGridItemBinding.bind(view)
val parent = adapter.recyclerView as AutofitRecyclerView
val coverHeight = parent.itemWidth / 3 * 4
@ -82,7 +84,19 @@ class LibraryItem(
coverHeight
)
}
LibraryComfortableGridHolder(view, adapter, displayMode != DisplayModeSetting.NO_TITLE_GRID)
LibraryComfortableGridHolder(view, adapter)
}
DisplayModeSetting.COVER_ONLY_GRID -> {
val binding = SourceCoverOnlyGridItemBinding.bind(view)
val parent = adapter.recyclerView as AutofitRecyclerView
val coverHeight = parent.itemWidth / 3 * 4
view.apply {
binding.card.layoutParams = ConstraintLayout.LayoutParams(
MATCH_PARENT,
coverHeight
)
}
LibraryCoverOnlyGridHolder(view, adapter)
}
DisplayModeSetting.LIST -> {
LibraryListHolder(view, adapter)

View File

@ -375,15 +375,11 @@ class LibrarySettingsSheet(
private val compactGrid = Item.Radio(R.string.action_display_grid, this)
private val comfortableGrid = Item.Radio(R.string.action_display_comfortable_grid, this)
// SY -->
private val noTitleGrid = Item.Radio(R.string.action_display_no_title_grid, this)
// SY <--
private val coverOnlyGrid = Item.Radio(R.string.action_display_cover_only_grid, this)
private val list = Item.Radio(R.string.action_display_list, this)
override val header = Item.Header(R.string.action_display_mode)
override val items = listOf(compactGrid, comfortableGrid, /* SY --> */ noTitleGrid /* SY <-- */, list)
override val items = listOf(compactGrid, comfortableGrid, coverOnlyGrid, list)
override val footer = null
override fun initModels() {
@ -407,9 +403,7 @@ class LibrarySettingsSheet(
fun setGroupSelections(mode: DisplayModeSetting) {
compactGrid.checked = mode == DisplayModeSetting.COMPACT_GRID
comfortableGrid.checked = mode == DisplayModeSetting.COMFORTABLE_GRID
// SY -->
noTitleGrid.checked = mode == DisplayModeSetting.NO_TITLE_GRID
// SY <--
coverOnlyGrid.checked = mode == DisplayModeSetting.COVER_ONLY_GRID
list.checked = mode == DisplayModeSetting.LIST
}
@ -417,9 +411,7 @@ class LibrarySettingsSheet(
val flag = when (item) {
compactGrid -> DisplayModeSetting.COMPACT_GRID
comfortableGrid -> DisplayModeSetting.COMFORTABLE_GRID
// SY -->
noTitleGrid -> DisplayModeSetting.NO_TITLE_GRID
// SY <--
coverOnlyGrid -> DisplayModeSetting.COVER_ONLY_GRID
list -> DisplayModeSetting.LIST
else -> throw NotImplementedError("Unknown display mode")
}

View File

@ -4,10 +4,7 @@ enum class DisplayModeSetting(val flag: Int) {
COMPACT_GRID(0b00000000),
COMFORTABLE_GRID(0b00000001),
LIST(0b00000010),
// SY -->
NO_TITLE_GRID(0b00000011);
// SY <--;
COVER_ONLY_GRID(0b00000011);
companion object {
const val MASK = 0b00000011

View File

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="2dp"
android:background="@drawable/library_item_selector"
android:foreground="@drawable/library_item_selector_overlay"
android:padding="4dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<FrameLayout
android:id="@+id/card"
android:layout_width="match_parent"
android:layout_height="220dp"
android:background="@drawable/rounded_rectangle"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorSurface"
android:scaleType="centerCrop"
tools:ignore="ContentDescription"
tools:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:ellipsize="end"
android:maxLines="2"
android:padding="8dp"
android:shadowColor="@color/md_black_1000"
android:shadowDx="0"
android:shadowDy="0"
android:shadowRadius="4"
android:textAppearance="?attr/textAppearanceTitleSmall"
android:textSize="12sp"
android:textColor="@color/md_white_1000"
tools:text="Sample name" />
<include
android:id="@+id/badges"
layout="@layout/source_grid_item_badges" />
<com.google.android.material.progressindicator.CircularProgressIndicator
android:id="@+id/progress"
style="@style/Widget.Tachiyomi.CircularProgressIndicator.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true"
android:visibility="gone" />
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>

View File

@ -91,6 +91,7 @@
<string name="action_display_grid">Compact grid</string>
<string name="action_display_comfortable_grid">Comfortable grid</string>
<string name="action_display_list">List</string>
<string name="action_display_cover_only_grid">Cover only grid</string>
<string name="action_display_download_badge">Downloaded chapters</string>
<string name="action_display_unread_badge">Unread chapters</string>
<string name="action_display_local_badge">Local manga</string>