diff --git a/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt b/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt index c04a39dd7..b27dc3ab6 100644 --- a/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt +++ b/app/src/main/java/io/legato/kazusa/constant/PreferKey.kt @@ -190,4 +190,6 @@ object PreferKey { const val themePref = "themePref" const val bookshelfSortOrder = "bookshelfSortOrder" const val showBottomView = "showBottomView" + const val mangaScrollMode = "mangaScrollMode" + const val webtoonSidePaddingDp = "webtoonSidePaddingDp" } diff --git a/app/src/main/java/io/legato/kazusa/data/entities/Book.kt b/app/src/main/java/io/legato/kazusa/data/entities/Book.kt index 1a2cbe5d6..8548c8f25 100644 --- a/app/src/main/java/io/legato/kazusa/data/entities/Book.kt +++ b/app/src/main/java/io/legato/kazusa/data/entities/Book.kt @@ -403,6 +403,8 @@ data class Book( var startDate: LocalDate? = null, var startChapter: Int? = null, // 用户设置的起始章节 var dailyChapters: Int = 3 // 用户设置的每日更新章节数 + + ) : Parcelable class Converters { diff --git a/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt b/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt index 81810a9ce..1c07c58ce 100644 --- a/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt +++ b/app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt @@ -5,6 +5,7 @@ import android.os.Build import io.legato.kazusa.BuildConfig import io.legato.kazusa.constant.PreferKey import io.legato.kazusa.data.appDb +import io.legato.kazusa.ui.book.manga.config.MangaScrollMode import io.legato.kazusa.utils.canvasrecorder.CanvasRecorderFactory import io.legato.kazusa.utils.getPrefBoolean import io.legato.kazusa.utils.getPrefInt @@ -664,6 +665,14 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { appCtx.putPrefBoolean(PreferKey.enableMangaHorizontalScroll, value) } + //漫画滚动方式 + var mangaScrollMode: Int + get() = appCtx.getPrefInt(PreferKey.mangaScrollMode, MangaScrollMode.PAGE_RIGHT_TO_LEFT) + set(value) { + appCtx.putPrefInt(PreferKey.mangaScrollMode, value) + } + + //漫画滤镜 var mangaColorFilter get() = appCtx.getPrefString(PreferKey.mangaColorFilter, "") set(value) { @@ -701,5 +710,12 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { set(value) { appCtx.putPrefBoolean(PreferKey.enableMangaGray, value) } + + var webtoonSidePaddingDp: Int + get() = appCtx.getPrefInt(PreferKey.webtoonSidePaddingDp, 0) + set(value) { + appCtx.putPrefInt(PreferKey.webtoonSidePaddingDp, value) + } + } diff --git a/app/src/main/java/io/legato/kazusa/model/ReadManga.kt b/app/src/main/java/io/legato/kazusa/model/ReadManga.kt index f76662acb..ab6d8aa4a 100644 --- a/app/src/main/java/io/legato/kazusa/model/ReadManga.kt +++ b/app/src/main/java/io/legato/kazusa/model/ReadManga.kt @@ -607,7 +607,7 @@ object ReadManga : CoroutineScope by MainScope() { if (imageCount == 0 && chapter.isVolume) { pages.add(ReaderLoading(chapter.index, -1, chapter.title, true)) } else { - pages.add(ReaderLoading(chapter.index, -1, "阅读 ${chapter.title}")) + pages.add(ReaderLoading(chapter.index, -1, "下一章 ${chapter.title}")) pages.addAll(list) pages.add(ReaderLoading(chapter.index, imageCount, "已读完 ${chapter.title}")) } diff --git a/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaActivity.kt b/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaActivity.kt index 1ed13d4bb..83b09b1f0 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/manga/ReadMangaActivity.kt @@ -12,6 +12,7 @@ import android.view.WindowManager import android.view.animation.LinearInterpolator import androidx.activity.viewModels import androidx.appcompat.app.AlertDialog +import androidx.core.view.doOnLayout import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope @@ -45,6 +46,8 @@ import io.legato.kazusa.ui.book.manga.config.MangaColorFilterConfig import io.legato.kazusa.ui.book.manga.config.MangaColorFilterDialog import io.legato.kazusa.ui.book.manga.config.MangaFooterConfig import io.legato.kazusa.ui.book.manga.config.MangaFooterSettingDialog +import io.legato.kazusa.ui.book.manga.config.MangaScrollMode +import io.legato.kazusa.ui.book.manga.config.MangaScrollModeDialog import io.legato.kazusa.ui.book.manga.entities.BaseMangaPage import io.legato.kazusa.ui.book.manga.entities.MangaPage import io.legato.kazusa.ui.book.manga.recyclerview.MangaAdapter @@ -77,11 +80,13 @@ import kotlin.math.ceil class ReadMangaActivity : VMBaseActivity(), ReadManga.Callback, ChangeBookSourceDialog.CallBack, MangaMenu.CallBack, - MangaColorFilterDialog.Callback, ScrollTimer.ScrollCallback, MangaFooterSettingDialog.Callback { + MangaColorFilterDialog.Callback, ScrollTimer.ScrollCallback, MangaFooterSettingDialog.Callback, + MangaScrollModeDialog.Callback { private val mLayoutManager by lazy { MangaLayoutManager(this) } + private val mAdapter: MangaAdapter by lazy { MangaAdapter(this) } @@ -99,6 +104,8 @@ class ReadMangaActivity : VMBaseActivity? = null private val networkChangedListener by lazy { @@ -192,7 +199,8 @@ class ReadMangaActivity : VMBaseActivity if (mAdapter.isNotEmpty()) { val item = mAdapter.getItem(position) @@ -431,10 +440,26 @@ class ReadMangaActivity : VMBaseActivity { - item.isChecked = !item.isChecked - AppConfig.disableMangaScale = item.isChecked - setDisableMangaScale(item.isChecked) - } - - R.id.menu_disable_click_scroll -> { - item.isChecked = !item.isChecked - AppConfig.disableClickScroll = item.isChecked - setDisableClickScroll(item.isChecked) - } - - R.id.menu_enable_horizontal_scroll -> { - item.isChecked = !item.isChecked - AppConfig.enableMangaHorizontalScroll = item.isChecked - mMenu?.findItem(R.id.menu_disable_horizontal_animation)?.isVisible = item.isChecked - setHorizontalScroll(item.isChecked) - mAdapter.notifyDataSetChanged() - } - R.id.menu_manga_color_filter -> { binding.mangaMenu.runMenuOut() showDialogFragment(MangaColorFilterDialog()) } - R.id.menu_enable_auto_scroll -> { - item.isChecked = !item.isChecked - mScrollTimer.isEnabled = item.isChecked - - enableAutoScroll = item.isChecked - enableAutoScrollPage = false - mScrollTimer.isEnabledPage = false - - if (enableAutoScroll) { - mPagerSnapHelper.attachToRecyclerView(null) - } else if (AppConfig.enableMangaHorizontalScroll) { - mPagerSnapHelper.attachToRecyclerView(binding.recyclerView) - } - } - R.id.menu_hide_manga_title -> { item.isChecked = !item.isChecked AppConfig.hideMangaTitle = item.isChecked @@ -577,6 +567,40 @@ class ReadMangaActivity : VMBaseActivity { + mLayoutManager.orientation = LinearLayoutManager.HORIZONTAL + mLayoutManager.reverseLayout = false + } + + MangaScrollMode.PAGE_RIGHT_TO_LEFT -> { + mLayoutManager.orientation = LinearLayoutManager.HORIZONTAL + mLayoutManager.reverseLayout = true + } + + MangaScrollMode.PAGE_TOP_TO_BOTTOM, + MangaScrollMode.WEBTOON, + MangaScrollMode.WEBTOON_WITH_GAP -> { + mLayoutManager.orientation = LinearLayoutManager.VERTICAL + mLayoutManager.reverseLayout = false + } + } + + mAdapter.isHorizontal = isHorizontalPage || mode == MangaScrollMode.PAGE_TOP_TO_BOTTOM + + if (!isWebtoon) { + mPagerSnapHelper.attachToRecyclerView(binding.recyclerView) + } else { + mPagerSnapHelper.attachToRecyclerView(null) + } + + mAdapter.notifyDataSetChanged() + } + + /** + * 调整条漫侧边留白设置 + * @param paddingDp 侧边留白距离,单位dp,默认16dp + */ + private fun updateWebtoonSidePadding(paddingDp: Int) { + if (scrollMode != MangaScrollMode.WEBTOON && scrollMode != MangaScrollMode.WEBTOON_WITH_GAP) { + // 非条漫模式,取消留白 + binding.recyclerView.setPadding(0, 0, 0, 0) + binding.recyclerView.clipToPadding = true + return + } + + binding.recyclerView.doOnLayout { recyclerView -> + val width = recyclerView.width + if (paddingDp == 0) { + recyclerView.setPadding(0, 0, 0, 0) + } else if (width > 0) { + val paddingPx = (width * paddingDp / 100).toInt() + recyclerView.setPadding(paddingPx, 0, paddingPx, 0) + } + } + + } + + private fun setRecyclerViewPreloader(maxPreload: Int) { if (mRecyclerViewPreloader != null) { binding.recyclerView.removeOnScrollListener(mRecyclerViewPreloader!!) @@ -658,33 +767,11 @@ class ReadMangaActivity : VMBaseActivity - callback?.onAutoPageToggle(isChecked) - initAutoPageSpeed(isChecked) - } - } - binding.btnColorFilter.setOnClickListener { callback?.showColorFilterConfig() dismiss() } - initAutoPageSpeed(initialAutoPageEnabled) - updateChapterText() } - private fun initAutoPageSpeed(boolean: Boolean) { - TransitionManager.beginDelayedTransition(binding.rootView) - binding.scvAutoPageSpeed.run { - isEnabled = boolean - valueFormat = { "$it 秒" } - progress = initialAutoPageSpeed - - onChanged = { newValue -> - callback?.onAutoPageSpeedChanged(newValue) - } - } - } - override fun onDismiss(dialog: DialogInterface) { super.onDismiss(dialog) AppConfig.mangaFooterConfig = GSON.toJson(config) diff --git a/app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaScrollMode.kt b/app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaScrollMode.kt new file mode 100644 index 000000000..4013f737e --- /dev/null +++ b/app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaScrollMode.kt @@ -0,0 +1,27 @@ +package io.legato.kazusa.ui.book.manga.config + +object MangaScrollMode { + const val PAGE_LEFT_TO_RIGHT = 1 // 单页式(从左到右) + const val PAGE_RIGHT_TO_LEFT = 2 // 单页式(从右到左) + const val PAGE_TOP_TO_BOTTOM = 3 // 单页式(从上到下) + const val WEBTOON = 4 // 条漫 + const val WEBTOON_WITH_GAP = 5 // 条漫(页面有空隙) + + val ALL = listOf( + PAGE_LEFT_TO_RIGHT, + PAGE_RIGHT_TO_LEFT, + PAGE_TOP_TO_BOTTOM, + WEBTOON, + WEBTOON_WITH_GAP + ) + + fun labelOf(mode: Int): String = when (mode) { + PAGE_LEFT_TO_RIGHT -> "单页式(从左到右)" + PAGE_RIGHT_TO_LEFT -> "单页式(从右到左)" + PAGE_TOP_TO_BOTTOM -> "单页式(从上到下)" + WEBTOON -> "条漫" + WEBTOON_WITH_GAP -> "条漫(页面有空隙)" + else -> "未知" + } +} + diff --git a/app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaScrollModeDialog.kt b/app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaScrollModeDialog.kt new file mode 100644 index 000000000..f6ff9cb01 --- /dev/null +++ b/app/src/main/java/io/legato/kazusa/ui/book/manga/config/MangaScrollModeDialog.kt @@ -0,0 +1,103 @@ +package io.legato.kazusa.ui.book.manga.config + +import android.os.Bundle +import android.view.View +import androidx.transition.TransitionManager +import com.google.android.material.chip.Chip +import io.legato.kazusa.R +import io.legato.kazusa.base.BaseBottomSheetDialogFragment +import io.legato.kazusa.databinding.DialogMangaScrollModeBinding +import io.legato.kazusa.help.config.AppConfig +import io.legato.kazusa.utils.viewbindingdelegate.viewBinding + +class MangaScrollModeDialog : BaseBottomSheetDialogFragment(R.layout.dialog_manga_scroll_mode) { + + private val binding by viewBinding(DialogMangaScrollModeBinding::bind) + + var initialScrollMode: Int = AppConfig.mangaScrollMode + var initialAutoPageSpeed: Int = AppConfig.mangaAutoPageSpeed + var initialSidePadding: Int = AppConfig.webtoonSidePaddingDp + var initialAutoPageEnabled: Boolean = false + var callback: Callback? = null + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + initView() + } + + private fun initView() { + binding.chipGroupScrollMode.removeAllViews() + + MangaScrollMode.ALL.forEach { mode -> + binding.chipGroupScrollMode.addView(Chip(requireContext()).apply { + text = MangaScrollMode.labelOf(mode) + isCheckable = true + isChecked = (mode == initialScrollMode) + + setOnClickListener { + AppConfig.mangaScrollMode = mode + callback?.onScrollModeChanged(mode) + binding.chipAutoPage.isChecked = false + } + }) + } + + binding.chipAutoPage.run { + isChecked = initialAutoPageEnabled + setOnCheckedChangeListener { _, isChecked -> + callback?.onAutoPageToggle(isChecked) + initAutoPageSpeed(isChecked) + } + } + + binding.checkboxDisableClickScroll.apply { + isChecked = AppConfig.disableClickScroll + setOnCheckedChangeListener { _, isChecked -> + AppConfig.disableClickScroll = isChecked + callback?.onClickScrollDisabledChanged(isChecked) + } + } + + binding.checkboxDisableMangaScale.apply { + isChecked = AppConfig.disableMangaScale + setOnCheckedChangeListener { _, isChecked -> + AppConfig.disableMangaScale = isChecked + callback?.onMangaScaleDisabledChanged(isChecked) + } + } + + binding.scvPadding.apply { + valueFormat = { "$it %" } + progress = initialSidePadding + onChanged = { newValue -> + callback?.upSidePadding(newValue) + initialSidePadding = newValue + } + } + + initAutoPageSpeed(initialAutoPageEnabled) + } + + private fun initAutoPageSpeed(boolean: Boolean) { + TransitionManager.beginDelayedTransition(binding.rootView) + binding.scvAutoPageSpeed.run { + isEnabled = boolean + valueFormat = { "$it 秒" } + progress = initialAutoPageSpeed + + onChanged = { newValue -> + callback?.onAutoPageSpeedChanged(newValue) + initialAutoPageSpeed = newValue + } + } + } + + interface Callback { + fun onAutoPageToggle(enable: Boolean) + fun onAutoPageSpeedChanged(speed: Int) + fun onScrollModeChanged(mode: Int) + fun onClickScrollDisabledChanged(disabled: Boolean) + fun onMangaScaleDisabledChanged(disabled: Boolean) + fun upSidePadding(padding: Int) + } + +} diff --git a/app/src/main/java/io/legato/kazusa/ui/book/manga/recyclerview/MangaAdapter.kt b/app/src/main/java/io/legato/kazusa/ui/book/manga/recyclerview/MangaAdapter.kt index 4415df975..94472a5ef 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/manga/recyclerview/MangaAdapter.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/manga/recyclerview/MangaAdapter.kt @@ -30,7 +30,6 @@ import io.legato.kazusa.ui.book.manga.entities.EpaperTransformation import io.legato.kazusa.ui.book.manga.entities.GrayscaleTransformation import io.legato.kazusa.ui.book.manga.entities.MangaPage import io.legato.kazusa.ui.book.manga.entities.ReaderLoading -import io.legato.kazusa.utils.dpToPx class MangaAdapter(private val context: Context) : @@ -47,6 +46,8 @@ class MangaAdapter(private val context: Context) : } var isHorizontal = false + var enableDoublePageInLandscape = false + private val mDiffCallback: DiffUtil.ItemCallback = object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean { @@ -131,19 +132,20 @@ class MangaAdapter(private val context: Context) : inner class PageMoreViewHolder(val binding: ItemBookMangaEdgeBinding) : RecyclerView.ViewHolder(binding.root) { fun onBind(item: ReaderLoading) { - val message = item.mMessage - binding.text.text = message - itemView.updateLayoutParams { - height = if (item.isVolume) { - MATCH_PARENT - } else { - 96.dpToPx() - } + val message = item.mMessage ?: "" + val parts = message.split(" ", limit = 2) + if (parts.size == 2) { + binding.text.text = parts[0] + binding.textChapter.text = parts[1] + } else { + binding.text.text = message + binding.textChapter.text = "" } } } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when { viewType >= TYPE_FOOTER_VIEW -> { diff --git a/app/src/main/java/io/legato/kazusa/ui/book/manga/recyclerview/ScrollTimer.kt b/app/src/main/java/io/legato/kazusa/ui/book/manga/recyclerview/ScrollTimer.kt index f5ee45c49..03ad76af8 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/manga/recyclerview/ScrollTimer.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/manga/recyclerview/ScrollTimer.kt @@ -63,13 +63,13 @@ class ScrollTimer( mScrollPageJob = coroutineScope.launch { while (isActive) { delay(distance.times(1000L)) - callback.scrollPage() + callback.scrollPage(1) } } } interface ScrollCallback { fun scrollBy(distance: Int) - fun scrollPage() + fun scrollPage(direction: Int) } } \ No newline at end of file diff --git a/app/src/main/java/io/legato/kazusa/ui/book/read/MangaMenu.kt b/app/src/main/java/io/legato/kazusa/ui/book/read/MangaMenu.kt index b281a4f12..03de20a96 100644 --- a/app/src/main/java/io/legato/kazusa/ui/book/read/MangaMenu.kt +++ b/app/src/main/java/io/legato/kazusa/ui/book/read/MangaMenu.kt @@ -243,7 +243,7 @@ class MangaMenu @JvmOverloads constructor( } btnAutoPage.setOnClickListener { - callBack.showFooterConfig() + callBack.showScrollModeDialog() } } @@ -263,6 +263,7 @@ class MangaMenu @JvmOverloads constructor( fun skipToPage(index: Int) fun openCatalog() fun showFooterConfig() + fun showScrollModeDialog() } } \ No newline at end of file diff --git a/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt b/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt index 4cf16d544..92bf5cfd6 100644 --- a/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt @@ -10,6 +10,7 @@ import android.view.MotionEvent import android.view.ViewGroup import androidx.activity.addCallback import androidx.activity.viewModels +import androidx.core.view.get import androidx.core.view.postDelayed import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager @@ -17,6 +18,7 @@ import androidx.fragment.app.FragmentStatePagerAdapter import androidx.lifecycle.lifecycleScope import androidx.viewpager.widget.ViewPager import com.google.android.material.bottomnavigation.BottomNavigationView +import com.google.android.material.navigation.NavigationBarView import io.legato.kazusa.BuildConfig import io.legato.kazusa.R import io.legato.kazusa.base.VMBaseActivity @@ -37,10 +39,12 @@ import io.legato.kazusa.ui.about.CrashLogsDialog import io.legato.kazusa.ui.main.bookshelf.BaseBookshelfFragment import io.legato.kazusa.ui.main.bookshelf.books.BookshelfFragment1 import io.legato.kazusa.ui.main.bookshelf.books.BookshelfFragment2 +import io.legato.kazusa.ui.main.bookshelf.books.BookshelfFragment3 import io.legato.kazusa.ui.main.explore.ExploreFragment import io.legato.kazusa.ui.main.my.MyFragment import io.legato.kazusa.ui.main.rss.RssFragment import io.legato.kazusa.ui.widget.dialog.TextDialog +import io.legato.kazusa.utils.gone import io.legato.kazusa.utils.hideSoftInput import io.legato.kazusa.utils.isCreated import io.legato.kazusa.utils.observeEvent @@ -48,16 +52,12 @@ import io.legato.kazusa.utils.shouldHideSoftInput import io.legato.kazusa.utils.showDialogFragment import io.legato.kazusa.utils.toastOnUi import io.legato.kazusa.utils.viewbindingdelegate.viewBinding +import io.legato.kazusa.utils.visible import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine -import androidx.core.view.get -import com.google.android.material.navigation.NavigationBarView -import io.legato.kazusa.ui.main.bookshelf.books.BookshelfFragment3 -import io.legato.kazusa.utils.gone -import io.legato.kazusa.utils.visible /** * 主界面 @@ -90,7 +90,6 @@ class MainActivity : VMBaseActivity(), getNavigationBarView().getOrCreateBadge(R.id.menu_bookshelf) } - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -382,32 +381,25 @@ class MainActivity : VMBaseActivity(), ) } - private fun upBottomMenu() { - if (AppConfig.showBottomView) - { - getNavigationBarView().visible() - val showDiscovery = AppConfig.showDiscovery - val showRss = AppConfig.showRSS - val menu = getNavigationBarView().menu - menu.findItem(R.id.menu_discovery).isVisible = showDiscovery - menu.findItem(R.id.menu_rss).isVisible = showRss - - var index = 0 - if (showDiscovery) { - index++ - realPositions[index] = idExplore - } - if (showRss) { - index++ - realPositions[index] = idRss - } + val menu = getNavigationBarView().menu + menu.findItem(R.id.menu_discovery).isVisible = AppConfig.showDiscovery + menu.findItem(R.id.menu_rss).isVisible = AppConfig.showRSS + var index = 0 + if (AppConfig.showDiscovery) { index++ - realPositions[index] = idMy - bottomMenuCount = index + 1 - adapter.notifyDataSetChanged() + realPositions[index] = idExplore } - else getNavigationBarView().gone() + if (AppConfig.showRSS) { + index++ + realPositions[index] = idRss + } + index++ + realPositions[index] = idMy + bottomMenuCount = index + 1 + adapter.notifyDataSetChanged() + if (AppConfig.showBottomView) getNavigationBarView().visible() + else binding.bottomNavigationView?.gone() } private fun upHomePage() { @@ -450,7 +442,6 @@ class MainActivity : VMBaseActivity(), } - private inner class TabFragmentPageAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { diff --git a/app/src/main/java/io/legato/kazusa/ui/widget/DetailSeekBar.kt b/app/src/main/java/io/legato/kazusa/ui/widget/DetailSeekBar.kt index 548387d7a..36934bc63 100644 --- a/app/src/main/java/io/legato/kazusa/ui/widget/DetailSeekBar.kt +++ b/app/src/main/java/io/legato/kazusa/ui/widget/DetailSeekBar.kt @@ -44,6 +44,12 @@ class DetailSeekBar @JvmOverloads constructor( binding.slider.valueTo = value.toFloat() } + var min: Int + get() = binding.slider.valueFrom.toInt() + set(value) { + binding.slider.valueFrom = value.toFloat() + } + init { val typedArray = context.obtainStyledAttributes(attrs, R.styleable.DetailSeekBar) isBottomBackground = @@ -57,17 +63,6 @@ class DetailSeekBar @JvmOverloads constructor( binding.slider.valueTo = typedArray.getInteger(R.styleable.DetailSeekBar_max, 0).toFloat() typedArray.recycle() - binding.ivSeekPlus.setOnClickListener { - val newValue = (binding.slider.value + 1).coerceAtMost(binding.slider.valueTo) - binding.slider.value = newValue - onChanged?.invoke(newValue.toInt()) - } - - binding.ivSeekReduce.setOnClickListener { - val newValue = (binding.slider.value - 1).coerceAtLeast(binding.slider.valueFrom) - binding.slider.value = newValue - onChanged?.invoke(newValue.toInt()) - } binding.slider.addOnChangeListener { _, value, fromUser -> upValue(value.toInt()) diff --git a/app/src/main/java/io/legato/kazusa/ui/widget/SimpleCounterView.kt b/app/src/main/java/io/legato/kazusa/ui/widget/SimpleCounterView.kt index 27c2b9483..5a6c2206c 100644 --- a/app/src/main/java/io/legato/kazusa/ui/widget/SimpleCounterView.kt +++ b/app/src/main/java/io/legato/kazusa/ui/widget/SimpleCounterView.kt @@ -23,6 +23,7 @@ class SimpleCounterView @JvmOverloads constructor( private var _progress = 0 private var _max = 100 + private var _min = 0 private val isBottomBackground: Boolean var valueFormat: ((Int) -> String)? = null @@ -39,7 +40,7 @@ class SimpleCounterView @JvmOverloads constructor( var progress: Int get() = _progress set(value) { - _progress = value.coerceIn(0, _max) + _progress = value.coerceIn(_min, _max) updateValue() } @@ -51,11 +52,22 @@ class SimpleCounterView @JvmOverloads constructor( updateValue() } + var min: Int + get() = _min + set(value) { + _min = value + _progress = _progress.coerceAtLeast(_min) + updateValue() + } + init { val typedArray = context.obtainStyledAttributes(attrs, R.styleable.DetailSeekBar) isBottomBackground = typedArray.getBoolean(R.styleable.DetailSeekBar_isBottomBackground, false) val title = typedArray.getText(R.styleable.DetailSeekBar_title) _max = typedArray.getInt(R.styleable.DetailSeekBar_max, 100) + _min = typedArray.getInt(R.styleable.DetailSeekBar_min, 0) + _progress = _progress.coerceIn(_min, _max) + typedArray.recycle() binding.tvSeekTitle.text = title @@ -70,7 +82,7 @@ class SimpleCounterView @JvmOverloads constructor( } binding.ivSeekReduce.setOnClickListener { - if (_progress > 0) { + if (_progress > _min) { _progress-- updateValue() onChanged?.invoke(_progress) @@ -119,6 +131,7 @@ class SimpleCounterView @JvmOverloads constructor( customView { val detailSeekBar = DetailSeekBar(ctx).apply { max = _max + min = _min progress = _progress valueFormat = this@SimpleCounterView.valueFormat setTitle(binding.tvSeekTitle.text) @@ -168,7 +181,7 @@ class SimpleCounterView @JvmOverloads constructor( private val decrementRunnable = object : Runnable { override fun run() { - if (_progress > 0) { + if (_progress > _min) { _progress-- updateValue() onChanged?.invoke(_progress) diff --git a/app/src/main/res/drawable/ic_filter.xml b/app/src/main/res/drawable/ic_filter.xml new file mode 100644 index 000000000..358b41c15 --- /dev/null +++ b/app/src/main/res/drawable/ic_filter.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_manga.xml b/app/src/main/res/layout/activity_manga.xml index d2daa47de..64790df08 100644 --- a/app/src/main/res/layout/activity_manga.xml +++ b/app/src/main/res/layout/activity_manga.xml @@ -8,7 +8,8 @@ + android:layout_height="match_parent" + android:background="@color/black"> - + app:indicatorSize="40dp" /> @@ -78,10 +78,11 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" /> - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_manga_scroll_mode.xml b/app/src/main/res/layout/dialog_manga_scroll_mode.xml new file mode 100644 index 000000000..493c9d91a --- /dev/null +++ b/app/src/main/res/layout/dialog_manga_scroll_mode.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_book_manga_edge.xml b/app/src/main/res/layout/item_book_manga_edge.xml index d96df3616..213543cdf 100644 --- a/app/src/main/res/layout/item_book_manga_edge.xml +++ b/app/src/main/res/layout/item_book_manga_edge.xml @@ -1,16 +1,38 @@ - + android:layout_gravity="center_vertical" + android:orientation="vertical" + android:padding="32dp"> + + + + + + + + diff --git a/app/src/main/res/layout/item_book_manga_page.xml b/app/src/main/res/layout/item_book_manga_page.xml index b6de8ad5c..7e84ac643 100644 --- a/app/src/main/res/layout/item_book_manga_page.xml +++ b/app/src/main/res/layout/item_book_manga_page.xml @@ -21,33 +21,32 @@ android:layout_height="match_parent" android:background="@color/book_ant_10"> - + app:indicatorSize="64dp" /> -