Ver Fonte

Transform SkillTab to use listener behavior.
Send appropriate signals from SkillLevelUpPanel

Sam Jaffe há 8 anos atrás
pai
commit
12d86ffb51

+ 51 - 25
src/main/lombok/org/leumasjaffe/charsheet/view/SkillTab.java

@@ -6,28 +6,33 @@ import javax.swing.JScrollPane;
 import java.awt.GridBagConstraints;
 import org.jdesktop.swingx.VerticalLayout;
 import org.leumasjaffe.charsheet.model.DDCharacter;
+import org.leumasjaffe.charsheet.model.skill.DDSkill;
 import org.leumasjaffe.charsheet.model.skill.DDSkills;
 import org.leumasjaffe.charsheet.view.skills.SkillLine;
+import org.leumasjaffe.observer.ObservableListener;
+import org.leumasjaffe.observer.ObserverDispatch;
 
 import lombok.AccessLevel;
 import lombok.experimental.FieldDefaults;
 import java.awt.Dimension;
 import java.awt.Insets;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.stream.Stream;
+
 import javax.swing.JLabel;
 import javax.swing.JTextField;
 import java.awt.Component;
 import javax.swing.Box;
 
+@SuppressWarnings("serial")
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 public class SkillTab extends JPanel {
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	JPanel skillPanel;
-	JTextField txtTotalSkillPoints;
-	JTextField txtClassSkills;
-	JTextField txtCrossClass;
+	
+	ObservableListener<JTextField, DDSkills> totalListener;
+	ObservableListener<JTextField, DDCharacter> classSkillListener;
+	ObservableListener<JTextField, DDCharacter> crossSkillListener;
+	ObservableListener<JPanel, DDCharacter> skillListener;
 
 	public SkillTab() {
 		setPreferredSize(new Dimension(600, 300));
@@ -60,7 +65,7 @@ public class SkillTab extends JPanel {
 		gbc_lblTotalSkillPoints.gridy = 0;
 		panel.add(lblTotalSkillPoints, gbc_lblTotalSkillPoints);
 		
-		txtTotalSkillPoints = new JTextField();
+		JTextField txtTotalSkillPoints = new JTextField();
 		txtTotalSkillPoints.setEditable(false);
 		GridBagConstraints gbc_txtTotalSkillPoints = new GridBagConstraints();
 		gbc_txtTotalSkillPoints.insets = new Insets(0, 0, 0, 5);
@@ -85,7 +90,7 @@ public class SkillTab extends JPanel {
 		gbc_lblMaxRanksClasscross.gridy = 0;
 		panel.add(lblMaxRanksClasscross, gbc_lblMaxRanksClasscross);
 		
-		txtClassSkills = new JTextField();
+		JTextField txtClassSkills = new JTextField();
 		txtClassSkills.setEditable(false);
 		GridBagConstraints gbc_txtClassSkills = new GridBagConstraints();
 		gbc_txtClassSkills.insets = new Insets(0, 0, 0, 5);
@@ -103,7 +108,7 @@ public class SkillTab extends JPanel {
 		gbc_label.gridy = 0;
 		panel.add(label, gbc_label);
 		
-		txtCrossClass = new JTextField();
+		JTextField txtCrossClass = new JTextField();
 		txtCrossClass.setEditable(false);
 		GridBagConstraints gbc_txtCrossClass = new GridBagConstraints();
 		gbc_txtCrossClass.fill = GridBagConstraints.HORIZONTAL;
@@ -119,25 +124,46 @@ public class SkillTab extends JPanel {
 		gbc_scrollPane.gridy = 1;
 		add(scrollPane, gbc_scrollPane);
 		
-		skillPanel = new JPanel();
+		JPanel skillPanel = new JPanel();
 		scrollPane.setViewportView(skillPanel);
 		skillPanel.setLayout(new VerticalLayout());
+		
+		totalListener = new ObservableListener<>(txtTotalSkillPoints, (c, v) -> {
+			final int totalPoints = v.getSkills().stream().mapToInt(DDSkill::getPointsSpent).sum();
+			c.setText(Integer.toString(totalPoints));
+		});
+		classSkillListener = new ObservableListener<>(txtClassSkills, (c, v) -> {
+			c.setText(Integer.toString(v.getLevel() + 3));
+		});
+		crossSkillListener = new ObservableListener<>(txtCrossClass, (c, v) -> {
+			c.setText(Integer.toString((v.getLevel() + 3)/2));
+		});
+		Map<String, SkillLine> lines = new TreeMap<>();
+		skillListener = new ObservableListener<>(skillPanel, (c, v) -> {
+			Stream<DDSkill> st = v.getSkills().getSkills().stream().filter(
+					sk -> sk.getPointsSpent() > 0 || !sk.isRequiresTraining());
+			st.forEach(sk -> lines.computeIfAbsent(sk.getName(), k -> new SkillLine(v, sk)));
+			skillPanel.removeAll();
+			lines.values().forEach(skillPanel::add);
+			revalidate();
+			repaint();
+		});
 	}
 	
 	public void setModel(final DDCharacter model) {
-		// TODO (sjaffe): Observables?
-		skillPanel.removeAll();
-		int[] totalPoints = {0};
-		final DDSkills skills = model.getSkills();
-		skills.getSkills().stream().filter(sk -> sk.getPointsSpent() > 0 || !sk.isRequiresTraining())
-		.forEach( skill -> {
-			skillPanel.add(new SkillLine(model, skill));
-			totalPoints[0] += skill.getPointsSpent();
-		});
-		txtTotalSkillPoints.setText(Integer.toString(totalPoints[0]));
-		int classSkill = model.getLevel() + 3;
-		txtClassSkills.setText(Integer.toString(classSkill));
-		txtCrossClass.setText(Integer.toString(classSkill / 2));
+		DDSkills skills = model.getSkills();
+		classSkillListener.setObserved(model);
+		crossSkillListener.setObserved(model);
+		totalListener.setObserved(skills);
+		skillListener.setObserved(model);
 	}
 	
+	@Override
+	public void removeNotify() {
+		super.removeNotify();
+		ObserverDispatch.unsubscribeAll(classSkillListener);
+		ObserverDispatch.unsubscribeAll(crossSkillListener);
+		ObserverDispatch.unsubscribeAll(totalListener);
+		ObserverDispatch.unsubscribeAll(skillListener);
+	}	
 }

+ 2 - 0
src/main/lombok/org/leumasjaffe/charsheet/view/skills/SkillLevelUpPanel.java

@@ -132,6 +132,8 @@ public abstract class SkillLevelUpPanel extends JPanel {
 		skills.getSkills().stream().filter(
 				sk -> sk.isFromWildcardSkill() && sk.getPointsSpent() == 0)
 		.collect(Collectors.toList()).forEach(skills::removeSkill);
+		ObserverDispatch.notifySubscribers(ddChara);
+		listener.notifySubscribers(skills);
 	}
 	
 	@Override