Viewer navigation (#3869)
* Viewer navigation Co-authored-by: Harsh Parekh <h.x.dev@outlook.com> * Match current reader behavior and add ability to invert it * A bit of clean up * Clean up inversion * Only create navigator when changed and change tap zone when invertTapping is changed * Clean up PagerConfig * Change how Viewer navigation works * Add Edge Navigation Co-authored-by: Harsh Parekh <h.x.dev@outlook.com>pull/4233/head
parent
71ece73d99
commit
d69e9034ab
@ -0,0 +1,43 @@
|
||||
package eu.kanade.tachiyomi.ui.reader.viewer
|
||||
|
||||
import android.graphics.PointF
|
||||
import android.graphics.RectF
|
||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues
|
||||
import eu.kanade.tachiyomi.util.lang.invert
|
||||
|
||||
abstract class ViewerNavigation {
|
||||
|
||||
enum class NavigationRegion {
|
||||
NEXT, PREV, MENU
|
||||
}
|
||||
|
||||
data class Region(
|
||||
val rectF: RectF,
|
||||
val type: NavigationRegion
|
||||
) {
|
||||
fun invert(invertMode: PreferenceValues.TappingInvertMode): Region {
|
||||
if (invertMode == PreferenceValues.TappingInvertMode.NONE) return this
|
||||
return this.copy(
|
||||
rectF = this.rectF.invert(invertMode)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private var constantMenuRegion: RectF = RectF(0f, 0f, 1f, 0.05f)
|
||||
|
||||
abstract var regions: List<Region>
|
||||
|
||||
var invertMode: PreferenceValues.TappingInvertMode = PreferenceValues.TappingInvertMode.NONE
|
||||
|
||||
fun getAction(pos: PointF): NavigationRegion {
|
||||
val x = pos.x
|
||||
val y = pos.y
|
||||
val region = regions.map { it.invert(invertMode) }
|
||||
.find { it.rectF.contains(x, y) }
|
||||
return when {
|
||||
region != null -> region.type
|
||||
constantMenuRegion.contains(x, y) -> NavigationRegion.MENU
|
||||
else -> NavigationRegion.MENU
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package eu.kanade.tachiyomi.ui.reader.viewer.navigation
|
||||
|
||||
import android.graphics.RectF
|
||||
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
|
||||
|
||||
/**
|
||||
* Visualization of default state without any inversion
|
||||
* +---+---+---+
|
||||
* | N | N | N | P: Previous
|
||||
* +---+---+---+
|
||||
* | N | M | N | M: Menu
|
||||
* +---+---+---+
|
||||
* | N | P | N | N: Next
|
||||
* +---+---+---+
|
||||
*/
|
||||
class EdgeNavigation : ViewerNavigation() {
|
||||
|
||||
override var regions: List<Region> = listOf(
|
||||
Region(
|
||||
rectF = RectF(0f, 0f, 0.33f, 1f),
|
||||
type = NavigationRegion.NEXT
|
||||
),
|
||||
Region(
|
||||
rectF = RectF(0.33f, 0.66f, 0.66f, 1f),
|
||||
type = NavigationRegion.PREV
|
||||
),
|
||||
Region(
|
||||
rectF = RectF(0.66f, 0f, 1f, 1f),
|
||||
type = NavigationRegion.NEXT
|
||||
),
|
||||
)
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package eu.kanade.tachiyomi.ui.reader.viewer.navigation
|
||||
|
||||
import android.graphics.RectF
|
||||
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
|
||||
|
||||
/**
|
||||
* Visualization of default state without any inversion
|
||||
* +---+---+---+
|
||||
* | M | M | M | P: Previous
|
||||
* +---+---+---+
|
||||
* | P | N | N | M: Menu
|
||||
* +---+---+---+
|
||||
* | P | N | N | N: Next
|
||||
* +---+---+---+
|
||||
*/
|
||||
class KindlishNavigation : ViewerNavigation() {
|
||||
|
||||
override var regions: List<Region> = listOf(
|
||||
Region(
|
||||
rectF = RectF(0.33f, 0.33f, 1f, 1f),
|
||||
type = NavigationRegion.NEXT
|
||||
),
|
||||
Region(
|
||||
rectF = RectF(0f, 0.33f, 0.33f, 1f),
|
||||
type = NavigationRegion.PREV
|
||||
)
|
||||
)
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
package eu.kanade.tachiyomi.ui.reader.viewer.navigation
|
||||
|
||||
import android.graphics.RectF
|
||||
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
|
||||
|
||||
/**
|
||||
* Visualization of default state without any inversion
|
||||
* +---+---+---+
|
||||
* | N | N | N | P: Previous
|
||||
* +---+---+---+
|
||||
* | N | M | P | M: Menu
|
||||
* +---+---+---+
|
||||
* | P | P | P | N: Next
|
||||
* +---+---+---+
|
||||
*/
|
||||
open class LNavigation : ViewerNavigation() {
|
||||
|
||||
override var regions: List<Region> = listOf(
|
||||
Region(
|
||||
rectF = RectF(0f, 0.33f, 0.33f, 0.66f),
|
||||
type = NavigationRegion.NEXT
|
||||
),
|
||||
Region(
|
||||
rectF = RectF(0f, 0f, 1f, 0.33f),
|
||||
type = NavigationRegion.NEXT
|
||||
),
|
||||
Region(
|
||||
rectF = RectF(0.66f, 0.33f, 1f, 0.66f),
|
||||
type = NavigationRegion.PREV
|
||||
),
|
||||
Region(
|
||||
rectF = RectF(0f, 0.66f, 1f, 1f),
|
||||
type = NavigationRegion.PREV
|
||||
)
|
||||
)
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
package eu.kanade.tachiyomi.ui.reader.viewer.pager
|
||||
|
||||
import android.graphics.RectF
|
||||
import eu.kanade.tachiyomi.ui.reader.viewer.ViewerNavigation
|
||||
import eu.kanade.tachiyomi.ui.reader.viewer.navigation.LNavigation
|
||||
|
||||
/**
|
||||
* Visualization of default state without any inversion
|
||||
* +---+---+---+
|
||||
* | N | M | P | P: Previous
|
||||
* +---+---+---+
|
||||
* | N | M | P | M: Menu
|
||||
* +---+---+---+
|
||||
* | N | M | P | N: Next
|
||||
* +---+---+---+
|
||||
*/
|
||||
class PagerDefaultNavigation : ViewerNavigation() {
|
||||
|
||||
override var regions: List<Region> = listOf(
|
||||
Region(
|
||||
rectF = RectF(0f, 0f, 0.33f, 1f),
|
||||
type = NavigationRegion.NEXT
|
||||
),
|
||||
Region(
|
||||
rectF = RectF(0.66f, 0f, 1f, 1f),
|
||||
type = NavigationRegion.PREV
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
class VerticalPagerDefaultNavigation : LNavigation()
|
@ -0,0 +1,5 @@
|
||||
package eu.kanade.tachiyomi.ui.reader.viewer.webtoon
|
||||
|
||||
import eu.kanade.tachiyomi.ui.reader.viewer.navigation.LNavigation
|
||||
|
||||
class WebtoonDefaultNavigation : LNavigation()
|
@ -0,0 +1,15 @@
|
||||
package eu.kanade.tachiyomi.util.lang
|
||||
|
||||
import android.graphics.RectF
|
||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues
|
||||
|
||||
fun RectF.invert(invertMode: PreferenceValues.TappingInvertMode): RectF {
|
||||
val horizontal = invertMode.shouldInvertHorizontal
|
||||
val vertical = invertMode.shouldInvertVertical
|
||||
return when {
|
||||
horizontal && vertical -> RectF(1f - this.right, 1f - this.bottom, 1f - this.left, 1f - this.top)
|
||||
vertical -> RectF(this.left, 1f - this.bottom, this.right, 1f - this.top)
|
||||
horizontal -> RectF(1f - this.right, this.top, 1f - this.left, this.bottom)
|
||||
else -> this
|
||||
}
|
||||
}
|
Loading…
Reference in new issue