ButtonManager

图层按钮:激活/停用切换

基本信息

属性 值
路径 com.gtnewhorizons.navigator.api.model.buttons.ButtonManager
行数 90
类型 abstract class

地图上的图层开关按钮。由 LayerManager 持有, 状态通过 onToggle / layerNotify 回调双向同步。

三个字段(:19-20)

protected boolean isActive = false;
protected BooleanConsumer onToggle;

⚠️ onToggle 初值是 null —— 必须先 setOnToggle(...) 才能工作, 否则 toggle() 里的 onToggle.accept(...) 会 NPE。

⚠️ isActive 初值 false —— 图层默认未激活。

抽象方法(2 个)

方法 行 返回
getIcon(SupportedMods mod, String theme) :29-30 ResourceLocation(abstract)
getButtonText() :32-33 String(abstract)

⚠️ getIcon 带 String theme 参数 —— 三个地图模组的图标主题机制不同 (JourneyMap 有自己的主题系统,Xaero 的图标集也不同), 所以实现方要按 mod + theme 返回不同纹理。

⚠️ getButtonText() 不带 SupportedMods 参数 —— 即按钮文字在三个地图上必须相同(文字不做主题适配)。

两个回调 setter(final)

方法 行 参数
setOnToggle(BooleanConsumer) :37-39 final
setLayerNotify(BooleanConsumer) :47-48 final

⚠️ 两个都是 final —— 子类不能覆写,只能调 set。

四个状态方法

方法 行 语义
isActive() :52-54 查状态
activate() :57-69 激活(13 行)
deactivate() :71-81 停用(11 行)
toggle() :83-~88 切换

⚠️ activate / deactivate 体长相当(13 / 11 行)—— 说明两者都做了实际工作(改 isActive + 触发回调

  • 可能通知图层),不是简单的赋值。

⚠️ 缺 isDeactivated() 之类的反向查询 —— 只有 isActive(),所以要判断「是否停用」得写 !isActive()。

与 LayerManager 的双向同步

用户点地图按钮
  ↓
ButtonManager.toggle()  →  改 isActive  →  调 onToggle
  ↓                                        ↓
LayerManager 收到 onLayerToggled(boolean toEnable)   (:376)

⚠️ LayerManager.onLayerToggled(:376-388)是可覆写的桥接点, 而 ButtonManager 的两个 setter 是 final—— 所以同步方向不对称:按钮→图层是 final,图层→按钮可覆写。

本仓的参考实现

DirtyChunkButtonManager(24 行)—— 是 ButtonManager 的最小实现,演示 getIcon / getButtonText 该怎么写。

相关