feat: explicitly reset filter state on room geometry change
This commit is contained in:
@@ -93,12 +93,23 @@ defmodule Localiser.Localisation.Tag.Filter do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Room geometry changed: reload the rooms cache so containment checks stay accurate.
|
|
||||||
@impl true
|
@impl true
|
||||||
def handle_info({event, _}, state) when event in [:room_created, :room_updated] do
|
def handle_info({:room_created, _room}, state) do
|
||||||
{:noreply, %{state | rooms: load_rooms()}}
|
{:noreply, %{state | rooms: load_rooms()}}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def handle_info({:room_updated, updated_room}, state) do
|
||||||
|
new_rooms = load_rooms()
|
||||||
|
old_room = Enum.find(state.rooms, &(&1.id == updated_room.id))
|
||||||
|
|
||||||
|
if geometry_changed?(old_room, updated_room) do
|
||||||
|
{:ok, new_filter_state} = state.filter_module.init([], rooms: new_rooms)
|
||||||
|
{:noreply, %{state | rooms: new_rooms, filter_state: new_filter_state}}
|
||||||
|
else
|
||||||
|
{:noreply, %{state | rooms: new_rooms}}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def handle_info({:room_deleted, _room_id, _floor_id}, state) do
|
def handle_info({:room_deleted, _room_id, _floor_id}, state) do
|
||||||
{:noreply, %{state | rooms: load_rooms()}}
|
{:noreply, %{state | rooms: load_rooms()}}
|
||||||
end
|
end
|
||||||
@@ -131,6 +142,12 @@ defmodule Localiser.Localisation.Tag.Filter do
|
|||||||
|> Enum.flat_map(& &1.rooms)
|
|> Enum.flat_map(& &1.rooms)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp geometry_changed?(nil, _), do: true
|
||||||
|
defp geometry_changed?(old, new) do
|
||||||
|
old.x != new.x or old.y != new.y or
|
||||||
|
old.width != new.width or old.height != new.height
|
||||||
|
end
|
||||||
|
|
||||||
defp find_room(rooms, x, y) do
|
defp find_room(rooms, x, y) do
|
||||||
Enum.find(rooms, fn room ->
|
Enum.find(rooms, fn room ->
|
||||||
ox = room.x || 0.0
|
ox = room.x || 0.0
|
||||||
|
|||||||
Reference in New Issue
Block a user