Editor/InteriorLayoutBuilder/RoomLayoutTool.SelectionOptions.cs
using System.Collections.Generic;
using System.Linq;
namespace ReusableRoomLayout;
public sealed partial class RoomLayoutTool
{
public bool HasSelectableLayoutItems =>
document.Rooms.Count > 0 ||
document.Doors.Count > 0 ||
document.Windows.Count > 0 ||
document.Corridors.Count > 0 ||
document.FloorCutouts.Count > 0;
public IEnumerable<RoomLayoutSelectionOption> GetSelectionOptions()
{
foreach ( var room in document.Rooms.OrderBy( room => document.FloorFor( room ) ).ThenBy( room => room.Id ) )
{
var name = string.IsNullOrWhiteSpace( room.Name ) ? $"Room {room.Id}" : room.Name;
yield return new RoomLayoutSelectionOption( RoomLayoutSelectionKind.Room, room.Id, $"{FloorLabel( document.FloorFor( room ) )}: {name}", "crop_square" );
}
foreach ( var door in document.Doors.OrderBy( door => document.FloorFor( door ) ).ThenBy( door => door.Id ) )
{
yield return new RoomLayoutSelectionOption( RoomLayoutSelectionKind.Door, door.Id, $"{FloorLabel( document.FloorFor( door ) )}: Door {door.Id}", "door_front" );
}
foreach ( var window in document.Windows.OrderBy( window => document.FloorFor( window ) ).ThenBy( window => window.Id ) )
{
yield return new RoomLayoutSelectionOption( RoomLayoutSelectionKind.Window, window.Id, $"{FloorLabel( document.FloorFor( window ) )}: Window {window.Id}", "window" );
}
foreach ( var corridor in document.Corridors.OrderBy( corridor => document.FloorFor( corridor ) ).ThenBy( corridor => corridor.Id ) )
{
yield return new RoomLayoutSelectionOption( RoomLayoutSelectionKind.Corridor, corridor.Id, $"{FloorLabel( document.FloorFor( corridor ) )}: Corridor {corridor.Id}", "timeline" );
}
foreach ( var cutout in document.FloorCutouts.OrderBy( cutout => document.FloorFor( cutout ) ).ThenBy( cutout => cutout.Id ) )
{
var name = string.IsNullOrWhiteSpace( cutout.Name ) ? $"Floor Cutout {cutout.Id}" : cutout.Name;
yield return new RoomLayoutSelectionOption( RoomLayoutSelectionKind.FloorCutout, cutout.Id, $"{FloorLabel( document.FloorFor( cutout ) )}: {name}", "stairs" );
}
}
public void SelectLayout( RoomLayoutSelectionKind kind, int id )
{
selectedRoomId = 0;
selectedDoorId = 0;
selectedWindowId = 0;
selectedCorridorId = 0;
selectedFloorCutoutId = 0;
switch ( kind )
{
case RoomLayoutSelectionKind.Room when document.FindRoom( id ) is not null:
selectedRoomId = id;
SetActiveFloorFromSelection();
break;
case RoomLayoutSelectionKind.Door when document.FindDoor( id ) is { } door:
selectedRoomId = door.RoomId;
selectedDoorId = id;
SetActiveFloorFromSelection();
break;
case RoomLayoutSelectionKind.Window when document.FindWindow( id ) is { } window:
selectedRoomId = window.RoomId;
selectedWindowId = id;
SetActiveFloorFromSelection();
break;
case RoomLayoutSelectionKind.Corridor when document.Corridors.Any( corridor => corridor.Id == id ):
selectedCorridorId = id;
SetActiveFloorFromSelection();
break;
case RoomLayoutSelectionKind.FloorCutout when document.FloorCutouts.Any( cutout => cutout.Id == id ):
selectedFloorCutoutId = id;
SetActiveFloorFromSelection();
break;
}
}
}
public enum RoomLayoutSelectionKind
{
Room,
Door,
Window,
Corridor,
FloorCutout
}
public readonly record struct RoomLayoutSelectionOption(
RoomLayoutSelectionKind Kind,
int Id,
string Name,
string Icon );