Added the multi color transform to the gui.

Former-commit-id: 96ff1aa60098871a8597f716c0788cc749e149ef
This commit is contained in:
T. van der Zwan 2013-11-26 12:24:48 +01:00
parent 602afa14f6
commit 79f66f7db1
5 changed files with 205 additions and 14 deletions

View File

@ -1,5 +1,6 @@
package org.hyperion.hypercon.gui; package org.hyperion.hypercon.gui;
import java.awt.BorderLayout;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.GridLayout; import java.awt.GridLayout;
import java.beans.Transient; import java.beans.Transient;
@ -11,11 +12,13 @@ import javax.swing.GroupLayout;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JSpinner; import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel; import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.hyperion.hypercon.spec.ColorConfig;
import org.hyperion.hypercon.spec.TransformConfig; import org.hyperion.hypercon.spec.TransformConfig;
/** /**
@ -23,10 +26,14 @@ import org.hyperion.hypercon.spec.TransformConfig;
* *
* NB This has not been integrated in the GUI jet! * NB This has not been integrated in the GUI jet!
*/ */
public class ColorPanel extends JPanel { public class ColorTransformPanel extends JPanel {
private final TransformConfig mColorConfig; private final TransformConfig mColorConfig;
private JPanel mIndexPanel;
private JLabel mIndexLabel;
private JTextField mIndexField;
private JPanel mRgbTransformPanel; private JPanel mRgbTransformPanel;
private JLabel mThresholdLabel; private JLabel mThresholdLabel;
private JLabel mGammaLabel; private JLabel mGammaLabel;
@ -54,10 +61,10 @@ public class ColorPanel extends JPanel {
private JLabel mValueAdjustLabel; private JLabel mValueAdjustLabel;
private JSpinner mValueAdjustSpinner; private JSpinner mValueAdjustSpinner;
public ColorPanel(ColorConfig pColorConfig) { public ColorTransformPanel(TransformConfig pTransformConfig) {
super(); super();
mColorConfig = pColorConfig.mTransforms.get(0); mColorConfig = pTransformConfig;
initialise(); initialise();
} }
@ -71,12 +78,32 @@ public class ColorPanel extends JPanel {
} }
private void initialise() { private void initialise() {
setBorder(BorderFactory.createTitledBorder("Color transform")); setBorder(BorderFactory.createTitledBorder("Transform [" + mColorConfig.mId + "]"));
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(getIndexPanel());
add(Box.createVerticalStrut(10));
add(getRgbPanel()); add(getRgbPanel());
add(Box.createVerticalStrut(10)); add(Box.createVerticalStrut(10));
add(getHsvPanel()); add(getHsvPanel());
add(Box.createVerticalGlue());
}
private JPanel getIndexPanel() {
if (mIndexPanel == null) {
mIndexPanel = new JPanel();
mIndexPanel.setMaximumSize(new Dimension(1024, 25));
mIndexPanel.setLayout(new BorderLayout(10,10));
mIndexLabel = new JLabel("Indices:");
mIndexPanel.add(mIndexLabel, BorderLayout.WEST);
mIndexField = new JTextField(mColorConfig.mLedIndexString);
mIndexField.setToolTipText("Comma seperated indices or index ranges (eg '1-10, 13, 14, 17-19')");
mIndexField.getDocument().addDocumentListener(mDocumentListener);
mIndexPanel.add(mIndexField, BorderLayout.CENTER);
}
return mIndexPanel;
} }
private JPanel getRgbPanel() { private JPanel getRgbPanel() {
@ -217,4 +244,18 @@ public class ColorPanel extends JPanel {
mColorConfig.mValueGain = (Double)mValueAdjustSpinner.getValue(); mColorConfig.mValueGain = (Double)mValueAdjustSpinner.getValue();
} }
}; };
private final DocumentListener mDocumentListener = new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
mColorConfig.mLedIndexString = mIndexField.getText();
}
@Override
public void insertUpdate(DocumentEvent e) {
mColorConfig.mLedIndexString = mIndexField.getText();
}
@Override
public void changedUpdate(DocumentEvent e) {
mColorConfig.mLedIndexString = mIndexField.getText();
}
};
} }

View File

@ -0,0 +1,130 @@
package org.hyperion.hypercon.gui;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import org.hyperion.hypercon.spec.ColorConfig;
import org.hyperion.hypercon.spec.TransformConfig;
public class ColorsPanel extends JPanel {
private final ColorConfig mColorConfig;
private final DefaultComboBoxModel<TransformConfig> mTransformsModel;
private JPanel mControlPanel;
private JComboBox<TransformConfig> mTransformCombo;
private JButton mAddTransformButton;
private JButton mDelTransformButton;
private JPanel mTransformPanel;
private final Map<TransformConfig, ColorTransformPanel> mTransformPanels = new HashMap<>();
public ColorsPanel(ColorConfig pColorConfig) {
super();
mColorConfig = pColorConfig;
mTransformsModel = new DefaultComboBoxModel<TransformConfig>(mColorConfig.mTransforms);
initialise();
}
private void initialise() {
setLayout(new BorderLayout(10,10));
setBorder(BorderFactory.createTitledBorder("Colors"));
add(getControlPanel(), BorderLayout.NORTH);
mTransformPanel = new JPanel();
mTransformPanel.setLayout(new BorderLayout());
add(mTransformPanel, BorderLayout.CENTER);
for (TransformConfig config : mColorConfig.mTransforms) {
mTransformPanels.put(config, new ColorTransformPanel(config));
}
ColorTransformPanel currentPanel = mTransformPanels.get(mColorConfig.mTransforms.get(0));
mTransformPanel.add(currentPanel, BorderLayout.CENTER);
}
private JPanel getControlPanel() {
if (mControlPanel == null) {
mControlPanel = new JPanel();
mControlPanel.setLayout(new BoxLayout(mControlPanel, BoxLayout.LINE_AXIS));
mTransformCombo = new JComboBox<>(mTransformsModel);
mTransformCombo.addActionListener(mComboListener);
mControlPanel.add(mTransformCombo);
mAddTransformButton = new JButton(mAddAction);
mControlPanel.add(mAddTransformButton);
mDelTransformButton = new JButton(mDelAction);
mDelTransformButton.setEnabled(mTransformCombo.getItemCount() > 1);
mControlPanel.add(mDelTransformButton);
}
return mControlPanel;
}
private final Action mAddAction = new AbstractAction("Add") {
@Override
public void actionPerformed(ActionEvent e) {
String newId = JOptionPane.showInputDialog("Give an identifier for the new color-transform:");
if (newId == null || newId.isEmpty()) {
// No proper value given
return;
}
TransformConfig config = new TransformConfig();
config.mId = newId;
ColorTransformPanel panel = new ColorTransformPanel(config);
mTransformPanels.put(config, panel);
mTransformsModel.addElement(config);
mTransformsModel.setSelectedItem(config);
mDelTransformButton.setEnabled(true);
}
};
private final Action mDelAction = new AbstractAction("Del") {
@Override
public void actionPerformed(ActionEvent e) {
TransformConfig config = (TransformConfig) mTransformCombo.getSelectedItem();
mTransformPanels.remove(config);
mTransformsModel.removeElement(config);
mDelTransformButton.setEnabled(mTransformCombo.getItemCount() > 1);
}
};
private final ActionListener mComboListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
TransformConfig selConfig = (TransformConfig) mTransformsModel.getSelectedItem();
if (selConfig == null) {
// Something went wrong here, there should always be a selection!
return;
}
ColorTransformPanel panel = mTransformPanels.get(selConfig);
mTransformPanel.removeAll();
mTransformPanel.add(panel, BorderLayout.CENTER);
mTransformPanel.revalidate();
mTransformPanel.repaint();
}
};
}

View File

@ -174,7 +174,7 @@ public class ConfigPanel extends JPanel {
mProcessPanel.add(new BootSequencePanel(ledString.mMiscConfig)); mProcessPanel.add(new BootSequencePanel(ledString.mMiscConfig));
mProcessPanel.add(new FrameGrabberPanel(ledString.mMiscConfig)); mProcessPanel.add(new FrameGrabberPanel(ledString.mMiscConfig));
mProcessPanel.add(new ColorSmoothingPanel(ledString.mColorConfig)); mProcessPanel.add(new ColorSmoothingPanel(ledString.mColorConfig));
mProcessPanel.add(new ColorPanel(ledString.mColorConfig)); mProcessPanel.add(new ColorsPanel(ledString.mColorConfig));
mProcessPanel.add(Box.createVerticalGlue()); mProcessPanel.add(Box.createVerticalGlue());
} }
return mProcessPanel; return mProcessPanel;

View File

@ -1,6 +1,5 @@
package org.hyperion.hypercon.spec; package org.hyperion.hypercon.spec;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Vector; import java.util.Vector;
@ -10,7 +9,7 @@ import java.util.Vector;
public class ColorConfig { public class ColorConfig {
/** List with color transformations */ /** List with color transformations */
public List<TransformConfig> mTransforms = new Vector<>(); public Vector<TransformConfig> mTransforms = new Vector<>();
{ {
mTransforms.add(new TransformConfig()); mTransforms.add(new TransformConfig());
} }
@ -31,16 +30,27 @@ public class ColorConfig {
public String toJsonString() { public String toJsonString() {
StringBuffer strBuf = new StringBuffer(); StringBuffer strBuf = new StringBuffer();
strBuf.append("\t/// Color manipulation configuration used to tune the output colors to specific surroundings. Contains the following fields:\n"); strBuf.append("\t/// Color manipulation configuration used to tune the output colors to specific surroundings. \n");
strBuf.append("\t/// * 'hsv' : The manipulation in the Hue-Saturation-Value color domain with the following tuning parameters:\n"); strBuf.append("\t/// The configuration contains a list of color-transforms. Each transform contains the \n");
strBuf.append("\t/// following fields:\n");
strBuf.append("\t/// * 'id' : The unique identifier of the color transformation (eg 'device_1')");
strBuf.append("\t/// * 'leds' : The indices (or index ranges) of the leds to which this color transform applies\n");
strBuf.append("\t/// (eg '0-5, 9, 11, 12-17'). The indices are zero based.");
strBuf.append("\t/// * 'hsv' : The manipulation in the Hue-Saturation-Value color domain with the following \n");
strBuf.append("\t/// tuning parameters:\n");
strBuf.append("\t/// - 'saturationGain' The gain adjustement of the saturation\n"); strBuf.append("\t/// - 'saturationGain' The gain adjustement of the saturation\n");
strBuf.append("\t/// - 'valueGain' The gain adjustement of the value\n"); strBuf.append("\t/// - 'valueGain' The gain adjustement of the value\n");
strBuf.append("\t/// * 'red'/'green'/'blue' : The manipulation in the Red-Green-Blue color domain with the following tuning parameters for each channel:\n"); strBuf.append("\t/// * 'red'/'green'/'blue' : The manipulation in the Red-Green-Blue color domain with the \n");
strBuf.append("\t/// - 'threshold' The minimum required input value for the channel to be on (else zero)\n"); strBuf.append("\t/// following tuning parameters for each channel:\n");
strBuf.append("\t/// - 'threshold' The minimum required input value for the channel to be on \n");
strBuf.append("\t/// (else zero)\n");
strBuf.append("\t/// - 'gamma' The gamma-curve correction factor\n"); strBuf.append("\t/// - 'gamma' The gamma-curve correction factor\n");
strBuf.append("\t/// - 'blacklevel' The lowest possible value (when the channel is black)\n"); strBuf.append("\t/// - 'blacklevel' The lowest possible value (when the channel is black)\n");
strBuf.append("\t/// - 'whitelevel' The highest possible value (when the channel is white)\n"); strBuf.append("\t/// - 'whitelevel' The highest possible value (when the channel is white)\n");
strBuf.append("\t/// * 'smoothing' : Smoothing of the colors in the time-domain with the following tuning parameters:\n"); strBuf.append("\t///");
strBuf.append("\t/// Next to the list with color transforms there is also a smoothing option.");
strBuf.append("\t/// * 'smoothing' : Smoothing of the colors in the time-domain with the following tuning \n");
strBuf.append("\t/// parameters:\n");
strBuf.append("\t/// - 'type' The type of smoothing algorithm ('linear' or 'none')\n"); strBuf.append("\t/// - 'type' The type of smoothing algorithm ('linear' or 'none')\n");
strBuf.append("\t/// - 'time_ms' The time constant for smoothing algorithm in milliseconds\n"); strBuf.append("\t/// - 'time_ms' The time constant for smoothing algorithm in milliseconds\n");
strBuf.append("\t/// - 'updateFrequency' The update frequency of the leds in Hz\n"); strBuf.append("\t/// - 'updateFrequency' The update frequency of the leds in Hz\n");

View File

@ -4,7 +4,10 @@ import java.util.Locale;
public class TransformConfig { public class TransformConfig {
/** The identifier of this ColorTransform configuration */ /** The identifier of this ColorTransform configuration */
public String mId = ""; public String mId = "default";
/** The indices to which this transform applies */
public String mLedIndexString = "0-49";
/** The saturation gain (in HSV space) */ /** The saturation gain (in HSV space) */
public double mSaturationGain = 1.0; public double mSaturationGain = 1.0;
@ -42,6 +45,8 @@ public class TransformConfig {
StringBuffer strBuf = new StringBuffer(); StringBuffer strBuf = new StringBuffer();
strBuf.append("\t\t\t{\n"); strBuf.append("\t\t\t{\n");
strBuf.append("\t\t\t\t\"id\" : \"" + mId + "\",\n");
strBuf.append("\t\t\t\t\"leds\" : \"" + mLedIndexString + "\",\n");
strBuf.append(hsvToJsonString() + ",\n"); strBuf.append(hsvToJsonString() + ",\n");
strBuf.append(rgbToJsonString() + "\n"); strBuf.append(rgbToJsonString() + "\n");
strBuf.append("\t\t\t}"); strBuf.append("\t\t\t}");
@ -98,4 +103,9 @@ public class TransformConfig {
return strBuf.toString(); return strBuf.toString();
} }
@Override
public String toString() {
return mId;
}
} }