Kaynağa Gözat

Use observable instead of property listener for Level Up Spells

Sam Jaffe 8 yıl önce
ebeveyn
işleme
9bfa480d18

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

@@ -69,7 +69,6 @@ class LevelUpSpellPanel extends JPanel {
 
 	public LevelUpSpellPanel(SpellPicker pick, SelectSpellsPanel.Info info, 
 			BoolArray readyCount, int index) {
-		this.putClientProperty(SelectSpellsPanel.READY, false);
 		this.pick = pick;
 		this.info = info;
 		this.toLevel = info.dclass.getLevel().value();
@@ -108,8 +107,7 @@ class LevelUpSpellPanel extends JPanel {
 			lvl.addPropertyChangeListener(SelectSpellsPanel.READY, e -> {
 				if ((Boolean) e.getNewValue()) ++ready[0];
 				else --ready[0];
-				boolean b = readyCount.data[index] = (ready[0] == spellLevelsGrown);
-				this.putClientProperty(SelectSpellsPanel.READY, b);
+				readyCount.data[index] = (ready[0] == spellLevelsGrown);
 				ObserverDispatch.notifySubscribers(readyCount, this);
 			});
 			panel.add(lvl);

+ 17 - 7
src/main/lombok/org/leumasjaffe/charsheet/view/level/UpdateClassWithLevelPanel.java

@@ -37,6 +37,8 @@ import javax.swing.JLabel;
 @SuppressWarnings("serial")
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 class UpdateClassWithLevelPanel extends JPanel {
+	static int LEARN_SPELL_INDEX = 1;
+
 	@FieldDefaults(level=AccessLevel.PUBLIC, makeFinal=true)
 	public class BoolArray extends Observable {
 		boolean data[] = new boolean[] {false, false, false};
@@ -45,6 +47,7 @@ class UpdateClassWithLevelPanel extends JPanel {
 	ObservableListener<Consumer<Boolean>, BoolArray> listener;
 	JTabbedPane tabbedPane;
 	@NonFinal LevelUpSpellPanel learnSpells = null;
+	@NonFinal ObservableListener<UpdateClassWithLevelPanel, BoolArray> learnAndPrepareListener = null;
 	
 	public UpdateClassWithLevelPanel(LevelUpClassInfo info, VoidVoidFunction back,
 			Consumer<Boolean> setReady) {
@@ -84,18 +87,18 @@ class UpdateClassWithLevelPanel extends JPanel {
 			if (sb.learnsSpells()) {
 				LevelUpSpellPanel spells = new LevelUpSpellPanel(LEARN,
 						new SelectSpellsPanel.Info(info.ddCharacter, info.ddClass),
-						readyCount, 1);
+						readyCount, LEARN_SPELL_INDEX);
 				tabbedPane.addTab("Learn Spells", null, spells, null);
 				if (sb.preparesSpells()) {
-					// TODO: use Observable?
-					spells.addPropertyChangeListener(SelectSpellsPanel.READY, e -> {
-						if ((Boolean) e.getNewValue()) {
-							createPrepareLearnedSpellPanel(info, spells);
+					learnAndPrepareListener = new ObservableListener<>(this, (c, v) -> {
+						if (v.data[LEARN_SPELL_INDEX]) {
+							c.createPrepareLearnedSpellPanel(info, spells);
 						} else {
-							tabbedPane.remove(learnSpells);
-							learnSpells = null;
+							c.tabbedPane.remove(learnSpells);
+							c.learnSpells = null;
 						}
 					});
+					learnAndPrepareListener.setObserved(readyCount);
 				}
 			}
 			else if (sb.preparesSpells()) {
@@ -162,4 +165,11 @@ class UpdateClassWithLevelPanel extends JPanel {
 				readyCount, 2);
 		tabbedPane.addTab("Prepare Spells", null, learnSpells, null);
 	}
+	
+	@Override
+	public void removeNotify() {
+		super.removeNotify();
+		ObserverDispatch.unsubscribeAll(listener);
+		ObserverDispatch.unsubscribeAll(learnAndPrepareListener);
+	}
 }