From 5c8c7e0c485fdff4f7141ac7551ad6a7a9383c78 Mon Sep 17 00:00:00 2001 From: Victor Date: Tue, 12 Jan 2021 19:21:09 +0200 Subject: [PATCH] Add support for Alt and Ctrl --- .../imagetagger/logic/KeyProcessor.java | 26 ++++++++++++++++++- .../imagetagger/views/ColoredLabel.java | 17 +++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/annimon/imagetagger/logic/KeyProcessor.java b/src/main/java/com/annimon/imagetagger/logic/KeyProcessor.java index 340f3d8..00898d8 100644 --- a/src/main/java/com/annimon/imagetagger/logic/KeyProcessor.java +++ b/src/main/java/com/annimon/imagetagger/logic/KeyProcessor.java @@ -6,6 +6,7 @@ import com.annimon.imagetagger.views.TagPanel; import java.awt.*; import java.awt.event.KeyEvent; import java.util.List; +import java.util.Locale; import java.util.Set; import java.util.stream.Collectors; @@ -58,7 +59,7 @@ public class KeyProcessor { changeBackground(); break; default: - final var key = String.valueOf(e.getKeyChar()); + final var key = getKeyAsString(e); if (keys.contains(key)) { tagPanel.toggle(key); } @@ -86,4 +87,27 @@ public class KeyProcessor { tagPanel.setBackground(bg); tagPanel.repaint(); } + + private String getKeyAsString(KeyEvent e) { + String prefix = ""; + if ((e.getModifiersEx() & KeyEvent.CTRL_DOWN_MASK) != 0) { + prefix += "Ctrl+"; + } + if ((e.getModifiersEx() & KeyEvent.ALT_DOWN_MASK) != 0) { + prefix += "Alt+"; + } + return prefix + keyToChar(e); + } + + private String keyToChar(KeyEvent e) { + final var code = e.getKeyCode(); + if (code >= KeyEvent.VK_A && code <= KeyEvent.VK_Z) { + String key = String.valueOf((char) ('a' + (code - KeyEvent.VK_A))); + if ((e.getModifiersEx() & KeyEvent.SHIFT_DOWN_MASK) != 0) { + key = key.toUpperCase(Locale.ROOT); + } + return key; + } + return String.valueOf(e.getKeyChar()); + } } diff --git a/src/main/java/com/annimon/imagetagger/views/ColoredLabel.java b/src/main/java/com/annimon/imagetagger/views/ColoredLabel.java index baf8e94..3a0f40e 100644 --- a/src/main/java/com/annimon/imagetagger/views/ColoredLabel.java +++ b/src/main/java/com/annimon/imagetagger/views/ColoredLabel.java @@ -13,7 +13,7 @@ public class ColoredLabel extends JLabel { private boolean isToggled; public ColoredLabel(String key, String tag) { - super(key + ": " + tag); + super(String.format("%s: %s", formatKeyAsHtml(key), tag)); isToggled = false; hue = (tag.hashCode() % MAX_COLORS) * (1f / MAX_COLORS); init(); @@ -49,4 +49,19 @@ public class ColoredLabel extends JLabel { public void setEnabled(boolean enabled) { super.setEnabled(enabled); } + + private static String formatKeyAsHtml(String key) { + String result = ""; + String mutableKey = key; + if (mutableKey.contains("Ctrl+")) { + result += "Cᵀᴿᴸ+"; + mutableKey = mutableKey.replace("Ctrl+", ""); + } + if (mutableKey.contains("Alt+")) { + result += "Aᴸᵀ+"; + mutableKey = mutableKey.replace("Alt+", ""); + } + result += mutableKey; + return result; + } }