Add reader bottom button menu customization
This commit is contained in:
parent
9095c98159
commit
a4933388aa
@ -372,4 +372,6 @@ object PreferenceKeys {
|
||||
const val leftVerticalSeekbar = "pref_left_handed_vertical_seekbar"
|
||||
|
||||
const val forceHorizontalSeekbar = "pref_force_horz_seekbar"
|
||||
|
||||
const val readerBottomButtons = "reader_bottom_buttons"
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ import eu.kanade.tachiyomi.data.preference.PreferenceValues.DisplayMode
|
||||
import eu.kanade.tachiyomi.data.track.TrackService
|
||||
import eu.kanade.tachiyomi.data.track.anilist.Anilist
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.ReaderBottomButton
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
|
||||
import eu.kanade.tachiyomi.widget.ExtendedNavigationView
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
@ -488,4 +489,6 @@ class PreferencesHelper(val context: Context) {
|
||||
fun landscapeVerticalSeekbar() = flowPrefs.getBoolean(Keys.landscapeVerticalSeekbar, false)
|
||||
|
||||
fun leftVerticalSeekbar() = flowPrefs.getBoolean(Keys.leftVerticalSeekbar, false)
|
||||
|
||||
fun readerBottomButtons() = flowPrefs.getStringSet(Keys.readerBottomButtons, ReaderBottomButton.BUTTONS_DEFAULTS)
|
||||
}
|
||||
|
@ -54,6 +54,7 @@ import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
|
||||
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
|
||||
import eu.kanade.tachiyomi.ui.reader.model.ViewerChapters
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.ReaderBottomButton
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsSheet
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
|
||||
import eu.kanade.tachiyomi.ui.reader.viewer.BaseViewer
|
||||
@ -70,6 +71,7 @@ import eu.kanade.tachiyomi.util.system.toast
|
||||
import eu.kanade.tachiyomi.util.view.defaultBar
|
||||
import eu.kanade.tachiyomi.util.view.hideBar
|
||||
import eu.kanade.tachiyomi.util.view.isDefaultBar
|
||||
import eu.kanade.tachiyomi.util.view.popupMenu
|
||||
import eu.kanade.tachiyomi.util.view.setTooltip
|
||||
import eu.kanade.tachiyomi.util.view.showBar
|
||||
import eu.kanade.tachiyomi.widget.SimpleAnimationListener
|
||||
@ -441,28 +443,12 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
||||
}
|
||||
// SY <--
|
||||
|
||||
/*binding.actionRotation.setOnClickListener {
|
||||
val newOrientation = OrientationType.getNextOrientation(preferences.rotation().get(), resources)
|
||||
|
||||
preferences.rotation().set(newOrientation.prefValue)
|
||||
setOrientation(newOrientation.flag)
|
||||
|
||||
rotationToast?.cancel()
|
||||
rotationToast = toast(newOrientation.stringRes)
|
||||
}
|
||||
preferences.rotation().asImmediateFlow { updateRotationShortcut(it) }
|
||||
.onEach {
|
||||
updateRotationShortcut(it)
|
||||
}
|
||||
.launchIn(lifecycleScope)
|
||||
*/
|
||||
|
||||
binding.actionSettings.setOnClickListener {
|
||||
ReaderSettingsSheet(this).show()
|
||||
}
|
||||
|
||||
// Reading mode
|
||||
/*with(binding.actionReadingMode) {
|
||||
with(binding.actionReadingMode) {
|
||||
setTooltip(R.string.viewer)
|
||||
|
||||
setOnClickListener {
|
||||
@ -502,7 +488,7 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
||||
menuToggleToast = toast(newOrientation.stringRes)
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
// Crop borders
|
||||
with(binding.actionCropBorders) {
|
||||
@ -721,6 +707,8 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
||||
.launchIn(lifecycleScope)
|
||||
|
||||
chapterBottomSheet = ReaderChapterSheet(this)
|
||||
|
||||
updateBottomButtons()
|
||||
// <-- EH
|
||||
|
||||
// Set initial visibility
|
||||
@ -736,12 +724,39 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
||||
val currentPage = (((viewer as? PagerViewer)?.currentPage ?: (viewer as? WebtoonViewer)?.currentPage) as? ReaderPage)?.index
|
||||
return currentPage?.let { presenter.viewerChaptersRelay.value.currChapter.pages?.getOrNull(it) }
|
||||
}
|
||||
|
||||
fun updateBottomButtons() {
|
||||
val enabledButtons = preferences.readerBottomButtons().get()
|
||||
with(binding) {
|
||||
actionReadingMode.isVisible = ReaderBottomButton.ReadingMode.isIn(enabledButtons)
|
||||
actionRotation.isVisible =
|
||||
ReaderBottomButton.Rotation.isIn(enabledButtons)
|
||||
// doublePage.isVisible = viewer is PagerViewer && ReaderBottomButton.PageLayout.isIn(enabledButtons)
|
||||
actionCropBorders.isVisible =
|
||||
if (viewer is PagerViewer) {
|
||||
ReaderBottomButton.CropBordersPager.isIn(enabledButtons)
|
||||
} else {
|
||||
val continuous = (viewer as? WebtoonViewer)?.isContinuous ?: false
|
||||
if (continuous) {
|
||||
ReaderBottomButton.CropBordersWebtoon.isIn(enabledButtons)
|
||||
} else {
|
||||
ReaderBottomButton.CropBordersContinuesVertical.isIn(enabledButtons)
|
||||
}
|
||||
}
|
||||
actionWebView.isVisible =
|
||||
ReaderBottomButton.WebView.isIn(enabledButtons)
|
||||
actionChapterList.isVisible =
|
||||
ReaderBottomButton.ViewChapters.isIn(enabledButtons)
|
||||
// shiftPageButton.isVisible = ((viewer as? PagerViewer)?.config?.doublePages ?: false) && ReaderBottomButton.ShiftDoublePage.isIn(enabledButtons)
|
||||
// binding.toolbar.menu.findItem(R.id.action_shift_double_page)?.isVisible = ((viewer as? PagerViewer)?.config?.doublePages ?: false) && !ReaderBottomButton.ShiftDoublePage.isIn(enabledButtons)
|
||||
}
|
||||
}
|
||||
// EXH <--
|
||||
|
||||
/*private fun updateOrientationShortcut(preference: Int) {
|
||||
private fun updateOrientationShortcut(preference: Int) {
|
||||
val orientation = OrientationType.fromPreference(preference)
|
||||
binding.actionRotation.setImageResource(orientation.iconRes)
|
||||
}*/
|
||||
}
|
||||
|
||||
private fun updateCropBordersShortcut() {
|
||||
val mangaViewer = presenter.getMangaReadingMode()
|
||||
@ -950,6 +965,7 @@ class ReaderActivity : BaseRxActivity<ReaderActivityBinding, ReaderPresenter>()
|
||||
|
||||
// <-- Left-handed vertical seekbar
|
||||
|
||||
updateBottomButtons()
|
||||
// SY <--
|
||||
binding.toolbar.title = manga.title
|
||||
|
||||
|
@ -0,0 +1,28 @@
|
||||
package eu.kanade.tachiyomi.ui.reader.setting
|
||||
|
||||
import androidx.annotation.StringRes
|
||||
import eu.kanade.tachiyomi.R
|
||||
|
||||
enum class ReaderBottomButton(val value: String, @StringRes val stringRes: Int) {
|
||||
ViewChapters("vc", R.string.action_view_chapters),
|
||||
WebView("wb", R.string.action_open_in_web_view),
|
||||
ReadingMode("rm", R.string.viewer),
|
||||
Rotation("rot", R.string.rotation_type),
|
||||
CropBordersPager("cbp", R.string.pref_crop_borders_pager),
|
||||
CropBordersContinuesVertical("cbc", R.string.pref_crop_borders_continues_vertical),
|
||||
CropBordersWebtoon("cbw", R.string.pref_crop_borders_webtoon),
|
||||
// PageLayout("pl", R.string.page_layout),
|
||||
// ShiftDoublePage("sdp", R.string.shift_double_pages)
|
||||
;
|
||||
|
||||
fun isIn(buttons: Collection<String>) = value in buttons
|
||||
|
||||
companion object {
|
||||
val BUTTONS_DEFAULTS = setOf(
|
||||
ViewChapters,
|
||||
WebView,
|
||||
CropBordersPager,
|
||||
CropBordersContinuesVertical
|
||||
).map { it.value }.toSet()
|
||||
}
|
||||
}
|
@ -1,22 +1,33 @@
|
||||
package eu.kanade.tachiyomi.ui.setting
|
||||
|
||||
import android.app.Dialog
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import androidx.preference.PreferenceScreen
|
||||
import com.afollestad.materialdialogs.MaterialDialog
|
||||
import com.afollestad.materialdialogs.list.listItemsMultiChoice
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues.TappingInvertMode
|
||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||
import eu.kanade.tachiyomi.data.preference.asImmediateFlow
|
||||
import eu.kanade.tachiyomi.ui.base.controller.DialogController
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.ReaderBottomButton
|
||||
import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
|
||||
import eu.kanade.tachiyomi.util.preference.defaultValue
|
||||
import eu.kanade.tachiyomi.util.preference.entriesRes
|
||||
import eu.kanade.tachiyomi.util.preference.intListPreference
|
||||
import eu.kanade.tachiyomi.util.preference.listPreference
|
||||
import eu.kanade.tachiyomi.util.preference.onClick
|
||||
import eu.kanade.tachiyomi.util.preference.preference
|
||||
import eu.kanade.tachiyomi.util.preference.preferenceCategory
|
||||
import eu.kanade.tachiyomi.util.preference.summaryRes
|
||||
import eu.kanade.tachiyomi.util.preference.switchPreference
|
||||
import eu.kanade.tachiyomi.util.preference.titleRes
|
||||
import eu.kanade.tachiyomi.util.system.hasDisplayCutout
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
|
||||
|
||||
class SettingsReaderController : SettingsController() {
|
||||
@ -494,7 +505,46 @@ class SettingsReaderController : SettingsController() {
|
||||
summaryRes = R.string.auto_webtoon_mode_summary
|
||||
defaultValue = true
|
||||
}
|
||||
|
||||
preference {
|
||||
key = "reader_bottom_buttons_pref"
|
||||
titleRes = R.string.reader_bottom_buttons
|
||||
summaryRes = R.string.reader_bottom_buttons_summary
|
||||
|
||||
onClick {
|
||||
ReaderBottomButtonsDialog().showDialog(router)
|
||||
}
|
||||
}
|
||||
}
|
||||
// EXH <--
|
||||
}
|
||||
|
||||
class ReaderBottomButtonsDialog : DialogController() {
|
||||
|
||||
private val preferences: PreferencesHelper = Injekt.get()
|
||||
|
||||
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
|
||||
val selected = preferences.readerBottomButtons().get()
|
||||
val values = ReaderBottomButton.values()
|
||||
val items = values.map { it.value }
|
||||
|
||||
val preselected = selected.mapNotNull { selection -> items.indexOf(selection).takeUnless { it == -1 } }
|
||||
.toIntArray()
|
||||
|
||||
return MaterialDialog(activity!!)
|
||||
.title(R.string.reader_bottom_buttons)
|
||||
.listItemsMultiChoice(
|
||||
items = values.map { activity!!.getString(it.stringRes) },
|
||||
initialSelection = preselected
|
||||
) { _, selections: IntArray, _ ->
|
||||
val included = selections
|
||||
.map { values[it].value }
|
||||
.toSet()
|
||||
|
||||
preferences.readerBottomButtons().set(included)
|
||||
}
|
||||
.positiveButton(android.R.string.ok)
|
||||
.negativeButton(android.R.string.cancel)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -387,6 +387,7 @@
|
||||
app:layout_constraintEnd_toStartOf="@+id/action_web_view"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintHorizontal_chainStyle="spread"
|
||||
app:srcCompat="@drawable/ic_format_list_numbered_24dp"
|
||||
app:tint="?attr/colorOnPrimary" />
|
||||
|
||||
@ -397,12 +398,27 @@
|
||||
android:background="?selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/custom_filter"
|
||||
android:padding="@dimen/material_layout_keylines_screen_edge_margin"
|
||||
app:layout_constraintEnd_toStartOf="@id/action_crop_borders"
|
||||
app:layout_constraintEnd_toStartOf="@id/action_reading_mode"
|
||||
app:layout_constraintStart_toEndOf="@+id/action_chapter_list"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintHorizontal_chainStyle="spread"
|
||||
app:srcCompat="@drawable/ic_public_24dp"
|
||||
app:tint="?attr/colorOnPrimary" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/action_reading_mode"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/viewer"
|
||||
android:padding="@dimen/material_layout_keylines_screen_edge_margin"
|
||||
app:layout_constraintEnd_toStartOf="@id/action_crop_borders"
|
||||
app:layout_constraintStart_toEndOf="@+id/action_web_view"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintHorizontal_chainStyle="spread"
|
||||
app:srcCompat="@drawable/ic_reader_default_24dp"
|
||||
app:tint="?attr/colorOnPrimary" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/action_crop_borders"
|
||||
android:layout_width="wrap_content"
|
||||
@ -410,12 +426,27 @@
|
||||
android:background="?selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/pref_crop_borders"
|
||||
android:padding="@dimen/material_layout_keylines_screen_edge_margin"
|
||||
app:layout_constraintEnd_toStartOf="@id/action_settings"
|
||||
app:layout_constraintStart_toEndOf="@+id/action_web_view"
|
||||
app:layout_constraintEnd_toStartOf="@id/action_rotation"
|
||||
app:layout_constraintStart_toEndOf="@+id/action_reading_mode"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintHorizontal_chainStyle="spread"
|
||||
app:srcCompat="@drawable/ic_crop_24dp"
|
||||
app:tint="?attr/colorOnPrimary" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/action_rotation"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?selectableItemBackgroundBorderless"
|
||||
android:contentDescription="@string/pref_rotation_type"
|
||||
android:padding="@dimen/material_layout_keylines_screen_edge_margin"
|
||||
app:layout_constraintEnd_toStartOf="@id/action_settings"
|
||||
app:layout_constraintStart_toEndOf="@+id/action_crop_borders"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintHorizontal_chainStyle="spread"
|
||||
app:srcCompat="@drawable/ic_screen_rotation_24dp"
|
||||
app:tint="?attr/colorOnPrimary" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/action_settings"
|
||||
android:layout_width="wrap_content"
|
||||
@ -424,8 +455,9 @@
|
||||
android:contentDescription="@string/action_settings"
|
||||
android:padding="@dimen/material_layout_keylines_screen_edge_margin"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/action_crop_borders"
|
||||
app:layout_constraintStart_toEndOf="@id/action_rotation"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintHorizontal_chainStyle="spread"
|
||||
app:srcCompat="@drawable/ic_settings_24dp"
|
||||
app:tint="?attr/colorOnPrimary" />
|
||||
|
||||
|
@ -217,6 +217,7 @@
|
||||
<string name="biometric_lock_invalid_time_selected">Invalid time selected</string>
|
||||
|
||||
<!-- Reader Settings -->
|
||||
<string name="page_downloading">Page Downloading</string>
|
||||
<string name="download_threads">Download threads</string>
|
||||
<string name="download_threads_summary">Higher values can speed up image downloading significantly, but can also trigger bans. Recommended value is 2 or 3. Current value is: %s</string>
|
||||
<string name="aggressively_load_pages">Aggressively load pages</string>
|
||||
@ -244,6 +245,8 @@
|
||||
<string name="smart_based_on_page_and_theme">Smart (based on page and theme)</string>
|
||||
<string name="tap_scroll_page">Tap scroll by page</string>
|
||||
<string name="tap_scroll_page_summary">Tapping will scroll by page instead of screen size when this option is enabled</string>
|
||||
<string name="reader_bottom_buttons">Reader Bottom Buttons</string>
|
||||
<string name="reader_bottom_buttons_summary">Customize what buttons appear at the bottom of the reader</string>
|
||||
|
||||
<string name="pref_show_vert_seekbar_landscape">Show vertical seekbar in landscape</string>
|
||||
<string name="pref_show_vert_seekbar_landscape_summary">Enables vertical seekbar when in landscape</string>
|
||||
@ -263,6 +266,9 @@
|
||||
<string name="eh_retry_all_help_message">Re-add all failed pages to the download queue.</string>
|
||||
<string name="eh_boost_page_help">Boost page help</string>
|
||||
<string name="eh_boost_page_help_message">Normally the downloader can only download a specific amount of pages at the same time. This means you can be waiting for a page to download but the downloader will not start downloading the page until it has a free download slot. Pressing \'Boost page\' will force the downloader to begin downloading the current page, regardless of whether or not there is an available slot.</string>
|
||||
<string name="pref_crop_borders_pager">Crop borders Pager</string>
|
||||
<string name="pref_crop_borders_continues_vertical">Crop borders Continues Vertical</string>
|
||||
<string name="pref_crop_borders_webtoon">Crop borders Webtoon</string>
|
||||
|
||||
<!-- Auto Webtoon Mode -->
|
||||
<string name="eh_auto_webtoon_snack">Reading webtoon style</string>
|
||||
|
Loading…
x
Reference in New Issue
Block a user