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 该怎么写。
相关
- LayerManager - 持有者
- InteractableLayerManager - 子类层
- DirtyChunkButtonManager - 参考实现
- SizableGuiTexturedButton - Xaero 侧按钮控件