From df7c97b6a4dda7ea50f7801a1633683063adb4fe Mon Sep 17 00:00:00 2001 From: Laurent Clouet Date: Thu, 15 Jan 2015 23:20:17 +0100 Subject: [PATCH] Improvement: add graphical ui --- build.xml | 3 + resources/icon.png | Bin 0 -> 10118 bytes resources/title.png | Bin 0 -> 24556 bytes src/com/sheepit/client/Client.java | 4 + src/com/sheepit/client/Configuration.java | 12 + src/com/sheepit/client/Gui.java | 4 + src/com/sheepit/client/Server.java | 35 +++ .../sheepit/client/standalone/GuiText.java | 10 + .../client/standalone/GuiTextOneLine.java | 10 + src/com/sheepit/client/standalone/Worker.java | 6 + .../standalone/swing/activity/Activity.java | 7 + .../standalone/swing/activity/Settings.java | 236 ++++++++++++++++++ .../standalone/swing/activity/Working.java | 154 ++++++++++++ 13 files changed, 481 insertions(+) create mode 100644 resources/icon.png create mode 100644 resources/title.png create mode 100644 src/com/sheepit/client/standalone/swing/activity/Activity.java create mode 100644 src/com/sheepit/client/standalone/swing/activity/Settings.java create mode 100644 src/com/sheepit/client/standalone/swing/activity/Working.java diff --git a/build.xml b/build.xml index a2c3f45..2a5fc0d 100644 --- a/build.xml +++ b/build.xml @@ -37,6 +37,9 @@ + + + diff --git a/resources/icon.png b/resources/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..88a9d5e85cebcbb50947c480a380b213c700998b GIT binary patch literal 10118 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 literal 0 HcmV?d00001 diff --git a/resources/title.png b/resources/title.png new file mode 100644 index 0000000000000000000000000000000000000000..e52fffdeb78a412fe824ccd9a62ba078bb0a094f GIT binary patch literal 24556 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 useGPUs; + + public Settings(GuiSwing parent_) { + parent = parent_; + cacheDir = null; + useGPUs = new LinkedList(); + } + + @Override + public void show() { + Configuration config = parent.getConfiguration(); + + int size_height_label = 24; + int start_label_left = 109; + int start_label_right = 265; + int end_label_right = 490; + int n = 10; + int sep = 45; + + ImageIcon image = new ImageIcon(getClass().getResource("/title.png")); + JLabel labelImage = new JLabel(image); + labelImage.setBounds(600 / 2 - 265 / 2, n, 265, 130 + n); + n = labelImage.getHeight(); + parent.getContentPane().add(labelImage); + + n += 40; + + JLabel loginLabel = new JLabel("Login:"); + loginLabel.setBounds(start_label_left, n, 170, size_height_label); + parent.getContentPane().add(loginLabel); + + login = new JTextField(); + login.setBounds(start_label_right, n, end_label_right - start_label_right, size_height_label); + login.setText(parent.getConfiguration().login()); + login.setColumns(20); + parent.getContentPane().add(login); + + n += sep; + + JLabel passwordLabel = new JLabel("Password:"); + passwordLabel.setBounds(start_label_left, n, 170, size_height_label); + parent.getContentPane().add(passwordLabel); + + password = new JPasswordField(); + password.setBounds(start_label_right, n, end_label_right - start_label_right, size_height_label); + password.setText(parent.getConfiguration().password()); + password.setColumns(10); + parent.getContentPane().add(password); + + n += sep; + + JLabel cacheLabel = new JLabel("Working directory"); + cacheLabel.setBounds(start_label_left, n, 240, size_height_label); + parent.getContentPane().add(cacheLabel); + + String destination = DUMMY_CACHE_DIR; + if (config.getUserSpecifiedACacheDir()) { + try { + destination = config.getStorageDir().getCanonicalPath(); + } + catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + cacheDirText = new JLabel(destination); + cacheDirText.setBounds(start_label_right, n, 240, size_height_label); + parent.getContentPane().add(cacheDirText); + + cacheDirChooser = new JFileChooser(); + cacheDirChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + JButton openButton = new JButton("..."); + openButton.addActionListener(new ChooseFileAction()); + openButton.setBounds(end_label_right - 50, n, 50, size_height_label); + parent.getContentPane().add(openButton); + + n += sep; + + JLabel computeMethodLabel = new JLabel("Use"); + computeMethodLabel.setBounds(start_label_left, n, 240, size_height_label); + parent.getContentPane().add(computeMethodLabel); + + ComputeType method = config.getComputeMethod(); + useCPU = new JCheckBox("CPU"); + boolean gpuChecked = false; + + if (method == ComputeType.CPU_GPU) { + useCPU.setSelected(true); + gpuChecked = true; + } + else if (method == ComputeType.CPU_ONLY) { + useCPU.setSelected(true); + gpuChecked = false; + } + else if (method == ComputeType.GPU_ONLY) { + useCPU.setSelected(false); + gpuChecked = true; + } + + int size = 60; + useCPU.setBounds(start_label_right, n, size, size_height_label); + parent.getContentPane().add(useCPU); + + List gpus = GPU.listDevices(); + if (gpus != null) { + for (String model : gpus) { + n += 20; + JCheckBox gpuCheckBox = new JCheckBox(model); + gpuCheckBox.setSelected(gpuChecked); + gpuCheckBox.setBounds(start_label_right, n, 200, size_height_label); + gpuCheckBox.addActionListener(new GpuChangeAction()); + parent.getContentPane().add(gpuCheckBox); + useGPUs.add(gpuCheckBox); + } + } + + n += sep; + + JButton saveButton = new JButton("Start"); + saveButton.setBounds(start_label_right, n, 80, size_height_label); + saveButton.addActionListener(new SaveAction()); + parent.getContentPane().add(saveButton); + + } + + class ChooseFileAction implements ActionListener { + + @Override + public void actionPerformed(ActionEvent arg0) { + int returnVal = cacheDirChooser.showOpenDialog(parent.getContentPane()); + if (returnVal == JFileChooser.APPROVE_OPTION) { + File file = cacheDirChooser.getSelectedFile(); + cacheDir = file; + cacheDirText.setText(cacheDir.getName()); + } + } + } + + class GpuChangeAction implements ActionListener { + + @Override + public void actionPerformed(ActionEvent e) { + for (JCheckBox box : useGPUs) { + if (box.equals(e.getSource()) == false) { + box.setSelected(false); + } + } + } + } + + class SaveAction implements ActionListener { + + @Override + public void actionPerformed(ActionEvent e) { + if (parent == null) { + return; + } + + Configuration config = parent.getConfiguration(); + if (config == null) { + return; + } + + if (cacheDir != null) { + File fromConfig = config.getStorageDir(); + if (fromConfig != null && fromConfig.getAbsolutePath().equals(cacheDir.getAbsolutePath()) == false) { + config.setCacheDir(cacheDir); + } + else { + System.out.println("Activity::Settings::handle do not dir since it did not change (dir: " + cacheDir + ")"); + } + } + + String selected_gpu = null; + for (JCheckBox box : useGPUs) { + if (box.isSelected()) { + selected_gpu = box.getText(); // model + } + } + + ComputeType method = ComputeType.CPU_ONLY; + if (useCPU.isSelected() && selected_gpu == null) { + method = ComputeType.CPU_ONLY; + } + else if (useCPU.isSelected() == false && selected_gpu != null) { + method = ComputeType.GPU_ONLY; + } + else if (useCPU.isSelected() && selected_gpu != null) { + method = ComputeType.CPU_GPU; + } + config.setComputeMethod(method); + + GPUDevice gpu = GPU.getGPUDevice(selected_gpu); + if (gpu != null) { + config.setUseGPU(gpu); + } + + parent.setCredentials(login.getText(), new String(password.getPassword())); + } + } + +} diff --git a/src/com/sheepit/client/standalone/swing/activity/Working.java b/src/com/sheepit/client/standalone/swing/activity/Working.java new file mode 100644 index 0000000..af6ac44 --- /dev/null +++ b/src/com/sheepit/client/standalone/swing/activity/Working.java @@ -0,0 +1,154 @@ +package com.sheepit.client.standalone.swing.activity; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +import javax.imageio.ImageIO; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JLabel; +import com.sheepit.client.Client; +import com.sheepit.client.Server; +import com.sheepit.client.standalone.GuiSwing; +import com.sheepit.client.standalone.GuiSwing.ActivityType; + +public class Working implements Activity { + GuiSwing parent; + + JLabel statusContent; + JLabel renderedFrameContent; + JLabel remainingFrameContent; + JLabel lastRender; + + public Working(GuiSwing parent_) { + parent = parent_; + + statusContent = new JLabel("Init"); + renderedFrameContent = new JLabel("0"); + remainingFrameContent = new JLabel("0"); + + lastRender = new JLabel(); + } + + @Override + public void show() { + int n = 10; + int size_height_label = 24; + int sep = 45; + int start_label_left = 109; + int start_label_right = 280; + int end_label_right = 490; + + ImageIcon image = new ImageIcon(getClass().getResource("/title.png")); + JLabel labelImage = new JLabel(image); + labelImage.setBounds(600 / 2 - 265 / 2, n, 265, 130 + n); + n = labelImage.getHeight(); + parent.getContentPane().add(labelImage); + + n += 40; + + JLabel statusLabel = new JLabel("Status:"); + statusLabel.setBounds(start_label_left, n, 240, size_height_label); + parent.getContentPane().add(statusLabel); + + statusContent.setBounds(start_label_right, n, end_label_right - start_label_right, size_height_label); + parent.getContentPane().add(statusContent); + + n += sep; + + JLabel renderedFrameLabel = new JLabel("Rendered Frame:"); + renderedFrameLabel.setBounds(start_label_left, n, 240, size_height_label); + parent.getContentPane().add(renderedFrameLabel); + + renderedFrameContent.setBounds(start_label_right, n, end_label_right - start_label_right, size_height_label); + parent.getContentPane().add(renderedFrameContent); + + n += sep; + + JLabel remainingFrameLabel = new JLabel("Remaining Frame:"); + remainingFrameLabel.setBounds(start_label_left, n, 240, size_height_label); + parent.getContentPane().add(remainingFrameLabel); + + remainingFrameContent.setBounds(start_label_right, n, end_label_right - start_label_right, size_height_label); + parent.getContentPane().add(remainingFrameContent); + + n += sep; + + JLabel lastRenderedFrameLabel = new JLabel("Last rendered frame:"); + lastRenderedFrameLabel.setBounds(start_label_left, n, 240, size_height_label); + parent.getContentPane().add(lastRenderedFrameLabel); + + lastRender.setBounds(start_label_right, n, 200, 112); + parent.getContentPane().add(lastRender); + + JButton settingsButton = new JButton("Settings"); + settingsButton.setBounds(220, 500, 100, 25); + settingsButton.addActionListener(new SettingsAction()); + parent.getContentPane().add(settingsButton); + + JButton pauseButton = new JButton("Pause"); + pauseButton.setBounds(330, 500, 80, 25); + pauseButton.addActionListener(new PauseAction()); + parent.getContentPane().add(pauseButton); + } + + public void setStatus(String msg_) { + statusContent.setText(msg_); + } + + public void setRemainingFrame(int n) { + remainingFrameContent.setText(String.valueOf(n)); + } + + public void setRenderedFrame(int n) { + renderedFrameContent.setText(String.valueOf(n)); + showLastRender(); + } + + public void showLastRender() { + Client client = parent.getClient(); + if (client != null) { + Server server = client.getServer(); + if (server != null) { + byte[] data = server.getLastRender(); + if (data != null) { + InputStream is = new ByteArrayInputStream(data); + try { + BufferedImage image = ImageIO.read(is); + lastRender.setIcon(new ImageIcon(image)); + } + catch (IOException e) { + System.out.println("Working::showLastRender() exception " + e); + e.printStackTrace(); + } + } + } + } + + } + + class PauseAction implements ActionListener { + + @Override + public void actionPerformed(ActionEvent e) { + Client client = parent.getClient(); + if (client != null) { + client.suspend(); + } + } + } + + class SettingsAction implements ActionListener { + @Override + public void actionPerformed(ActionEvent e) { + if (parent != null) { + parent.showActivity(ActivityType.SETTINGS); + } + } + } + +}