Skip to content

Commit

Permalink
config panel: respect range on unit fields
Browse files Browse the repository at this point in the history
This fixes integer fields with both Range and Unit, as setting the unit
formatter replaces the default formatter which is what imposes the range
limit.

This also fixes double fields with a unit, due to the Integer.valueOf()
call failing to parse.
  • Loading branch information
Adam- committed Jan 9, 2025
1 parent 29675bd commit 81fc0c5
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,9 @@ private JSpinner createIntSpinner(ConfigDescriptor cd, ConfigItemDescriptor cid)
Units units = cid.getUnits();
if (units != null)
{
spinnerTextField.setFormatterFactory(new UnitFormatterFactory(units.value()));
// The existing DefaultFormatterFactory with a NumberEditorFormatter. Its model is the same SpinnerModel above.
JFormattedTextField.AbstractFormatterFactory delegate = spinnerTextField.getFormatterFactory();
spinnerTextField.setFormatterFactory(new UnitFormatterFactory(delegate, units.value()));
}

return spinner;
Expand All @@ -495,7 +497,9 @@ private JSpinner createDoubleSpinner(ConfigDescriptor cd, ConfigItemDescriptor c
Units units = cid.getUnits();
if (units != null)
{
spinnerTextField.setFormatterFactory(new UnitFormatterFactory(units.value()));
// The existing DefaultFormatterFactory with a NumberEditorFormatter. Its model is the same SpinnerModel above.
JFormattedTextField.AbstractFormatterFactory delegate = spinnerTextField.getFormatterFactory();
spinnerTextField.setFormatterFactory(new UnitFormatterFactory(delegate, units.value()));
}

return spinner;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ private JSpinner createIntSpinner(int min, int max, int value, String unit)
Component editor = spinner.getEditor();
JFormattedTextField spinnerTextField = ((JSpinner.DefaultEditor) editor).getTextField();
spinnerTextField.setColumns(6);
spinnerTextField.setFormatterFactory(new UnitFormatterFactory(unit));
spinnerTextField.setFormatterFactory(new UnitFormatterFactory(spinnerTextField.getFormatterFactory(), unit));
return spinner;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
*/
package net.runelite.client.plugins.skillcalculator;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
Expand All @@ -37,8 +39,6 @@
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.EmptyBorder;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import lombok.Getter;
import static net.runelite.client.plugins.skillcalculator.SkillCalculator.MAX_XP_MULTIPLIER;
import net.runelite.client.ui.ColorScheme;
Expand Down Expand Up @@ -194,7 +194,7 @@ private JSpinner addMultiplicationSpinnerComponent(String label, int max)
JSpinner.DefaultEditor editor = (JSpinner.DefaultEditor) uiInput.getEditor();
JFormattedTextField spinnerTextField = editor.getTextField();
spinnerTextField.setHorizontalAlignment(JTextField.LEFT);
spinnerTextField.setFormatterFactory(new UnitFormatterFactory("x"));
spinnerTextField.setFormatterFactory(new UnitFormatterFactory(spinnerTextField.getFormatterFactory(), "x"));
uiInput.setBackground(ColorScheme.DARKER_GRAY_COLOR);
uiInput.setBorder(new EmptyBorder(5, 7, 5, 7));

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2020, Hydrox6 <ikada@protonmail.ch>
* Copyright (c) 2025 Adam <Adam@sigterm.info>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
Expand Down Expand Up @@ -30,21 +31,20 @@
import javax.swing.JFormattedTextField;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
final class UnitFormatter extends JFormattedTextField.AbstractFormatter
{
private final JFormattedTextField.AbstractFormatter delegate;
private final String units;

UnitFormatter(String units)
{
this.units = units;
}

@Override
public Object stringToValue(final String text) throws ParseException
{
final String trimmedText;

// Using the spinner controls causes the value to have the unit on the end, so remove it
// Using the spinner controls causes the value to have the unit on the end, so remove it.
// This isn't actually required because NumberFormatter is very lax and will error out
// when encountering the unit, but we do it anyway.
if (text.endsWith(units))
{
trimmedText = text.substring(0, text.length() - units.length());
Expand All @@ -54,14 +54,7 @@ public Object stringToValue(final String text) throws ParseException
trimmedText = text;
}

try
{
return Integer.valueOf(trimmedText);
}
catch (NumberFormatException e)
{
throw new ParseException(trimmedText + " is not an integer.", 0); // NOPMD: PreserveStackTrace
}
return delegate.stringToValue(trimmedText);
}

@Override
Expand All @@ -74,12 +67,13 @@ public String valueToString(final Object value)
@RequiredArgsConstructor
public final class UnitFormatterFactory extends JFormattedTextField.AbstractFormatterFactory
{
private final JFormattedTextField.AbstractFormatterFactory delegateFactory;
private final String units;
private final Map<JFormattedTextField, JFormattedTextField.AbstractFormatter> formatters = new HashMap<>();
private final Map<JFormattedTextField, JFormattedTextField.AbstractFormatter> formatters = new HashMap<>(1);

@Override
public JFormattedTextField.AbstractFormatter getFormatter(final JFormattedTextField tf)
{
return formatters.computeIfAbsent(tf, (key) -> new UnitFormatter(units));
return formatters.computeIfAbsent(tf, (key) -> new UnitFormatter(delegateFactory.getFormatter(key), units));
}
}

0 comments on commit 81fc0c5

Please sign in to comment.