diff --git a/src/main/java/com/annimon/imagetagger/Main.java b/src/main/java/com/annimon/imagetagger/Main.java index 4004c07..c94c045 100644 --- a/src/main/java/com/annimon/imagetagger/Main.java +++ b/src/main/java/com/annimon/imagetagger/Main.java @@ -25,8 +25,10 @@ public class Main extends JFrame { return; } - var main = new Main(config); - main.setVisible(true); + EventQueue.invokeLater(() -> { + var main = new Main(config); + main.setVisible(true); + }); } public Main(Config config) { diff --git a/src/main/java/com/annimon/imagetagger/beans/TagButtonHolder.java b/src/main/java/com/annimon/imagetagger/beans/TagButtonHolder.java index 84372bf..9bb371d 100644 --- a/src/main/java/com/annimon/imagetagger/beans/TagButtonHolder.java +++ b/src/main/java/com/annimon/imagetagger/beans/TagButtonHolder.java @@ -1,13 +1,13 @@ package com.annimon.imagetagger.beans; -import javax.swing.*; +import com.annimon.imagetagger.views.ColoredLabel; public class TagButtonHolder { private final TagButton tagButton; - private final JLabel label; + private final ColoredLabel label; - public TagButtonHolder(TagButton tagButton, JLabel label) { + public TagButtonHolder(TagButton tagButton, ColoredLabel label) { this.tagButton = tagButton; this.label = label; } @@ -16,7 +16,7 @@ public class TagButtonHolder { return tagButton; } - public JLabel getLabel() { + public ColoredLabel getLabel() { return label; } } diff --git a/src/main/java/com/annimon/imagetagger/views/ColoredLabel.java b/src/main/java/com/annimon/imagetagger/views/ColoredLabel.java new file mode 100644 index 0000000..baf8e94 --- /dev/null +++ b/src/main/java/com/annimon/imagetagger/views/ColoredLabel.java @@ -0,0 +1,52 @@ +package com.annimon.imagetagger.views; + +import java.awt.*; +import javax.swing.*; + +public class ColoredLabel extends JLabel { + + private static final int MAX_COLORS = 8; + private static final Color ENABLED_TEXT = Color.WHITE; + private static final Color DISABLED_TEXT = new Color(0xA9A9A9); + + private final float hue; + private boolean isToggled; + + public ColoredLabel(String key, String tag) { + super(key + ": " + tag); + isToggled = false; + hue = (tag.hashCode() % MAX_COLORS) * (1f / MAX_COLORS); + init(); + } + + private void init() { + setFont(getFont().deriveFont(11f)); + setBorder(BorderFactory.createEmptyBorder(3, 6, 3, 6)); + setOpaque(true); + setToggled(false); + } + + public void toggle() { + setToggled(!isToggled); + } + + public void setToggled(boolean toggled) { + isToggled = toggled; + if (toggled) { + setBackground(Color.getHSBColor(hue, 0.90f, 0.65f)); + setForeground(ENABLED_TEXT); + } else { + setBackground(Color.getHSBColor(hue, 0.6f, 0.22f)); + setForeground(DISABLED_TEXT); + } + } + + public boolean isToggled() { + return isToggled; + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + } +} diff --git a/src/main/java/com/annimon/imagetagger/views/TagPanel.java b/src/main/java/com/annimon/imagetagger/views/TagPanel.java index 6659328..0739b06 100644 --- a/src/main/java/com/annimon/imagetagger/views/TagPanel.java +++ b/src/main/java/com/annimon/imagetagger/views/TagPanel.java @@ -2,7 +2,6 @@ package com.annimon.imagetagger.views; import com.annimon.imagetagger.beans.TagButton; import com.annimon.imagetagger.beans.TagButtonHolder; -import java.awt.*; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -13,8 +12,6 @@ import javax.swing.*; public class TagPanel extends JPanel { - private static final int MAX_COLORS = 8; - private final Map tagButtons; public TagPanel(List buttons) { @@ -23,29 +20,16 @@ public class TagPanel extends JPanel { setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS)); for (TagButton button : buttons) { final var key = button.getKey(); - final var label = new JLabel(key + ": " + button.getTag()); - label.setBorder(BorderFactory.createEmptyBorder(3, 6, 3, 6)); - label.setOpaque(true); - label.setEnabled(false); - setBackground(label, button); + final var label = new ColoredLabel(key, button.getTag()); add(label); tagButtons.put(key, new TagButtonHolder(button, label)); } } - private void setBackground(JLabel label, TagButton button) { - final boolean enabled = label.isEnabled(); - final float hue = (button.getTag().hashCode() % MAX_COLORS) * (1f / MAX_COLORS); - final var color = Color.getHSBColor(hue, enabled ? 0.99f : 0.6f, enabled ? 0.95f : 0.28f); - label.setBackground(color); - } - public void toggle(String key) { final var holder = tagButtons.get(key); if (holder != null) { - final var label = holder.getLabel(); - label.setEnabled(!label.isEnabled()); - setBackground(label, holder.getTagButton()); + holder.getLabel().toggle(); } } @@ -62,7 +46,7 @@ public class TagPanel extends JPanel { } private Predicate enabledLabelPredicate() { - return h -> h.getLabel().isEnabled(); + return h -> h.getLabel().isToggled(); } private Set filterTags(Predicate predicate) { @@ -77,8 +61,7 @@ public class TagPanel extends JPanel { final var label = holder.getLabel(); final var tagButton = holder.getTagButton(); final var containsTag = tags.contains(tagButton.getTag()); - label.setEnabled(containsTag); - setBackground(label, tagButton); + label.setToggled(containsTag); }); } }