1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
package gregtech.common.gui.modularui.widget;
import java.io.IOException;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import net.minecraft.network.PacketBuffer;
import com.gtnewhorizons.modularui.api.widget.Widget;
import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
import gregtech.api.gui.modularui.IDataFollowerWidget;
import gregtech.api.util.GT_CoverBehaviorBase;
import gregtech.api.util.ISerializableObject;
public class CoverDataControllerWidget<T extends ISerializableObject> extends DataControllerWidget<T> {
protected final GT_CoverBehaviorBase<T> coverBehavior;
/**
* @param dataGetter () -> cover data this widget handles
* @param dataSetter data to set -> if setting cover data is successful
* @param coverBehavior cover this widget handles data update
*/
public CoverDataControllerWidget(Supplier<T> dataGetter, Function<T, Boolean> dataSetter,
GT_CoverBehaviorBase<T> coverBehavior) {
super(dataGetter, dataSetter);
this.coverBehavior = coverBehavior;
}
@Override
public <U, W extends Widget & IDataFollowerWidget<T, U>> CoverDataControllerWidget<T> addFollower(W widget,
Function<T, U> dataToStateGetter, BiFunction<T, U, T> dataUpdater, Consumer<W> applyForWidget) {
super.addFollower(widget, dataToStateGetter, dataUpdater, applyForWidget);
return this;
}
@Override
protected void writeToPacket(PacketBuffer buffer, T data) {
try {
NetworkUtils.writeNBTBase(buffer, data.saveDataToNBT());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected T readFromPacket(PacketBuffer buffer) throws IOException {
return coverBehavior.createDataObject(NetworkUtils.readNBTBase(buffer));
}
/**
* Uses int index to determine toggle button behaviors.
*/
public static class CoverDataIndexedControllerWidget_ToggleButtons<T extends ISerializableObject>
extends CoverDataControllerWidget<T> {
private final BiFunction<Integer, T, Boolean> dataToStateGetter;
private final BiFunction<Integer, T, T> dataUpdater;
/**
* @param coverDataGetter () -> cover data this widget handles
* @param coverDataSetter data to set -> if setting cover data is successful
* @param coverBehavior cover this widget handles data update
* @param dataToStateGetter (index of button, given cover data) -> button state
* @param dataUpdater (index of button, current cover data) -> new cover data
*/
public CoverDataIndexedControllerWidget_ToggleButtons(Supplier<T> coverDataGetter,
Function<T, Boolean> coverDataSetter, GT_CoverBehaviorBase<T> coverBehavior,
BiFunction<Integer, T, Boolean> dataToStateGetter, BiFunction<Integer, T, T> dataUpdater) {
super(coverDataGetter, coverDataSetter, coverBehavior);
this.dataToStateGetter = dataToStateGetter;
this.dataUpdater = dataUpdater;
}
/**
* @param index index of widget to add
* @param widget widget to add
* @param applyForWidget methods to call for widget to add
*/
public <W extends CoverDataFollower_ToggleButtonWidget<T>> CoverDataIndexedControllerWidget_ToggleButtons<T> addToggleButton(
int index, W widget, Consumer<CoverDataFollower_ToggleButtonWidget<T>> applyForWidget) {
addFollower(
widget,
data -> dataToStateGetter.apply(index, data),
(data, state) -> dataUpdater.apply(index, data),
applyForWidget);
return this;
}
}
/**
* Uses int index to determine cycle button behaviors.
*/
public static class CoverDataIndexedControllerWidget_CycleButtons<T extends ISerializableObject>
extends CoverDataControllerWidget<T> {
private final BiFunction<Integer, T, Integer> dataToStateGetter;
private final BiFunction<Integer, T, T> dataUpdater;
/**
* @param coverDataGetter () -> cover data this widget handles
* @param coverDataSetter data to set -> if setting cover data is successful
* @param coverBehavior cover this widget handles data update
* @param dataToStateGetter (index of button, given cover data) -> button state
* @param dataUpdater (index of button, current cover data) -> new cover data
*/
public CoverDataIndexedControllerWidget_CycleButtons(Supplier<T> coverDataGetter,
Function<T, Boolean> coverDataSetter, GT_CoverBehaviorBase<T> coverBehavior,
BiFunction<Integer, T, Integer> dataToStateGetter, BiFunction<Integer, T, T> dataUpdater) {
super(coverDataGetter, coverDataSetter, coverBehavior);
this.dataToStateGetter = dataToStateGetter;
this.dataUpdater = dataUpdater;
}
/**
* @param index index of widget to add
* @param widget widget to add
* @param applyForWidget methods to call for the widget to add
*/
public <W extends CoverDataFollower_CycleButtonWidget<T>> CoverDataIndexedControllerWidget_CycleButtons<T> addCycleButton(
int index, W widget, Consumer<CoverDataFollower_CycleButtonWidget<T>> applyForWidget) {
addFollower(
widget,
data -> dataToStateGetter.apply(index, data),
(data, state) -> dataUpdater.apply(index, data),
applyForWidget);
return this;
}
}
}
|