Bladeren bron

Allow adding instantiations of wildcard skills on button press.
To do this, the following changes were made to SkillLevelUpPanel:
- Change to use an Ordered Map of (Skill Name) -> (GUI Element). This allows order preservation while taking advantage of the usefulness of features like computeIfAbsent.
- Capture more variables as member variables to reduce lambda nesting.
- Add a listener that computes/regenerates the list of components.

Sam Jaffe 8 jaren geleden
bovenliggende
commit
aa4532e7ed
1 gewijzigde bestanden met toevoegingen van 33 en 16 verwijderingen
  1. 33 16
      src/main/lombok/org/leumasjaffe/charsheet/view/skills/SkillLevelUpPanel.java

+ 33 - 16
src/main/lombok/org/leumasjaffe/charsheet/view/skills/SkillLevelUpPanel.java

@@ -4,8 +4,8 @@ import java.awt.Dimension;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
 
 import javax.swing.JLabel;
 import javax.swing.JPanel;
@@ -16,6 +16,7 @@ import org.jdesktop.swingx.VerticalLayout;
 import org.leumasjaffe.charsheet.model.DDCharacter;
 import org.leumasjaffe.charsheet.model.DDCharacterClass;
 import org.leumasjaffe.charsheet.model.observable.IntValue;
+import org.leumasjaffe.charsheet.model.skill.DDSkill;
 import org.leumasjaffe.charsheet.model.skill.DDSkills;
 import org.leumasjaffe.observer.ObservableListener;
 import org.leumasjaffe.observer.ObserverDispatch;
@@ -29,12 +30,23 @@ import javax.swing.ScrollPaneConstants;
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 public abstract class SkillLevelUpPanel extends JPanel {
 	ObservableListener<JTextField, IntValue> purchaseListener;
+	ObservableListener<SkillLevelUpPanel, DDSkills> listener;
+	
 	@Getter(AccessLevel.PROTECTED) JPanel panel;
-	List<SkillLevelUpLine> lines;
+	JPanel skillPanel;
+	Map<String, SkillLevelUpLine> lines = new TreeMap<>();
+	
+	DDCharacter ddChara;
+	DDCharacterClass ddClass;
+	DDSkills skills;
+	IntValue pointsAvailable;
 
 	public SkillLevelUpPanel(final DDCharacter chara, final DDCharacterClass cclass) {
-		final IntValue pointsAvailable = new IntValue(Math.max(1, cclass.getSkillPoints() + 
-				chara.getAbilities().getInt().baseModifier()));
+		this.ddChara = chara;
+		this.ddClass = cclass;
+		this.skills = ddChara.getSkills();
+		this.pointsAvailable = new IntValue(Math.max(1, ddClass.getSkillPoints() + 
+				ddChara.getAbilities().getInt().baseModifier()));
 		
 		GridBagLayout gridBagLayout = new GridBagLayout();
 		gridBagLayout.columnWidths = new int[]{0, 0};
@@ -83,20 +95,19 @@ public abstract class SkillLevelUpPanel extends JPanel {
 		gbc_scrollPane.gridy = 1;
 		add(scrollPane, gbc_scrollPane);
 		
-		JPanel skillPanel = new JPanel();
+		skillPanel = new JPanel();
 		scrollPane.setPreferredSize(new Dimension(480, 300));
 		scrollPane.setViewportView(skillPanel);
 		skillPanel.setLayout(new VerticalLayout());
-				
-		lines = new ArrayList<>();
-		final DDSkills skills = chara.getSkills();
-		skills.getSkills().stream().forEach(skill -> {
-			SkillLevelUpLine line = skill.isWildcardSkill()
-					? new WildcardSkillLevelUpLine(chara, cclass, skills, skill)
-					: new NormalSkillLevelUpLine(chara, cclass, skill, pointsAvailable);
-			skillPanel.add(line);
-			lines.add(line);
+		
+		listener = new ObservableListener<>(this, (c, v) -> {
+			v.getSkills().stream().forEach(skill -> {
+				c.lines.computeIfAbsent(skill.getName(), k -> createSkillLine(skill));
+			});
+			c.skillPanel.removeAll();
+			c.lines.values().forEach(c.skillPanel::add);
 		});
+		listener.setObserved(skills);
 		
 		purchaseListener = new ObservableListener<>(pointsRemaining, (c, v) -> {
 			setIsReady(v.value() == 0);
@@ -104,11 +115,17 @@ public abstract class SkillLevelUpPanel extends JPanel {
 		});
 		purchaseListener.setObserved(pointsAvailable);
 	}
+
+	private SkillLevelUpLine createSkillLine(DDSkill skill) {
+		return skill.isWildcardSkill()
+				? new WildcardSkillLevelUpLine(ddChara, ddClass, skills, skill)
+				: new NormalSkillLevelUpLine(ddChara, ddClass, skill, pointsAvailable);
+	}
 	
 	protected abstract void setIsReady(boolean b);
 	
 	public void commitAllChanges() {
-		lines.forEach(SkillLevelUpLine::applyChange);
+		lines.values().forEach(SkillLevelUpLine::applyChange);
 	}
 	
 	@Override