Refreshing StampButtonList when StampImage loaded

This commit is contained in:
Patrick Haßel 2023-02-27 08:13:35 +01:00
parent 6b7dd83149
commit 6fff359ab1
11 changed files with 86 additions and 72 deletions

View File

@ -0,0 +1,14 @@
package de.ph87.kindermalen;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Main {
public static void main(String[] args) {
final Environment environment = new Environment();
final Window window = new Window(environment);
window.setVisible(true);
}
}

View File

@ -17,8 +17,6 @@ public class Sidebar extends JPanel {
private ToolPanel toolPanel = null; private ToolPanel toolPanel = null;
private StampPanel stamp;
public Sidebar(final Environment environment) { public Sidebar(final Environment environment) {
setPreferredSize(new Dimension(300, 0)); setPreferredSize(new Dimension(300, 0));
setLayout(new GridBagLayout()); setLayout(new GridBagLayout());
@ -44,23 +42,20 @@ public class Sidebar extends JPanel {
private void onToolSelected(final Tool tool) { private void onToolSelected(final Tool tool) {
if (toolPanel != null) { if (toolPanel != null) {
toolPanel.setVisible(false); remove(toolPanel);
toolPanel = null; toolPanel = null;
} }
if (tool instanceof StampTool) { if (tool instanceof StampTool) {
if (stamp == null) { toolPanel = new StampPanel((StampTool) tool);
stamp = new StampPanel((StampTool) tool);
add(stamp, C(0, 2, 1, 0.9));
}
toolPanel = stamp;
} }
if (toolPanel != null) { if (toolPanel != null) {
add(toolPanel, C(0, 2, 1, 0.9));
toolPanel.setVisible(true); toolPanel.setVisible(true);
} }
repaint(); revalidate();
} }
} }

View File

@ -64,10 +64,4 @@ public class Window extends JFrame {
setLocation(bounds.x, bounds.y); setLocation(bounds.x, bounds.y);
} }
public static void main(String[] args) {
final Environment environment = new Environment();
final Window window = new Window(environment);
window.setVisible(true);
}
} }

View File

