DEADSOFTWARE

Better touch inventory controls
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / ui / windows / inventory / AbstractInventoryWindow.kt
index 9d8e0f93387fd99da2198fa9d5ead2dc7028a13e..f49ba4908d1cd91b88ce7918ce823a8fef715d57 100644 (file)
@@ -1,5 +1,6 @@
 package ru.deadsoftware.cavedroid.game.ui.windows.inventory
 
+import ru.deadsoftware.cavedroid.game.GameItemsHolder
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
 
@@ -9,4 +10,44 @@ abstract class AbstractInventoryWindow {
 
     abstract var selectedItem: InventoryItem?
 
+    var selectItemPointer: Int = -1
+
+    fun onLeftCLick(items: MutableList<InventoryItem?>, gameItemsHolder: GameItemsHolder, index: Int, pointer: Int = -1) {
+        if (selectedItem != null && selectedItem?.item?.isNone() != true && pointer >= 0 && selectItemPointer >= 0 && pointer != selectItemPointer) {
+            return
+        }
+
+        val clickedItem = items[index]
+
+        selectedItem?.let { selectedItem ->
+            if (clickedItem != null && items[index]!!.item == selectedItem.item &&
+                items[index]!!.amount + selectedItem.amount <= selectedItem.item.params.maxStack) {
+                items[index]!!.amount += selectedItem.amount
+                this@AbstractInventoryWindow.selectedItem = null
+                selectItemPointer = -1
+                return
+            }
+        }
+
+        val item = items[index]
+        items[index] = selectedItem ?: gameItemsHolder.fallbackItem.toInventoryItem()
+        selectedItem = item
+        selectItemPointer = pointer
+    }
+
+    fun onRightClick(items: MutableList<InventoryItem?>, index: Int) {
+        val clickedItem = items[index]
+        val selectedItem = selectedItem
+            ?.takeIf { clickedItem == null || clickedItem.item.isNone() || it.item == items[index]!!.item && items[index]!!.amount + 1 < it.item.params.maxStack }
+            ?: return
+
+        val newItem = selectedItem.item.toInventoryItem((clickedItem?.takeIf { !it.item.isNone() }?.amount ?: 0) + 1)
+        items[index] = newItem
+        selectedItem.amount --
+
+        if (selectedItem.amount <= 0) {
+            this@AbstractInventoryWindow.selectedItem = null
+        }
+    }
+
 }
\ No newline at end of file