A game framework written with osu! in mind.

Add implicit operators for compatibility with Drawable[][]

+68 -60
+6 -6
osu.Framework.Tests/Layout/TestSceneGridContainerLayout.cs
··· 31 31 AutoSizeAxes = Axes.Both, 32 32 RowDimensions = new[] { new Dimension(GridSizeMode.AutoSize) }, 33 33 ColumnDimensions = new[] { new Dimension(GridSizeMode.AutoSize) }, 34 - Content = new GridContainerContent(new[] 34 + Content = new[] 35 35 { 36 36 new Drawable[] 37 37 { ··· 41 41 LifetimeStart = double.MaxValue 42 42 } 43 43 }, 44 - }) 44 + } 45 45 }; 46 46 }); 47 47 ··· 66 66 AutoSizeAxes = Axes.Both, 67 67 RowDimensions = new[] { new Dimension(GridSizeMode.AutoSize) }, 68 68 ColumnDimensions = new[] { new Dimension(GridSizeMode.AutoSize) }, 69 - Content = new GridContainerContent(new[] 69 + Content = new[] 70 70 { 71 71 new Drawable[] 72 72 { 73 73 box = new Box { Size = new Vector2(200) } 74 74 }, 75 - }) 75 + } 76 76 }; 77 77 }); 78 78 ··· 97 97 AutoSizeAxes = Axes.Both, 98 98 RowDimensions = new[] { new Dimension(GridSizeMode.AutoSize) }, 99 99 ColumnDimensions = new[] { new Dimension(GridSizeMode.AutoSize) }, 100 - Content = new GridContainerContent(new[] 100 + Content = new[] 101 101 { 102 102 new Drawable[] 103 103 { 104 104 box = new TestBox1 { Size = new Vector2(200) } 105 105 }, 106 - }) 106 + } 107 107 }; 108 108 }); 109 109
+2 -2
osu.Framework.Tests/Visual/Audio/TestSceneSampleAmplitudes.cs
··· 36 36 new GridContainer 37 37 { 38 38 RelativeSizeAxes = Axes.Both, 39 - Content = new GridContainerContent(new[] 39 + Content = new[] 40 40 { 41 41 new Drawable[] 42 42 { ··· 78 78 }) 79 79 }, 80 80 } 81 - }) 81 + } 82 82 }, 83 83 }; 84 84 }
+2 -2
osu.Framework.Tests/Visual/Audio/TestSceneTrackAmplitudes.cs
··· 34 34 new GridContainer 35 35 { 36 36 RelativeSizeAxes = Axes.Both, 37 - Content = new GridContainerContent(new[] 37 + Content = new[] 38 38 { 39 39 new Drawable[] 40 40 { ··· 76 76 }) 77 77 }, 78 78 } 79 - }) 79 + } 80 80 }, 81 81 }; 82 82 }
+2 -2
osu.Framework.Tests/Visual/Bindables/TestSceneBindableNumbers.cs
··· 41 41 Child = new GridContainer 42 42 { 43 43 RelativeSizeAxes = Axes.Both, 44 - Content = new GridContainerContent(new[] 44 + Content = new[] 45 45 { 46 46 new Drawable[] 47 47 { ··· 53 53 new BindableDisplayContainer<float>(bindableFloat), 54 54 new BindableDisplayContainer<double>(bindableDouble), 55 55 } 56 - }) 56 + } 57 57 }; 58 58 } 59 59
+1 -1
osu.Framework.Tests/Visual/Containers/TestSceneSafeAreaContainer.cs
··· 138 138 { 139 139 Name = "Safe Contents", 140 140 RelativeSizeAxes = Axes.Both, 141 - Content = new GridContainerContent(boxes), 141 + Content = boxes, 142 142 }; 143 143 } 144 144
+2 -2
osu.Framework.Tests/Visual/Input/TestSceneKeyBindingsGrid.cs
··· 29 29 Child = new GridContainer 30 30 { 31 31 RelativeSizeAxes = Axes.Both, 32 - Content = new GridContainerContent(new[] 32 + Content = new[] 33 33 { 34 34 new Drawable[] 35 35 { ··· 42 42 unique = new KeyBindingTester(SimultaneousBindingMode.Unique, KeyCombinationMatchingMode.Any), 43 43 all = new KeyBindingTester(SimultaneousBindingMode.All, KeyCombinationMatchingMode.Any) 44 44 }, 45 - }) 45 + } 46 46 }; 47 47 } 48 48
+30 -30
osu.Framework.Tests/Visual/Layout/TestSceneGridContainer.cs
··· 60 60 public void TestSingleCellDistributedXy() 61 61 { 62 62 FillBox box = null; 63 - AddStep("set content", () => grid.Content = new GridContainerContent(new[] { new Drawable[] { box = new FillBox() }, })); 63 + AddStep("set content", () => grid.Content = new[] { new Drawable[] { box = new FillBox() }, }); 64 64 AddAssert("box is same size as grid", () => Precision.AlmostEquals(box.DrawSize, grid.DrawSize)); 65 65 } 66 66 ··· 72 72 FillBox box = null; 73 73 AddStep("set content", () => 74 74 { 75 - grid.Content = new GridContainerContent(new[] { new Drawable[] { box = new FillBox() }, }); 75 + grid.Content = new[] { new Drawable[] { box = new FillBox() }, }; 76 76 grid.RowDimensions = grid.ColumnDimensions = new[] { new Dimension(GridSizeMode.Absolute, size) }; 77 77 }); 78 78 ··· 87 87 FillBox box = null; 88 88 AddStep("set content", () => 89 89 { 90 - grid.Content = new GridContainerContent(new[] { new Drawable[] { box = new FillBox() }, }); 90 + grid.Content = new[] { new Drawable[] { box = new FillBox() }, }; 91 91 grid.RowDimensions = grid.ColumnDimensions = new[] { new Dimension(GridSizeMode.Relative, size) }; 92 92 }); 93 93 ··· 103 103 FillBox box = null; 104 104 AddStep("set content", () => 105 105 { 106 - grid.Content = new GridContainerContent(new[] { new Drawable[] { box = new FillBox() }, }); 106 + grid.Content = new[] { new Drawable[] { box = new FillBox() }, }; 107 107 grid.RowDimensions = new[] { new Dimension(GridSizeMode.Absolute, absolute_height) }; 108 108 grid.ColumnDimensions = new[] { new Dimension(GridSizeMode.Relative, relative_width) }; 109 109 }); ··· 120 120 FillBox box = null; 121 121 AddStep("set content", () => 122 122 { 123 - grid.Content = new GridContainerContent(new[] { new Drawable[] { box = new FillBox() }, }); 123 + grid.Content = new[] { new Drawable[] { box = new FillBox() }, }; 124 124 grid.RowDimensions = new[] { new Dimension(GridSizeMode.Relative, height) }; 125 125 }); 126 126 ··· 250 250 251 251 AddStep("set content", () => 252 252 { 253 - grid.Content = new GridContainerContent(new[] 253 + grid.Content = new[] 254 254 { 255 255 new Drawable[] { boxes[0] = new FillBox(), boxes[1] = new FillBox(), boxes[2] = new FillBox() }, 256 256 new Drawable[] { boxes[3] = new FillBox(), boxes[4] = new FillBox(), boxes[5] = new FillBox() }, 257 257 new Drawable[] { boxes[6] = new FillBox(), boxes[7] = new FillBox(), boxes[8] = new FillBox() } 258 - }); 258 + }; 259 259 }); 260 260 261 261 for (int i = 0; i < 9; i++) ··· 279 279 280 280 AddStep("set content", () => 281 281 { 282 - grid.Content = new GridContainerContent(new[] 282 + grid.Content = new[] 283 283 { 284 284 new Drawable[] { boxes[0] = new FillBox(), boxes[1] = new FillBox(), boxes[2] = new FillBox() }, 285 285 new Drawable[] { boxes[3] = new FillBox(), boxes[4] = new FillBox(), boxes[5] = new FillBox() }, 286 286 new Drawable[] { boxes[6] = new FillBox(), boxes[7] = new FillBox(), boxes[8] = new FillBox() } 287 - }); 287 + }; 288 288 289 289 grid.RowDimensions = grid.ColumnDimensions = dimensions; 290 290 }); ··· 310 310 311 311 AddStep("set content", () => 312 312 { 313 - grid.Content = new GridContainerContent(new[] 313 + grid.Content = new[] 314 314 { 315 315 new Drawable[] { boxes[0] = new FillBox(), boxes[1] = new FillBox(), boxes[2] = new FillBox() }, 316 316 new Drawable[] { boxes[3] = new FillBox(), boxes[4] = new FillBox(), boxes[5] = new FillBox() }, 317 317 new Drawable[] { boxes[6] = new FillBox(), boxes[7] = new FillBox(), boxes[8] = new FillBox() } 318 - }); 318 + }; 319 319 320 320 grid.RowDimensions = grid.ColumnDimensions = dimensions; 321 321 }); ··· 341 341 342 342 AddStep("set content", () => 343 343 { 344 - grid.Content = new GridContainerContent(new[] 344 + grid.Content = new[] 345 345 { 346 346 new Drawable[] { boxes[0] = new FillBox(), boxes[1] = new FillBox(), boxes[2] = new FillBox() }, 347 347 new Drawable[] { boxes[3] = new FillBox(), boxes[4] = new FillBox(), boxes[5] = new FillBox() }, 348 348 new Drawable[] { boxes[6] = new FillBox(), boxes[7] = new FillBox(), boxes[8] = new FillBox() } 349 - }); 349 + }; 350 350 351 351 grid.RowDimensions = grid.ColumnDimensions = dimensions; 352 352 }); ··· 377 377 378 378 AddStep("set content", () => 379 379 { 380 - grid.Content = new GridContainerContent(new[] 380 + grid.Content = new[] 381 381 { 382 382 new Drawable[] { boxes[0] = new FillBox(), null, boxes[1] = new FillBox(), null }, 383 383 null, 384 384 new Drawable[] { boxes[2] = new FillBox(), null, boxes[3] = new FillBox(), null }, 385 385 null 386 - }); 386 + }; 387 387 }); 388 388 389 389 AddAssert("two extra rows and columns", () => ··· 405 405 406 406 AddStep("set content", () => 407 407 { 408 - grid.Content = new GridContainerContent(new[] 408 + grid.Content = new[] 409 409 { 410 410 new Drawable[] 411 411 { 412 412 new GridContainer 413 413 { 414 414 RelativeSizeAxes = Axes.Both, 415 - Content = new GridContainerContent(new[] 415 + Content = new[] 416 416 { 417 417 new Drawable[] { boxes[0] = new FillBox(), new FillBox(), }, 418 418 new Drawable[] { new FillBox(), boxes[1] = new FillBox(), }, 419 - }) 419 + } 420 420 }, 421 421 new FillBox(), 422 422 }, ··· 426 426 new GridContainer 427 427 { 428 428 RelativeSizeAxes = Axes.Both, 429 - Content = new GridContainerContent(new[] 429 + Content = new[] 430 430 { 431 431 new Drawable[] { boxes[2] = new FillBox(), new FillBox(), }, 432 432 new Drawable[] { new FillBox(), boxes[3] = new FillBox(), }, 433 - }) 433 + } 434 434 } 435 435 } 436 - }); 436 + }; 437 437 }); 438 438 439 439 for (int i = 0; i < 4; i++) ··· 451 451 452 452 AddStep("set content", () => 453 453 { 454 - grid.Content = new GridContainerContent(new[] 454 + grid.Content = new[] 455 455 { 456 456 new[] 457 457 { ··· 473 473 Size = new Vector2(50, 10) 474 474 }, 475 475 }, 476 - }); 476 + }; 477 477 478 478 grid.ColumnDimensions = new[] { new Dimension(GridSizeMode.AutoSize) }; 479 479 grid.RowDimensions = new[] ··· 605 605 gridParent.RelativeSizeAxes = Axes.Y; 606 606 gridParent.Width = 420; 607 607 608 - grid.Content = new GridContainerContent(new[] 608 + grid.Content = new[] 609 609 { 610 610 new Drawable[] 611 611 { ··· 613 613 new FillBox(), 614 614 new FillBox(), 615 615 }, 616 - }); 616 + }; 617 617 618 618 grid.ColumnDimensions = new[] 619 619 { ··· 635 635 gridParent.RelativeSizeAxes = Axes.Y; 636 636 gridParent.Width = 230; 637 637 638 - grid.Content = new GridContainerContent(new[] 638 + grid.Content = new[] 639 639 { 640 640 new Drawable[] 641 641 { 642 642 new FillBox(), 643 643 new FillBox(), 644 644 }, 645 - }); 645 + }; 646 646 647 647 grid.ColumnDimensions = new[] 648 648 { ··· 672 672 new Dimension(GridSizeMode.AutoSize), 673 673 new Dimension() 674 674 }; 675 - grid.Content = new GridContainerContent(new[] 675 + grid.Content = new[] 676 676 { 677 677 new Drawable[] { new FillBox(), transparentBox(alwaysPresent), new FillBox() }, 678 678 new Drawable[] { new FillBox(), transparentBox(alwaysPresent), new FillBox() }, 679 679 new Drawable[] { transparentBox(alwaysPresent), transparentBox(alwaysPresent), transparentBox(alwaysPresent) } 680 - }); 680 + }; 681 681 }); 682 682 683 683 float desiredTransparentBoxSize = alwaysPresent ? 50 : 0; ··· 843 843 if (!row) 844 844 content = content.Invert(); 845 845 846 - grid.Content = new GridContainerContent(content); 846 + grid.Content = content; 847 847 848 848 if (dimensions == null) 849 849 return;
+2 -2
osu.Framework.Tests/Visual/Sprites/TestSceneAnimationLayout.cs
··· 45 45 Child = new GridContainer 46 46 { 47 47 RelativeSizeAxes = Axes.Both, 48 - Content = new GridContainerContent(new[] 48 + Content = new[] 49 49 { 50 50 new Drawable[] 51 51 { ··· 76 76 } 77 77 } 78 78 }, 79 - }), 79 + }, 80 80 RowDimensions = new[] { new Dimension(GridSizeMode.AutoSize) } 81 81 } 82 82 };
+2 -2
osu.Framework.Tests/Visual/Sprites/TestSceneBufferedContainerView.cs
··· 76 76 new GridContainer 77 77 { 78 78 RelativeSizeAxes = Axes.Both, 79 - Content = new GridContainerContent(new[] 79 + Content = new[] 80 80 { 81 81 new Drawable[] 82 82 { ··· 115 115 }) 116 116 } 117 117 }, 118 - }), 118 + }, 119 119 RowDimensions = new[] 120 120 { 121 121 new Dimension(GridSizeMode.Absolute, 20),
+2 -2
osu.Framework.Tests/Visual/Sprites/TestSceneVideoLayout.cs
··· 44 44 Child = new GridContainer 45 45 { 46 46 RelativeSizeAxes = Axes.Both, 47 - Content = new GridContainerContent(new[] 47 + Content = new[] 48 48 { 49 49 new Drawable[] 50 50 { ··· 75 75 } 76 76 } 77 77 }, 78 - }), 78 + }, 79 79 RowDimensions = new[] { new Dimension(GridSizeMode.AutoSize) } 80 80 } 81 81 };
+8
osu.Framework/Graphics/Containers/GridContainerContent.cs
··· 14 14 15 15 public GridContainerContent(Drawable[][] drawables) 16 16 { 17 + source = drawables; 18 + 17 19 _ = new ArrayWrapper<ArrayWrapper<Drawable>> 18 20 { 19 21 _ = new ArrayWrapper<Drawable>[drawables?.Length ?? 0] ··· 34 36 } 35 37 } 36 38 39 + private readonly Drawable[][] source; 40 + 37 41 private void onArrayElementChanged() 38 42 { 39 43 ContentChanged?.Invoke(); 40 44 } 41 45 42 46 public ArrayWrapper<ArrayWrapper<Drawable>> _ { get; } 47 + 48 + public static implicit operator Drawable[][](GridContainerContent content) => content.source; 49 + 50 + public static implicit operator GridContainerContent(Drawable[][] drawables) => new GridContainerContent(drawables); 43 51 44 52 public ArrayWrapper<Drawable> this[int index] 45 53 {
+1 -1
osu.Framework/Graphics/Containers/Markdown/MarkdownTable.cs
··· 62 62 { 63 63 AutoSizeAxes = Axes.Y, 64 64 RelativeSizeAxes = Axes.X, 65 - Content = new GridContainerContent(rows.Select(x => x.ToArray()).ToArray()) 65 + Content = rows.Select(x => x.ToArray()).ToArray() 66 66 }; 67 67 } 68 68
+1 -1
osu.Framework/Graphics/Containers/TableContainer.cs
··· 162 162 /// </summary> 163 163 private void updateContent() 164 164 { 165 - grid.Content = new GridContainerContent(getContentWithHeaders().ToJagged()); 165 + grid.Content = getContentWithHeaders().ToJagged(); 166 166 167 167 grid.ColumnDimensions = columns.Select(c => c.Dimension).ToArray(); 168 168 grid.RowDimensions = Enumerable.Repeat(RowSize, totalRows).ToArray();
+2 -2
osu.Framework/Graphics/UserInterface/BasicRearrangeableListContainer.cs
··· 58 58 InternalChild = new GridContainer 59 59 { 60 60 RelativeSizeAxes = Axes.Both, 61 - Content = new GridContainerContent(new[] 61 + Content = new[] 62 62 { 63 63 new[] 64 64 { ··· 98 98 Action = () => RequestRemoval?.Invoke(this), 99 99 }, 100 100 }, 101 - }), 101 + }, 102 102 ColumnDimensions = new[] 103 103 { 104 104 new Dimension(GridSizeMode.AutoSize),
+2 -2
osu.Framework/Testing/Drawables/Sections/ToolbarRateSection.cs
··· 29 29 new Dimension(GridSizeMode.AutoSize), 30 30 new Dimension(), 31 31 }, 32 - Content = new GridContainerContent(new[] 32 + Content = new[] 33 33 { 34 34 new Drawable[] 35 35 { ··· 56 56 Current = browser.PlaybackRate 57 57 }, 58 58 } 59 - }) 59 + } 60 60 }; 61 61 62 62 rateAdjustSlider.Current.BindValueChanged(e => rateText.Text = e.NewValue.ToString("0%"), true);
+2 -2
osu.Framework/Testing/Drawables/TestBrowserToolbar.cs
··· 44 44 new Dimension(), 45 45 new Dimension(GridSizeMode.AutoSize), 46 46 }, 47 - Content = new GridContainerContent(new[] 47 + Content = new[] 48 48 { 49 49 new Drawable[] 50 50 { ··· 71 71 } 72 72 }, 73 73 } 74 - }), 74 + }, 75 75 }, 76 76 } 77 77 };
+1 -1
osu.Framework/Testing/GridTestScene.cs
··· 44 44 cells[r, c] = new Container { RelativeSizeAxes = Axes.Both }; 45 45 } 46 46 47 - testContainer.Content = new GridContainerContent(cells.ToJagged()); 47 + testContainer.Content = cells.ToJagged(); 48 48 } 49 49 50 50 protected Container Cell(int index) => (Container)cells[index / Cols, index % Cols];