Files
sheepit-shadow-nabber/src/com/sheepit/client/standalone/swing/activity/Settings.java

868 lines
29 KiB
Java
Raw Normal View History

2016-10-04 06:33:25 +02:00
/*
* Copyright (C) 2015 Laurent CLOUET
* Author Laurent CLOUET <laurent.clouet@nopnop.net>
*
* This program is free software; you can redistribute it and/or
2016-10-04 06:33:25 +02:00
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
2015-01-15 23:20:17 +01:00
package com.sheepit.client.standalone.swing.activity;
import java.awt.Graphics;
2015-07-29 16:51:34 -06:00
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
2015-01-15 23:20:17 +01:00
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
2015-01-15 23:20:17 +01:00
import java.io.File;
import java.net.MalformedURLException;
import java.util.Hashtable;
2015-01-15 23:20:17 +01:00
import java.util.LinkedList;
import java.util.List;
import javax.imageio.ImageIO;
2015-07-29 16:51:34 -06:00
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
2015-01-15 23:20:17 +01:00
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
2015-01-15 23:20:17 +01:00
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JSlider;
import javax.swing.JSpinner;
2015-01-15 23:20:17 +01:00
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.SpinnerNumberModel;
import com.formdev.flatlaf.FlatLaf;
import com.formdev.flatlaf.FlatLightLaf;
import com.formdev.flatlaf.FlatDarkLaf;
2015-01-15 23:20:17 +01:00
import com.sheepit.client.Configuration;
import com.sheepit.client.Configuration.ComputeType;
2015-04-08 20:45:54 +01:00
import com.sheepit.client.SettingsLoader;
import com.sheepit.client.hardware.cpu.CPU;
2015-01-15 23:20:17 +01:00
import com.sheepit.client.hardware.gpu.GPU;
import com.sheepit.client.hardware.gpu.GPUDevice;
import com.sheepit.client.hardware.gpu.GPULister;
import com.sheepit.client.hardware.gpu.nvidia.Nvidia;
import com.sheepit.client.hardware.gpu.opencl.OpenCL;
import com.sheepit.client.network.Proxy;
import com.sheepit.client.os.OS;
2015-01-15 23:20:17 +01:00
import com.sheepit.client.standalone.GuiSwing;
2021-05-03 20:36:51 +00:00
import com.sheepit.client.standalone.swing.SwingTooltips;
import com.sheepit.client.standalone.swing.components.CollapsibleJPanel;
2015-01-15 23:20:17 +01:00
public class Settings implements Activity {
private static final String DUMMY_CACHE_DIR = "Auto detected";
private GuiSwing parent;
private JTextField login;
private JPasswordField password;
private JLabel cacheDirText;
private File cacheDir;
private JFileChooser cacheDirChooser;
private JCheckBox useCPU;
private List<JCheckBoxGPU> useGPUs;
private JCheckBox useSysTray;
private JLabel renderbucketSizeLabel;
private JSlider renderbucketSize;
private JSlider cpuCores;
private JSlider ram;
private JSpinner renderTime;
2017-03-19 17:38:22 +01:00
private JSlider priority;
private JTextField proxy;
2017-05-08 01:35:08 +02:00
private JTextField hostname;
2015-01-15 23:20:17 +01:00
private ButtonGroup themeOptionsGroup;
private JRadioButton lightMode;
private JRadioButton darkMode;
2015-03-31 21:35:04 +01:00
private JCheckBox saveFile;
private JCheckBox autoSignIn;
JButton saveButton;
private boolean haveAutoStarted;
private boolean useSysTrayPrevState;
2015-01-15 23:20:17 +01:00
public Settings(GuiSwing parent_) {
parent = parent_;
cacheDir = null;
useGPUs = new LinkedList<JCheckBoxGPU>();
haveAutoStarted = false;
2015-01-15 23:20:17 +01:00
}
@Override public void show() {
2015-01-15 23:20:17 +01:00
Configuration config = parent.getConfiguration();
new SettingsLoader(config.getConfigFilePath()).merge(config);
useSysTrayPrevState = config.isUseSysTray();
2015-01-15 23:20:17 +01:00
applyTheme(config.getTheme()); // apply the proper theme (light/dark)
2018-08-24 19:46:03 +02:00
List<GPUDevice> gpus = GPU.listDevices(config);
useGPUs.clear(); // Empty the auxiliary list (used in the list of checkboxes)
2015-07-29 16:51:34 -06:00
GridBagConstraints constraints = new GridBagConstraints();
int currentRow = 0;
JLabel labelImage;
try {
// Include the version of the app as a watermark in the SheepIt logo.
final BufferedImage watermark = ImageIO.read(getClass().getResource("/sheepit-logo.png"));
Graphics gph = watermark.getGraphics();
gph.setFont(gph.getFont().deriveFont(12f));
gph.drawString("v" + config.getJarVersion(), 335, 120);
gph.dispose();
labelImage = new JLabel(new ImageIcon(watermark));
}
catch (Exception e) {
// If something fails, we just show the SheepIt logo (without any watermark)
ImageIcon image = new ImageIcon(getClass().getResource("/sheepit-logo.png"));
labelImage = new JLabel(image);
}
constraints.fill = GridBagConstraints.CENTER;
constraints.gridwidth = 2;
constraints.gridx = 0;
2015-07-29 16:51:34 -06:00
constraints.gridy = currentRow;
parent.getContentPane().add(labelImage, constraints);
2015-01-15 23:20:17 +01:00
2015-07-29 16:51:34 -06:00
++currentRow;
2015-01-15 23:20:17 +01:00
constraints.gridy = currentRow;
parent.getContentPane().add(new JLabel(" "), constraints); // Add a separator between logo and first panel
currentRow++;
// authentication
CollapsibleJPanel authentication_panel = new CollapsibleJPanel(new GridLayout(2, 2), this);
2017-02-18 14:31:43 +01:00
authentication_panel.setBorder(BorderFactory.createTitledBorder("Authentication"));
2015-01-15 23:20:17 +01:00
2017-02-18 14:31:43 +01:00
JLabel loginLabel = new JLabel("Username:");
2015-01-15 23:20:17 +01:00
login = new JTextField();
login.setText(parent.getConfiguration().getLogin());
2015-01-15 23:20:17 +01:00
login.setColumns(20);
login.addKeyListener(new CheckCanStart());
2017-02-18 14:31:43 +01:00
JLabel passwordLabel = new JLabel("Password:");
2015-01-15 23:20:17 +01:00
password = new JPasswordField();
password.setText(parent.getConfiguration().getPassword());
2015-01-15 23:20:17 +01:00
password.setColumns(10);
password.addKeyListener(new CheckCanStart());
2015-01-15 23:20:17 +01:00
2017-02-18 14:31:43 +01:00
authentication_panel.add(loginLabel);
authentication_panel.add(login);
2015-01-15 23:20:17 +01:00
2017-02-18 14:31:43 +01:00
authentication_panel.add(passwordLabel);
authentication_panel.add(password);
constraints.gridx = 0;
2015-07-29 16:51:34 -06:00
constraints.gridy = currentRow;
constraints.fill = GridBagConstraints.HORIZONTAL;
2017-02-18 14:31:43 +01:00
parent.getContentPane().add(authentication_panel, constraints);
2015-01-15 23:20:17 +01:00
// Theme selection panel
CollapsibleJPanel themePanel = new CollapsibleJPanel(new GridLayout(1, 3), this);
themePanel.setBorder(BorderFactory.createTitledBorder("Theme"));
themeOptionsGroup = new ButtonGroup();
lightMode = new JRadioButton("Light");
lightMode.setActionCommand("light");
lightMode.setSelected(config.getTheme().equals("light"));
lightMode.addActionListener(new ApplyThemeAction());
darkMode = new JRadioButton("Dark");
darkMode.setActionCommand("dark");
darkMode.setSelected(config.getTheme().equals("dark"));
darkMode.addActionListener(new ApplyThemeAction());
themePanel.add(lightMode);
themePanel.add(darkMode);
// Group both radio buttons to allow only one selected
themeOptionsGroup.add(lightMode);
themeOptionsGroup.add(darkMode);
currentRow++;
constraints.gridx = 0;
constraints.gridy = currentRow;
constraints.gridwidth = 2;
parent.getContentPane().add(themePanel, constraints);
// directory
CollapsibleJPanel directory_panel = new CollapsibleJPanel(new GridLayout(1, 3), this);
directory_panel.setBorder(BorderFactory.createTitledBorder("Cache"));
2017-02-18 14:31:43 +01:00
JLabel cacheLabel = new JLabel("Working directory:");
cacheLabel.setToolTipText(SwingTooltips.WORKING_DIRECTORY.getText());
directory_panel.add(cacheLabel);
2015-01-15 23:20:17 +01:00
String destination = DUMMY_CACHE_DIR;
if (config.isUserHasSpecifiedACacheDir()) {
destination = config.getCacheDirForSettings().getName();
2015-01-15 23:20:17 +01:00
}
JPanel cacheDirWrapper = new JPanel();
cacheDirWrapper.setLayout(new BoxLayout(cacheDirWrapper, BoxLayout.LINE_AXIS));
2015-01-15 23:20:17 +01:00
cacheDirText = new JLabel(destination);
cacheDirWrapper.add(cacheDirText);
cacheDirWrapper.add(Box.createHorizontalGlue());
2015-01-15 23:20:17 +01:00
cacheDirChooser = new JFileChooser();
cacheDirChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
JButton openButton = new JButton("...");
openButton.addActionListener(new ChooseFileAction());
cacheDirWrapper.add(openButton);
directory_panel.add(cacheDirWrapper);
2015-01-15 23:20:17 +01:00
currentRow++;
constraints.gridx = 0;
2015-07-29 16:51:34 -06:00
constraints.gridy = currentRow;
constraints.gridwidth = 2;
parent.getContentPane().add(directory_panel, constraints);
// compute devices
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints compute_devices_constraints = new GridBagConstraints();
CollapsibleJPanel compute_devices_panel = new CollapsibleJPanel(gridbag, this);
compute_devices_panel.setBorder(BorderFactory.createTitledBorder("Compute devices"));
compute_devices_panel.setToolTipText(SwingTooltips.COMPUTE_DEVICES.getText());
2015-01-15 23:20:17 +01:00
ComputeType method = config.getComputeMethod();
useCPU = new JCheckBox("CPU");
boolean gpuChecked = false;
if (method == ComputeType.CPU_GPU) {
useCPU.setSelected(true);
gpuChecked = true;
}
2015-04-07 20:05:48 +01:00
else if (method == ComputeType.CPU) {
2015-01-15 23:20:17 +01:00
useCPU.setSelected(true);
gpuChecked = false;
}
2015-04-07 20:05:48 +01:00
else if (method == ComputeType.GPU) {
2015-01-15 23:20:17 +01:00
useCPU.setSelected(false);
gpuChecked = true;
}
useCPU.addActionListener(new CpuChangeAction());
compute_devices_constraints.gridx = 1;
compute_devices_constraints.gridy = 0;
compute_devices_constraints.fill = GridBagConstraints.BOTH;
compute_devices_constraints.weightx = 1.0;
compute_devices_constraints.weighty = 1.0;
gridbag.setConstraints(useCPU, compute_devices_constraints);
compute_devices_panel.add(useCPU);
if (gpus.size() > 0) {
renderbucketSizeLabel = new JLabel("Renderbucket size:");
renderbucketSize = new JSlider();
renderbucketSize.setMajorTickSpacing(1);
renderbucketSize.setMinorTickSpacing(1);
renderbucketSize.setPaintTicks(true);
renderbucketSize.setPaintLabels(true);
renderbucketSizeLabel.setToolTipText(SwingTooltips.RENDERBUCKET_SIZE.getText());
renderbucketSizeLabel.setVisible(false);
renderbucketSize.setVisible(false);
for (GPUDevice gpu : gpus) {
JCheckBoxGPU gpuCheckBox = new JCheckBoxGPU(gpu);
gpuCheckBox.setToolTipText(gpu.getId());
if (gpuChecked) {
GPUDevice config_gpu = config.getGPUDevice();
if (config_gpu != null && config_gpu.getId().equals(gpu.getId())) {
gpuCheckBox.setSelected(gpuChecked);
renderbucketSizeLabel.setVisible(true);
renderbucketSize.setVisible(true);
}
}
gpuCheckBox.addActionListener(new GpuChangeAction());
compute_devices_constraints.gridy++;
gridbag.setConstraints(gpuCheckBox, compute_devices_constraints);
compute_devices_panel.add(gpuCheckBox);
useGPUs.add(gpuCheckBox);
2015-01-15 23:20:17 +01:00
}
// Initialisation values will apply if we are not able to detect the proper GPU technology or
// because is a new one (different from CUDA and OPENCL). In that case, move into a safe position
// of 32x32 pixel render bucket and a maximum of 128x128 pixel for the "unknown GPU"
int maxRenderbucketSize = 128;
int recommendedBucketSize = GPU.MIN_RENDERBUCKET_SIZE;
//When replacing gpus it can happen that the client can't find the one specified in the config anymore in which case config.getGPUDevice()
//returns null
if ((config.getComputeMethod() == ComputeType.GPU || config.getComputeMethod() == ComputeType.CPU_GPU) && config.getGPUDevice() != null) {
GPULister gpu;
if (config.getGPUDevice().getType().equals("CUDA")) {
gpu = new Nvidia();
maxRenderbucketSize = gpu.getMaximumRenderBucketSize(config.getGPUDevice().getMemory());
recommendedBucketSize = gpu.getRecommendedRenderBucketSize(config.getGPUDevice().getMemory());
}
else if (config.getGPUDevice().getType().equals("OPENCL")) {
gpu = new OpenCL();
maxRenderbucketSize = gpu.getMaximumRenderBucketSize(config.getGPUDevice().getMemory());
recommendedBucketSize = gpu.getRecommendedRenderBucketSize(config.getGPUDevice().getMemory());
}
}
buildRenderBucketSizeSlider(maxRenderbucketSize, config.getRenderbucketSize() != -1 ?
((int) (Math.log(config.getRenderbucketSize()) / Math.log(2))) - 5 :
((int) (Math.log(recommendedBucketSize) / Math.log(2))) - 5);
compute_devices_constraints.weightx = 1.0 / gpus.size();
compute_devices_constraints.gridx = 0;
compute_devices_constraints.gridy++;
gridbag.setConstraints(renderbucketSizeLabel, compute_devices_constraints);
compute_devices_panel.add(renderbucketSizeLabel);
compute_devices_constraints.gridx = 1;
compute_devices_constraints.weightx = 1.0;
gridbag.setConstraints(renderbucketSize, compute_devices_constraints);
compute_devices_panel.add(new JLabel(" "), compute_devices_constraints); // Add a space between lines
compute_devices_panel.add(renderbucketSize);
2015-01-15 23:20:17 +01:00
}
CPU cpu = new CPU();
if (cpu.cores() > 1) { // if only one core is available, no need to show the choice
double step = 1;
double display = (double) cpu.cores() / step;
while (display > 10) {
step += 1.0;
display = (double) cpu.cores() / step;
}
cpuCores = new JSlider(1, cpu.cores());
cpuCores.setMajorTickSpacing((int) (step));
cpuCores.setMinorTickSpacing(1);
cpuCores.setPaintTicks(true);
cpuCores.setPaintLabels(true);
cpuCores.setValue(config.getNbCores() != -1 ? config.getNbCores() : cpuCores.getMaximum());
JLabel coreLabel = new JLabel("CPU cores:");
coreLabel.setToolTipText(SwingTooltips.CPU_CORES.getText());
2015-07-29 16:51:34 -06:00
compute_devices_constraints.weightx = 1.0 / gpus.size();
compute_devices_constraints.gridx = 0;
compute_devices_constraints.gridy++;
gridbag.setConstraints(coreLabel, compute_devices_constraints);
compute_devices_panel.add(coreLabel);
compute_devices_constraints.gridx = 1;
compute_devices_constraints.weightx = 1.0;
gridbag.setConstraints(cpuCores, compute_devices_constraints);
compute_devices_panel.add(new JLabel(" "), compute_devices_constraints); // Add a space between lines
compute_devices_panel.add(cpuCores);
}
// max ram allowed to render
OS os = OS.getOS();
int all_ram = (int) os.getMemory();
ram = new JSlider(0, all_ram);
int step = 1000000;
double display = (double) all_ram / (double) step;
while (display > 10) {
step += 1000000;
display = (double) all_ram / (double) step;
}
Hashtable<Integer, JLabel> labelTable = new Hashtable<Integer, JLabel>();
for (int g = 0; g < all_ram; g += step) {
labelTable.put(new Integer(g), new JLabel("" + (g / 1000000)));
}
ram.setMajorTickSpacing(step);
ram.setLabelTable(labelTable);
ram.setPaintTicks(true);
ram.setPaintLabels(true);
ram.setValue((int) (config.getMaxMemory() != -1 ? config.getMaxMemory() : os.getMemory()));
JLabel ramLabel = new JLabel("Memory:");
ramLabel.setToolTipText(SwingTooltips.MEMORY.getText());
compute_devices_constraints.weightx = 1.0 / gpus.size();
compute_devices_constraints.gridx = 0;
compute_devices_constraints.gridy++;
gridbag.setConstraints(ramLabel, compute_devices_constraints);
compute_devices_panel.add(ramLabel);
compute_devices_constraints.gridx = 1;
compute_devices_constraints.weightx = 1.0;
gridbag.setConstraints(ram, compute_devices_constraints);
compute_devices_panel.add(new JLabel(" "), compute_devices_constraints); // Add a space between lines
compute_devices_panel.add(ram);
parent.getContentPane().add(compute_devices_panel, constraints);
// priority
// ui display low -> high but the actual values are reversed
// -19 is highest priority
boolean high_priority_support = os.getSupportHighPriority();
priority = new JSlider(high_priority_support ? -19 : 0, 19);
Hashtable<Integer, JLabel> labelTablePriority = new Hashtable<>();
labelTablePriority.put(high_priority_support ? -19 : 0, new JLabel("Low"));
labelTablePriority.put(19, new JLabel("High"));
priority.setLabelTable(labelTablePriority);
2017-03-19 17:38:22 +01:00
priority.setMinorTickSpacing(1);
priority.setPaintTicks(true);
priority.setPaintLabels(true);
if (high_priority_support) {
// inverse
priority.setValue(-1 * config.getPriority());
}
else {
priority.setValue(19 - config.getPriority());
}
JLabel priorityLabel = new JLabel("Priority");
priorityLabel.setToolTipText(SwingTooltips.PRIORITY.getText());
2017-03-19 17:38:22 +01:00
boolean showPrioritySlider = os.checkNiceAvailability();
priority.setVisible(showPrioritySlider);
priorityLabel.setVisible(showPrioritySlider);
2017-03-19 17:38:22 +01:00
compute_devices_constraints.weightx = 1.0 / gpus.size();
compute_devices_constraints.gridx = 0;
compute_devices_constraints.gridy++;
gridbag.setConstraints(priorityLabel, compute_devices_constraints);
compute_devices_panel.add(priorityLabel);
compute_devices_constraints.gridx = 1;
compute_devices_constraints.weightx = 1.0;
gridbag.setConstraints(priority, compute_devices_constraints);
compute_devices_panel.add(priority);
currentRow++;
constraints.gridx = 0;
2016-09-21 23:26:44 +02:00
constraints.gridy = currentRow;
constraints.gridwidth = 2;
parent.getContentPane().add(compute_devices_panel, constraints);
2016-09-21 23:26:44 +02:00
// other
CollapsibleJPanel advanced_panel = new CollapsibleJPanel(new GridLayout(4, 2), this);
advanced_panel.setBorder(BorderFactory.createTitledBorder("Advanced options"));
2016-09-21 23:26:44 +02:00
JLabel useSysTrayLabel = new JLabel("Minimize to SysTray");
useSysTrayLabel.setToolTipText(SwingTooltips.MINIMIZE_TO_SYSTRAY.getText());
useSysTray = new JCheckBox();
useSysTray.setSelected(config.isUseSysTray());
advanced_panel.add(useSysTrayLabel);
advanced_panel.add(useSysTray);
2017-02-18 14:31:43 +01:00
JLabel proxyLabel = new JLabel("Proxy:");
proxyLabel.setToolTipText("http://login:password@host:port\n" + SwingTooltips.PROXY.getText());
proxy = new JTextField();
proxy.setToolTipText("http://login:password@host:port");
proxy.setText(parent.getConfiguration().getProxy());
proxy.addKeyListener(new CheckCanStart());
advanced_panel.add(proxyLabel);
advanced_panel.add(proxy);
2017-05-08 01:35:08 +02:00
JLabel hostnameLabel = new JLabel("Computer name:");
hostnameLabel.setToolTipText(SwingTooltips.COMPUTER_NAME.getText());
2017-05-08 01:35:08 +02:00
hostname = new JTextField();
hostname.setText(parent.getConfiguration().getHostname());
advanced_panel.add(hostnameLabel);
advanced_panel.add(hostname);
JLabel renderTimeLabel = new JLabel("Max time per frame (in minute):");
renderTimeLabel.setToolTipText(SwingTooltips.MAX_TIME_PER_FRAME.getText());
int val = 0;
if (parent.getConfiguration().getMaxRenderTime() > 0) {
val = parent.getConfiguration().getMaxRenderTime() / 60;
}
renderTime = new JSpinner(new SpinnerNumberModel(val, 0, 1000, 1));
advanced_panel.add(renderTimeLabel);
advanced_panel.add(renderTime);
currentRow++;
constraints.gridx = 0;
2015-07-29 16:51:34 -06:00
constraints.gridy = currentRow;
constraints.gridwidth = 2;
parent.getContentPane().add(advanced_panel, constraints);
2015-03-31 21:35:04 +01:00
// general settings
JPanel general_panel = new JPanel(new GridLayout(1, 2));
saveFile = new JCheckBox("Save settings", true);
general_panel.add(saveFile);
autoSignIn = new JCheckBox("Auto sign in", config.isAutoSignIn());
autoSignIn.addActionListener(new AutoSignInChangeAction());
general_panel.add(autoSignIn);
currentRow++;
constraints.gridx = 0;
constraints.gridy = currentRow;
constraints.gridwidth = 2;
parent.getContentPane().add(general_panel, constraints);
2015-03-31 21:35:04 +01:00
currentRow++;
constraints.gridy = currentRow;
parent.getContentPane().add(new JLabel(" "), constraints); // Add a separator between last checkboxes and button
currentRow++;
2016-02-08 13:06:33 +01:00
String buttonText = "Start";
if (parent.getClient() != null) {
if (parent.getClient().isRunning()) {
buttonText = "Save";
}
}
saveButton = new JButton(buttonText);
checkDisplaySaveButton();
2015-01-15 23:20:17 +01:00
saveButton.addActionListener(new SaveAction());
currentRow++;
constraints.gridwidth = 2;
constraints.gridx = 0;
2015-07-29 16:51:34 -06:00
constraints.gridy = currentRow;
parent.getContentPane().add(saveButton, constraints);
// Increase the size of the app Window to ensure it shows all the information with the Advanced Options panel opened.
parent.setSize(520,850);
2015-07-29 16:51:34 -06:00
if (haveAutoStarted == false && config.isAutoSignIn() && checkDisplaySaveButton()) {
// auto start
haveAutoStarted = true;
new SaveAction().actionPerformed(null);
}
2015-01-15 23:20:17 +01:00
}
public void resizeWindow() {}
private void buildRenderBucketSizeSlider(int maxRenderbucketSize, int selectedBucketSize) {
Hashtable<Integer, JLabel> renderbucketSizeTable = new Hashtable<Integer, JLabel>();
// We "take logs" to calculate the exponent to fill the slider. The logarithm, or log, of a number reflects
// what power you need to raise a certain base to in order to get that number. In this case, as we are
// offering increments of 2^n, the formula will be:
//
// log(tile size in px)
// exponent = --------------------
// log(2)
//
int steps = (int) (Math.log(maxRenderbucketSize) / Math.log(2));
for (int i = 5; i <= steps; i++) {
renderbucketSizeTable.put((i - 5), new JLabel(String.format("%.0f", Math.pow(2, i))));
}
renderbucketSize.setMinimum(0);
renderbucketSize.setMaximum(renderbucketSizeTable.size() - 1);
renderbucketSize.setLabelTable(renderbucketSizeTable);
renderbucketSize.setValue(selectedBucketSize);
}
public boolean checkDisplaySaveButton() {
boolean selected = useCPU.isSelected();
for (JCheckBoxGPU box : useGPUs) {
if (box.isSelected()) {
selected = true;
}
}
if (login.getText().isEmpty() || password.getPassword().length == 0 || Proxy.isValidURL(proxy.getText()) == false) {
selected = false;
}
saveButton.setEnabled(selected);
return selected;
}
private void applyTheme(String theme_) {
try {
if (theme_.equals("light")) {
UIManager.setLookAndFeel(new FlatLightLaf());
}
else if (theme_.equals("dark")) {
UIManager.setLookAndFeel(new FlatDarkLaf());
}
// Apply the new theme
FlatLaf.updateUI();
}
catch (UnsupportedLookAndFeelException e1) {
e1.printStackTrace();
}
}
2015-01-15 23:20:17 +01:00
class ChooseFileAction implements ActionListener {
@Override public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(parent.getContentPane(),
"<html>The working directory has to be dedicated directory. <br />Caution, everything not related to SheepIt-Renderfarm will be removed.<br />You should create a directory specifically for it.</html>",
"Warning: files will be removed!", JOptionPane.WARNING_MESSAGE);
2015-01-15 23:20:17 +01:00
int returnVal = cacheDirChooser.showOpenDialog(parent.getContentPane());
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = cacheDirChooser.getSelectedFile();
cacheDir = file;
cacheDirText.setText(cacheDir.getName());
}
}
}
class CpuChangeAction implements ActionListener {
@Override public void actionPerformed(ActionEvent e) {
checkDisplaySaveButton();
}
}
2015-01-15 23:20:17 +01:00
class GpuChangeAction implements ActionListener {
@Override public void actionPerformed(ActionEvent e) {
renderbucketSizeLabel.setVisible(false);
renderbucketSize.setVisible(false);
int counter = 0;
2015-01-15 23:20:17 +01:00
for (JCheckBox box : useGPUs) {
if (!box.isSelected()) {
box.setSelected(false);
}
else {
GPULister gpu;
int maxRenderbucketSize = 128; // Max default render bucket size
int recommendedBucketSize = GPU.MIN_RENDERBUCKET_SIZE; // Default recommended render bucket size
if (useGPUs.get(counter).getGPUDevice().getType().equals("CUDA")) {
gpu = new Nvidia();
maxRenderbucketSize = gpu.getMaximumRenderBucketSize(useGPUs.get(counter).getGPUDevice().getMemory());
recommendedBucketSize = gpu.getRecommendedRenderBucketSize(useGPUs.get(counter).getGPUDevice().getMemory());
}
else if (useGPUs.get(counter).getGPUDevice().getType().equals("OPENCL")) {
gpu = new OpenCL();
maxRenderbucketSize = gpu.getMaximumRenderBucketSize(useGPUs.get(counter).getGPUDevice().getMemory());
recommendedBucketSize = gpu.getRecommendedRenderBucketSize(useGPUs.get(counter).getGPUDevice().getMemory());
}
buildRenderBucketSizeSlider(maxRenderbucketSize, ((int) (Math.log(recommendedBucketSize) / Math.log(2))) - 5);
renderbucketSizeLabel.setVisible(true);
renderbucketSize.setVisible(true);
}
// Simulate a radio button behavior with check buttons while only 1 GPU
// can be selected at a time
2015-01-15 23:20:17 +01:00
if (box.equals(e.getSource()) == false) {
box.setSelected(false);
}
counter++;
2015-01-15 23:20:17 +01:00
}
checkDisplaySaveButton();
2015-01-15 23:20:17 +01:00
}
}
class AutoSignInChangeAction implements ActionListener {
@Override public void actionPerformed(ActionEvent e) {
if (autoSignIn.isSelected()) {
saveFile.setSelected(true);
}
}
}
class ApplyThemeAction implements ActionListener {
@Override public void actionPerformed(ActionEvent e) {
applyTheme(themeOptionsGroup.getSelection().getActionCommand());
}
}
2015-01-15 23:20:17 +01:00
class SaveAction implements ActionListener {
@Override public void actionPerformed(ActionEvent e) {
2015-01-15 23:20:17 +01:00
if (parent == null) {
return;
}
Configuration config = parent.getConfiguration();
if (config == null) {
return;
}
if (themeOptionsGroup.getSelection().getActionCommand() != null)
config.setTheme(themeOptionsGroup.getSelection().getActionCommand());
2015-01-15 23:20:17 +01:00
if (cacheDir != null) {
File fromConfig = config.getStorageDir();
if (fromConfig != null && fromConfig.getAbsolutePath().equals(cacheDir.getAbsolutePath()) == false) {
config.setCacheDir(cacheDir);
}
else {
2016-01-06 20:26:46 +01:00
// do nothing because the directory is the same as before
2015-01-15 23:20:17 +01:00
}
}
GPUDevice selected_gpu = null;
for (JCheckBoxGPU box : useGPUs) {
2015-01-15 23:20:17 +01:00
if (box.isSelected()) {
selected_gpu = box.getGPUDevice();
2015-01-15 23:20:17 +01:00
}
}
2015-04-07 20:05:48 +01:00
ComputeType method = ComputeType.CPU;
2015-01-15 23:20:17 +01:00
if (useCPU.isSelected() && selected_gpu == null) {
2015-04-07 20:05:48 +01:00
method = ComputeType.CPU;
2015-01-15 23:20:17 +01:00
}
else if (useCPU.isSelected() == false && selected_gpu != null) {
2015-04-07 20:05:48 +01:00
method = ComputeType.GPU;
2015-01-15 23:20:17 +01:00
}
else if (useCPU.isSelected() && selected_gpu != null) {
method = ComputeType.CPU_GPU;
}
config.setComputeMethod(method);
if (selected_gpu != null) {
config.setGPUDevice(selected_gpu);
2015-01-15 23:20:17 +01:00
}
int renderbucket_size = -1;
if (renderbucketSize != null) {
renderbucket_size = (int) Math.pow(2, (renderbucketSize.getValue() + 5));
}
int cpu_cores = -1;
2015-06-05 12:51:27 +00:00
if (cpuCores != null) {
cpu_cores = cpuCores.getValue();
}
if (cpu_cores > 0) {
config.setNbCores(cpu_cores);
}
long max_ram = -1;
if (ram != null) {
max_ram = ram.getValue();
}
if (max_ram > 0) {
config.setMaxMemory(max_ram);
}
int max_rendertime = -1;
if (renderTime != null) {
max_rendertime = (Integer) renderTime.getValue() * 60;
config.setMaxRenderTime(max_rendertime);
}
// ui display low -> high but the actual values are reversed
// -19 is highest priority
OS os = OS.getOS();
boolean high_priority_support = os.getSupportHighPriority();
if (high_priority_support) {
// inverse
config.setUsePriority(-1 * priority.getValue());
}
else {
config.setUsePriority(19 - priority.getValue());
}
2017-03-19 17:38:22 +01:00
String proxyText = null;
if (proxy != null) {
try {
Proxy.set(proxy.getText());
proxyText = proxy.getText();
}
catch (MalformedURLException e1) {
System.err.println("Error: wrong url for proxy");
2017-01-12 20:50:44 +01:00
System.err.println(e1);
System.exit(2);
}
}
2015-01-15 23:20:17 +01:00
parent.setCredentials(login.getText(), new String(password.getPassword()));
2015-03-31 00:29:58 +01:00
String cachePath = null;
if (config.isUserHasSpecifiedACacheDir() && config.getCacheDirForSettings() != null) {
cachePath = config.getCacheDirForSettings().getAbsolutePath();
2015-03-31 00:29:58 +01:00
}
String hostnameText = hostname.getText();
if (hostnameText == null || hostnameText.isEmpty()) {
hostnameText = parent.getConfiguration().getHostname();
2017-05-08 01:35:08 +02:00
}
2015-03-31 21:35:04 +01:00
if (saveFile.isSelected()) {
parent.setSettingsLoader(
new SettingsLoader(config.getConfigFilePath(), login.getText(), new String(password.getPassword()), proxyText, hostnameText, method,
selected_gpu, renderbucket_size, cpu_cores, max_ram, max_rendertime, cachePath, autoSignIn.isSelected(), useSysTray.isSelected(),
GuiSwing.type, themeOptionsGroup.getSelection().getActionCommand(), config.getPriority()));
2019-09-15 21:34:16 +02:00
// wait for successful authentication (to store the public key)
// or do we already have one?
if (parent.getClient().getServer().getServerConfig() != null && parent.getClient().getServer().getServerConfig().getPublickey() != null) {
parent.getSettingsLoader().saveFile();
}
if (useSysTrayPrevState != useSysTray.isSelected()) {
JOptionPane.showMessageDialog(null, "You must restart the SheepIt app for the SysTray change to take effect");
}
}
2015-01-15 23:20:17 +01:00
}
}
class JCheckBoxGPU extends JCheckBox {
private GPUDevice gpu;
public JCheckBoxGPU(GPUDevice gpu) {
super(gpu.getModel());
this.gpu = gpu;
}
public GPUDevice getGPUDevice() {
return gpu;
}
}
public class CheckCanStart implements KeyListener {
@Override public void keyPressed(KeyEvent arg0) {
}
@Override public void keyReleased(KeyEvent arg0) {
checkDisplaySaveButton();
}
@Override public void keyTyped(KeyEvent arg0) {
}
}
2015-01-15 23:20:17 +01:00
}