Эх сурвалжийг харах

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 <[email protected]>
Mica 3 жил өмнө
parent
commit
44b055c019

+ 3 - 3
app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt

@@ -222,7 +222,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
                         }
                     }
@@ -273,9 +273,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
             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
     }

+ 18 - 18
app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceItem.kt

@@ -22,9 +22,9 @@ class SourceItem(val manga: Manga, private val displayMode: Preference<DisplayMo
 
     override fun getLayoutRes(): Int {
         return when (displayMode.get()) {
-            DisplayModeSetting.COMPACT_GRID -> R.layout.source_compact_grid_item
-            DisplayModeSetting.COMFORTABLE_GRID -> R.layout.source_comfortable_grid_item
             DisplayModeSetting.LIST -> R.layout.source_list_item
+            DisplayModeSetting.COMFORTABLE_GRID -> R.layout.source_comfortable_grid_item
+            else -> R.layout.source_compact_grid_item
         }
     }
 
@@ -33,37 +33,37 @@ class SourceItem(val manga: Manga, private val displayMode: Preference<DisplayMo
         adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>
     ): SourceHolder<*> {
         return when (displayMode.get()) {
-            DisplayModeSetting.COMPACT_GRID -> {
-                val binding = SourceCompactGridItemBinding.bind(view)
+            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 = FrameLayout.LayoutParams(
+                    binding.card.layoutParams = ConstraintLayout.LayoutParams(
                         MATCH_PARENT,
                         coverHeight
                     )
-                    binding.gradient.layoutParams = FrameLayout.LayoutParams(
-                        MATCH_PARENT,
-                        coverHeight / 2,
-                        Gravity.BOTTOM
-                    )
                 }
-                SourceCompactGridHolder(view, adapter)
+                SourceComfortableGridHolder(view, adapter)
             }
-            DisplayModeSetting.COMFORTABLE_GRID -> {
-                val binding = SourceComfortableGridItemBinding.bind(view)
+            else -> {
+                val binding = SourceCompactGridItemBinding.bind(view)
                 val parent = adapter.recyclerView as AutofitRecyclerView
                 val coverHeight = parent.itemWidth / 3 * 4
                 view.apply {
-                    binding.card.layoutParams = ConstraintLayout.LayoutParams(
+                    binding.card.layoutParams = FrameLayout.LayoutParams(
                         MATCH_PARENT,
                         coverHeight
                     )
+                    binding.gradient.layoutParams = FrameLayout.LayoutParams(
+                        MATCH_PARENT,
+                        coverHeight / 2,
+                        Gravity.BOTTOM
+                    )
                 }
-                SourceComfortableGridHolder(view, adapter)
-            }
-            DisplayModeSetting.LIST -> {
-                SourceListHolder(view, adapter)
+                SourceCompactGridHolder(view, adapter)
             }
         }
     }

+ 60 - 0
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCoverOnlyGridHolder.kt

@@ -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
+        }
+    }
+}

+ 14 - 0
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt

@@ -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
@@ -48,6 +49,7 @@ class LibraryItem(
         return when (getDisplayMode()) {
             DisplayModeSetting.COMPACT_GRID -> R.layout.source_compact_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
         }
     }
@@ -80,6 +82,18 @@ class LibraryItem(
                 }
                 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)
             }

+ 4 - 1
app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt

@@ -315,10 +315,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)
+            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, list)
+            override val items = listOf(compactGrid, comfortableGrid, coverOnlyGrid, list)
             override val footer = null
 
             override fun initModels() {
@@ -342,6 +343,7 @@ class LibrarySettingsSheet(
             fun setGroupSelections(mode: DisplayModeSetting) {
                 compactGrid.checked = mode == DisplayModeSetting.COMPACT_GRID
                 comfortableGrid.checked = mode == DisplayModeSetting.COMFORTABLE_GRID
+                coverOnlyGrid.checked = mode == DisplayModeSetting.COVER_ONLY_GRID
                 list.checked = mode == DisplayModeSetting.LIST
             }
 
@@ -349,6 +351,7 @@ class LibrarySettingsSheet(
                 val flag = when (item) {
                     compactGrid -> DisplayModeSetting.COMPACT_GRID
                     comfortableGrid -> DisplayModeSetting.COMFORTABLE_GRID
+                    coverOnlyGrid -> DisplayModeSetting.COVER_ONLY_GRID
                     list -> DisplayModeSetting.LIST
                     else -> throw NotImplementedError("Unknown display mode")
                 }

+ 3 - 2
app/src/main/java/eu/kanade/tachiyomi/ui/library/setting/DisplayModeSetting.kt

@@ -3,10 +3,11 @@ package eu.kanade.tachiyomi.ui.library.setting
 enum class DisplayModeSetting(val flag: Int) {
     COMPACT_GRID(0b00000000),
     COMFORTABLE_GRID(0b00000001),
-    LIST(0b00000010);
+    LIST(0b00000010),
+    COVER_ONLY_GRID(0b00000100);
 
     companion object {
-        const val MASK = 0b00000011
+        const val MASK = 0b00000111
 
         fun fromFlag(flag: Int?): DisplayModeSetting {
             return values()

+ 68 - 0
app/src/main/res/layout/source_cover_only_grid_item.xml

@@ -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>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -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>