Implement 'pan-with-cursor' for relative action mode

This commit is contained in:
Gaurav Ujjwal 2022-03-18 16:48:56 +05:30
parent ce2736ed20
commit c6b28ea6f1
4 changed files with 48 additions and 0 deletions

View file

@ -266,6 +266,7 @@ class Dispatcher(private val activity: VncActivity) {
y = y.coerceIn(0f, viewModel.frameState.fbHeight - 1)
}
doButtonDown(PointerButton.None, pointerPosition)
viewModel.showFbPoint(pointerPosition)
}
override fun doDrag(p: PointF, dx: Float, dy: Float) {

View file

@ -194,6 +194,24 @@ class FrameState(private val minZoomScale: Float = 0.5F, private val maxZoomScal
return null
}
/**
* Makes sure that framebuffer point [fbX],[fbY] is visible.
* If point is outside of visible area, frame is panned to make the it visible.
*/
fun showFbPoint(fbX: Float, fbY: Float) {
val vpX = fbX * scale + frameX
val vpY = fbY * scale + frameY
var dx = 0f
var dy = 0f
if (vpX < 0) dx = -vpX
if (vpX >= vpWidth) dx = vpWidth - vpX - 1
if (vpY < 0) dy = -vpY
if (vpY >= vpHeight) dy = vpHeight - vpY - 1
pan(dx, dy)
}
private fun calculateBaseScale() {
if (fbHeight == 0F || fbWidth == 0F || windowHeight == 0F)
return //Not enough info yet

View file

@ -9,6 +9,7 @@
package com.gaurav.avnc.viewmodel
import android.app.Application
import android.graphics.PointF
import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
@ -277,6 +278,11 @@ class VncViewModel(app: Application) : BaseViewModel(app), VncClient.Observer {
frameViewRef.get()?.requestRender()
}
fun showFbPoint(fbPoint: PointF) {
frameState.showFbPoint(fbPoint.x, fbPoint.y)
frameViewRef.get()?.requestRender()
}
/**************************************************************************
* Clipboard Sync
**************************************************************************/

View file

@ -156,4 +156,27 @@ class FrameStateTest {
assertEquals(-100f, state.frameX) //Right side of frame and Viewport are aligned
assertEquals(-100f, state.frameY) //Bottom side of frame and Viewport are aligned
}
@Test
fun showFbPointTest() {
val state = FrameState()
state.setViewportSize(50f, 50f)
state.setFramebufferSize(100f, 100f)
state.showFbPoint(49f, 49f)
assertEquals(0f, state.frameX)
assertEquals(0f, state.frameY)
state.showFbPoint(50f, 50f)
assertEquals(-1f, state.frameX)
assertEquals(-1f, state.frameY)
state.showFbPoint(0f, 0f)
assertEquals(0f, state.frameX)
assertEquals(0f, state.frameY)
state.showFbPoint(99f, 99f)
assertEquals(-50f, state.frameX)
assertEquals(-50f, state.frameY)
}
}