Skip to content
This repository was archived by the owner on Feb 19, 2019. It is now read-only.

Commit 6800633

Browse files
committed
Allow adding PRE & POST Value change listeners
Defaults to PRE if not explicitly set.
1 parent 3faf3b8 commit 6800633

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

src/main/java/clientapi/value/IValue.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import clientapi.util.interfaces.Identifiable;
2121
import clientapi.util.interfaces.Nameable;
2222
import clientapi.value.holder.IValueHolder;
23+
import me.zero.alpine.type.EventState;
2324

2425
import java.util.stream.Stream;
2526

@@ -49,12 +50,19 @@ public interface IValue<T> extends Nameable, Describable, Identifiable, IValueHo
4950
void setValue(T value);
5051

5152
/**
52-
* Adds a change listener to this value
53+
* Adds a change listener to this value, defaulting to EventState.PRE
5354
*
5455
* @param listener The change listener
5556
*/
5657
void addChangeListener(ValueChangeListener<T> listener);
5758

59+
/**
60+
* Adds a change listener to this value
61+
*
62+
* @param listener The change listener
63+
*/
64+
void addChangeListener(EventState state, ValueChangeListener<T> listener);
65+
5866
/**
5967
* Intended to be used with flatMap() to flatten the IValue tree recursively
6068
* @param value the root node of the tree

src/main/java/clientapi/value/Value.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import clientapi.util.interfaces.impl.MergedMutable;
2121
import clientapi.util.interfaces.impl.MutableField;
2222
import clientapi.value.holder.ValueAccessor;
23+
import me.zero.alpine.type.EventState;
2324

2425
import java.lang.reflect.Field;
2526
import java.util.ArrayList;
@@ -50,7 +51,7 @@ public class Value<T> implements IValue<T> {
5051
/**
5152
* A list of all of the {@code ValueChangeListeners} waiting for this value to change
5253
*/
53-
private final List<ValueChangeListener<T>> valueChangeListeners = new ArrayList<>();
54+
private final Map<EventState, List<ValueChangeListener<T>>> valueChangeListeners = new HashMap<>();
5455

5556
/**
5657
* Name of the Value
@@ -107,6 +108,11 @@ public Value(String name, String parent, String id, String description, Object o
107108
} else {
108109
this.mutable = new MutableField<>(object, field);
109110
}
111+
112+
// Listeners
113+
for (EventState state : EventState.values()) {
114+
valueChangeListeners.put(state, new ArrayList<>());
115+
}
110116
}
111117

112118
@Override
@@ -122,15 +128,23 @@ public T getValue() {
122128

123129
@Override
124130
public void setValue(T value) {
125-
// Notify all of the change listeners of the new change of state
126-
this.valueChangeListeners.forEach(listener -> listener.onValueChanged(this, this.getValue(), value));
131+
T oldValue = this.getValue();
132+
// Notify all PRE change listeners
133+
this.valueChangeListeners.get(EventState.PRE).forEach(listener -> listener.onValueChanged(this, oldValue, value));
127134
// Pass the new value to the change function
128135
this.mutable.accept(value);
136+
// Nofify all POST change listeners
137+
this.valueChangeListeners.get(EventState.POST).forEach(listener -> listener.onValueChanged(this, oldValue, value));
129138
}
130139

131140
@Override
132141
public void addChangeListener(ValueChangeListener<T> listener) {
133-
this.valueChangeListeners.add(listener);
142+
this.addChangeListener(EventState.PRE, listener);
143+
}
144+
145+
@Override
146+
public void addChangeListener(EventState state, ValueChangeListener<T> listener) {
147+
this.valueChangeListeners.get(state).add(listener);
134148
}
135149

136150
@Override

0 commit comments

Comments
 (0)