Переглянути джерело

Allow the applying of an image.

Sam Jaffe 4 роки тому
батько
коміт
23d9a98202

+ 54 - 0
src/main/lombok/org/leumasjaffe/recipe/controller/SetImageAction.java

@@ -0,0 +1,54 @@
+package org.leumasjaffe.recipe.controller;
+
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
+
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+
+import org.leumasjaffe.recipe.model.RecipeCard;
+
+import lombok.AccessLevel;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import lombok.experimental.FieldDefaults;
+import lombok.experimental.NonFinal;
+
+@RequiredArgsConstructor
+@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+public class SetImageAction extends MouseAdapter {
+	private static class ImageFileFilter extends FileFilter {
+		@Override
+		public boolean accept(File f) {
+			final String ext = Stream.of(f.getAbsolutePath())
+					.filter(p -> p.contains("."))
+					.map(p -> p.substring(p.lastIndexOf(".") + 1))
+					.findFirst().orElse("");
+			return Stream.of("png").anyMatch(s -> s.equalsIgnoreCase(ext));
+		}
+
+		@Override
+		public String getDescription() { return "Only image files"; }
+	}
+
+	Consumer<String> setPhoto;
+	@NonFinal @Setter RecipeCard model = null;
+	
+	@Override
+	public void mousePressed(MouseEvent e) {
+		if (model == null || e.getClickCount() != 2) { return; }
+		
+		final JFileChooser chooser = new JFileChooser("./");
+		chooser.addChoosableFileFilter(new ImageFileFilter());
+		if (chooser.showOpenDialog(e.getComponent()) != JFileChooser.APPROVE_OPTION) {
+			return;
+		}
+		
+		final String path = chooser.getSelectedFile().getAbsolutePath();
+		model.setPhoto(path);
+		setPhoto.accept(path);
+	}
+}

+ 4 - 0
src/main/lombok/org/leumasjaffe/recipe/model/RecipeCard.java

@@ -22,6 +22,10 @@ public class RecipeCard extends Observable.Instance implements CompoundRecipeCom
 	Optional<String> photo = Optional.empty(); // TODO JSONIZATION	
 	List<Element> elements = new ArrayList<>();
 	
+	public void setPhoto(final String photo) {
+		this.photo = Optional.of(photo);
+	}
+	
 	@Override
 	public Stream<Element> getComponents() {
 		return getElements().stream();

+ 5 - 2
src/main/lombok/org/leumasjaffe/recipe/view/ImagePanel.java

@@ -2,6 +2,7 @@ package org.leumasjaffe.recipe.view;
 
 import java.awt.Dimension;
 import java.awt.Graphics;
+import java.awt.Image;
 import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
@@ -16,7 +17,7 @@ import lombok.Synchronized;
 @SuppressWarnings("serial")
 public class ImagePanel extends JPanel {
 	private static final @Getter(lazy=true) BufferedImage placeholder = getDefaultImage();
-    private BufferedImage image;
+    private Image image;
 
     public ImagePanel() {
     	image = getPlaceholder();
@@ -33,12 +34,14 @@ public class ImagePanel extends JPanel {
     public void setImage(final String path) {
     	if (path == null || !setImageImpl(path)) {
     		image = getPlaceholder();
+    		repaint();
     	}
     }
 
     private boolean setImageImpl(final @NonNull String path) {
     	try {                
-    		image = ImageIO.read(new File(path));
+    		image = ImageIO.read(new File(path)).getScaledInstance(200, 200, Image.SCALE_SMOOTH);
+    		repaint();
     		return true;
     	} catch (IOException ex) {
     		return false;

+ 6 - 0
src/main/lombok/org/leumasjaffe/recipe/view/summary/SummaryPanel.java

@@ -19,6 +19,7 @@ import org.jdesktop.swingx.VerticalLayout;
 import org.leumasjaffe.observer.ObservableListener;
 import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.controller.ReplaceChildrenAction;
+import org.leumasjaffe.recipe.controller.SetImageAction;
 import org.leumasjaffe.recipe.controller.SpinnerBinding;
 import org.leumasjaffe.recipe.controller.TextBinding;
 import org.leumasjaffe.recipe.model.Element;
@@ -36,6 +37,7 @@ import javax.swing.JSpinner;
 @FieldDefaults(level=AccessLevel.PRIVATE)
 public class SummaryPanel extends JPanel {
 	ReplaceChildrenAction<RecipeCard, Element> controller;
+	SetImageAction setImage;
 	TextBinding<RecipeCard> titleBinding;
 	SpinnerBinding<RecipeCard, Integer> servingsBinding;
 	SpinnerBinding<ScaleFactor, Integer> servingsToMakeBinding;
@@ -180,6 +182,9 @@ public class SummaryPanel extends JPanel {
 		gbc_txaDescription.gridy = 2;
 		panel.add(txaDescription, gbc_txaDescription);
 		
+		setImage = new SetImageAction(panelPhoto::setImage);
+		panelPhoto.addMouseListener(setImage);
+
 		titleBinding = new TextBinding<>(txtTitle,
 				RecipeCard::getTitle, RecipeCard::setTitle);
 		
@@ -212,6 +217,7 @@ public class SummaryPanel extends JPanel {
 	public void setModel(final RecipeCard card) {
 		// We need to always update the image
 		panelPhoto.setImage(card.getPhoto().orElse(null));
+		setImage.setModel(card);
 		panelTags.setModel(card.getTags());
 		titleBinding.setModel(card);
 		servingsBinding.setModel(card);