{"record":{"id":"86a9f2fb25bca064","repo":"FyroxEngine/Fyrox","slug":"node-column-out-of-bounds-row-column","errorCode":null,"errorMessage":"Node column out of bounds: {} row:{}, column:{}","messagePattern":"Node column out of bounds: (.+?) row:(.+?), column:(.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"fyrox-ui/src/grid.rs","lineNumber":466,"sourceCode":"                SizeMode::Strict => dim.actual_size = dim.desired_size,\n                SizeMode::Stretch => (),\n            }\n        }\n        for handle in self.children() {\n            let Ok(node) = ui.try_get_node(*handle) else {\n                continue;\n            };\n            let Some(row) = rows.get_mut(node.row()) else {\n                Log::err(format!(\n                    \"Node row out of bounds: {} row:{}, column:{}\",\n                    node.type_info_ref().type_name,\n                    node.row(),\n                    node.column()\n                ));\n                continue;\n            };\n            let Some(col) = cols.get_mut(node.column()) else {\n                Log::err(format!(\n                    \"Node column out of bounds: {} row:{}, column:{}\",\n                    node.type_info_ref().type_name,\n                    node.row(),\n                    node.column()\n                ));\n                continue;\n            };\n            if col.size_mode == SizeMode::Auto {\n                col.unmeasured_node_count += 1\n            }\n            if row.size_mode == SizeMode::Auto {\n                row.unmeasured_node_count += 1\n            }\n        }\n    }\n    fn measure_width_and_height(\n        &self,\n        child: Handle<UiNode>,","sourceCodeStart":448,"sourceCodeEnd":484,"githubUrl":"https://github.com/FyroxEngine/Fyrox/blob/76c91aad8eca488ce527b1af707be8b3b24ad72d/fyrox-ui/src/grid.rs#L448-L484","documentation":"The Grid widget arranges children by (row, column) indices into its internal row/column size collections. This error is logged when a child node's column index is >= the number of columns the grid knows about (no matching column slot exists), so that child is skipped during measurement.","triggerScenarios":"Adding a Grid child whose `column` value exceeds the grid's column count (or before columns are defined), e.g. `WidgetBuilder::new().on_row(0).on_column(5)` on a grid that only has 3 columns, or mutating grid column definitions after children were added.","commonSituations":"Building grid UIs programmatically with hardcoded indices; binding children from data where the column index comes from unvalidated config/data; increasing row/column definitions out of sync with existing children after style or layout changes.","solutions":["Ensure the grid's column definitions (e.g. via `GridBuilder::draw_columns` / column count) cover every child's `column` index","Clamp or validate each child's row/column against grid dimensions before adding it","Log/inspect which node has the bad index using the type name printed in the message and fix its WidgetBuilder on_column value","Check for off-by-one errors: columns are 0-based, so a 3-column grid accepts columns 0..=2"],"exampleFix":"// before\nTextBuilder::new(WidgetBuilder::new().on_row(0).on_column(5))\n// after\nlet column = 5.min(grid_columns - 1);\nTextBuilder::new(WidgetBuilder::new().on_row(0).on_column(column))","handlingStrategy":"validation","validationCode":"fn grid_child_is_in_bounds(grid_cols: usize, grid_rows: usize, row: usize, column: usize) -> bool {\n    row < grid_rows && column < grid_cols\n}","typeGuard":"fn valid_cell(grid_cols: usize, grid_rows: usize, b: &WidgetBuilder) -> bool {\n    b.row.unwrap_or(0) < grid_rows && b.column.unwrap_or(0) < grid_cols\n}","tryCatchPattern":null,"preventionTips":["Keep a single source of truth for grid row/column counts and derive child indices from it","Clamp child indices at the point of construction","Watch for off-by-one errors with 0-based indices"],"tags":["ui","layout","grid","index-out-of-bounds"],"backgroundTag":"index-out-of-bounds","analyzedSha":"76c91aad8eca488ce527b1af707be8b3b24ad72d","analyzedAt":"2026-09-10T16:04:01.633Z","contentChangedAt":"2026-09-10T16:04:01.633Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}