diff --git a/src/main/java/de/ph87/kindermalen/Main.java b/src/main/java/de/ph87/kindermalen/Main.java new file mode 100644 index 0000000..99a7e7e --- /dev/null +++ b/src/main/java/de/ph87/kindermalen/Main.java @@ -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); + } + +} diff --git a/src/main/java/de/ph87/kindermalen/Sidebar.java b/src/main/java/de/ph87/kindermalen/Sidebar.java index bac9ae0..f0115b2 100644 --- a/src/main/java/de/ph87/kindermalen/Sidebar.java +++ b/src/main/java/de/ph87/kindermalen/Sidebar.java @@ -17,8 +17,6 @@ public class Sidebar extends JPanel { private ToolPanel toolPanel = null; - private StampPanel stamp; - public Sidebar(final Environment environment) { setPreferredSize(new Dimension(300, 0)); setLayout(new GridBagLayout()); @@ -44,23 +42,20 @@ public class Sidebar extends JPanel { private void onToolSelected(final Tool tool) { if (toolPanel != null) { - toolPanel.setVisible(false); + remove(toolPanel); toolPanel = null; } if (tool instanceof StampTool) { - if (stamp == null) { - stamp = new StampPanel((StampTool) tool); - add(stamp, C(0, 2, 1, 0.9)); - } - toolPanel = stamp; + toolPanel = new StampPanel((StampTool) tool); } if (toolPanel != null) { + add(toolPanel, C(0, 2, 1, 0.9)); toolPanel.setVisible(true); } - repaint(); + revalidate(); } } diff --git a/src/main/java/de/ph87/kindermalen/Window.java b/src/main/java/de/ph87/kindermalen/Window.java index c544b7e..5ca9ce7 100644 --- a/src/main/java/de/ph87/kindermalen/Window.java +++ b/src/main/java/de/ph87/kindermalen/Window.java @@ -64,10 +64,4 @@ public class Window extends JFrame { 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); - } - } diff --git a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButton.java b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButton.java index adea683..e0cd15a 100644 --- a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButton.java +++ b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButton.java @@ -15,7 +15,7 @@ public class StampButton extends JPanel { private final StampTool tool; @Getter - private final Stamp stamp; + private final StampImage image; private final BufferedImage icon; @@ -23,19 +23,19 @@ public class StampButton extends JPanel { private boolean hover = false; - public StampButton(final StampTool tool, final Stamp stamp) { + public StampButton(final StampTool tool, final StampImage image) { this.tool = tool; - this.stamp = stamp; + this.image = image; setPreferredSize(new Dimension(STAMP_BUTTON_SIZE, STAMP_BUTTON_SIZE)); MouseListener.onRelease(this, this::onRelease); MouseListener.onEnter(this, this::onEnter); 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); } private void onRelease(final MouseEvent mouseEvent) { - this.tool.setStamp(stamp); + this.tool.setImage(image); this.tool.prepare(); } @@ -59,7 +59,7 @@ public class StampButton extends JPanel { if (hover) { g2.setColor(Color.yellow); highlight = true; - } else if (tool.getStamp() == stamp) { + } else if (tool.getImage() == image) { g2.setColor(Color.magenta); highlight = true; } else { diff --git a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButtonList.java b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButtonList.java new file mode 100644 index 0000000..3a83ea4 --- /dev/null +++ b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButtonList.java @@ -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 images) { + removeAll(); + for (final StampImage image : images.stream().sorted(Comparator.comparing(StampImage::getFile)).toList()) { + final StampButton button = new StampButton(stampTool, image); + add(button); + } + revalidate(); + } + +} diff --git a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/Stamp.java b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampImage.java similarity index 92% rename from src/main/java/de/ph87/kindermalen/tools/tool/stamp/Stamp.java rename to src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampImage.java index 5fce19f..c00c69b 100644 --- a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/Stamp.java +++ b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampImage.java @@ -17,7 +17,7 @@ import static de.ph87.kindermalen.util.ImageHelper.RESIZE; @Slf4j @Getter @ToString -public class Stamp { +public class StampImage { private final String name; @@ -27,7 +27,7 @@ public class Stamp { private final Map 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.file = file; this.original = ImageIO.read(file); diff --git a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampListPanel.java b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampListPanel.java deleted file mode 100644 index a2a3262..0000000 --- a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampListPanel.java +++ /dev/null @@ -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()); - } - } - -} diff --git a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampOptionsPanel.java b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampOptions.java similarity index 94% rename from src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampOptionsPanel.java rename to src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampOptions.java index b0fafe7..c142500 100644 --- a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampOptionsPanel.java +++ b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampOptions.java @@ -5,7 +5,7 @@ import java.awt.*; 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); @@ -13,7 +13,7 @@ public class StampOptionsPanel extends JPanel { private final JSlider stepSlider = new JSlider(1, 1000, 25); - public StampOptionsPanel(final StampTool tool) { + public StampOptions(final StampTool tool) { setLayout(new GridLayout(6, 1)); final JLabel sizeLabel = new JLabel("Größe:"); diff --git a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampPanel.java b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampPanel.java index deaa1d8..d22e023 100644 --- a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampPanel.java +++ b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampPanel.java @@ -13,8 +13,8 @@ public class StampPanel extends ToolPanel { public StampPanel(final StampTool tool) { setLayout(new GridBagLayout()); - add(new StampOptionsPanel(tool), C(0, 0, 1, 0, HORIZONTAL)); - add(new StampListPanel(tool), C(0, 1, 1, 1)); + add(new StampOptions(tool), C(0, 0, 1, 0, HORIZONTAL)); + add(new StampButtonList(tool), C(0, 1, 1, 1)); } } diff --git a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampTool.java b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampTool.java index 6b19fc9..cf656a2 100644 --- a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampTool.java +++ b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampTool.java @@ -3,6 +3,8 @@ package de.ph87.kindermalen.tools.tool.stamp; import de.ph87.kindermalen.drawing.Drawing; import de.ph87.kindermalen.tools.tool.Tool; 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 lombok.Getter; import lombok.Setter; @@ -14,6 +16,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; import java.util.function.Supplier; 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 List stamps = new ArrayList<>(); + private final List images = new ArrayList<>(); + + private final Publisher> onListChange = new Publisher>(); @Setter - private Stamp stamp = null; + private StampImage image = null; @Setter private int size = 100; @@ -46,20 +51,21 @@ public class StampTool extends Tool { public StampTool() { super("Stempel"); - final Stream> runnables = SCAN_FILES(STAMPS_DIR).stream().map(stamp -> () -> StampTool.this.load(stamp)); - try { - stamps = new Batch<>(runnables.toList()).join(); - } catch (InterruptedException e) { - log.error(e.toString()); - } - if (stamp == null && !stamps.isEmpty()) { - setStamp(stamps.get(0)); + final Stream> runnables = SCAN_FILES(STAMPS_DIR).stream().map(stamp -> () -> load(stamp)); + new Batch<>(runnables.toList()); + if (image == null && !images.isEmpty()) { + setImage(images.get(0)); } } - private Stamp load(final File file) { + private StampImage load(final File file) { try { - return new Stamp(file); + final StampImage image = new StampImage(file); + synchronized (images) { + images.add(image); + onListChange.publish(images); + } + return image; } catch (IOException e) { log.error(e.toString()); return null; @@ -67,12 +73,12 @@ public class StampTool extends Tool { } public void prepare() { - if (this.stamp == null || stamp.getOriginal() == null) { + if (this.image == null || image.getOriginal() == null) { return; } - prepared = RESIZE(stamp.getOriginal(), size, size); + prepared = RESIZE(image.getOriginal(), size, size); ALPHA(prepared, alpha); - log.info("Stamp prepared: {}", stamp.getName()); + log.info("Stamp prepared: {}", image.getName()); onChange.publish(this); } @@ -101,4 +107,8 @@ public class StampTool extends Tool { return prepared; } + public Subscription> onListChange(final Consumer> next) { + return onListChange.subscribe(next); + } + } diff --git a/src/main/java/de/ph87/kindermalen/util/Batch.java b/src/main/java/de/ph87/kindermalen/util/Batch.java index f883c61..40852bb 100644 --- a/src/main/java/de/ph87/kindermalen/util/Batch.java +++ b/src/main/java/de/ph87/kindermalen/util/Batch.java @@ -17,8 +17,6 @@ public class Batch { private boolean stop = false; - private final List results = new ArrayList<>(); - public Batch(final List> suppliers) { this.suppliers = new ArrayList<>(suppliers); synchronized (threads) { @@ -37,12 +35,11 @@ public class Batch { } } - public List join() throws InterruptedException { + public void join() throws InterruptedException { synchronized (threads) { while (!threads.isEmpty()) { threads.wait(); } - return results; } } @@ -55,9 +52,6 @@ public class Batch { return; } final T result = supplier.get(); - synchronized (results) { - results.add(result); - } } } finally { synchronized (threads) {