فهرست منبع

Moving equipment into a separate Observable DDEquipment object.

Sam Jaffe 8 سال پیش
والد
کامیت
b545004881

+ 8 - 8
src/main/lombok/org/leumasjaffe/charsheet/controller/EquipItemController.java

@@ -4,7 +4,7 @@ import static org.leumasjaffe.charsheet.model.inventory.EquipmentSlot.*;
 
 import javax.swing.JOptionPane;
 
-import org.leumasjaffe.charsheet.model.inventory.DDInventory;
+import org.leumasjaffe.charsheet.model.inventory.DDEquipment;
 import org.leumasjaffe.charsheet.model.inventory.DDItem;
 import org.leumasjaffe.charsheet.model.inventory.EquipmentSlot;
 import org.leumasjaffe.charsheet.view.dialog.EquipItemDialog;
@@ -14,7 +14,7 @@ import lombok.RequiredArgsConstructor;
 
 public class EquipItemController {	
 
-	public static void accept(final DDInventory inv, final DDItem item) {
+	public static void accept(final DDEquipment inv, final DDItem item) {
 		if (item.getUnequippedCount() == 0) { return; }
 		if (inv.canEquip(item) || new Helper(inv).getReplaceItem(item.getSlot())) {
 			item.adjustCounEquipped(+1);
@@ -25,11 +25,11 @@ public class EquipItemController {
 
 	@RequiredArgsConstructor
 	private static class Helper {
-		final DDInventory inv;
 		private static final String QUERY_REPLACE = "Replace Equipped Item";
 		private static final String REPLACE_EITHER = "Which of the following items would you like to replace?";
 		private static final String REPLACE_BOTH = "Do you want to replace both of the following items?";
 		private static final String REPLACE_ONE = "Do you want to replace the following item?";
+		final DDEquipment inv;
 		
 		private boolean getReplaceItem(final EquipmentSlot slot) {
 			switch (slot) {
@@ -42,7 +42,7 @@ public class EquipItemController {
 
 		private boolean selectToReplaceAllOf(final EquipmentSlot base,
 				final EquipmentSlot slot1, final EquipmentSlot slot2) {
-			if (inv.getEquipment().get(slot1).getSlot() == base) {
+			if (inv.get(slot1).getSlot() == base) {
 				return selectToReplace(slot1);
 			} else if (JOptionPane.showConfirmDialog(null, createDialogTwoSlots(REPLACE_BOTH, slot1, slot2), 
 					QUERY_REPLACE, JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
@@ -78,19 +78,19 @@ public class EquipItemController {
 		}
 
 		private void doUnequip(final EquipmentSlot slot) {
-			inv.getEquipment().get(slot).adjustCounEquipped(-1);
+			inv.get(slot).adjustCounEquipped(-1);
 			inv.unequip(slot);
 		}		
 
 		private EquipItemDialog createDialogOneSlot(final EquipmentSlot slot) {
-			return new EquipItemDialog(REPLACE_ONE, slot, inv.getEquipment().get(slot));
+			return new EquipItemDialog(REPLACE_ONE, slot, inv.get(slot));
 		}
 		
 		private EquipItemDialog createDialogTwoSlots(final String message, 
 				final EquipmentSlot slot1, final EquipmentSlot slot2) {
 			return new EquipItemDialog(message,
-					new EquipItemDialog.Tuple(slot1, inv.getEquipment().get(slot1)),
-					new EquipItemDialog.Tuple(slot2, inv.getEquipment().get(slot2)));
+					new EquipItemDialog.Tuple(slot1, inv.get(slot1)),
+					new EquipItemDialog.Tuple(slot2, inv.get(slot2)));
 		}
 	}
 }

+ 124 - 0
src/main/lombok/org/leumasjaffe/charsheet/model/inventory/DDEquipment.java

@@ -0,0 +1,124 @@
+package org.leumasjaffe.charsheet.model.inventory;
+
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiConsumer;
+
+import org.leumasjaffe.observer.Observable;
+
+import lombok.AccessLevel;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+import lombok.ToString;
+import lombok.experimental.FieldDefaults;
+
+@ToString
+@EqualsAndHashCode(callSuper=false)
+@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+public class DDEquipment extends Observable {
+	@NonNull Map<EquipmentSlot, DDItem> equipment = new EnumMap<>(EquipmentSlot.class);
+
+	public boolean canEquip(final DDItem item) {
+		return canEquip(item.getSlot());
+	}
+	
+	private boolean canEquip(final EquipmentSlot slot) {
+		switch (slot) {
+		case NONE: return false;
+		case TWO_HANDS: return canEquip(EquipmentSlot.MAIN_HAND) && 
+				canEquip(EquipmentSlot.OFF_HAND);
+		case ONE_HAND: return canEquip(EquipmentSlot.MAIN_HAND) || 
+				canEquip(EquipmentSlot.OFF_HAND);
+		case RING: return canEquip(EquipmentSlot.RING1) || 
+				canEquip(EquipmentSlot.RING2);
+		default:
+			return !equipment.containsKey(slot);
+		}
+	}
+	
+	public void equip(final EquipmentSlot slot, final DDItem item) {
+		switch ( slot ) {
+		case NONE:
+		case ONE_HAND:
+		case RING:
+			throw new IllegalArgumentException("Cannot equip directly to slot:" + slot);
+		case TWO_HANDS: 
+			equip(EquipmentSlot.MAIN_HAND, item); 
+			equip(EquipmentSlot.OFF_HAND, item);
+			break;
+		default:
+			equipment.put(slot, item);
+			break;
+		}
+	}
+	
+	public void unequip(final EquipmentSlot slot) {
+		switch (slot) {
+		case NONE:
+		case ONE_HAND:
+		case RING:
+			throw new IllegalArgumentException("Cannot unequip directly to slot:" + slot);
+		case TWO_HANDS: 
+			unequip(EquipmentSlot.MAIN_HAND); 
+			unequip(EquipmentSlot.OFF_HAND);
+			break;
+		default:
+			equipment.remove(slot);
+			break;
+		}
+	}
+
+	public void equipNext(final DDItem item) {
+		switch (item.getSlot()) {
+		case NONE:
+			throw new IllegalArgumentException("Cannot equip unequippable item");
+		case ONE_HAND:
+			if (canEquip(EquipmentSlot.MAIN_HAND)) { 
+				equip(EquipmentSlot.MAIN_HAND, item);
+			} else {
+				equip(EquipmentSlot.OFF_HAND, item);
+			}
+			break;
+		case RING:
+			if (canEquip(EquipmentSlot.RING1) ) { 
+				equip(EquipmentSlot.RING1, item);
+			} else {
+				equip(EquipmentSlot.RING2, item);
+			}
+			break;
+		default:
+			equip(item.getSlot(), item);
+			break;
+		}
+	}
+	
+	public Set<EquipmentSlot> keySet() {
+		return Collections.unmodifiableSet(equipment.keySet());
+	}
+	
+	public DDItem get(EquipmentSlot slot) {
+		return equipment.get(slot);
+	}
+	
+	public boolean containsKey(EquipmentSlot slot) {
+		return equipment.containsKey(slot);
+	}
+
+	void put(EquipmentSlot slot, DDItem item) {
+		equipment.put(slot, item);
+	}
+
+	void remove(EquipmentSlot slot) {
+		equipment.remove(slot);
+	}
+	
+	void forEach(BiConsumer<? super EquipmentSlot, ? super DDItem> action) {
+		equipment.forEach(action);
+	}
+
+	void clear() {
+		equipment.clear();
+	}
+}

+ 2 - 80
src/main/lombok/org/leumasjaffe/charsheet/model/inventory/DDInventory.java

@@ -27,7 +27,7 @@ public class DDInventory extends Observable {
 	
 	// Serializable properties
 	@NonNull List<DDItem> items = new ArrayList<>();
-	@NonNull Map<EquipmentSlot, DDItem> equipment = new EnumMap<>(EquipmentSlot.class);
+	@NonNull DDEquipment equipment = new DDEquipment();
 	@NonNull Map<String, Map<EquipmentSlot, String>> favorites = new TreeMap<>();
 	@NonNull Money wealth = new Money(0, 0, 0, 0);
 	// Transient/Record-Keeping properties
@@ -66,91 +66,13 @@ public class DDInventory extends Observable {
 		return Collections.unmodifiableMap(favorites);
 	}
 	
-	public Map<EquipmentSlot, DDItem> getEquipment() {
-		return Collections.unmodifiableMap(equipment);
-	}
-	
 	public boolean hasItem(final String itemName) {
 		return named.containsKey(itemName);
 	}
-	
-	public boolean canEquip(final DDItem item) {
-		return canEquip(item.getSlot());
-	}
-	
-	private boolean canEquip(final EquipmentSlot slot) {
-		switch (slot) {
-		case NONE: return false;
-		case TWO_HANDS: return canEquip(EquipmentSlot.MAIN_HAND) && 
-				canEquip(EquipmentSlot.OFF_HAND);
-		case ONE_HAND: return canEquip(EquipmentSlot.MAIN_HAND) || 
-				canEquip(EquipmentSlot.OFF_HAND);
-		case RING: return canEquip(EquipmentSlot.RING1) || 
-				canEquip(EquipmentSlot.RING2);
-		default:
-			return !equipment.containsKey(slot);
-		}
-	}
-	
-	public void equip(final EquipmentSlot slot, final DDItem item) {
-		switch ( slot ) {
-		case NONE:
-		case ONE_HAND:
-		case RING:
-			throw new IllegalArgumentException("Cannot equip directly to slot:" + slot);
-		case TWO_HANDS: 
-			equip(EquipmentSlot.MAIN_HAND, item); 
-			equip(EquipmentSlot.OFF_HAND, item);
-			break;
-		default:
-			equipment.put(slot, item);
-			break;
-		}
-	}
-	
-	public void unequip(final EquipmentSlot slot) {
-		switch (slot) {
-		case NONE:
-		case ONE_HAND:
-		case RING:
-			throw new IllegalArgumentException("Cannot unequip directly to slot:" + slot);
-		case TWO_HANDS: 
-			unequip(EquipmentSlot.MAIN_HAND); 
-			unequip(EquipmentSlot.OFF_HAND);
-			break;
-		default:
-			equipment.remove(slot);
-			break;
-		}
-	}
-
-	public void equipNext(final DDItem item) {
-		switch (item.getSlot()) {
-		case NONE:
-			throw new IllegalArgumentException("Cannot equip unequippable item");
-		case ONE_HAND:
-			if (canEquip(EquipmentSlot.MAIN_HAND)) { 
-				equip(EquipmentSlot.MAIN_HAND, item);
-			} else {
-				equip(EquipmentSlot.OFF_HAND, item);
-			}
-			break;
-		case RING:
-			if (canEquip(EquipmentSlot.RING1) ) { 
-				equip(EquipmentSlot.RING1, item);
-			} else {
-				equip(EquipmentSlot.RING2, item);
-			}
-			break;
-		default:
-			equip(item.getSlot(), item);
-			break;
-		}
-	}
 
 	private Map<EquipmentSlot, String> getSerializableEquipment() {
 		final Map<EquipmentSlot, String> m = new EnumMap<>(EquipmentSlot.class);
-		equipment.entrySet().stream().forEach(e -> m.put(e.getKey(), e.getValue().getName()));
+		equipment.forEach((k, v) -> m.put(k, v.getName()));
 		return Collections.unmodifiableMap(m);
 	}
 	

+ 4 - 3
src/main/lombok/org/leumasjaffe/charsheet/view/inventory/EquipmentInfoMenu.java

@@ -2,7 +2,7 @@ package org.leumasjaffe.charsheet.view.inventory;
 
 import javax.swing.JPopupMenu;
 
-import org.leumasjaffe.charsheet.model.inventory.DDInventory;
+import org.leumasjaffe.charsheet.model.inventory.DDEquipment;
 import org.leumasjaffe.charsheet.model.inventory.DDItem;
 import org.leumasjaffe.charsheet.model.inventory.EquipmentSlot;
 import org.leumasjaffe.observer.ObserverDispatch;
@@ -17,7 +17,7 @@ class EquipmentInfoMenu extends JPopupMenu {
 	 */
 	private static final long serialVersionUID = 1L;
 	
-	public EquipmentInfoMenu(DDInventory inv, DDItem item,
+	public EquipmentInfoMenu(DDEquipment equip, DDItem item,
 			EquipmentSlot slot) {
 		
 		JMenuItem mntmInfo = new JMenuItem("Info");
@@ -35,8 +35,9 @@ class EquipmentInfoMenu extends JPopupMenu {
 					"Are you sure you want to unequip your " + item.getName(), 
 					"Unequip", JOptionPane.YES_NO_OPTION) 
 					== JOptionPane.YES_OPTION) {
-				inv.unequip(slot);
 				item.adjustCounEquipped(-1);
+				equip.unequip(slot);
+				ObserverDispatch.notifySubscribers(equip, null);
 				ObserverDispatch.notifySubscribers(item.getCountEquipped(), null);
 			}
 		});

+ 17 - 17
src/main/lombok/org/leumasjaffe/charsheet/view/inventory/EquipmentPanel.java

@@ -8,7 +8,7 @@ import javax.swing.border.MatteBorder;
 
 import org.jdesktop.swingx.VerticalLayout;
 import org.leumasjaffe.charsheet.model.DDCharacter;
-import org.leumasjaffe.charsheet.model.inventory.DDInventory;
+import org.leumasjaffe.charsheet.model.inventory.DDEquipment;
 import org.leumasjaffe.charsheet.model.inventory.DDItem;
 import org.leumasjaffe.charsheet.model.inventory.EquipmentSlot;
 import org.leumasjaffe.event.PopClickListener;
@@ -39,7 +39,7 @@ public class EquipmentPanel extends JPanel {
 	JPanel equipment;
 	LoadoutMenu loadoutMenu = new LoadoutMenu();
 	
-	ObservableListener<EquipmentPanel, DDInventory> equipmentObserver;
+	ObservableListener<EquipmentPanel, DDEquipment> equipmentObserver;
 
 	public EquipmentPanel() {
 		GridBagLayout gridBagLayout = new GridBagLayout();
@@ -74,25 +74,25 @@ public class EquipmentPanel extends JPanel {
 		equipment.setLayout(new VerticalLayout(5));
 		
 		equipmentObserver = new ObservableListener<>(this, 
-				(self, inv) -> self.updateModel(inv) );
+				(self, equip) -> self.updateModel(equip) );
 	}
 	
 	public void setModel(DDCharacter model) {
-		equipmentObserver.setObserved(model.getInventory());
+		equipmentObserver.setObserved(model.getInventory().getEquipment());
 		loadoutMenu.setModel(model.getInventory());
 	}
 
-	private void updateModel(final DDInventory inv) {
+	private void updateModel(final DDEquipment equip) {
 		final Set<EquipmentSlot> manual = EnumSet.noneOf(EquipmentSlot.class);
 		equipment.removeAll();	
-		final DDItem armor = inv.getEquipment().get(BODY);
+		final DDItem armor = equip.get(BODY);
 		if (armor != null && armor.isArmor()) {
 			manual.add(BODY);
-			createWithRightClickMenu(ArmorPanel::new, inv, BODY, BODY);
+			createWithRightClickMenu(ArmorPanel::new, equip, BODY, BODY);
 		}
 		
-		final DDItem main = inv.getEquipment().get(MAIN_HAND);
-		final DDItem off = inv.getEquipment().get(OFF_HAND);
+		final DDItem main = equip.get(MAIN_HAND);
+		final DDItem off = equip.get(OFF_HAND);
 	
 		final Optional<Function<DDItem, JPanel>> makeMain = getEquipmentRightClickPanelFactory(main);
 		final Optional<Function<DDItem, JPanel>> makeOff = getEquipmentRightClickPanelFactory(off);
@@ -101,22 +101,22 @@ public class EquipmentPanel extends JPanel {
 			makeMain.ifPresent(f -> {
 				manual.add(MAIN_HAND);
 				manual.add(OFF_HAND);
-				createWithRightClickMenu(f, inv, TWO_HANDS, MAIN_HAND);
+				createWithRightClickMenu(f, equip, TWO_HANDS, MAIN_HAND);
 			});
 		} else {
 			makeMain.ifPresent(f -> {
 				manual.add(MAIN_HAND);
-				createWithRightClickMenu(f, inv, MAIN_HAND, MAIN_HAND);
+				createWithRightClickMenu(f, equip, MAIN_HAND, MAIN_HAND);
 			});
 			makeOff.ifPresent(f -> {
 				manual.add(OFF_HAND);
-				createWithRightClickMenu(f, inv, OFF_HAND, OFF_HAND);
+				createWithRightClickMenu(f, equip, OFF_HAND, OFF_HAND);
 			});
 		}
 		
-		inv.getEquipment().keySet().stream().filter( slot -> ! manual.contains(slot) )
+		equip.keySet().stream().filter( slot -> ! manual.contains(slot) )
 		.forEach( slot -> {
-			createWithRightClickMenu(null, inv, slot, slot);
+			createWithRightClickMenu(null, equip, slot, slot);
 		});
 		repaint();
 	}
@@ -133,11 +133,11 @@ public class EquipmentPanel extends JPanel {
 	}
 	
 	private void createWithRightClickMenu(final Function<DDItem, JPanel> make,
-			final DDInventory inv, final EquipmentSlot slot, EquipmentSlot get) {
-		final DDItem item = inv.getEquipment().get(get);
+			final DDEquipment equip, final EquipmentSlot slot, EquipmentSlot get) {
+		final DDItem item = equip.get(get);
 		final JPanel panel = make.apply(item);
 		equipment.add(panel);
 		panel.addMouseListener(new PopClickListener(
-				new EquipmentInfoMenu(inv, item, slot)));
+				new EquipmentInfoMenu(equip, item, slot)));
 	}
 }