Skip to content

Commit

Permalink
Add 'Move to Top' and 'Move to Bottom' ops for movables in popup menu
Browse files Browse the repository at this point in the history
  • Loading branch information
SpaiR committed Jul 8, 2019
1 parent 93c8c4a commit 65c3934
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,9 @@ import io.github.spair.strongdmm.gui.objtree.ObjectTreeView
import io.github.spair.strongdmm.logic.action.ActionController
import io.github.spair.strongdmm.logic.action.PlaceTileItemAction
import io.github.spair.strongdmm.logic.action.SwapTileItemAction
import io.github.spair.strongdmm.logic.action.SwitchTileItemsAction
import io.github.spair.strongdmm.logic.dmi.DmiProvider
import io.github.spair.strongdmm.logic.map.Dmm
import io.github.spair.strongdmm.logic.map.Tile
import io.github.spair.strongdmm.logic.map.TileItemComparator
import io.github.spair.strongdmm.logic.map.TileOperation
import io.github.spair.strongdmm.logic.map.*
import org.lwjgl.input.Mouse
import org.lwjgl.opengl.Display
import javax.swing.JMenu
Expand Down Expand Up @@ -129,7 +127,7 @@ private fun JPopupMenu.addOptionalSelectedInstanceActions(map: Dmm, currentTile:
}

private fun JPopupMenu.addTileItemsActions(map: Dmm, currentTile: Tile) {
currentTile.getTileItems().sortedWith(TileItemComparator).forEach { tileItem ->
currentTile.getTileItems().sortedWith(TileItemComparator).reverseTileMovables().forEach { tileItem ->
val menu = JMenu("${tileItem.getVarText(VAR_NAME)} [${tileItem.type}]").apply {
this@addTileItemsActions.add(this)
}
Expand All @@ -138,6 +136,33 @@ private fun JPopupMenu.addTileItemsActions(map: Dmm, currentTile: Tile) {
menu.icon = spite.scaledIcon
}

// Moving can be done only for objects and mobs.
if (tileItem.isType(TYPE_OBJ) || tileItem.isType(TYPE_MOB)) {
menu.add(JMenuItem("Move to Top").apply {
addActionListener {
val higherItemId = currentTile.getHigherItemId(tileItem.id)
if (higherItemId != NON_EXISTENT_INT) {
currentTile.switchTileItems(tileItem.id, higherItemId)
ActionController.addUndoAction(SwitchTileItemsAction(currentTile, higherItemId, tileItem.id))
Frame.update(true)
}
}
})

menu.add(JMenuItem("Move to Bottom").apply {
addActionListener {
val lowerItemId = currentTile.getLowerItemId(tileItem.id)
if (lowerItemId != NON_EXISTENT_INT) {
currentTile.switchTileItems(tileItem.id, lowerItemId)
ActionController.addUndoAction(SwitchTileItemsAction(currentTile, lowerItemId, tileItem.id))
Frame.update(true)
}
}
})

menu.addSeparator()
}

menu.add(JMenuItem("Make Active Object (Ctrl+Shift+Click)").apply {
addActionListener {
ObjectTreeView.findAndSelectItemInstance(tileItem)
Expand All @@ -160,7 +185,7 @@ private fun JPopupMenu.addTileItemsActions(map: Dmm, currentTile: Tile) {
}
}

menu.add(JMenuItem("View Variables")).apply {
menu.add(JMenuItem("Edit Variables...")).apply {
addActionListener {
if (ViewVariablesDialog(currentTile, tileItem).open()) {
Frame.update(true)
Expand All @@ -169,3 +194,25 @@ private fun JPopupMenu.addTileItemsActions(map: Dmm, currentTile: Tile) {
}
}
}

// Method to reverse all movables in the tile items list.
// Used on the sorted list which will have structure like 'area -> movables -> turf' for sure.
// Method itself is needed to show tile items in popup menu properly.
// Like area goes first, then all movables sorted from top to bottom and then turf.
private fun List<TileItem>.reverseTileMovables(): List<TileItem> {
// We have only area and turf
if (this.size == 2) {
return this
}

val area = this.first()
val turf = this.last()
val movables = this.subList(1, this.size - 1).reversed()
val result = mutableListOf<TileItem>()

result.add(area)
result.addAll(movables)
result.add(turf)

return result
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.github.spair.strongdmm.logic.action

import io.github.spair.strongdmm.gui.map.Frame
import io.github.spair.strongdmm.logic.map.Tile

class SwitchTileItemsAction(
private val tile: Tile,
private val item1: Int,
private val item2: Int
) : Undoable {
override fun doAction(): Undoable {
tile.switchTileItems(item1, item2)
Frame.update(true)
return SwitchTileItemsAction(tile, item2, item1)
}
}
49 changes: 49 additions & 0 deletions src/main/kotlin/io/github/spair/strongdmm/logic/map/Tile.kt
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,59 @@ class Tile(val x: Int, val y: Int, private var tileItemsIDs: IntArray) {
return removedItem
}

fun getHigherItemId(tileItemID: Int): Int {
val index = tileItemsIDs.indexOf(tileItemID)

// We are the one who is on the top
if (index == tileItemsIDs.size - 1) {
return NON_EXISTENT_INT
}

for (i in (index + 1) until tileItemsIDs.size) {
val itemId = tileItemsIDs[i]
val tileItem = TileItemProvider.getByID(itemId)
if (tileItem.isType(TYPE_OBJ) || tileItem.isType(TYPE_MOB)) {
return itemId
}
}

return NON_EXISTENT_INT
}

fun getLowerItemId(tileItemID: Int): Int {
val index = tileItemsIDs.indexOf(tileItemID)

// We are the one who is on the bottom
if (index == 0) {
return NON_EXISTENT_INT
}

for (i in (index - 1) downTo 0) {
val itemId = tileItemsIDs[i]
val tileItem = TileItemProvider.getByID(itemId)
if (tileItem.isType(TYPE_OBJ) || tileItem.isType(TYPE_MOB)) {
return itemId
}
}

return NON_EXISTENT_INT
}

fun swapTileItem(which: Int, with: Int) {
tileItemsIDs[tileItemsIDs.indexOf(which)] = with
}

fun switchTileItems(item1: Int, item2: Int) {
val item1Index = tileItemsIDs.indexOf(item1)
val item2Index = tileItemsIDs.indexOf(item2)
val tmpArr = getTileItemsIDs()

tmpArr[item1Index] = item2
tmpArr[item2Index] = item1

tileItemsIDs = tmpArr
}

fun fullReplaceTileItemsByIDs(tileItemsIDs: IntArray) {
this.tileItemsIDs = tileItemsIDs.copyOf()
}
Expand Down

0 comments on commit 65c3934

Please sign in to comment.