DEADSOFTWARE

228c049c02aba7c1e1140608c6d83aa7bb43106e
[cavedroid.git] /
1 package ru.fredboy.cavedroid.ux.controls.input.handler.mouse
2
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
18
19 @GameScope
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 {
27
28 private val creativeInventoryTexture get() = requireNotNull(textureRegions["creative"])
29
30 private var dragStartY = 0f
31
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)
37
38 }
39
40 private fun checkStartDragConditions(action: MouseInputAction): Boolean {
41 return (action.actionKey is MouseInputActionKey.Screen) &&
42 !action.actionKey.touchUp && !gameWindowsManager.isDragging
43 }
44
45 private fun checkEndDragConditions(action: MouseInputAction): Boolean {
46 return action.actionKey is MouseInputActionKey.Screen &&
47 action.actionKey.touchUp && gameWindowsManager.isDragging
48 }
49
50 private fun checkDragConditions(action: MouseInputAction): Boolean {
51 return gameConfigurationRepository.isTouch() && action.actionKey is MouseInputActionKey.Dragged &&
52 abs(action.screenY - dragStartY) >= DRAG_SENSITIVITY
53 }
54
55 private fun clampScrollAmount() {
56 gameWindowsManager.creativeScrollAmount =
57 MathUtils.clamp(
58 /* value = */ gameWindowsManager.creativeScrollAmount,
59 /* min = */ 0,
60 /* max = */ (gameWindowsManager.currentWindow as CreativeInventoryWindow).getMaxScroll(itemsRepository)
61 )
62 }
63
64 private fun handleStartOrEndDrag(action: MouseInputAction) {
65 if (gameWindowsManager.isDragging) {
66 gameWindowsManager.isDragging = false
67 } else {
68 dragStartY = action.screenY
69 }
70 }
71
72 private fun handleDrag(action: MouseInputAction) {
73 gameWindowsManager.isDragging = true
74 gameWindowsManager.creativeScrollAmount += ((dragStartY - action.screenY) / DRAG_SENSITIVITY).toInt()
75 clampScrollAmount()
76 dragStartY = action.screenY
77 }
78
79 private fun handleScroll(action: MouseInputAction) {
80 gameWindowsManager.creativeScrollAmount += (action.actionKey as MouseInputActionKey.Scroll).amountY.toInt()
81 clampScrollAmount()
82 }
83
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)
89 else -> return
90 }
91 }
92
93 companion object {
94 private const val DRAG_SENSITIVITY = 16f
95 }
96 }