Pārlūkot izejas kodu

Apply level up to class correctly.
Don't completely regenerate object.
TODO: update summary and such?

Sam Jaffe 8 gadi atpakaļ
vecāks
revīzija
43189cf363

+ 5 - 4
src/main/lombok/org/leumasjaffe/charsheet/view/ClassTab.java

@@ -3,6 +3,7 @@ package org.leumasjaffe.charsheet.view;
 import javax.swing.JPanel;
 
 import lombok.AccessLevel;
+import lombok.Getter;
 import lombok.experimental.FieldDefaults;
 import java.awt.GridBagLayout;
 import javax.swing.JTextField;
@@ -30,13 +31,13 @@ public class ClassTab extends JPanel {
 	 */
 	private static final long serialVersionUID = 1L;
 
-	String title;
-
+	@Getter DDCharacterClass model;
+	
 	ObservableListener<JTextField, IntValue> levelListener;
 	ObservableListener<JTextField, IntValue> expListener;
 	
 	public ClassTab(DDCharacter chara, DDCharacterClass model) {
-		this.title = model.getName();
+		this.model = model;
 		
 		GridBagLayout gridBagLayout = new GridBagLayout();
 		gridBagLayout.columnWidths = new int[]{0, 0};
@@ -184,7 +185,7 @@ public class ClassTab extends JPanel {
 	
 	@Override
 	public String getName() {
-		return title;
+		return model.getName();
 	}
 	
 	@Override

+ 43 - 12
src/main/lombok/org/leumasjaffe/charsheet/view/D20Sheet.java

@@ -26,6 +26,7 @@ import org.leumasjaffe.charsheet.model.DDCharacter;
 import org.leumasjaffe.charsheet.model.DDCharacterClass;
 import org.leumasjaffe.charsheet.observer.ObserverHelper;
 import org.leumasjaffe.charsheet.view.level.ExperienceDialog;
+import org.leumasjaffe.observer.ObservableListener;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
@@ -36,12 +37,11 @@ import lombok.SneakyThrows;
 import lombok.experimental.FieldDefaults;
 import lombok.experimental.NonFinal;
 
+@SuppressWarnings("serial")
 @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 public class D20Sheet extends JFrame {
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
+	static int TABS_BEFORE_CLASSES = 1;
+	
 	ObjectMapper mapper = new ObjectMapper();
 	@NonFinal File currentlyOpenFile = null;
 	@NonFinal @NonNull DDCharacter model = new DDCharacter();
@@ -52,7 +52,9 @@ public class D20Sheet extends JFrame {
 	JPanel abilitiesTab;
 	SkillTab skillTab;
 	EquipmentTab equipmentTab;
-	private DeveloperMenu developerMenu;
+	DeveloperMenu developerMenu;
+	
+	ObservableListener<D20Sheet, DDCharacter> listener;
 	
 	public D20Sheet() {
 		UIManager.put("CheckBox.disabledText", UIManager.get("CheckBox.foreground"));
@@ -119,7 +121,7 @@ public class D20Sheet extends JFrame {
 		
 		JMenuItem mntmGainExperience = new JMenuItem("Gain Experience");
 		mntmGainExperience.addActionListener(e -> {
-			ExperienceDialog.GainExperience(this.model);
+			ExperienceDialog.gainExperience(this.model);
 			if (Config.get(K_LEVELUP, IMMEDIATELY) == IMMEDIATELY) {
 				DialogBuilder.showLevelUpDialog(this, this.model, 0);
 			}
@@ -160,6 +162,7 @@ public class D20Sheet extends JFrame {
 		menuBar.add(developerMenu);
 		
 		// Set up post-GUI dependencies
+		listener = new ObservableListener<>(this, (c, v) -> c.reloadModel());
 		setModel(model);
 	}
 
@@ -176,7 +179,7 @@ public class D20Sheet extends JFrame {
 		tabbedPane.addTab("Skills", null, skillTab, null);
 		tabbedPane.addTab("Gear & Items", null, equipmentTab, null);
 	}
-
+	
 	private void saveAs(final JFileChooser fc) {
 		int rv = fc.showSaveDialog(this);
 		if ( rv == JFileChooser.APPROVE_OPTION ) {
@@ -184,7 +187,7 @@ public class D20Sheet extends JFrame {
 			saveModelResource();
 		}
 	}
-
+	
 	@SneakyThrows
 	private void loadModelResource(File selectedFile) {
 		currentlyOpenFile = selectedFile;
@@ -197,16 +200,44 @@ public class D20Sheet extends JFrame {
 			mapper.writeValue(currentlyOpenFile, model);
 		}
 	}
-		
+	
+	private void reloadModel() {
+		int i = -1;
+		for (DDCharacterClass cc : this.model.getClasses()) {
+			++i;
+			if (checkIfClassExistsAndOverwrite(cc)) continue;
+			ClassTab ct = new ClassTab(model, cc);
+			classTabs.add(ct);
+			tabbedPane.insertTab(ct.getName(), null, ct, null, TABS_BEFORE_CLASSES + i);
+		}
+	}
+
+	private boolean checkIfClassExistsAndOverwrite(DDCharacterClass cc) {
+		for (int j = 0; j < classTabs.size(); ++j) {
+			final DDCharacterClass dclass = classTabs.get(j).getModel();
+			if (dclass.getName().equals(cc.getName())) {
+				if (dclass.getLevel().value() != cc.getLevel().value()) {
+					ClassTab ct = new ClassTab(model, cc);
+					classTabs.set(j, ct);
+					tabbedPane.setComponentAt(j + TABS_BEFORE_CLASSES, ct);
+				}
+				return true;
+			}
+		}
+		return false;
+	}
+	
 	private void setModel(DDCharacter model) {
-		classTabs.clear();
 		this.model = model;
+		classTabs.clear();
 		summaryTab.setModel(model);
-		model.getClasses().stream().forEach(cc -> classTabs.add(new ClassTab(model, cc)));
+
 		equipmentTab.setModel(model);
 		skillTab.setModel(model);
 		developerMenu.setModel(model);
-		
+	
 		reorderTabs();
+
+		listener.setObserved(this.model);
 	}
 }

+ 2 - 1
src/main/lombok/org/leumasjaffe/charsheet/view/DialogBuilder.java

@@ -9,6 +9,7 @@ import javax.swing.JPanel;
 import org.leumasjaffe.charsheet.model.DDCharacter;
 import org.leumasjaffe.charsheet.model.DDCharacterClass;
 import org.leumasjaffe.charsheet.view.config.ConfigPanel;
+import org.leumasjaffe.charsheet.view.level.ExperienceDialog;
 import org.leumasjaffe.charsheet.view.level.LevelUpDialog;
 import org.leumasjaffe.charsheet.view.magic.PrepareSpellsDialog;
 import org.leumasjaffe.charsheet.view.skills.SkillLevelUpDialog;
@@ -41,7 +42,7 @@ public class DialogBuilder {
 	}
 	
 	public void showLevelUpDialog(final JFrame parent, DDCharacter chara, int bonusLevels) {
-		final int levelsGained = LevelUpDialog.computeLevelsNeeded(chara, bonusLevels);
+		final int levelsGained = ExperienceDialog.computeLevelsNeeded(chara, bonusLevels);
 		if (levelsGained == 1) {
 			createDialog(parent, "Level Up", new LevelUpDialog(chara));
 			return;

+ 16 - 12
src/main/lombok/org/leumasjaffe/charsheet/view/level/UpdateClassWithLevelPanel.java

@@ -6,7 +6,8 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Optional;
-import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
 import java.util.function.Consumer;
 
 import javax.swing.JPanel;
@@ -16,6 +17,7 @@ import org.leumasjaffe.charsheet.model.DDCharacterClass;
 import org.leumasjaffe.charsheet.model.magic.DDSpell;
 import org.leumasjaffe.charsheet.model.magic.DDSpellbook;
 import org.leumasjaffe.charsheet.model.observable.BoolGate;
+import org.leumasjaffe.charsheet.model.observable.IntValue;
 import org.leumasjaffe.charsheet.view.magic.SelectSpellsPanel;
 import org.leumasjaffe.charsheet.view.magic.SelectSpellsPanel.Info;
 import org.leumasjaffe.charsheet.view.skills.SkillLevelUpPanel;
@@ -130,10 +132,10 @@ class UpdateClassWithLevelPanel extends JPanel {
 	}
 
 	private void createPanelForPrepareSpells() {
-		LevelUpSpellPanel spells = new LevelUpSpellPanel(PREPARE,
+		prepSpells = Optional.of(new LevelUpSpellPanel(PREPARE,
 				new SelectSpellsPanel.Info(levelUpInfo.ddCharacter, levelUpInfo.ddClass),
-				readyCount.handle(PREPARE_SPELL_INDEX));
-		tabbedPane.addTab("Prepare Spells", null, spells, null);
+				readyCount.handle(PREPARE_SPELL_INDEX)));
+		tabbedPane.addTab("Prepare Spells", null, prepSpells.get(), null);
 	}
 
 	private void createPanelsForLearnSpell(DDSpellbook sb) {
@@ -209,15 +211,17 @@ class UpdateClassWithLevelPanel extends JPanel {
 	public void commitAllChanges() {
 		final String className = levelUpInfo.ddClass.getName();
 		skills.commitAllChanges();
-		Optional<DDSpellbook> maybeBook = levelUpInfo.ddClass.getSpellBook();
+		final Optional<DDSpellbook> maybeBook = levelUpInfo.ddClass.getSpellBook();
 		maybeBook.ifPresent(this::commitSpellbook);
-		final Set<DDCharacterClass> classes = levelUpInfo.ddCharacter.getClasses();
-		if (classes.stream().map(DDCharacterClass::getName).anyMatch(className::equals)) {
-			// Update class to new data
-		} else {
-			// New class
-		}
+		final SortedSet<DDCharacterClass> classes = new TreeSet<>(levelUpInfo.ddCharacter.getClasses());
+		classes.removeIf(cc -> cc.getName().equals(className));
+		classes.add(levelUpInfo.ddClass);
+		levelUpInfo.ddCharacter.setClasses(classes);
 		// TODO: Acquire features
-		// TODO: Update spellbook
+		final IntValue exp = levelUpInfo.ddCharacter.getExperience();
+		final int neededExp = ExperienceDialog.experienceForLevel(levelUpInfo.ddCharacter.getLevel());
+		if (exp.value() < neededExp) { exp.value(neededExp); }
+		ObserverDispatch.notifySubscribers(exp, this);
+		ObserverDispatch.notifySubscribers(levelUpInfo.ddCharacter, null);
 	}
 }