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 收到的输入。

相关条目