Parcourir la source

Make BoolGate much cleaner in design

Sam Jaffe il y a 8 ans
Parent
commit
8461cc983f

+ 34 - 2
src/main/lombok/org/leumasjaffe/charsheet/model/observable/BoolGate.java

@@ -1,8 +1,10 @@
 package org.leumasjaffe.charsheet.model.observable;
 
 import java.util.Arrays;
+import java.util.function.Consumer;
 
 import org.leumasjaffe.observer.Observable;
+import org.leumasjaffe.observer.ObservableListener;
 import org.leumasjaffe.observer.ObserverDispatch;
 
 import lombok.AccessLevel;
@@ -14,18 +16,42 @@ public class BoolGate extends Observable.Instance {
 	boolean[] data;
 	int size;
 	
-	@AllArgsConstructor
+	@AllArgsConstructor(access=AccessLevel.PRIVATE)
 	@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 	public class Handle {
 		int index;
 		public boolean get() { return BoolGate.this.get(index); }
-		public void set(Object source, boolean bool) {
+		public void set(boolean bool) {
 			// FIXME
 			if (bool != get()) {
 				BoolGate.this.set(index, bool);
 				ObserverDispatch.notifySubscribers(BoolGate.this);
 			}
 		}
+		
+		public Meta createSubGate(int dim) {
+			return new Meta(this, dim);
+		}
+	}
+	
+	@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+	public static class Meta extends BoolGate {
+		BoolGate.Handle callBack;
+		
+		private Meta(BoolGate.Handle callBack, int dim) {
+			super(dim);
+			this.callBack = callBack;
+		}
+		
+		public ObservableListener<Void, Meta> makeListener() {
+			ObservableListener<Void, Meta> obs = new ObservableListener<>(null, Meta::invokeCallback);
+			obs.setObserved(this);
+			return obs;
+		}
+		
+		private static void invokeCallback(Object ignore, Meta self) {
+			self.callBack.set(self.all());
+		}
 	}
 	
 	public BoolGate(int dim) {
@@ -56,4 +82,10 @@ public class BoolGate extends Observable.Instance {
 	public boolean some(int...idxs) {
 		return Arrays.stream(idxs).mapToObj(this::get).allMatch(Boolean::booleanValue);
 	}
+	
+	public ObservableListener<Consumer<Boolean>, BoolGate> makeListener(Consumer<Boolean> accepter) {
+		ObservableListener<Consumer<Boolean>, BoolGate> obs = new ObservableListener<>(accepter, (c, v) -> c.accept(v.all()));
+		obs.setObserved(this);
+		return obs;
+	}
 }

+ 3 - 3
src/main/lombok/org/leumasjaffe/charsheet/view/level/LU_AbilityPanel.java

@@ -57,7 +57,7 @@ public class LU_AbilityPanel extends JPanel {
 		this.ability = clone(info.ddCharacter.getAbilities());
 		this.gate = gate;
 		this.canGainAbility = info.ddCharacter.getLevel() % 4 == 3;
-		this.gate.set(null, !canGainAbility);
+		this.gate.set(!canGainAbility);
 		ButtonGroup group = new ButtonGroup();
 
 		GridBagLayout gridBagLayout = new GridBagLayout();
@@ -111,7 +111,7 @@ public class LU_AbilityPanel extends JPanel {
 		panel_2.add(btnClear, gbc_btnClear);
 		btnClear.setEnabled(canGainAbility);
 		btnClear.addActionListener(e -> {
-			gate.set(null, false);
+			gate.set(false);
 			group.clearSelection();
 			resetAbility();
 		});
@@ -156,7 +156,7 @@ public class LU_AbilityPanel extends JPanel {
 			resetAbility();
 			setCurrentSelection(y);
 			updateAbility(this.ability, true);
-			gate.set(null, true);
+			gate.set(true);
 		});
 		radioButton.setEnabled(canGainAbility);
 	}

+ 3 - 6
src/main/lombok/org/leumasjaffe/charsheet/view/level/LU_FeaturesPanel.java

@@ -19,10 +19,10 @@ import java.awt.Insets;
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 class LU_FeaturesPanel extends JPanel {
 	static int HD_INDEX = 0, ABIL_INDEX = 1, FEAT_INDEX = 2;
-	ObservableListener<LU_FeaturesPanel, BoolGate> listener;
+	ObservableListener<Void, BoolGate.Meta> listener;
 	
 	public LU_FeaturesPanel(LevelUpClassInfo info, BoolGate.Handle ready) {		
-		BoolGate gate = new BoolGate(3);
+		BoolGate.Meta gate = ready.createSubGate(3);
 		gate.set(HD_INDEX, true);
 		gate.set(FEAT_INDEX, true); // TODO Feats
 
@@ -51,10 +51,7 @@ class LU_FeaturesPanel extends JPanel {
 		gbc_abilPanel.gridy = 0;
 		add(abilPanel, gbc_abilPanel);
 		
-		this.listener = new ObservableListener<>(this, (c, v) -> {
-			ready.set(null, v.all());
-		});
-		this.listener.setObserved(gate);
+		this.listener = gate.makeListener();
 	}
 	
 	@Override

+ 3 - 6
src/main/lombok/org/leumasjaffe/charsheet/view/level/LevelUpSpellPanel.java

@@ -67,7 +67,7 @@ class LevelUpSpellPanel extends JPanel {
 	SpellPicker pick;
 	SelectSpellsPanel.Info info;
 	@Getter List<SelectSpellsPanel> panels;
-	ObservableListener<LevelUpSpellPanel, BoolGate> allReady;
+	ObservableListener<Void, BoolGate.Meta> allReady;
 
 	public LevelUpSpellPanel(SpellPicker pick, SelectSpellsPanel.Info info, 
 			BoolGate.Handle readyCount) {
@@ -99,7 +99,7 @@ class LevelUpSpellPanel extends JPanel {
 		final IntValue val = getSharedAllowedSlots(info);
 		final Map<Integer, Integer> spells = getNewSpells(val);
 		final int sharedSlots = val.value();
-		BoolGate gate = new BoolGate(newHighestSpellLevel);
+		BoolGate.Meta gate = readyCount.createSubGate(newHighestSpellLevel);
 		for (int i = 0; i < newHighestSpellLevel; ++i) {
 			if (spells.get(i) < 0) { gate.set(i, true); panels.add(null); continue; }
 			++spellLevelsGrown;
@@ -110,10 +110,7 @@ class LevelUpSpellPanel extends JPanel {
 			panels.add(lvl);
 			panel.add(lvl);
 		}
-		allReady = new ObservableListener<>(this, (c, v) -> {
-			readyCount.set(this, v.all());
-		});
-		allReady.setObserved(gate);
+		allReady = gate.makeListener();
 	}
 	
 	private Map<Integer, Integer> getNewSpells(IntValue sharedSpellCountLimit) {

+ 1 - 4
src/main/lombok/org/leumasjaffe/charsheet/view/level/UpdateClassWithLevelPanel.java

@@ -120,10 +120,7 @@ class UpdateClassWithLevelPanel extends JPanel {
 		gbc_horizontalGlue.gridy = 0;
 		panel.add(horizontalGlue, gbc_horizontalGlue);
 
-		listener = new ObservableListener<>(setReady, (c, v) -> {
-			c.accept(v.all());
-		});
-		listener.setObserved(readyCount);
+		listener = readyCount.makeListener(setReady);
 	}
 
 	private void createPanelForPrepareSpells() {

+ 3 - 5
src/main/lombok/org/leumasjaffe/charsheet/view/magic/PrepareSpellsDialog.java

@@ -20,6 +20,7 @@ import java.awt.GridBagConstraints;
 import java.awt.Insets;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Consumer;
 
 import javax.swing.JButton;
 import javax.swing.JDialog;
@@ -30,7 +31,7 @@ import javax.swing.ScrollPaneConstants;
 public class PrepareSpellsDialog extends JPanel {	
 	int[] ready = {0};
 	int highestSpellLevel;
-	ObservableListener<PrepareSpellsDialog, BoolGate> allReady;
+	ObservableListener<Consumer<Boolean>, BoolGate> allReady;
 
 	public PrepareSpellsDialog(DDCharacter chara, DDCharacterClass dclass) {
 		highestSpellLevel = dclass.getHighestSpellLevel();
@@ -77,10 +78,7 @@ public class PrepareSpellsDialog extends JPanel {
 		
 		List<SelectPreparedSpellsPanel> panels = new ArrayList<>();
 		final BoolGate gate = new BoolGate(highestSpellLevel);
-		allReady = new ObservableListener<>(this, (c, v) -> {
-			btnPrepareTheseSpells.setEnabled(v.all());
-		});
-		allReady.setObserved(gate);
+		allReady = gate.makeListener(btnPrepareTheseSpells::setEnabled);
 		for (int i = 0; i < highestSpellLevel; ++i) {
 			SelectPreparedSpellsPanel lvl = new SelectPreparedSpellsPanel(chara, dclass, gate.handle(i), i);
 			panels.add(lvl);

+ 1 - 1
src/main/lombok/org/leumasjaffe/charsheet/view/magic/SelectSpellsPanel.java

@@ -232,7 +232,7 @@ public class SelectSpellsPanel extends JPanel {
 				for (Object o : modelPrepared.data) {
 					this.prepared.add(DDSpell.fromString((String) o)); // TODO
 				}
-				gate.set(this, true);
+				gate.set(true);
 			}
 		});
 	}