Skip to content

Instantly share code, notes, and snippets.

@aaronjyoder
Last active October 1, 2021 09:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aaronjyoder/b3bd774117fa47e9e23c666612973019 to your computer and use it in GitHub Desktop.
Save aaronjyoder/b3bd774117fa47e9e23c666612973019 to your computer and use it in GitHub Desktop.
package com.example.ui.component
import androidx.compose.foundation.*
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.focus.focusTarget
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.*
import androidx.compose.ui.graphics.drawscope.drawIntoCanvas
import androidx.compose.ui.input.key.isCtrlPressed
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.input.mouse.MouseScrollOrientation
import androidx.compose.ui.input.mouse.MouseScrollUnit
import androidx.compose.ui.input.mouse.mouseScrollFilter
import androidx.compose.ui.input.pointer.pointerMoveFilter
import androidx.compose.ui.unit.dp
import com.riskrieg.editor.model.EditorModel
import java.awt.Point
import kotlin.math.abs
@OptIn(ExperimentalFoundationApi::class, androidx.compose.ui.ExperimentalComposeUiApi::class)
@Composable
fun MyView(model: EditorModel, viewModifier: Modifier) {
val stateVertical = rememberScrollState(0)
val stateHorizontal = rememberScrollState(0)
var scale: Float by remember { mutableStateOf(1.0f) }
var canZoom: Boolean by remember { mutableStateOf(false) }
Box(modifier = viewModifier.background(color = Color(255, 255, 255))) {
Box(
modifier = Modifier
.fillMaxSize()
.verticalScroll(stateVertical) // tried enabled = false, doesn't seem to do anything
.horizontalScroll(stateHorizontal)
) {
Canvas(modifier = Modifier
.width((model.image().width * scale).dp)
.height((model.image().height * scale).dp)
.align(Alignment.Center)
.onKeyEvent { keyEvent ->
canZoom = keyEvent.isCtrlPressed
false
}
.mouseScrollFilter(onMouseScroll = { event, _ ->
if (event.orientation == MouseScrollOrientation.Vertical && canZoom) {
val deltaY = when (val delta = event.delta) {
is MouseScrollUnit.Line -> -delta.value
is MouseScrollUnit.Page -> -delta.value
}
scale *= 1.01.pow(deltaY.toDouble()).toFloat()
}
false
})
) {
drawIntoCanvas { canvas -> // drawing shapes and stuff
canvas.scale(scale, scale, 0f, 0f)
}
}
}
VerticalScrollbar(
modifier = Modifier.fillMaxHeight().align(Alignment.CenterEnd),
adapter = rememberScrollbarAdapter(stateVertical)
)
HorizontalScrollbar(
modifier = Modifier.fillMaxWidth().align(Alignment.BottomCenter).padding(end = 12.dp),
adapter = rememberScrollbarAdapter(stateHorizontal)
)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment