summaryrefslogtreecommitdiff
path: root/src/bjc/imgchain/ImgPipeline.java
diff options
context:
space:
mode:
authorBenjamin Culkin <bjculkin@mix.wvu.edu>2018-04-26 05:48:09 -0700
committerBenjamin Culkin <bjculkin@mix.wvu.edu>2018-04-26 05:48:09 -0700
commiteab6df10ab8292a59a05b25d18c413dd107bb94a (patch)
tree9b147cbb61463d4a74d1a7dbc07f3273316fc670 /src/bjc/imgchain/ImgPipeline.java
parent697bc0bae293a9f31c00f6e10f33955151228f64 (diff)
Initial commit
Diffstat (limited to 'src/bjc/imgchain/ImgPipeline.java')
-rw-r--r--src/bjc/imgchain/ImgPipeline.java206
1 files changed, 206 insertions, 0 deletions
diff --git a/src/bjc/imgchain/ImgPipeline.java b/src/bjc/imgchain/ImgPipeline.java
new file mode 100644
index 0000000..8dbbebf
--- /dev/null
+++ b/src/bjc/imgchain/ImgPipeline.java
@@ -0,0 +1,206 @@
+package bjc.imgchain;
+
+import java.awt.BorderLayout;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.text.MessageFormat;
+
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JInternalFrame;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.border.BevelBorder;
+import javax.swing.border.CompoundBorder;
+import javax.swing.border.TitledBorder;
+
+import bjc.imgchain.pipeline.MutablePipeline;
+import bjc.imgchain.pipeline.PipelineStage;
+import bjc.imgchain.pipeline.stages.ColorSkewStage;
+import bjc.imgchain.pipeline.stages.GaussStage;
+import bjc.imgchain.pipeline.stages.GreyscaleStage;
+import bjc.imgchain.pipeline.stages.IDStage;
+import bjc.imgchain.pipeline.stages.NegativeStage;
+import bjc.imgchain.pipeline.stages.StagePicker;
+
+/**
+ * Edit an image pipeline.
+ *
+ * @author acm
+ *
+ */
+public class ImgPipeline extends JInternalFrame {
+ private static final long serialVersionUID = 2252473157369730085L;
+
+ private MutablePipeline editing;
+
+ /**
+ * Create a editor for a new image pipeline.
+ */
+ public ImgPipeline() {
+ super("Pipeline Editor - New pipeline", true, true, true, true);
+
+ editing = new MutablePipeline();
+
+ setupGUI();
+ }
+
+ /**
+ * Create an editor for an existing pipeline.
+ *
+ * @param pipe
+ * The pipeline to edit.
+ */
+ public ImgPipeline(MutablePipeline pipe) {
+ super("Pipeline Editor - New pipeline", true, true, true, true);
+
+ editing = pipe;
+
+ setupGUI();
+ }
+
+ private void setupGUI() {
+ setSize(320, 320);
+ setLayout(new GridLayout(1, 1));
+
+ JPanel stageEditor = new JPanel();
+ stageEditor.setLayout(new BorderLayout());
+ TitledBorder border = new TitledBorder(new BevelBorder(BevelBorder.LOWERED), "No Stage Selected");
+ stageEditor.setBorder(border);
+
+ DefaultListModel<PipelineStage> mod = new DefaultListModel<>();
+ for (PipelineStage stage : editing.stages()) {
+ mod.addElement(stage);
+ }
+
+ JList<PipelineStage> stageList = new JList<>(mod);
+ stageList.addListSelectionListener(e -> {
+ if (e.getValueIsAdjusting())
+ return;
+
+ PipelineStage stag = stageList.getSelectedValue();
+
+ stageEditor.removeAll();
+
+ stageEditor.add(stag.getEditor(), BorderLayout.CENTER);
+ border.setTitle(stag.name());
+
+ // stageEditor.repaint();
+ });
+ JScrollPane stageScroll = new JScrollPane(stageList);
+
+ JPanel listPanel = new JPanel();
+ listPanel.setLayout(new BorderLayout());
+
+ JPanel buttonPanel = new JPanel();
+ buttonPanel.setLayout(new GridLayout(2, 1));
+
+ JPanel stageButtons = new JPanel();
+ stageButtons.setLayout(new GridLayout(1, 2));
+
+ JButton addStage = new JButton("Add Stage");
+ addStage.addActionListener(new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ StagePicker pick = new StagePicker();
+ pick.pack();
+ pick.setVisible(true);
+
+ if (pick.stageName == null) {
+ System.out.println("WARN: picked null stage");
+ return;
+ }
+
+ PipelineStage stag;
+ /*
+ * :AddStage
+ */
+ switch (pick.stageName) {
+ case "Identity": {
+ stag = new IDStage();
+ }
+ break;
+ case "Greyscale": {
+ stag = new GreyscaleStage();
+ }
+ break;
+ case "Color Skew": {
+ stag = new ColorSkewStage();
+ }
+ break;
+ case "Sepia": {
+ /*
+ * NOTE: these values were pulled from somewhere on the internet, and tweaked
+ * slightly to work better.
+ */
+ stag = new ColorSkewStage(.393, .769, .189, .349, .686, .168, .272, .534, .131);
+ }
+ case "Negative": {
+ stag = new NegativeStage();
+ }
+ break;
+ case "Gaussian Blur": {
+ stag = new GaussStage();
+ }
+ break;
+ default:
+ JOptionPane.showMessageDialog(ImgChain.chan.desktop, String
+ .format("Attempted to add unknown stage '%s'", pick.stageName));
+ return;
+ }
+
+ editing.addStage(stag);
+ mod.addElement(stag);
+
+ stageList.setSelectedValue(stag, true);
+ }
+ });
+
+ JButton delStage = new JButton("Delete Stage");
+ delStage.addActionListener(e -> {
+ int res = JOptionPane.showInternalConfirmDialog(this,
+ "Are you sure you want to remove the stage?");
+
+ if (res != JOptionPane.YES_OPTION) {
+ return;
+ }
+
+ int idx = stageList.getSelectedIndex();
+
+ mod.remove(idx);
+ editing.removeStage(idx);
+
+ stageEditor.removeAll();
+ border.setTitle("No Stage Selected");
+ });
+
+ stageButtons.add(addStage);
+ stageButtons.add(delStage);
+
+ JButton savePipeline = new JButton("Save Pipeline");
+ savePipeline.addActionListener((ev) -> {
+ String newName = JOptionPane.showInternalInputDialog(this, "Enter Pipeline Name");
+
+ editing.name(newName);
+
+ ImgChain.chan.addPipe(editing);
+
+ setTitle("Pipeline Editor - " + newName);
+ });
+
+ buttonPanel.add(stageButtons);
+ buttonPanel.add(savePipeline);
+
+ listPanel.add(stageScroll, BorderLayout.CENTER);
+ listPanel.add(buttonPanel, BorderLayout.PAGE_END);
+
+ JSplitPane main = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, listPanel, stageEditor);
+
+ add(main);
+ }
+}