aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common/gui/modularui/widget/CoverDataControllerWidget.java
blob: 4543980ce1d39d970a2535e6fc6c9c53bd8baeb2 (plain)
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;
        }
    }
}