@ -15,7 +15,7 @@ public class StampButton extends JPanel {
private final StampTool tool; private final StampTool tool;
@Getter @Getter
private final Stamp stamp; private final StampImage image;
private final BufferedImage icon; private final BufferedImage icon;
@ -23,19 +23,19 @@ public class StampButton extends JPanel {
private boolean hover = false; private boolean hover = false;
public StampButton(final StampTool tool, final Stamp stamp) { public StampButton(final StampTool tool, final StampImage image) {
this.tool = tool; this.tool = tool;
this.stamp = stamp; this.image = image;
setPreferredSize(new Dimension(STAMP_BUTTON_SIZE, STAMP_BUTTON_SIZE)); setPreferredSize(new Dimension(STAMP_BUTTON_SIZE, STAMP_BUTTON_SIZE));
MouseListener.onRelease(this, this::onRelease); MouseListener.onRelease(this, this::onRelease);
MouseListener.onEnter(this, this::onEnter); MouseListener.onEnter(this, this::onEnter);
MouseListener.onExit(this, this::onExit); MouseListener.onExit(this, this::onExit);
icon = stamp.getSize(STAMP_BUTTON_ICON_REAL_SIZE); icon = image.getSize(STAMP_BUTTON_ICON_REAL_SIZE);
position = new Point((STAMP_BUTTON_SIZE - icon.getWidth()) / 2, (STAMP_BUTTON_SIZE - icon.getHeight()) / 2); position = new Point((STAMP_BUTTON_SIZE - icon.getWidth()) / 2, (STAMP_BUTTON_SIZE - icon.getHeight()) / 2);
} }
private void onRelease(final MouseEvent mouseEvent) { private void onRelease(final MouseEvent mouseEvent) {
this.tool.setStamp(stamp); this.tool.setImage(image);
this.tool.prepare(); this.tool.prepare();
} }
@ -59,7 +59,7 @@ public class StampButton extends JPanel {
if (hover) { if (hover) {
g2.setColor(Color.yellow); g2.setColor(Color.yellow);
highlight = true; highlight = true;
} else if (tool.getStamp() == stamp) { } else if (tool.getImage() == image) {
g2.setColor(Color.magenta); g2.setColor(Color.magenta);
highlight = true; highlight = true;
} else { } else {

View File

@ -0,0 +1,30 @@
package de.ph87.kindermalen.tools.tool.stamp;
import lombok.extern.slf4j.Slf4j;
import javax.swing.*;
import java.awt.*;
import java.util.Comparator;
import java.util.List;
@Slf4j
public class StampButtonList extends JPanel {
public StampButtonList(final StampTool stampTool) {
final FlowLayout flowLayout = new FlowLayout(FlowLayout.LEADING, 0, 0);
setLayout(flowLayout);
stampTool.onListChange(images -> add(stampTool, images));
add(stampTool, stampTool.getImages());
stampTool.onChange(ignore -> repaint());
}
private void add(final StampTool stampTool, final List<StampImage> images) {
removeAll();
for (final StampImage image : images.stream().sorted(Comparator.comparing(StampImage::getFile)).toList()) {
final StampButton button = new StampButton(stampTool, image);
add(button);
}
revalidate();
}
}

View File

@ -17,7 +17,7 @@ import static de.ph87.kindermalen.util.ImageHelper.RESIZE;
@Slf4j @Slf4j
@Getter @Getter
@ToString @ToString
public class Stamp { public class StampImage {
private final String name; private final String name;
@ -27,7 +27,7 @@ public class Stamp {
private final Map<Integer, BufferedImage> sizes = new HashMap<>(); private final Map<Integer, BufferedImage> sizes = new HashMap<>();
public Stamp(final File file) throws IOException { public StampImage(final File file) throws IOException {
this.name = file.getName().substring(0, file.getName().lastIndexOf(".")); this.name = file.getName().substring(0, file.getName().lastIndexOf("."));
this.file = file; this.file = file;
this.original = ImageIO.read(file); this.original = ImageIO.read(file);

View File

@ -1,23 +0,0 @@
package de.ph87.kindermalen.tools.tool.stamp;
import lombok.extern.slf4j.Slf4j;
import javax.swing.*;
import java.awt.*;
import static de.ph87.kindermalen.CONFIG.BORDERS;
@Slf4j
public class StampListPanel extends JPanel {
public StampListPanel(final StampTool tool) {
setLayout(new FlowLayout(FlowLayout.LEADING, 0, 0));
tool.getStamps().forEach(stamp -> add(new StampButton(tool, stamp)));
tool.onChange(ignore -> repaint());
repaint();
if (BORDERS) {
setBackground(Color.green.brighter().brighter());
}
}
}

View File

@ -5,7 +5,7 @@ import java.awt.*;
import static de.ph87.kindermalen.CONFIG.BORDERS; import static de.ph87.kindermalen.CONFIG.BORDERS;
public class StampOptionsPanel extends JPanel { public class StampOptions extends JPanel {
private final JSlider sizeSlider = new JSlider(10, 1000, 100); private final JSlider sizeSlider = new JSlider(10, 1000, 100);
@ -13,7 +13,7 @@ public class StampOptionsPanel extends JPanel {
private final JSlider stepSlider = new JSlider(1, 1000, 25); private final JSlider stepSlider = new JSlider(1, 1000, 25);
public StampOptionsPanel(final StampTool tool) { public StampOptions(final StampTool tool) {
setLayout(new GridLayout(6, 1)); setLayout(new GridLayout(6, 1));
final JLabel sizeLabel = new JLabel("Größe:"); final JLabel sizeLabel = new JLabel("Größe:");

View File

@ -13,8 +13,8 @@ public class StampPanel extends ToolPanel {
public StampPanel(final StampTool tool) { public StampPanel(final StampTool tool) {
setLayout(new GridBagLayout()); setLayout(new GridBagLayout());
add(new StampOptionsPanel(tool), C(0, 0, 1, 0, HORIZONTAL)); add(new StampOptions(tool), C(0, 0, 1, 0, HORIZONTAL));
add(new StampListPanel(tool), C(0, 1, 1, 1)); add(new StampButtonList(tool), C(0, 1, 1, 1));
} }
} }

View File

@ -3,6 +3,8 @@ package de.ph87.kindermalen.tools.tool.stamp;
import de.ph87.kindermalen.drawing.Drawing; import de.ph87.kindermalen.drawing.Drawing;
import de.ph87.kindermalen.tools.tool.Tool; import de.ph87.kindermalen.tools.tool.Tool;
import de.ph87.kindermalen.util.Batch; import de.ph87.kindermalen.util.Batch;
import de.ph87.kindermalen.util.Publisher;
import de.ph87.kindermalen.util.Subscription;
import de.ph87.kindermalen.util.Vector; import de.ph87.kindermalen.util.Vector;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -14,6 +16,7 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -28,10 +31,12 @@ public class StampTool extends Tool {
private static final File STAMPS_DIR = new File("./data/stamps"); private static final File STAMPS_DIR = new File("./data/stamps");
private List<Stamp> stamps = new ArrayList<>(); private final List<StampImage> images = new ArrayList<>();
private final Publisher<List<StampImage>> onListChange = new Publisher<List<StampImage>>();
@Setter @Setter
private Stamp stamp = null; private StampImage image = null;
@Setter @Setter
private int size = 100; private int size = 100;
@ -46,20 +51,21 @@ public class StampTool extends Tool {
public StampTool() { public StampTool() {
super("Stempel"); super("Stempel");
final Stream<Supplier<Stamp>> runnables = SCAN_FILES(STAMPS_DIR).stream().map(stamp -> () -> StampTool.this.load(stamp)); final Stream<Supplier<StampImage>> runnables = SCAN_FILES(STAMPS_DIR).stream().map(stamp -> () -> load(stamp));
try { new Batch<>(runnables.toList());
stamps = new Batch<>(runnables.toList()).join(); if (image == null && !images.isEmpty()) {
} catch (InterruptedException e) { setImage(images.get(0));
log.error(e.toString());
}
if (stamp == null && !stamps.isEmpty()) {
setStamp(stamps.get(0));
} }
} }
private Stamp load(final File file) { private StampImage load(final File file) {
try { try {
return new Stamp(file); final StampImage image = new StampImage(file);
synchronized (images) {
images.add(image);
onListChange.publish(images);
}
return image;
} catch (IOException e) { } catch (IOException e) {
log.error(e.toString()); log.error(e.toString());
return null; return null;
@ -67,12 +73,12 @@ public class StampTool extends Tool {
} }
public void prepare() { public void prepare() {
if (this.stamp == null || stamp.getOriginal() == null) { if (this.image == null || image.getOriginal() == null) {
return; return;
} }
prepared = RESIZE(stamp.getOriginal(), size, size); prepared = RESIZE(image.getOriginal(), size, size);
ALPHA(prepared, alpha); ALPHA(prepared, alpha);
log.info("Stamp prepared: {}", stamp.getName()); log.info("Stamp prepared: {}", image.getName());
onChange.publish(this); onChange.publish(this);
} }
@ -101,4 +107,8 @@ public class StampTool extends Tool {
return prepared; return prepared;
} }
public Subscription<List<StampImage>> onListChange(final Consumer<List<StampImage>> next) {
return onListChange.subscribe(next);
}
} }

View File

@ -17,8 +17,6 @@ public class Batch<T> {
private boolean stop = false; private boolean stop = false;
private final List<T> results = new ArrayList<>();
public Batch(final List<Supplier<T>> suppliers) { public Batch(final List<Supplier<T>> suppliers) {
this.suppliers = new ArrayList<>(suppliers); this.suppliers = new ArrayList<>(suppliers);
synchronized (threads) { synchronized (threads) {
@ -37,12 +35,11 @@ public class Batch<T> {
} }
} }
public List<T> join() throws InterruptedException { public void join() throws InterruptedException {
synchronized (threads) { synchronized (threads) {
while (!threads.isEmpty()) { while (!threads.isEmpty()) {
threads.wait(); threads.wait();
} }
return results;
} }
} }
@ -55,9 +52,6 @@ public class Batch<T> {
return; return;
} }
final T result = supplier.get(); final T result = supplier.get();
synchronized (results) {
results.add(result);
}
} }
} finally { } finally {
synchronized (threads) { synchronized (threads) {