GridLayout.java

net.minecraft.client.gui.layouts.GridLayout

信息

  • 全限定名:net.minecraft.client.gui.layouts.GridLayout
  • 类型:public class
  • 包:net.minecraft.client.gui.layouts
  • 源码路径:src/main/java/net/minecraft/client/gui/layouts/GridLayout.java
  • 起始行号:L14
  • 继承:AbstractLayout
  • 职责:

    TODO

字段/常量

  • children

    • 类型: List<GridLayout.ChildContainer>
    • 修饰符: private final
    • 源码定位: L15
    • 说明:

      TODO

  • defaultCellSettings

    • 类型: LayoutSettings
    • 修饰符: private final
    • 源码定位: L16
    • 说明:

      TODO

  • rowSpacing

    • 类型: int
    • 修饰符: private
    • 源码定位: L17
    • 说明:

      TODO

  • columnSpacing

    • 类型: int
    • 修饰符: private
    • 源码定位: L18
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.gui.layouts.GridLayout.ChildContainer

    • 类型: class
    • 修饰符: private static
    • 源码定位: L158
    • 说明:

      TODO

  • net.minecraft.client.gui.layouts.GridLayout.RowHelper

    • 类型: class
    • 修饰符: public final
    • 源码定位: L182
    • 说明:

      TODO

构造器

public GridLayout() @ L20

  • 构造器名:GridLayout
  • 源码定位:L20
  • 修饰符:public

参数:

说明:

TODO

public GridLayout(int x, int y) @ L24

  • 构造器名:GridLayout
  • 源码定位:L24
  • 修饰符:public

参数:

  • x: int
  • y: int

说明:

TODO

方法

下面的方法块按源码顺序生成。

public void arrangeElements() @ L28

  • 方法名:arrangeElements
  • 源码定位:L28
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

public <T extends LayoutElement> T addChild(T child, int row, int column) @ L95

  • 方法名:addChild
  • 源码定位:L95
  • 返回类型: T
  • 修饰符:public

参数:

  • child: T
  • row: int
  • column: int

说明:

TODO

public <T extends LayoutElement> T addChild(T child, int row, int column, LayoutSettings cellSettings) @ L99

  • 方法名:addChild
  • 源码定位:L99
  • 返回类型: T
  • 修饰符:public

参数:

  • child: T
  • row: int
  • column: int
  • cellSettings: LayoutSettings

说明:

TODO

public <T extends LayoutElement> T addChild(T child, int row, int column, Consumer<LayoutSettings> layoutSettingsAdjustments) @ L103

  • 方法名:addChild
  • 源码定位:L103
  • 返回类型: T
  • 修饰符:public

参数:

  • child: T
  • row: int
  • column: int
  • layoutSettingsAdjustments: Consumer

说明:

TODO

public <T extends LayoutElement> T addChild(T child, int row, int column, int rows, int columns) @ L107

  • 方法名:addChild
  • 源码定位:L107
  • 返回类型: T
  • 修饰符:public

参数:

  • child: T
  • row: int
  • column: int
  • rows: int
  • columns: int

说明:

TODO

public <T extends LayoutElement> T addChild(T child, int row, int column, int rows, int columns, LayoutSettings cellSettings) @ L111

  • 方法名:addChild
  • 源码定位:L111
  • 返回类型: T
  • 修饰符:public

参数:

  • child: T
  • row: int
  • column: int
  • rows: int
  • columns: int
  • cellSettings: LayoutSettings

说明:

TODO

public <T extends LayoutElement> T addChild(T child, int row, int column, int rows, int columns, Consumer<LayoutSettings> layoutSettingsAdjustments) @ L122

  • 方法名:addChild
  • 源码定位:L122
  • 返回类型: T
  • 修饰符:public

参数:

  • child: T
  • row: int
  • column: int
  • rows: int
  • columns: int
  • layoutSettingsAdjustments: Consumer

说明:

TODO

public GridLayout columnSpacing(int columnSpacing) @ L126

  • 方法名:columnSpacing
  • 源码定位:L126
  • 返回类型:GridLayout
  • 修饰符:public

参数:

  • columnSpacing: int

说明:

TODO

public GridLayout rowSpacing(int rowSpacing) @ L131

  • 方法名:rowSpacing
  • 源码定位:L131
  • 返回类型:GridLayout
  • 修饰符:public

参数:

  • rowSpacing: int

说明:

TODO

public GridLayout spacing(int spacing) @ L136

  • 方法名:spacing
  • 源码定位:L136
  • 返回类型:GridLayout
  • 修饰符:public

参数:

  • spacing: int

说明:

TODO

