ModularUI2 核心接口(api/widget、api/layout)
基本信息
| 属性 | 值 |
|---|---|
| 包路径 | com.cleanroommc.modularui.api.widget / .api.layout |
api/widget 文件数 |
17 |
api/layout 文件数 |
5 |
| 基类实现 | com.cleanroommc.modularui.widget.AbstractWidget(widget/AbstractWidget.java:13,implements IWidget) |
| 通用基类 | com.cleanroommc.modularui.widget.Widget<W extends Widget<W>>(widget/Widget.java:47) |
ModularUI2 的全部可扩展契约都放在 api/ 包下,运行时实现放在 widget/、widgets/ 等包下。
api/ 包的控件/布局层共 22 个类型(widget 17 + layout 5),
是其他 mod 编程时首先应当依赖的部分。
(api/ 下另有 value 11 + value/sync 11 + drawable 7 + event 2,
合计 53 个接口类型,见 值与同步接口。)
功能
接口分层
自顶向下的继承关系(grep -oE 'public interface X extends ...' src/main/java/com/cleanroommc/modularui/api/widget/):
| 接口 | 职责 | 关键方法 |
|---|---|---|
IGuiElement |
所有 GUI 元素的最顶层契约 | hasParent()(:32)、getParentArea()(:46)、applyTheme(ITheme)(:56)、isEnabled()(:109)、getDefaultWidth()/getDefaultHeight()(:114/:121)、悬停状态 isHovering()/isHoveringFor(int)/isBelowMouse()/isBelowMouseFor(int)(:82-:100) |
IWidget extends IGuiElement, ITreeNode |
可渲染、可定位的控件 | isInside(IViewportStack,int,int)(:79)、isInside(...,boolean absolute)(:93) |
IPositioned<W> |
位置与自适应尺寸 | requiresResize()(:27)、scheduleResize()(:29)、coverChildrenWidth()/coverChildrenHeight()(:36/:40)、disableCoverChildren*()(:66-:74) |
IParentWidget<I,W> |
可容纳子控件 | addChild(I,int)(:11)、child(I)(:20)、childIf(boolean,Supplier<I>)(:37) |
IFocusedWidget |
可获焦 | isFocused()(:14)、onFocus(ModularGuiContext)(:21)、onRemoveFocus(ModularGuiContext)(:28) |
ITooltip<W> |
提示气泡 | tooltip(...) 系列 4 个重载(:64/:75/:87/:98)、tooltipPos(:109/:121)、tooltipAlignment(:132)、tooltipTextShadow(:144)、tooltipTextColor(:155) |
ISynced<W> |
服务端↔客户端同步 | initialiseSyncHandler(ModularSyncManager,boolean late)(:35)、isValidSyncOrValue(ISyncOrValue)(:55) |
IValueWidget<W,T> |
绑定一个值 | 见 值与同步接口 |
IVanillaSlot |
暴露原版 Slot 语义 |
用于 ItemSlot 适配原版 GuiContainer |
IDelegatingWidget |
代理另一个控件 | TransformWidget、DelegatingWidget 实现它 |
IDraggable / IDragResizeable / ResizeDragArea |
拖动与边缘缩放 | ResizeDragArea 是 TOP/LEFT/…/BOTTOM_RIGHT 枚举 |
布局相关接口(api/layout,5 个)
| 接口 | 用途 |
|---|---|
ILayoutWidget |
标记「参与布局计算」的控件 |
IResizeable |
可被父级重新分配尺寸 |
IResizeParent |
可作为 resize 的父级 |
IViewport |
坐标视口(提供当前变换矩阵) |
IViewportStack |
视口栈,负责坐标变换的压栈/弹栈 |
交互接口
Interactable(api/widget/Interactable.java)提供 12 个全 default 的事件回调,
默认实现全部为空或返回 Result.REJECT,因此实现类只需覆写关心的方法:
- 鼠标:
onMousePressed(:29)、onMouseRelease(:39)、onMouseTapped(:51)、onMouseScroll(:101)、onMouseDrag(:111) - 键盘:
onKeyPressed(:64)、onKeyRelease(:75)、onKeyTapped(:88) - 客户端侧:
onMouseClick(:116附近,@SideOnly(Side.CLIENT))、onKeyClick(:124附近)
ModernInteractable(api/widget/ModernInteractable.java)是 lwjgl3ify 专属的新版输入接口,
两个方法都标注 @Optional.Method(modid = ModularUI.ModIds.LWJGL3IFY)(:11、:16):
onKeyEvent(InputEvents.KeyEvent) 与 onTextInput(InputEvents.TextEvent)。
未安装 lwjgl3ify 时这两个回调不会被调用。
输入事件对象(api/event,2 个)
KeyboardInputEvent 与 MouseInputEvent 由
core/mixins/early/minecraft/GuiScreenMixin.java:3-4 注入 GuiScreen 后派发,
其他 mod 可以监听它们来拦截原版 GUI 收到的输入。
相关条目
- 值与同步接口 -
IValue家族、ISynced的值绑定部分 - GUI 工厂入口 - 把界面挂到方块/物品/实体上的注册面
- Widget 基类与层级 -
IWidget的默认实现