Skip to content

Commit

Permalink
Mouse_Events tutorial: add section about AWT's MouseEvent (#455)
Browse files Browse the repository at this point in the history
  • Loading branch information
prepor committed Mar 2, 2021
1 parent 2fac821 commit b68f599
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 1 deletion.
56 changes: 55 additions & 1 deletion tutorials/Mouse_Events/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,4 +140,58 @@ fun main() = Window(title = "Compose for Desktop", size = IntSize(400, 400)) {
}
}
```
![Application running](mouse_enter.gif)
![Application running](mouse_enter.gif)

### Mouse right/middle clicks and keyboard modifiers

While first-class support for pointer type-specific data, like pressed mouse buttons, is still in development in Compose, there is an available raw AWT mouse event object in Compose for Desktop, that can be used as a workaround when you need advanced functionality.

```kotlin
import androidx.compose.desktop.Window
import androidx.compose.foundation.gestures.forEachGesture
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Text
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.AwaitPointerEventScope
import androidx.compose.ui.input.pointer.PointerEvent
import androidx.compose.ui.input.pointer.changedToDown
import androidx.compose.ui.input.pointer.consumeDownChange
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.unit.IntSize
import java.awt.event.MouseEvent

fun main() = Window(title = "Compose for Desktop", size = IntSize(400, 400)) {
var lastEvent by remember { mutableStateOf<MouseEvent?>(null) }
Column {
Text(
text = "Custom button",
modifier = Modifier.pointerInput(Unit) {
forEachGesture {
awaitPointerEventScope {
lastEvent = awaitEventFirstDown().also {
it.changes.forEach { it.consumeDownChange() }
}.mouseEvent
}
}
}
)
Text("Mouse event: ${lastEvent?.paramString()}")
}

}

private suspend fun AwaitPointerEventScope.awaitEventFirstDown(): PointerEvent {
var event: PointerEvent
do {
event = awaitPointerEvent()
} while (
!event.changes.all { it.changedToDown() }
)
return event
}
```
![Application running](mouse_event.gif)
Binary file added tutorials/Mouse_Events/mouse_event.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit b68f599

Please sign in to comment.