public void visitChildren(Consumer<LayoutElement> layoutElementVisitor) @ L140

  • 方法名:visitChildren
  • 源码定位:L140
  • 返回类型:void
  • 修饰符:public

参数:

  • layoutElementVisitor: Consumer

说明:

TODO

public LayoutSettings newCellSettings() @ L145

  • 方法名:newCellSettings
  • 源码定位:L145
  • 返回类型:LayoutSettings
  • 修饰符:public

参数:

说明:

TODO

public LayoutSettings defaultCellSetting() @ L149

  • 方法名:defaultCellSetting
  • 源码定位:L149
  • 返回类型:LayoutSettings
  • 修饰符:public

参数:

说明:

TODO

public GridLayout.RowHelper createRowHelper(int columns) @ L153

  • 方法名:createRowHelper
  • 源码定位:L153
  • 返回类型:GridLayout.RowHelper
  • 修饰符:public

参数:

  • columns: int

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class GridLayout extends AbstractLayout {
    private final List<GridLayout.ChildContainer> children = new ArrayList<>();
    private final LayoutSettings defaultCellSettings = LayoutSettings.defaults();
    private int rowSpacing = 0;
    private int columnSpacing = 0;
 
    public GridLayout() {
        this(0, 0);
    }
 
    public GridLayout(int x, int y) {
        super(x, y, 0, 0);
    }
 
    @Override
    public void arrangeElements() {
        super.arrangeElements();
        int maxRow = 0;
        int maxColumn = 0;
 
        for (GridLayout.ChildContainer child : this.children) {
            maxRow = Math.max(child.getLastOccupiedRow(), maxRow);
            maxColumn = Math.max(child.getLastOccupiedColumn(), maxColumn);
        }
 
        int[] maxColumnWidths = new int[maxColumn + 1];
        int[] maxRowHeights = new int[maxRow + 1];
 
        for (GridLayout.ChildContainer child : this.children) {
            int childHeight = child.getHeight() - (child.occupiedRows - 1) * this.rowSpacing;
            Divisor heightDivisor = new Divisor(childHeight, child.occupiedRows);
 
            for (int row = child.row; row <= child.getLastOccupiedRow(); row++) {
                maxRowHeights[row] = Math.max(maxRowHeights[row], heightDivisor.nextInt());
            }
 
            int childWidth = child.getWidth() - (child.occupiedColumns - 1) * this.columnSpacing;
            Divisor widthDivisor = new Divisor(childWidth, child.occupiedColumns);
 
            for (int column = child.column; column <= child.getLastOccupiedColumn(); column++) {
                maxColumnWidths[column] = Math.max(maxColumnWidths[column], widthDivisor.nextInt());
            }
        }
 
        int[] columnXOffsets = new int[maxColumn + 1];
        int[] rowYOffsets = new int[maxRow + 1];
        columnXOffsets[0] = 0;
 
        for (int column = 1; column <= maxColumn; column++) {
            columnXOffsets[column] = columnXOffsets[column - 1] + maxColumnWidths[column - 1] + this.columnSpacing;
        }
 
        rowYOffsets[0] = 0;
 
        for (int row = 1; row <= maxRow; row++) {
            rowYOffsets[row] = rowYOffsets[row - 1] + maxRowHeights[row - 1] + this.rowSpacing;
        }
 
        for (GridLayout.ChildContainer child : this.children) {
            int availableWidth = 0;
 
            for (int column = child.column; column <= child.getLastOccupiedColumn(); column++) {
                availableWidth += maxColumnWidths[column];
            }
 
            availableWidth += this.columnSpacing * (child.occupiedColumns - 1);
            child.setX(this.getX() + columnXOffsets[child.column], availableWidth);
            int availableHeight = 0;
 
            for (int row = child.row; row <= child.getLastOccupiedRow(); row++) {
                availableHeight += maxRowHeights[row];
            }
 
            availableHeight += this.rowSpacing * (child.occupiedRows - 1);
            child.setY(this.getY() + rowYOffsets[child.row], availableHeight);
        }
 
        this.width = columnXOffsets[maxColumn] + maxColumnWidths[maxColumn];
        this.height = rowYOffsets[maxRow] + maxRowHeights[maxRow];
    }
 
    public <T extends LayoutElement> T addChild(T child, int row, int column) {
        return this.addChild(child, row, column, this.newCellSettings());
    }
 
    public <T extends LayoutElement> T addChild(T child, int row, int column, LayoutSettings cellSettings) {
        return this.addChild(child, row, column, 1, 1, cellSettings);
    }
 
    public <T extends LayoutElement> T addChild(T child, int row, int column, Consumer<LayoutSettings> layoutSettingsAdjustments) {
        return this.addChild(child, row, column, 1, 1, Util.make(this.newCellSettings(), layoutSettingsAdjustments));
    }
 
    public <T extends LayoutElement> T addChild(T child, int row, int column, int rows, int columns) {
        return this.addChild(child, row, column, rows, columns, this.newCellSettings());
    }
 
    public <T extends LayoutElement> T addChild(T child, int row, int column, int rows, int columns, LayoutSettings cellSettings) {
        if (rows < 1) {
            throw new IllegalArgumentException("Occupied rows must be at least 1");
        } else if (columns < 1) {
            throw new IllegalArgumentException("Occupied columns must be at least 1");
        } else {
            this.children.add(new GridLayout.ChildContainer(child, row, column, rows, columns, cellSettings));
            return child;
        }
    }
 
    public <T extends LayoutElement> T addChild(T child, int row, int column, int rows, int columns, Consumer<LayoutSettings> layoutSettingsAdjustments) {
        return this.addChild(child, row, column, rows, columns, Util.make(this.newCellSettings(), layoutSettingsAdjustments));
    }
 
    public GridLayout columnSpacing(int columnSpacing) {
        this.columnSpacing = columnSpacing;
        return this;
    }
 
    public GridLayout rowSpacing(int rowSpacing) {
        this.rowSpacing = rowSpacing;
        return this;
    }
 
    public GridLayout spacing(int spacing) {
        return this.columnSpacing(spacing).rowSpacing(spacing);
    }
 
    @Override
    public void visitChildren(Consumer<LayoutElement> layoutElementVisitor) {
        this.children.forEach(child -> layoutElementVisitor.accept(child.child));
    }
 
    public LayoutSettings newCellSettings() {
        return this.defaultCellSettings.copy();
    }
 
    public LayoutSettings defaultCellSetting() {
        return this.defaultCellSettings;
    }
 
    public GridLayout.RowHelper createRowHelper(int columns) {
        return new GridLayout.RowHelper(columns);
    }
 
    @OnlyIn(Dist.CLIENT)
    private static class ChildContainer extends AbstractLayout.AbstractChildWrapper {
        private final int row;
        private final int column;
        private final int occupiedRows;
        private final int occupiedColumns;
 
        private ChildContainer(LayoutElement widget, int row, int column, int occupiedRows, int occupiedColumns, LayoutSettings cellSettings) {
            super(widget, cellSettings.getExposed());
            this.row = row;
            this.column = column;
            this.occupiedRows = occupiedRows;
            this.occupiedColumns = occupiedColumns;
        }
 
        public int getLastOccupiedRow() {
            return this.row + this.occupiedRows - 1;
        }
 
        public int getLastOccupiedColumn() {
            return this.column + this.occupiedColumns - 1;
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    public final class RowHelper {
        private final int columns;
        private int index;
 
        private RowHelper(int columns) {
            Objects.requireNonNull(GridLayout.this);
            super();
            this.columns = columns;
        }
 
        public <T extends LayoutElement> T addChild(T widget) {
            return this.addChild(widget, 1);
        }
 
        public <T extends LayoutElement> T addChild(T widget, int columnWidth) {
            return this.addChild(widget, columnWidth, this.defaultCellSetting());
        }
 
        public <T extends LayoutElement> T addChild(T widget, LayoutSettings layoutSettings) {
            return this.addChild(widget, 1, layoutSettings);
        }
 
        public <T extends LayoutElement> T addChild(T widget, int columnWidth, LayoutSettings layoutSettings) {
            int row = this.index / this.columns;
            int columnBegin = this.index % this.columns;
            if (columnBegin + columnWidth > this.columns) {
                row++;
                columnBegin = 0;
                this.index = Mth.roundToward(this.index, this.columns);
            }
 
            this.index += columnWidth;
            return GridLayout.this.addChild(widget, row, columnBegin, 1, columnWidth, layoutSettings);
        }
 
        public GridLayout getGrid() {
            return GridLayout.this;
        }
 
        public LayoutSettings newCellSettings() {
            return GridLayout.this.newCellSettings();
        }
 
        public LayoutSettings defaultCellSetting() {
            return GridLayout.this.defaultCellSetting();
        }
    }
}

引用的其他类

  • Divisor

    • 引用位置: 构造调用
    • 关联成员: Divisor()
  • AbstractLayout

    • 引用位置: 继承
  • LayoutElement

    • 引用位置: 参数/返回值
  • LayoutSettings

    • 引用位置: 参数/字段/方法调用/返回值
    • 关联成员: LayoutSettings.defaults()
  • Mth

    • 引用位置: 方法调用
    • 关联成员: Mth.roundToward()
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.make()