config panel: refactor input components creation into methods
This commit is contained in:
@@ -337,220 +337,35 @@ class ConfigPanel extends PluginPanel
|
||||
|
||||
if (cid.getType() == boolean.class)
|
||||
{
|
||||
JCheckBox checkbox = new JCheckBox();
|
||||
checkbox.setBackground(ColorScheme.LIGHT_GRAY_COLOR);
|
||||
checkbox.setSelected(Boolean.parseBoolean(configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName())));
|
||||
checkbox.addActionListener(ae -> changeConfiguration(checkbox, cd, cid));
|
||||
|
||||
item.add(checkbox, BorderLayout.EAST);
|
||||
item.add(createCheckbox(cd, cid), BorderLayout.EAST);
|
||||
}
|
||||
|
||||
if (cid.getType() == int.class)
|
||||
else if (cid.getType() == int.class)
|
||||
{
|
||||
int value = Integer.parseInt(configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName()));
|
||||
|
||||
Range range = cid.getRange();
|
||||
int min = 0, max = Integer.MAX_VALUE;
|
||||
if (range != null)
|
||||
{
|
||||
min = range.min();
|
||||
max = range.max();
|
||||
}
|
||||
|
||||
// Config may previously have been out of range
|
||||
value = Ints.constrainToRange(value, min, max);
|
||||
|
||||
SpinnerModel model = new SpinnerNumberModel(value, min, max, 1);
|
||||
JSpinner spinner = new JSpinner(model);
|
||||
Component editor = spinner.getEditor();
|
||||
JFormattedTextField spinnerTextField = ((JSpinner.DefaultEditor) editor).getTextField();
|
||||
spinnerTextField.setColumns(SPINNER_FIELD_WIDTH);
|
||||
spinner.addChangeListener(ce -> changeConfiguration(spinner, cd, cid));
|
||||
|
||||
Units units = cid.getUnits();
|
||||
if (units != null)
|
||||
{
|
||||
spinnerTextField.setFormatterFactory(new UnitFormatterFactory(units));
|
||||
}
|
||||
|
||||
item.add(spinner, BorderLayout.EAST);
|
||||
item.add(createIntSpinner(cd, cid), BorderLayout.EAST);
|
||||
}
|
||||
|
||||
else if (cid.getType() == double.class)
|
||||
{
|
||||
double value = configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName(), double.class);
|
||||
|
||||
SpinnerModel model = new SpinnerNumberModel(value, 0, Double.MAX_VALUE, 0.1);
|
||||
JSpinner spinner = new JSpinner(model);
|
||||
Component editor = spinner.getEditor();
|
||||
JFormattedTextField spinnerTextField = ((JSpinner.DefaultEditor) editor).getTextField();
|
||||
spinnerTextField.setColumns(SPINNER_FIELD_WIDTH);
|
||||
spinner.addChangeListener(ce -> changeConfiguration(spinner, cd, cid));
|
||||
|
||||
item.add(spinner, BorderLayout.EAST);
|
||||
item.add(createDoubleSpinner(cd, cid), BorderLayout.EAST);
|
||||
}
|
||||
|
||||
if (cid.getType() == String.class)
|
||||
else if (cid.getType() == String.class)
|
||||
{
|
||||
JTextComponent textField;
|
||||
|
||||
if (cid.getItem().secret())
|
||||
{
|
||||
textField = new JPasswordField();
|
||||
}
|
||||
else
|
||||
{
|
||||
final JTextArea textArea = new JTextArea();
|
||||
textArea.setLineWrap(true);
|
||||
textArea.setWrapStyleWord(true);
|
||||
textField = textArea;
|
||||
}
|
||||
|
||||
textField.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
|
||||
textField.setText(configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName()));
|
||||
|
||||
textField.addFocusListener(new FocusAdapter()
|
||||
{
|
||||
@Override
|
||||
public void focusLost(FocusEvent e)
|
||||
{
|
||||
changeConfiguration(textField, cd, cid);
|
||||
}
|
||||
});
|
||||
|
||||
item.add(textField, BorderLayout.SOUTH);
|
||||
item.add(createTextField(cd, cid), BorderLayout.SOUTH);
|
||||
}
|
||||
|
||||
if (cid.getType() == Color.class)
|
||||
else if (cid.getType() == Color.class)
|
||||
{
|
||||
Color existing = configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName(), Color.class);
|
||||
|
||||
ColorJButton colorPickerBtn;
|
||||
|
||||
boolean alphaHidden = cid.getAlpha() == null;
|
||||
|
||||
if (existing == null)
|
||||
{
|
||||
colorPickerBtn = new ColorJButton("Pick a color", Color.BLACK);
|
||||
}
|
||||
else
|
||||
{
|
||||
String colorHex = "#" + (alphaHidden ? ColorUtil.colorToHexCode(existing) : ColorUtil.colorToAlphaHexCode(existing)).toUpperCase();
|
||||
colorPickerBtn = new ColorJButton(colorHex, existing);
|
||||
}
|
||||
|
||||
colorPickerBtn.setFocusable(false);
|
||||
colorPickerBtn.addMouseListener(new MouseAdapter()
|
||||
{
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e)
|
||||
{
|
||||
RuneliteColorPicker colorPicker = colorPickerManager.create(
|
||||
SwingUtilities.windowForComponent(ConfigPanel.this),
|
||||
colorPickerBtn.getColor(),
|
||||
cid.getItem().name(),
|
||||
alphaHidden);
|
||||
colorPicker.setLocation(getLocationOnScreen());
|
||||
colorPicker.setOnColorChange(c ->
|
||||
{
|
||||
colorPickerBtn.setColor(c);
|
||||
colorPickerBtn.setText("#" + (alphaHidden ? ColorUtil.colorToHexCode(c) : ColorUtil.colorToAlphaHexCode(c)).toUpperCase());
|
||||
});
|
||||
colorPicker.setOnClose(c -> changeConfiguration(colorPicker, cd, cid));
|
||||
colorPicker.setVisible(true);
|
||||
}
|
||||
});
|
||||
|
||||
item.add(colorPickerBtn, BorderLayout.EAST);
|
||||
item.add(createColorPicker(cd, cid), BorderLayout.EAST);
|
||||
}
|
||||
|
||||
if (cid.getType() == Dimension.class)
|
||||
else if (cid.getType() == Dimension.class)
|
||||
{
|
||||
JPanel dimensionPanel = new JPanel();
|
||||
dimensionPanel.setLayout(new BorderLayout());
|
||||
|
||||
String str = configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName());
|
||||
String[] splitStr = str.split("x");
|
||||
int width = Integer.parseInt(splitStr[0]);
|
||||
int height = Integer.parseInt(splitStr[1]);
|
||||
|
||||
SpinnerModel widthModel = new SpinnerNumberModel(width, 0, Integer.MAX_VALUE, 1);
|
||||
JSpinner widthSpinner = new JSpinner(widthModel);
|
||||
Component widthEditor = widthSpinner.getEditor();
|
||||
JFormattedTextField widthSpinnerTextField = ((JSpinner.DefaultEditor) widthEditor).getTextField();
|
||||
widthSpinnerTextField.setColumns(4);
|
||||
|
||||
SpinnerModel heightModel = new SpinnerNumberModel(height, 0, Integer.MAX_VALUE, 1);
|
||||
JSpinner heightSpinner = new JSpinner(heightModel);
|
||||
Component heightEditor = heightSpinner.getEditor();
|
||||
JFormattedTextField heightSpinnerTextField = ((JSpinner.DefaultEditor) heightEditor).getTextField();
|
||||
heightSpinnerTextField.setColumns(4);
|
||||
|
||||
ChangeListener listener = e ->
|
||||
configManager.setConfiguration(cd.getGroup().value(), cid.getItem().keyName(), widthSpinner.getValue() + "x" + heightSpinner.getValue());
|
||||
|
||||
widthSpinner.addChangeListener(listener);
|
||||
heightSpinner.addChangeListener(listener);
|
||||
|
||||
dimensionPanel.add(widthSpinner, BorderLayout.WEST);
|
||||
dimensionPanel.add(new JLabel(" x "), BorderLayout.CENTER);
|
||||
dimensionPanel.add(heightSpinner, BorderLayout.EAST);
|
||||
|
||||
item.add(dimensionPanel, BorderLayout.EAST);
|
||||
item.add(createDimension(cd, cid), BorderLayout.EAST);
|
||||
}
|
||||
|
||||
if (cid.getType().isEnum())
|
||||
else if (cid.getType().isEnum())
|
||||
{
|
||||
Class<? extends Enum> type = (Class<? extends Enum>) cid.getType();
|
||||
|
||||
JComboBox<Enum<?>> box = new JComboBox<Enum<?>>(type.getEnumConstants()); // NOPMD: UseDiamondOperator
|
||||
// set renderer prior to calling box.getPreferredSize(), since it will invoke the renderer
|
||||
// to build components for each combobox element in order to compute the display size of the
|
||||
// combobox
|
||||
box.setRenderer(new ComboBoxListRenderer<>());
|
||||
box.setPreferredSize(new Dimension(box.getPreferredSize().width, 25));
|
||||
box.setForeground(Color.WHITE);
|
||||
box.setFocusable(false);
|
||||
|
||||
try
|
||||
{
|
||||
Enum<?> selectedItem = Enum.valueOf(type, configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName()));
|
||||
box.setSelectedItem(selectedItem);
|
||||
box.setToolTipText(Text.titleCase(selectedItem));
|
||||
}
|
||||
catch (IllegalArgumentException ex)
|
||||
{
|
||||
log.debug("invalid seleced item", ex);
|
||||
}
|
||||
box.addItemListener(e ->
|
||||
{
|
||||
if (e.getStateChange() == ItemEvent.SELECTED)
|
||||
{
|
||||
changeConfiguration(box, cd, cid);
|
||||
box.setToolTipText(Text.titleCase((Enum<?>) box.getSelectedItem()));
|
||||
}
|
||||
});
|
||||
item.add(box, BorderLayout.EAST);
|
||||
item.add(createComboBox(cd, cid), BorderLayout.EAST);
|
||||
}
|
||||
|
||||
if (cid.getType() == Keybind.class || cid.getType() == ModifierlessKeybind.class)
|
||||
else if (cid.getType() == Keybind.class || cid.getType() == ModifierlessKeybind.class)
|
||||
{
|
||||
Keybind startingValue = configManager.getConfiguration(cd.getGroup().value(),
|
||||
cid.getItem().keyName(),
|
||||
(Class<? extends Keybind>) cid.getType());
|
||||
|
||||
HotkeyButton button = new HotkeyButton(startingValue, cid.getType() == ModifierlessKeybind.class);
|
||||
|
||||
button.addFocusListener(new FocusAdapter()
|
||||
{
|
||||
@Override
|
||||
public void focusLost(FocusEvent e)
|
||||
{
|
||||
changeConfiguration(button, cd, cid);
|
||||
}
|
||||
});
|
||||
|
||||
item.add(button, BorderLayout.EAST);
|
||||
item.add(createKeybind(cd, cid), BorderLayout.EAST);
|
||||
}
|
||||
|
||||
JPanel section = sectionWidgets.get(cid.getItem().section());
|
||||
@@ -596,6 +411,223 @@ class ConfigPanel extends PluginPanel
|
||||
revalidate();
|
||||
}
|
||||
|
||||
private JCheckBox createCheckbox(ConfigDescriptor cd, ConfigItemDescriptor cid)
|
||||
{
|
||||
JCheckBox checkbox = new JCheckBox();
|
||||
checkbox.setBackground(ColorScheme.LIGHT_GRAY_COLOR);
|
||||
checkbox.setSelected(Boolean.parseBoolean(configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName())));
|
||||
checkbox.addActionListener(ae -> changeConfiguration(checkbox, cd, cid));
|
||||
return checkbox;
|
||||
}
|
||||
|
||||
private JSpinner createIntSpinner(ConfigDescriptor cd, ConfigItemDescriptor cid)
|
||||
{
|
||||
int value = Integer.parseInt(configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName()));
|
||||
|
||||
Range range = cid.getRange();
|
||||
int min = 0, max = Integer.MAX_VALUE;
|
||||
if (range != null)
|
||||
{
|
||||
min = range.min();
|
||||
max = range.max();
|
||||
}
|
||||
|
||||
// Config may previously have been out of range
|
||||
value = Ints.constrainToRange(value, min, max);
|
||||
|
||||
SpinnerModel model = new SpinnerNumberModel(value, min, max, 1);
|
||||
JSpinner spinner = new JSpinner(model);
|
||||
Component editor = spinner.getEditor();
|
||||
JFormattedTextField spinnerTextField = ((JSpinner.DefaultEditor) editor).getTextField();
|
||||
spinnerTextField.setColumns(SPINNER_FIELD_WIDTH);
|
||||
spinner.addChangeListener(ce -> changeConfiguration(spinner, cd, cid));
|
||||
|
||||
Units units = cid.getUnits();
|
||||
if (units != null)
|
||||
{
|
||||
spinnerTextField.setFormatterFactory(new UnitFormatterFactory(units));
|
||||
}
|
||||
|
||||
return spinner;
|
||||
}
|
||||
|
||||
private JSpinner createDoubleSpinner(ConfigDescriptor cd, ConfigItemDescriptor cid)
|
||||
{
|
||||
double value = configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName(), double.class);
|
||||
|
||||
SpinnerModel model = new SpinnerNumberModel(value, 0, Double.MAX_VALUE, 0.1);
|
||||
JSpinner spinner = new JSpinner(model);
|
||||
Component editor = spinner.getEditor();
|
||||
JFormattedTextField spinnerTextField = ((JSpinner.DefaultEditor) editor).getTextField();
|
||||
spinnerTextField.setColumns(SPINNER_FIELD_WIDTH);
|
||||
spinner.addChangeListener(ce -> changeConfiguration(spinner, cd, cid));
|
||||
return spinner;
|
||||
}
|
||||
|
||||
private JTextComponent createTextField(ConfigDescriptor cd, ConfigItemDescriptor cid)
|
||||
{
|
||||
JTextComponent textField;
|
||||
|
||||
if (cid.getItem().secret())
|
||||
{
|
||||
textField = new JPasswordField();
|
||||
}
|
||||
else
|
||||
{
|
||||
final JTextArea textArea = new JTextArea();
|
||||
textArea.setLineWrap(true);
|
||||
textArea.setWrapStyleWord(true);
|
||||
textField = textArea;
|
||||
}
|
||||
|
||||
textField.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
|
||||
textField.setText(configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName()));
|
||||
|
||||
textField.addFocusListener(new FocusAdapter()
|
||||
{
|
||||
@Override
|
||||
public void focusLost(FocusEvent e)
|
||||
{
|
||||
changeConfiguration(textField, cd, cid);
|
||||
}
|
||||
});
|
||||
|
||||
return textField;
|
||||
}
|
||||
|
||||
private ColorJButton createColorPicker(ConfigDescriptor cd, ConfigItemDescriptor cid)
|
||||
{
|
||||
Color existing = configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName(), Color.class);
|
||||
|
||||
ColorJButton colorPickerBtn;
|
||||
|
||||
boolean alphaHidden = cid.getAlpha() == null;
|
||||
|
||||
if (existing == null)
|
||||
{
|
||||
colorPickerBtn = new ColorJButton("Pick a color", Color.BLACK);
|
||||
}
|
||||
else
|
||||
{
|
||||
String colorHex = "#" + (alphaHidden ? ColorUtil.colorToHexCode(existing) : ColorUtil.colorToAlphaHexCode(existing)).toUpperCase();
|
||||
colorPickerBtn = new ColorJButton(colorHex, existing);
|
||||
}
|
||||
|
||||
colorPickerBtn.setFocusable(false);
|
||||
colorPickerBtn.addMouseListener(new MouseAdapter()
|
||||
{
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e)
|
||||
{
|
||||
RuneliteColorPicker colorPicker = colorPickerManager.create(
|
||||
SwingUtilities.windowForComponent(ConfigPanel.this),
|
||||
colorPickerBtn.getColor(),
|
||||
cid.getItem().name(),
|
||||
alphaHidden);
|
||||
colorPicker.setLocation(getLocationOnScreen());
|
||||
colorPicker.setOnColorChange(c ->
|
||||
{
|
||||
colorPickerBtn.setColor(c);
|
||||
colorPickerBtn.setText("#" + (alphaHidden ? ColorUtil.colorToHexCode(c) : ColorUtil.colorToAlphaHexCode(c)).toUpperCase());
|
||||
});
|
||||
colorPicker.setOnClose(c -> changeConfiguration(colorPicker, cd, cid));
|
||||
colorPicker.setVisible(true);
|
||||
}
|
||||
});
|
||||
|
||||
return colorPickerBtn;
|
||||
}
|
||||
|
||||
private JPanel createDimension(ConfigDescriptor cd, ConfigItemDescriptor cid)
|
||||
{
|
||||
JPanel dimensionPanel = new JPanel();
|
||||
dimensionPanel.setLayout(new BorderLayout());
|
||||
|
||||
String str = configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName());
|
||||
String[] splitStr = str.split("x");
|
||||
int width = Integer.parseInt(splitStr[0]);
|
||||
int height = Integer.parseInt(splitStr[1]);
|
||||
|
||||
SpinnerModel widthModel = new SpinnerNumberModel(width, 0, Integer.MAX_VALUE, 1);
|
||||
JSpinner widthSpinner = new JSpinner(widthModel);
|
||||
Component widthEditor = widthSpinner.getEditor();
|
||||
JFormattedTextField widthSpinnerTextField = ((JSpinner.DefaultEditor) widthEditor).getTextField();
|
||||
widthSpinnerTextField.setColumns(4);
|
||||
|
||||
SpinnerModel heightModel = new SpinnerNumberModel(height, 0, Integer.MAX_VALUE, 1);
|
||||
JSpinner heightSpinner = new JSpinner(heightModel);
|
||||
Component heightEditor = heightSpinner.getEditor();
|
||||
JFormattedTextField heightSpinnerTextField = ((JSpinner.DefaultEditor) heightEditor).getTextField();
|
||||
heightSpinnerTextField.setColumns(4);
|
||||
|
||||
ChangeListener listener = e ->
|
||||
configManager.setConfiguration(cd.getGroup().value(), cid.getItem().keyName(), widthSpinner.getValue() + "x" + heightSpinner.getValue());
|
||||
|
||||
widthSpinner.addChangeListener(listener);
|
||||
heightSpinner.addChangeListener(listener);
|
||||
|
||||
dimensionPanel.add(widthSpinner, BorderLayout.WEST);
|
||||
dimensionPanel.add(new JLabel(" x "), BorderLayout.CENTER);
|
||||
dimensionPanel.add(heightSpinner, BorderLayout.EAST);
|
||||
|
||||
return dimensionPanel;
|
||||
}
|
||||
|
||||
private JComboBox<Enum<?>> createComboBox(ConfigDescriptor cd, ConfigItemDescriptor cid)
|
||||
{
|
||||
Class<? extends Enum> type = (Class<? extends Enum>) cid.getType();
|
||||
|
||||
JComboBox<Enum<?>> box = new JComboBox<Enum<?>>(type.getEnumConstants()); // NOPMD: UseDiamondOperator
|
||||
// set renderer prior to calling box.getPreferredSize(), since it will invoke the renderer
|
||||
// to build components for each combobox element in order to compute the display size of the
|
||||
// combobox
|
||||
box.setRenderer(new ComboBoxListRenderer<>());
|
||||
box.setPreferredSize(new Dimension(box.getPreferredSize().width, 25));
|
||||
box.setForeground(Color.WHITE);
|
||||
box.setFocusable(false);
|
||||
|
||||
try
|
||||
{
|
||||
Enum<?> selectedItem = Enum.valueOf(type, configManager.getConfiguration(cd.getGroup().value(), cid.getItem().keyName()));
|
||||
box.setSelectedItem(selectedItem);
|
||||
box.setToolTipText(Text.titleCase(selectedItem));
|
||||
}
|
||||
catch (IllegalArgumentException ex)
|
||||
{
|
||||
log.debug("invalid seleced item", ex);
|
||||
}
|
||||
box.addItemListener(e ->
|
||||
{
|
||||
if (e.getStateChange() == ItemEvent.SELECTED)
|
||||
{
|
||||
changeConfiguration(box, cd, cid);
|
||||
box.setToolTipText(Text.titleCase((Enum<?>) box.getSelectedItem()));
|
||||
}
|
||||
});
|
||||
|
||||
return box;
|
||||
}
|
||||
|
||||
private HotkeyButton createKeybind(ConfigDescriptor cd, ConfigItemDescriptor cid)
|
||||
{
|
||||
Keybind startingValue = configManager.getConfiguration(cd.getGroup().value(),
|
||||
cid.getItem().keyName(),
|
||||
(Class<? extends Keybind>) cid.getType());
|
||||
|
||||
HotkeyButton button = new HotkeyButton(startingValue, cid.getType() == ModifierlessKeybind.class);
|
||||
|
||||
button.addFocusListener(new FocusAdapter()
|
||||
{
|
||||
@Override
|
||||
public void focusLost(FocusEvent e)
|
||||
{
|
||||
changeConfiguration(button, cd, cid);
|
||||
}
|
||||
});
|
||||
|
||||
return button;
|
||||
}
|
||||
|
||||
private void changeConfiguration(Component component, ConfigDescriptor cd, ConfigItemDescriptor cid)
|
||||
{
|
||||
final ConfigItem configItem = cid.getItem();
|
||||
|
||||
Reference in New Issue
Block a user