aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/moe/nea/firmament/features/world/NpcWaypointGui.kt
blob: 6146e50133b3c01de2ae9f23f4f27160cfd8192a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package moe.nea.firmament.features.world

import io.github.notenoughupdates.moulconfig.observer.ObservableList
import io.github.notenoughupdates.moulconfig.xml.Bind
import moe.nea.firmament.features.events.anniversity.AnniversaryFeatures.atOnce
import moe.nea.firmament.keybindings.SavedKeyBinding

class NpcWaypointGui(
    val allWaypoints: List<NavigableWaypoint>,
) {

    data class NavigableWaypointW(val waypoint: NavigableWaypoint) {
        @Bind
        fun name() = waypoint.name

        @Bind
        fun isSelected() = NavigationHelper.targetWaypoint == waypoint

        @Bind
        fun click() {
            if (SavedKeyBinding.isShiftDown()) {
                NavigationHelper.targetWaypoint = waypoint
                NavigationHelper.tryWarpNear()
            } else if (isSelected()) {
                NavigationHelper.targetWaypoint = null
            } else {
                NavigationHelper.targetWaypoint = waypoint
            }
        }
    }

    @JvmField
    @field:Bind
    var search: String = ""
    var lastSearch: String? = null

    @Bind("results")
    fun results(): ObservableList<NavigableWaypointW> {
        return results
    }

    @Bind
    fun tick() {
        if (search != lastSearch) {
            updateSearch()
            lastSearch = search
        }
    }

    val results: ObservableList<NavigableWaypointW> = ObservableList(mutableListOf())

    fun updateSearch() {
        val split = search.split(" +".toRegex())
        results.atOnce {
            results.clear()
            allWaypoints.filter { waypoint ->
                if (search.isBlank()) {
                    true
                } else {
                    split.all { waypoint.name.contains(it, ignoreCase = true) }
                }
            }.mapTo(results) {
                NavigableWaypointW(it)
            }
        }
    }

}