mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	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>
This commit is contained in:
		@@ -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
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -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,7 +33,22 @@ class SourceItem(val manga: Manga, private val displayMode: Preference<DisplayMo
 | 
			
		||||
        adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>
 | 
			
		||||
    ): SourceHolder<*> {
 | 
			
		||||
        return when (displayMode.get()) {
 | 
			
		||||
            DisplayModeSetting.COMPACT_GRID -> {
 | 
			
		||||
            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
 | 
			
		||||
@@ -50,21 +65,6 @@ class SourceItem(val manga: Manga, private val displayMode: Preference<DisplayMo
 | 
			
		||||
                }
 | 
			
		||||
                SourceCompactGridHolder(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)
 | 
			
		||||
            }
 | 
			
		||||
            DisplayModeSetting.LIST -> {
 | 
			
		||||
                SourceListHolder(view, adapter)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -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)
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -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,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
									
								
								app/src/main/res/layout/source_cover_only_grid_item.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								app/src/main/res/layout/source_cover_only_grid_item.xml
									
									
									
									
									
										Normal 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>
 | 
			
		||||
@@ -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>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user