Skip to content

Commit

Permalink
Display a ⇆ symbol next to swapped components / actions in Assignment…
Browse files Browse the repository at this point in the history
…sComponent / SVG Visualization
  • Loading branch information
bwRavencl committed Aug 14, 2024
1 parent 0e9e752 commit 1de8183
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,8 @@ private static final class CompoundButton extends CustomButton {
private String text;
private CompoundButton peer;

private boolean swapTextPossible;

private CompoundButton(final Main main, final JPanel parentPanel, final Component component) {
this(main, parentPanel, component, CompoundButtonLocation.Center, null);
}
Expand All @@ -296,11 +298,16 @@ private CompoundButton(final Main main, final JPanel parentPanel, final Componen
if (component.getIndex() == GLFW.GLFW_GAMEPAD_BUTTON_LEFT_THUMB) {
setAction(new EditComponentAction(main,
Main.strings.getString(swapLeftAndRightSticks ? "RIGHT_THUMB" : "LEFT_THUMB"), component));

text = Main.strings.getString(swapLeftAndRightSticks ? "RIGHT_STICK" : "LEFT_STICK");

swapTextPossible = true;
} else if (component.getIndex() == GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_THUMB) {
setAction(new EditComponentAction(main,
Main.strings.getString(swapLeftAndRightSticks ? "LEFT_THUMB" : "RIGHT_THUMB"), component));
text = Main.strings.getString(swapLeftAndRightSticks ? "LEFT_STICK" : "RIGHT_STICK");

swapTextPossible = true;
} else {
throw new IllegalArgumentException();
}
Expand Down Expand Up @@ -334,6 +341,19 @@ public int getIconWidth() {
return preferredSize.width;
}

private Rectangle getTextRectangle(final String text, final Graphics2D g2d, final int x, final int y,
final int line) {
final var metrics = g2d.getFontMetrics(getFont());
final var textHeight = metrics.getHeight();
final var ascent = metrics.getAscent();

final var stringWidth = metrics.stringWidth(text);
final var tx = x + (getIconWidth() - stringWidth) / 2;
final var ty = y + (getIconHeight() - textHeight) / 2 + ascent;

return new Rectangle(tx, ty - ascent + line * textHeight, stringWidth, textHeight);
}

@Override
public void paintIcon(final java.awt.Component c, final Graphics g, final int x, final int y) {
final var model = getModel();
Expand All @@ -354,17 +374,13 @@ public void paintIcon(final java.awt.Component c, final Graphics g, final int x,
if (buttonLocation == CompoundButtonLocation.Center) {
beginForeground(g2d);

final var metrics = g2d.getFontMetrics(getFont());
final var textHeight = metrics.getHeight();
final var ascent = metrics.getAscent();

final var tx = x + (getIconWidth() - metrics.stringWidth(text)) / 2;
final var ty = y + (getIconHeight() - textHeight) / 2 + ascent;
final var stringWidth = metrics.stringWidth(text);

final var textRect = new Rectangle(tx, ty - ascent, stringWidth, textHeight);

final var textRect = getTextRectangle(text, g2d, x, y, 0);
paintText(g, textRect, text);

if (swapTextPossible && main.isSwapLeftAndRightSticks()) {
final var swappedTextRect = getTextRectangle(Main.SWAPPED_SYMBOL, g2d, x, y, 1);
paintText(g, swappedTextRect, Main.SWAPPED_SYMBOL);
}
}
}
});
Expand Down
49 changes: 36 additions & 13 deletions src/main/java/de/bwravencl/controllerbuddy/gui/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -220,13 +220,11 @@ public final class Main {
public static final boolean isMac = Platform.getOSType() == Platform.MAC;
public static final ResourceBundle strings = ResourceBundle.getBundle("strings");
public static final int DEFAULT_HGAP = 10;

@SuppressWarnings("exports")
public static final Dimension BUTTON_DIMENSION = new Dimension(120, 25);

@SuppressWarnings("exports")
public static final Color TRANSPARENT = new Color(255, 255, 255, 0);

public static final String SWAPPED_SYMBOL = "⇆";
static final int DEFAULT_VGAP = 10;
static final int DEFAULT_OVERLAY_SCALING = 1;
private static final Options options = new Options();
Expand Down Expand Up @@ -1558,21 +1556,37 @@ private SVGDocument generateSvgDocument(final Mode mode, final boolean darkTheme
final var swapLeftAndRightSticks = isSwapLeftAndRightSticks();

for (var axis = 0; axis <= GLFW.GLFW_GAMEPAD_AXIS_LAST; axis++) {
var swapped = false;

final var idPrefix = switch (axis) {
case GLFW.GLFW_GAMEPAD_AXIS_LEFT_TRIGGER -> SVG_ID_LEFT_TRIGGER;
case GLFW.GLFW_GAMEPAD_AXIS_LEFT_X -> swapLeftAndRightSticks ? SVG_ID_RIGHT_X : SVG_ID_LEFT_X;
case GLFW.GLFW_GAMEPAD_AXIS_LEFT_Y -> swapLeftAndRightSticks ? SVG_ID_RIGHT_Y : SVG_ID_LEFT_Y;
case GLFW.GLFW_GAMEPAD_AXIS_LEFT_X -> {
swapped = swapLeftAndRightSticks;
yield swapLeftAndRightSticks ? SVG_ID_RIGHT_X : SVG_ID_LEFT_X;
}
case GLFW.GLFW_GAMEPAD_AXIS_LEFT_Y -> {
swapped = swapLeftAndRightSticks;
yield swapLeftAndRightSticks ? SVG_ID_RIGHT_Y : SVG_ID_LEFT_Y;
}
case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER -> SVG_ID_RIGHT_TRIGGER;
case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X -> swapLeftAndRightSticks ? SVG_ID_LEFT_X : SVG_ID_RIGHT_X;
case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y -> swapLeftAndRightSticks ? SVG_ID_LEFT_Y : SVG_ID_RIGHT_Y;
case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_X -> {
swapped = swapLeftAndRightSticks;
yield swapLeftAndRightSticks ? SVG_ID_LEFT_X : SVG_ID_RIGHT_X;
}
case GLFW.GLFW_GAMEPAD_AXIS_RIGHT_Y -> {
swapped = swapLeftAndRightSticks;
yield swapLeftAndRightSticks ? SVG_ID_LEFT_Y : SVG_ID_RIGHT_Y;
}
default -> null;
};

final var actions = mode.getAxisToActionsMap().get(axis);
updateSvgElements(workingCopySvgDocument, idPrefix, actions, darkTheme);
updateSvgElements(workingCopySvgDocument, idPrefix, actions, darkTheme, swapped);
}

for (var button = 0; button <= GLFW.GLFW_GAMEPAD_BUTTON_LAST; button++) {
var swapped = false;

final var idPrefix = switch (button) {
case GLFW.GLFW_GAMEPAD_BUTTON_A -> SVG_ID_A;
case GLFW.GLFW_GAMEPAD_BUTTON_B -> SVG_ID_B;
Expand All @@ -1583,10 +1597,15 @@ private SVGDocument generateSvgDocument(final Mode mode, final boolean darkTheme
case GLFW.GLFW_GAMEPAD_BUTTON_DPAD_UP -> SVG_ID_DPAD_UP;
case GLFW.GLFW_GAMEPAD_BUTTON_GUIDE -> SVG_ID_GUIDE;
case GLFW.GLFW_GAMEPAD_BUTTON_LEFT_BUMPER -> SVG_ID_LEFT_SHOULDER;
case GLFW.GLFW_GAMEPAD_BUTTON_LEFT_THUMB -> swapLeftAndRightSticks ? SVG_ID_RIGHT_STICK : SVG_ID_LEFT_STICK;
case GLFW.GLFW_GAMEPAD_BUTTON_LEFT_THUMB -> {
swapped = swapLeftAndRightSticks;
yield swapLeftAndRightSticks ? SVG_ID_RIGHT_STICK : SVG_ID_LEFT_STICK;
}
case GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER -> SVG_ID_RIGHT_SHOULDER;
case GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_THUMB ->
swapLeftAndRightSticks ? SVG_ID_LEFT_STICK : SVG_ID_RIGHT_STICK;
case GLFW.GLFW_GAMEPAD_BUTTON_RIGHT_THUMB -> {
swapped = swapLeftAndRightSticks;
yield swapLeftAndRightSticks ? SVG_ID_LEFT_STICK : SVG_ID_RIGHT_STICK;
}
case GLFW.GLFW_GAMEPAD_BUTTON_START -> SVG_ID_START;
case GLFW.GLFW_GAMEPAD_BUTTON_X -> SVG_ID_X;
case GLFW.GLFW_GAMEPAD_BUTTON_Y -> SVG_ID_Y;
Expand All @@ -1607,7 +1626,7 @@ private SVGDocument generateSvgDocument(final Mode mode, final boolean darkTheme
}
}

updateSvgElements(workingCopySvgDocument, idPrefix, combinedActions, darkTheme);
updateSvgElements(workingCopySvgDocument, idPrefix, combinedActions, darkTheme, swapped);
}

return workingCopySvgDocument;
Expand Down Expand Up @@ -3187,7 +3206,7 @@ private void updateSonyTouchpadSettings() {
}

private void updateSvgElements(final SVGDocument svgDocument, final String idPrefix,
final List<? extends IAction<?>> actions, final boolean darkTheme) {
final List<? extends IAction<?>> actions, final boolean darkTheme, final boolean swapped) {
final var groupElement = (SVGStylableElement) svgDocument.getElementById(idPrefix + "Group");

final var hide = actions == null || actions.isEmpty();
Expand Down Expand Up @@ -3257,6 +3276,10 @@ private void updateSvgElements(final SVGDocument svgDocument, final String idPre

addTSpanElement(actionGroupB, tSpanNode);

if (swapped) {
addTSpanElement(" " + SWAPPED_SYMBOL, true, tSpanNode);
}

if (darkTheme) {
textElement.getStyle().setProperty(CSSConstants.CSS_FILL_PROPERTY, SVG_DARK_THEME_TEXT_COLOR, "");

Expand Down

0 comments on commit 1de8183

Please sign in to comment.