1 package ru.fredboy.cavedroid.ux.controls.input.handler.mouse
3 import com.badlogic.gdx.math.MathUtils
4 import ru.fredboy.cavedroid.common.di.GameScope
5 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
6 import ru.fredboy.cavedroid.domain.configuration.repository.GameConfigurationRepository
7 import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
8 import ru.fredboy.cavedroid.game.window.GameWindowType
9 import ru.fredboy.cavedroid.game.window.GameWindowsManager
10 import ru.fredboy.cavedroid.game.window.inventory.CreativeInventoryWindow
11 import ru.fredboy.cavedroid.ux.controls.input.IMouseInputHandler
12 import ru.fredboy.cavedroid.ux.controls.input.action.MouseInputAction
13 import ru.fredboy.cavedroid.ux.controls.input.action.keys.MouseInputActionKey
14 import ru.fredboy.cavedroid.ux.controls.input.annotation.BindMouseInputHandler
15 import ru.fredboy.cavedroid.ux.controls.input.isInsideWindow
16 import javax.inject.Inject
17 import kotlin.math.abs
20 @BindMouseInputHandler
21 class CreativeInventoryScrollMouseInputHandler @Inject constructor(
22 private val gameConfigurationRepository: GameConfigurationRepository,
23 private val gameWindowsManager: GameWindowsManager,
24 private val itemsRepository: ItemsRepository,
25 private val textureRegions: GetTextureRegionByNameUseCase,
26 ) : IMouseInputHandler {
28 private val creativeInventoryTexture get() = requireNotNull(textureRegions["creative"])
30 private var dragStartY = 0f
32 override fun checkConditions(action: MouseInputAction): Boolean {
33 return gameWindowsManager.currentWindowType == GameWindowType.CREATIVE_INVENTORY &&
34 (gameWindowsManager.isDragging || isInsideWindow(action, creativeInventoryTexture)) &&
35 (checkStartDragConditions(action) || checkEndDragConditions(action) ||
36 checkDragConditions(action) || action.actionKey is MouseInputActionKey.Scroll)
40 private fun checkStartDragConditions(action: MouseInputAction): Boolean {
41 return (action.actionKey is MouseInputActionKey.Screen) &&
42 !action.actionKey.touchUp && !gameWindowsManager.isDragging
45 private fun checkEndDragConditions(action: MouseInputAction): Boolean {
46 return action.actionKey is MouseInputActionKey.Screen &&
47 action.actionKey.touchUp && gameWindowsManager.isDragging
50 private fun checkDragConditions(action: MouseInputAction): Boolean {
51 return gameConfigurationRepository.isTouch() && action.actionKey is MouseInputActionKey.Dragged &&
52 abs(action.screenY - dragStartY) >= DRAG_SENSITIVITY
55 private fun clampScrollAmount() {
56 gameWindowsManager.creativeScrollAmount =
58 /* value = */ gameWindowsManager.creativeScrollAmount,
60 /* max = */ (gameWindowsManager.currentWindow as CreativeInventoryWindow).getMaxScroll(itemsRepository)
64 private fun handleStartOrEndDrag(action: MouseInputAction) {
65 if (gameWindowsManager.isDragging) {
66 gameWindowsManager.isDragging = false
68 dragStartY = action.screenY
72 private fun handleDrag(action: MouseInputAction) {
73 gameWindowsManager.isDragging = true
74 gameWindowsManager.creativeScrollAmount += ((dragStartY - action.screenY) / DRAG_SENSITIVITY).toInt()
76 dragStartY = action.screenY
79 private fun handleScroll(action: MouseInputAction) {
80 gameWindowsManager.creativeScrollAmount += (action.actionKey as MouseInputActionKey.Scroll).amountY.toInt()
84 override fun handle(action: MouseInputAction) {
85 when (action.actionKey) {
86 is MouseInputActionKey.Screen -> handleStartOrEndDrag(action)
87 is MouseInputActionKey.Dragged -> handleDrag(action)
88 is MouseInputActionKey.Scroll -> handleScroll(action)
94 private const val DRAG_SENSITIVITY = 16f