; SPDX-FileCopyrightText: 2023 Jummit
;
; SPDX-License-Identifier: GPL-3.0-or-later

(var handled false)

(fn select-with-mouse [world]
  (let [(mx my) (_G.mouse)]
    (each [_ entity (ipairs world)]
      (case entity
        (where {: y : x : w : h} entity.on-select)
        (set entity.selected (and (< x mx (+ x w)) (< y my (+ y h))))
        (where {: y : x : w : h} entity.selected)
        (set entity.selected nil)))))

(fn perform-select [world]
  (let [(_ _ pressed) (_G.mouse)]
    (if (not pressed)
        (set handled false)
        (each [_ entity (ipairs world)]
          (when (not handled)
            (case entity
              {: on-select :selected true}
              (do
                (set handled true)
                (on-select))))))))

{: select-with-mouse : perform-select}