This guide documents the events and hooks available for connecting your game’s UI to GridPlacement mode changes.
Event Architecture
GridPlacement uses a dual-event pattern:
Core events — C# EventHandler<T> events on IModeService
Godot signals — PlacementSignalBus for Godot-native UI wiring
Both are fired simultaneously so you can use either pattern.
Mode Events (IModeService)
ModeChanged Event
Fired when the primary grid mode changes.
1
2
3
4
5
6
7
8
9
10
11
modeService.ModeChanged+=(sender,args)=>{switch(args.NewMode){caseGridMode.Place:ShowPlacePalette();break;caseGridMode.Move:ShowMoveCursor();break;caseGridMode.Remove:ShowDemolishCursor();break;caseGridMode.Edit:// Edit mode entered - waiting for entity selectioncaseGridMode.Inspect:ShowInspectPanel();break;}};
EntitySelectedForEdit Event
Fired when an editable entity is selected in Edit mode.
1
2
3
4
5
modeService.EntitySelectedForEdit+=(sender,args)=>{// Load entity data and show edit UIShowEditPanel(args.EntityId,args.EntityType);};
Event Properties:
Property
Type
Description
EntityId
EntityId
ECS entity ID of selected object
EntityType
string
Type name for loading appropriate edit UI
Godot Signal Bus
The PlacementSignalBus provides Godot-native signals:
1
2
3
4
5
6
7
8
// In PlacementBootstrappublicPlacementSignalBusPlacementSignals{get;}=new();// Signals available:// PlacementSignals.PlaceConfirmed// PlacementSignals.PlacementInvalid// PlacementSignals.ManipulationStarted// etc.
ModeChanged → Game shows “select entity to edit” hint
EntitySelectedForEdit → Game shows edit panel with entity properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
privatevoidOnModeChanged(object?sender,ModeChangedEventargs){if(args.NewMode==GridMode.Edit){_ui.ShowEditModeHint("Click an editable building to edit its properties");}}privatevoidOnEntitySelectedForEdit(object?sender,EntitySelectedForEditEventargs){// Load entity data from ECSvarentity=_store.GetEntityById(args.EntityId);// Show edit panel_ui.ShowEditPanel(args.EntityType,entity);}
publicclassPlacementUiController:Node{ [Export]privatePlacementBootstrap_bootstrap=null!; [Export]privateControl_editPanel=null!; [Export]privateControl_palettePanel=null!;publicoverridevoid_Ready(){varmodeService=_bootstrap.Coordinator?.ModeService;modeService.ModeChanged+=OnModeChanged;modeService.EntitySelectedForEdit+=OnEntitySelectedForEdit;}privatevoidOnModeChanged(object?sender,ModeChangedEventargs){_palettePanel.Visible=args.NewMode==GridMode.Place;_editPanel.Visible=false;if(args.NewMode==GridMode.Edit){_ui.ShowMessage("Select a building to edit");}}privatevoidOnEntitySelectedForEdit(object?sender,EntitySelectedForEditEventargs){_editPanel.Visible=true;_ui.LoadEntityForEditing(args.EntityId,args.EntityType);}}