feat: Optional dialog to crop a cover image when added.
This commit is contained in:
parent
7dfa5ba30c
commit
5f5ebf5174
|
@ -35,6 +35,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import se.lantz.gui.screenshot.EditScreenshotDialog;
|
import se.lantz.gui.screenshot.EditScreenshotDialog;
|
||||||
|
import se.lantz.gui.screenshot.cover.EditCoverDialog;
|
||||||
import se.lantz.model.InfoModel;
|
import se.lantz.model.InfoModel;
|
||||||
import se.lantz.model.MainViewModel;
|
import se.lantz.model.MainViewModel;
|
||||||
import se.lantz.util.CustomUndoPlainDocument;
|
import se.lantz.util.CustomUndoPlainDocument;
|
||||||
|
@ -748,6 +749,21 @@ public class ScreenshotsPanel extends JPanel
|
||||||
JOptionPane.ERROR_MESSAGE);
|
JOptionPane.ERROR_MESSAGE);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
if (FileManager.isShowCropDialogForCover())
|
||||||
|
{
|
||||||
|
//Show a edit dialog
|
||||||
|
EditCoverDialog dialog = new EditCoverDialog(returnImage);
|
||||||
|
dialog.pack();
|
||||||
|
dialog.setLocationRelativeTo(MainWindow.getInstance());
|
||||||
|
if (dialog.showDialog())
|
||||||
|
{
|
||||||
|
returnImage = dialog.getEditedImage();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
Image newImage = returnImage.getScaledInstance(130, 200, Image.SCALE_SMOOTH);
|
Image newImage = returnImage.getScaledInstance(130, 200, Image.SCALE_SMOOTH);
|
||||||
imageLabel.setIcon(new ImageIcon(newImage));
|
imageLabel.setIcon(new ImageIcon(newImage));
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ public class MiscPanel extends JPanel
|
||||||
private JCheckBox deleteOldInstallsCheckBox;
|
private JCheckBox deleteOldInstallsCheckBox;
|
||||||
private JPanel screenshotsPanel;
|
private JPanel screenshotsPanel;
|
||||||
private JCheckBox cropScreenCheckBox;
|
private JCheckBox cropScreenCheckBox;
|
||||||
|
private JCheckBox cropCoverCheckBox;
|
||||||
|
|
||||||
public MiscPanel(PreferencesModel model)
|
public MiscPanel(PreferencesModel model)
|
||||||
{
|
{
|
||||||
|
@ -91,7 +92,7 @@ public class MiscPanel extends JPanel
|
||||||
startupPanel.setLayout(gbl_startupPanel);
|
startupPanel.setLayout(gbl_startupPanel);
|
||||||
GridBagConstraints gbc_managerVersionCheckBox = new GridBagConstraints();
|
GridBagConstraints gbc_managerVersionCheckBox = new GridBagConstraints();
|
||||||
gbc_managerVersionCheckBox.weightx = 1.0;
|
gbc_managerVersionCheckBox.weightx = 1.0;
|
||||||
gbc_managerVersionCheckBox.insets = new Insets(5, 0, 5, 0);
|
gbc_managerVersionCheckBox.insets = new Insets(5, 0, 0, 0);
|
||||||
gbc_managerVersionCheckBox.anchor = GridBagConstraints.WEST;
|
gbc_managerVersionCheckBox.anchor = GridBagConstraints.WEST;
|
||||||
gbc_managerVersionCheckBox.gridx = 0;
|
gbc_managerVersionCheckBox.gridx = 0;
|
||||||
gbc_managerVersionCheckBox.gridy = 0;
|
gbc_managerVersionCheckBox.gridy = 0;
|
||||||
|
@ -136,6 +137,7 @@ public class MiscPanel extends JPanel
|
||||||
getPcuaeVersionCheckBox().setSelected(model.isCheckPCUAEVersionAtStartup());
|
getPcuaeVersionCheckBox().setSelected(model.isCheckPCUAEVersionAtStartup());
|
||||||
getDeleteOldInstallsCheckBox().setSelected(model.isDeleteOldInstallfilesAfterDownload());
|
getDeleteOldInstallsCheckBox().setSelected(model.isDeleteOldInstallfilesAfterDownload());
|
||||||
getCropScreenCheckBox().setSelected(model.isCropScreenshots());
|
getCropScreenCheckBox().setSelected(model.isCropScreenshots());
|
||||||
|
getCropCoverCheckBox().setSelected(model.isShowCropDialogForCover());
|
||||||
}
|
}
|
||||||
|
|
||||||
private SaveStatePrefPanel getSaveStatePrefPanel()
|
private SaveStatePrefPanel getSaveStatePrefPanel()
|
||||||
|
@ -196,18 +198,25 @@ public class MiscPanel extends JPanel
|
||||||
{
|
{
|
||||||
screenshotsPanel = new JPanel();
|
screenshotsPanel = new JPanel();
|
||||||
screenshotsPanel
|
screenshotsPanel
|
||||||
.setBorder(new TitledBorder(null, "Screenshots", TitledBorder.LEADING, TitledBorder.TOP, null, null));
|
.setBorder(new TitledBorder(null, "Screenshots & Cover", TitledBorder.LEADING, TitledBorder.TOP, null, null));
|
||||||
GridBagLayout gbl_screenshotsPanel = new GridBagLayout();
|
GridBagLayout gbl_screenshotsPanel = new GridBagLayout();
|
||||||
gbl_screenshotsPanel.columnWidths = new int[] { 0, 0 };
|
gbl_screenshotsPanel.columnWidths = new int[] { 0, 0 };
|
||||||
gbl_screenshotsPanel.rowHeights = new int[] { 0, 0 };
|
gbl_screenshotsPanel.rowHeights = new int[] { 0, 0, 0 };
|
||||||
gbl_screenshotsPanel.columnWeights = new double[] { 0.0, Double.MIN_VALUE };
|
gbl_screenshotsPanel.columnWeights = new double[] { 0.0, Double.MIN_VALUE };
|
||||||
gbl_screenshotsPanel.rowWeights = new double[] { 0.0, Double.MIN_VALUE };
|
gbl_screenshotsPanel.rowWeights = new double[] { 0.0, 0.0, Double.MIN_VALUE };
|
||||||
screenshotsPanel.setLayout(gbl_screenshotsPanel);
|
screenshotsPanel.setLayout(gbl_screenshotsPanel);
|
||||||
GridBagConstraints gbc_cropScreenCheckBox = new GridBagConstraints();
|
GridBagConstraints gbc_cropScreenCheckBox = new GridBagConstraints();
|
||||||
gbc_cropScreenCheckBox.insets = new Insets(5, 0, 5, 5);
|
gbc_cropScreenCheckBox.anchor = GridBagConstraints.NORTHWEST;
|
||||||
|
gbc_cropScreenCheckBox.insets = new Insets(5, 0, 0, 0);
|
||||||
gbc_cropScreenCheckBox.gridx = 0;
|
gbc_cropScreenCheckBox.gridx = 0;
|
||||||
gbc_cropScreenCheckBox.gridy = 0;
|
gbc_cropScreenCheckBox.gridy = 0;
|
||||||
screenshotsPanel.add(getCropScreenCheckBox(), gbc_cropScreenCheckBox);
|
screenshotsPanel.add(getCropScreenCheckBox(), gbc_cropScreenCheckBox);
|
||||||
|
GridBagConstraints gbc_cropCoverCheckBox = new GridBagConstraints();
|
||||||
|
gbc_cropCoverCheckBox.anchor = GridBagConstraints.NORTHWEST;
|
||||||
|
gbc_cropCoverCheckBox.insets = new Insets(0, 0, 5, 0);
|
||||||
|
gbc_cropCoverCheckBox.gridx = 0;
|
||||||
|
gbc_cropCoverCheckBox.gridy = 1;
|
||||||
|
screenshotsPanel.add(getCropCoverCheckBox(), gbc_cropCoverCheckBox);
|
||||||
}
|
}
|
||||||
return screenshotsPanel;
|
return screenshotsPanel;
|
||||||
}
|
}
|
||||||
|
@ -222,4 +231,12 @@ public class MiscPanel extends JPanel
|
||||||
}
|
}
|
||||||
return cropScreenCheckBox;
|
return cropScreenCheckBox;
|
||||||
}
|
}
|
||||||
|
private JCheckBox getCropCoverCheckBox() {
|
||||||
|
if (cropCoverCheckBox == null) {
|
||||||
|
cropCoverCheckBox = new JCheckBox("Show dialog to crop cover when added.");
|
||||||
|
cropCoverCheckBox.setVerticalTextPosition(SwingConstants.TOP);
|
||||||
|
cropCoverCheckBox.addItemListener((e) -> model.setShowCropDialogForCover(cropCoverCheckBox.isSelected()));
|
||||||
|
}
|
||||||
|
return cropCoverCheckBox;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ public class PreferencesDialog extends BaseDialog
|
||||||
addContent(getPreferencesTabPanel());
|
addContent(getPreferencesTabPanel());
|
||||||
getOkButton().setText("Save");
|
getOkButton().setText("Save");
|
||||||
getOkButton().setPreferredSize(null);
|
getOkButton().setPreferredSize(null);
|
||||||
this.setPreferredSize(new Dimension(368, 570));
|
this.setPreferredSize(new Dimension(368, 585));
|
||||||
this.setResizable(false);
|
this.setResizable(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
package se.lantz.gui.screenshot;
|
package se.lantz.gui.screenshot;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
import java.awt.Dimension;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
import java.awt.GridBagConstraints;
|
import java.awt.GridBagConstraints;
|
||||||
import java.awt.GridBagLayout;
|
import java.awt.GridBagLayout;
|
||||||
|
import java.awt.Image;
|
||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
|
import java.awt.Toolkit;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
|
@ -196,8 +200,24 @@ public class EditScreenshotPanel extends JPanel
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImage(BufferedImage image)
|
public void setImage(BufferedImage image)
|
||||||
|
{
|
||||||
|
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
|
||||||
|
int screenHeight = (int)screenSize.getHeight();
|
||||||
|
int heightThreshold = screenHeight - 250;
|
||||||
|
//Handle very large images by scaling them down so that the dialog fits on the screen
|
||||||
|
if (image.getHeight() > heightThreshold)
|
||||||
|
{
|
||||||
|
Image scaledImage = image.getScaledInstance(-1, heightThreshold, Image.SCALE_SMOOTH);
|
||||||
|
BufferedImage newBufImage = new BufferedImage(scaledImage.getWidth(null), scaledImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);
|
||||||
|
Graphics2D bGr = newBufImage.createGraphics();
|
||||||
|
bGr.drawImage(scaledImage, 0, 0, null);
|
||||||
|
bGr.dispose();
|
||||||
|
this.image = newBufImage;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
this.image = image;
|
this.image = image;
|
||||||
|
}
|
||||||
getLargeSizeCheckBox().setVisible(image.getWidth() > 447 && image.getHeight() > 279);
|
getLargeSizeCheckBox().setVisible(image.getWidth() > 447 && image.getHeight() > 279);
|
||||||
x = (image.getWidth() - width) / 2;
|
x = (image.getWidth() - width) / 2;
|
||||||
y = ((image.getHeight() - height) / 2) - 1;
|
y = ((image.getHeight() - height) / 2) - 1;
|
||||||
|
@ -255,8 +275,22 @@ public class EditScreenshotPanel extends JPanel
|
||||||
|
|
||||||
public BufferedImage getCroppedImage()
|
public BufferedImage getCroppedImage()
|
||||||
{
|
{
|
||||||
|
int xToUse = x < 0 ? 0 : x;
|
||||||
|
int yToUse = y < 0 ? 0 : y;
|
||||||
|
int widthToUse = width;
|
||||||
|
int heightToUse = height;
|
||||||
|
if ((xToUse + widthToUse) > image.getWidth())
|
||||||
|
{
|
||||||
|
widthToUse = image.getWidth() - xToUse;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((yToUse + heightToUse) > image.getHeight())
|
||||||
|
{
|
||||||
|
heightToUse = image.getHeight() - yToUse;
|
||||||
|
}
|
||||||
|
|
||||||
BufferedImage newImage = image
|
BufferedImage newImage = image
|
||||||
.getSubimage(x, y, width, height);
|
.getSubimage(xToUse, yToUse, widthToUse, heightToUse);
|
||||||
BufferedImage copyOfImage =
|
BufferedImage copyOfImage =
|
||||||
new BufferedImage(newImage.getWidth(), newImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
|
new BufferedImage(newImage.getWidth(), newImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
|
||||||
Graphics g = copyOfImage.createGraphics();
|
Graphics g = copyOfImage.createGraphics();
|
||||||
|
|
|
@ -26,7 +26,7 @@ public class TypomaticButton extends JButton implements MouseListener
|
||||||
addMouseListener(this);
|
addMouseListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
TypomaticButton(String text)
|
public TypomaticButton(String text)
|
||||||
{
|
{
|
||||||
super(text);
|
super(text);
|
||||||
setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
|
setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6));
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
package se.lantz.gui.screenshot.cover;
|
||||||
|
|
||||||
|
import java.awt.BorderLayout;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
|
||||||
|
import se.lantz.gui.BaseDialog;
|
||||||
|
import se.lantz.gui.MainWindow;
|
||||||
|
|
||||||
|
public class EditCoverDialog extends BaseDialog
|
||||||
|
{
|
||||||
|
private EditCoverPanel editScreenPanel;
|
||||||
|
|
||||||
|
public EditCoverDialog(BufferedImage originalScreen)
|
||||||
|
{
|
||||||
|
super(MainWindow.getInstance());
|
||||||
|
setTitle("Edit screenshot");
|
||||||
|
JPanel content = new JPanel();
|
||||||
|
content.setLayout(new BorderLayout());
|
||||||
|
content.add(getEditScreenshotPanel(), BorderLayout.CENTER);
|
||||||
|
addContent(content);
|
||||||
|
getEditScreenshotPanel().setImage(originalScreen);
|
||||||
|
this.setResizable(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private EditCoverPanel getEditScreenshotPanel()
|
||||||
|
{
|
||||||
|
if (editScreenPanel == null)
|
||||||
|
{
|
||||||
|
editScreenPanel = new EditCoverPanel();
|
||||||
|
}
|
||||||
|
return editScreenPanel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean showDialog()
|
||||||
|
{
|
||||||
|
return super.showDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
public BufferedImage getEditedImage()
|
||||||
|
{
|
||||||
|
return getEditScreenshotPanel().getCroppedImage();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,374 @@
|
||||||
|
package se.lantz.gui.screenshot.cover;
|
||||||
|
|
||||||
|
import java.awt.BasicStroke;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.GridBagConstraints;
|
||||||
|
import java.awt.GridBagLayout;
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.awt.Insets;
|
||||||
|
import java.awt.Toolkit;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.awt.event.MouseAdapter;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.awt.event.MouseMotionAdapter;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
|
||||||
|
import javax.swing.AbstractAction;
|
||||||
|
import javax.swing.ImageIcon;
|
||||||
|
import javax.swing.InputMap;
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.KeyStroke;
|
||||||
|
import javax.swing.SwingConstants;
|
||||||
|
|
||||||
|
import se.lantz.gui.screenshot.TypomaticButton;
|
||||||
|
|
||||||
|
public class EditCoverPanel extends JPanel
|
||||||
|
{
|
||||||
|
private JLabel imageLabel;
|
||||||
|
private JPanel buttonPanel;
|
||||||
|
private TypomaticButton leftButton;
|
||||||
|
private TypomaticButton righButton;
|
||||||
|
private BufferedImage image;
|
||||||
|
|
||||||
|
private int x = 0;
|
||||||
|
private int y = 0;
|
||||||
|
private int width = 0;
|
||||||
|
private int height = 0;
|
||||||
|
|
||||||
|
private TypomaticButton upButton;
|
||||||
|
private TypomaticButton downButton;
|
||||||
|
private JLabel infoLabel;
|
||||||
|
|
||||||
|
public EditCoverPanel()
|
||||||
|
{
|
||||||
|
GridBagLayout gridBagLayout = new GridBagLayout();
|
||||||
|
setLayout(gridBagLayout);
|
||||||
|
GridBagConstraints gbc_infoLabel = new GridBagConstraints();
|
||||||
|
gbc_infoLabel.ipady = 10;
|
||||||
|
gbc_infoLabel.fill = GridBagConstraints.BOTH;
|
||||||
|
gbc_infoLabel.insets = new Insets(10, 0, 0, 0);
|
||||||
|
gbc_infoLabel.gridx = 0;
|
||||||
|
gbc_infoLabel.gridy = 0;
|
||||||
|
add(getInfoLabel(), gbc_infoLabel);
|
||||||
|
GridBagConstraints gbc_imageLabel = new GridBagConstraints();
|
||||||
|
gbc_imageLabel.weighty = 1.0;
|
||||||
|
gbc_imageLabel.insets = new Insets(0, 10, 10, 10);
|
||||||
|
gbc_imageLabel.weightx = 1.0;
|
||||||
|
gbc_imageLabel.gridx = 0;
|
||||||
|
gbc_imageLabel.gridy = 1;
|
||||||
|
add(getImageLabel(), gbc_imageLabel);
|
||||||
|
GridBagConstraints gbc_buttonPanel = new GridBagConstraints();
|
||||||
|
gbc_buttonPanel.anchor = GridBagConstraints.NORTH;
|
||||||
|
gbc_buttonPanel.gridx = 0;
|
||||||
|
gbc_buttonPanel.gridy = 3;
|
||||||
|
add(getButtonPanel(), gbc_buttonPanel);
|
||||||
|
|
||||||
|
InputMap inputMap = this.getInputMap(WHEN_IN_FOCUSED_WINDOW);
|
||||||
|
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "left");
|
||||||
|
getActionMap().put("left", new AbstractAction()
|
||||||
|
{
|
||||||
|
public void actionPerformed(ActionEvent e)
|
||||||
|
{
|
||||||
|
performLeftAction();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "right");
|
||||||
|
getActionMap().put("right", new AbstractAction()
|
||||||
|
{
|
||||||
|
public void actionPerformed(ActionEvent e)
|
||||||
|
{
|
||||||
|
performRightAction();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up");
|
||||||
|
getActionMap().put("up", new AbstractAction()
|
||||||
|
{
|
||||||
|
public void actionPerformed(ActionEvent e)
|
||||||
|
{
|
||||||
|
performUpAction();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "down");
|
||||||
|
getActionMap().put("down", new AbstractAction()
|
||||||
|
{
|
||||||
|
public void actionPerformed(ActionEvent e)
|
||||||
|
{
|
||||||
|
performDownAction();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void performLeftAction()
|
||||||
|
{
|
||||||
|
if (x > 0)
|
||||||
|
{
|
||||||
|
x = x - 1;
|
||||||
|
updateLabelIcon();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void performRightAction()
|
||||||
|
{
|
||||||
|
if (x < (image.getWidth() - width - 1))
|
||||||
|
{
|
||||||
|
x = x + 1;
|
||||||
|
updateLabelIcon();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void performUpAction()
|
||||||
|
{
|
||||||
|
if (y > 0)
|
||||||
|
{
|
||||||
|
y = y - 1;
|
||||||
|
updateLabelIcon();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void performDownAction()
|
||||||
|
{
|
||||||
|
if (y < (image.getHeight() - height - 1))
|
||||||
|
{
|
||||||
|
y = y + 1;
|
||||||
|
updateLabelIcon();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private JLabel getImageLabel()
|
||||||
|
{
|
||||||
|
if (imageLabel == null)
|
||||||
|
{
|
||||||
|
imageLabel = new JLabel("");
|
||||||
|
imageLabel.addMouseListener(new MouseAdapter()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void mousePressed(MouseEvent e)
|
||||||
|
{
|
||||||
|
System.out.println("Mouse pressed!" + e.getPoint());
|
||||||
|
x = e.getX();
|
||||||
|
y = e.getY();
|
||||||
|
width = 0;
|
||||||
|
height = 0;
|
||||||
|
updateLabelIcon();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
imageLabel.addMouseMotionListener(new MouseMotionAdapter()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void mouseDragged(MouseEvent e)
|
||||||
|
{
|
||||||
|
System.out.println("Mouse dragged!" + e.getPoint());
|
||||||
|
mouseDrag(e.getX(), e.getY());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return imageLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JPanel getButtonPanel()
|
||||||
|
{
|
||||||
|
if (buttonPanel == null)
|
||||||
|
{
|
||||||
|
buttonPanel = new JPanel();
|
||||||
|
buttonPanel.add(getLeftButton());
|
||||||
|
buttonPanel.add(getRighButton());
|
||||||
|
buttonPanel.add(getUpButton());
|
||||||
|
buttonPanel.add(getDownButton());
|
||||||
|
}
|
||||||
|
return buttonPanel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private TypomaticButton getLeftButton()
|
||||||
|
{
|
||||||
|
if (leftButton == null)
|
||||||
|
{
|
||||||
|
leftButton = new TypomaticButton("");
|
||||||
|
leftButton.setIcon(new ImageIcon(this.getClass().getResource("/se/lantz/arrow-plain-left.png")));
|
||||||
|
leftButton.addActionListener(new ActionListener()
|
||||||
|
{
|
||||||
|
public void actionPerformed(ActionEvent arg0)
|
||||||
|
{
|
||||||
|
performLeftAction();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return leftButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
private TypomaticButton getRighButton()
|
||||||
|
{
|
||||||
|
if (righButton == null)
|
||||||
|
{
|
||||||
|
righButton = new TypomaticButton("");
|
||||||
|
righButton.setIcon(new ImageIcon(this.getClass().getResource("/se/lantz/arrow-plain-right.png")));
|
||||||
|
righButton.addActionListener(new ActionListener()
|
||||||
|
{
|
||||||
|
public void actionPerformed(ActionEvent arg0)
|
||||||
|
{
|
||||||
|
performRightAction();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return righButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImage(BufferedImage image)
|
||||||
|
{
|
||||||
|
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
|
||||||
|
int screenHeight = (int) screenSize.getHeight();
|
||||||
|
int heightThreshold = screenHeight - 250;
|
||||||
|
//Handle very large images by scaling them down so that the dialog fits on the screen
|
||||||
|
if (image.getHeight() > heightThreshold)
|
||||||
|
{
|
||||||
|
Image scaledImage = image.getScaledInstance(-1, heightThreshold, Image.SCALE_SMOOTH);
|
||||||
|
BufferedImage newBufImage =
|
||||||
|
new BufferedImage(scaledImage.getWidth(null), scaledImage.getHeight(null), BufferedImage.TYPE_INT_ARGB);
|
||||||
|
Graphics2D bGr = newBufImage.createGraphics();
|
||||||
|
bGr.drawImage(scaledImage, 0, 0, null);
|
||||||
|
bGr.dispose();
|
||||||
|
this.image = newBufImage;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.image = image;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateLabelIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateLabelIcon()
|
||||||
|
{
|
||||||
|
BufferedImage copyOfImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
|
||||||
|
Graphics2D g = copyOfImage.createGraphics();
|
||||||
|
g.drawImage(image, 0, 0, null);
|
||||||
|
g.setColor(Color.red);
|
||||||
|
g.setStroke(new BasicStroke(2));
|
||||||
|
g.drawRect(x, y, width, height);
|
||||||
|
getImageLabel().setIcon(new ImageIcon(copyOfImage));
|
||||||
|
}
|
||||||
|
|
||||||
|
public BufferedImage getImage()
|
||||||
|
{
|
||||||
|
return this.image;
|
||||||
|
}
|
||||||
|
|
||||||
|
private TypomaticButton getUpButton()
|
||||||
|
{
|
||||||
|
if (upButton == null)
|
||||||
|
{
|
||||||
|
upButton = new TypomaticButton("");
|
||||||
|
upButton.setIcon(new ImageIcon(this.getClass().getResource("/se/lantz/arrow-plain-up.png")));
|
||||||
|
upButton.addActionListener(new ActionListener()
|
||||||
|
{
|
||||||
|
public void actionPerformed(ActionEvent e)
|
||||||
|
{
|
||||||
|
performUpAction();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return upButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
private TypomaticButton getDownButton()
|
||||||
|
{
|
||||||
|
if (downButton == null)
|
||||||
|
{
|
||||||
|
downButton = new TypomaticButton("");
|
||||||
|
downButton.setIcon(new ImageIcon(this.getClass().getResource("/se/lantz/arrow-plain-down.png")));
|
||||||
|
downButton.addActionListener(new ActionListener()
|
||||||
|
{
|
||||||
|
public void actionPerformed(ActionEvent e)
|
||||||
|
{
|
||||||
|
performDownAction();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return downButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BufferedImage getCroppedImage()
|
||||||
|
{
|
||||||
|
if (width < 5 || height < 5)
|
||||||
|
{
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
BufferedImage newImage = image.getSubimage(x, y, width, height);
|
||||||
|
BufferedImage copyOfImage =
|
||||||
|
new BufferedImage(newImage.getWidth(), newImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
|
||||||
|
Graphics g = copyOfImage.createGraphics();
|
||||||
|
g.drawImage(newImage, 0, 0, null);
|
||||||
|
return newImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JLabel getInfoLabel()
|
||||||
|
{
|
||||||
|
if (infoLabel == null)
|
||||||
|
{
|
||||||
|
infoLabel =
|
||||||
|
new JLabel("<html>Left-click and drag to mark the area to crop.<br>Move the rectangle with the arrow buttons.</html>");
|
||||||
|
infoLabel.setVerticalAlignment(SwingConstants.TOP);
|
||||||
|
infoLabel.setHorizontalAlignment(SwingConstants.CENTER);
|
||||||
|
infoLabel.addMouseListener(new MouseAdapter()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void mousePressed(MouseEvent e)
|
||||||
|
{
|
||||||
|
//The image might not be at position 0 if the image is small, compensate for that.
|
||||||
|
x = e.getX() - imageLabel.getLocation().x;
|
||||||
|
if (x < 0)
|
||||||
|
{
|
||||||
|
x = 0;
|
||||||
|
}
|
||||||
|
y = 0;
|
||||||
|
width = 0;
|
||||||
|
height = 0;
|
||||||
|
updateLabelIcon();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
infoLabel.addMouseMotionListener(new MouseMotionAdapter()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void mouseDragged(MouseEvent e)
|
||||||
|
{
|
||||||
|
System.out.println("Mouse dragged on label!" + e.getPoint());
|
||||||
|
int ypos = e.getY();
|
||||||
|
|
||||||
|
if (e.getY() > (infoLabel.getHeight()))
|
||||||
|
{
|
||||||
|
ypos = e.getY() - infoLabel.getHeight();
|
||||||
|
mouseDrag(e.getX(), ypos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return infoLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void mouseDrag(int xPos, int yPos)
|
||||||
|
{
|
||||||
|
width = xPos - x;
|
||||||
|
height = yPos - y;
|
||||||
|
if (x + width > image.getWidth())
|
||||||
|
{
|
||||||
|
width = image.getWidth() - x;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y + height > image.getHeight())
|
||||||
|
{
|
||||||
|
height = image.getHeight() - y;
|
||||||
|
}
|
||||||
|
updateLabelIcon();
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,6 +15,7 @@ public class PreferencesModel extends AbstractModel implements CommonInfoModel
|
||||||
public static final String MANGER_VERSION_CHECK = "checkForManagerVersion";
|
public static final String MANGER_VERSION_CHECK = "checkForManagerVersion";
|
||||||
public static final String DELETE_OLD_INSTALL_FILES = "deleteOldInstallFiles";
|
public static final String DELETE_OLD_INSTALL_FILES = "deleteOldInstallFiles";
|
||||||
public static final String CROP_SCREENSHOTS = "cropScreenshotsWhenAdded";
|
public static final String CROP_SCREENSHOTS = "cropScreenshotsWhenAdded";
|
||||||
|
public static final String SHOW_CROP_DIALOG_FOR_COVER = "showCropDialogForCover";
|
||||||
public static final String GENRE = "infoSlotGenre";
|
public static final String GENRE = "infoSlotGenre";
|
||||||
public static final String AUTHOR = "infoSlotAuthor";
|
public static final String AUTHOR = "infoSlotAuthor";
|
||||||
public static final String YEAR = "infoSlotYear";
|
public static final String YEAR = "infoSlotYear";
|
||||||
|
@ -43,6 +44,7 @@ public class PreferencesModel extends AbstractModel implements CommonInfoModel
|
||||||
private boolean checkManagerVersionAtStartup = true;
|
private boolean checkManagerVersionAtStartup = true;
|
||||||
private boolean deleteOldInstallfilesAfterDownload = false;
|
private boolean deleteOldInstallfilesAfterDownload = false;
|
||||||
private boolean cropScreenshots = false;
|
private boolean cropScreenshots = false;
|
||||||
|
private boolean cropDialogForCover = false;
|
||||||
|
|
||||||
private String description =
|
private String description =
|
||||||
"For more Info on PCUAE go to https://github.com/CommodoreOS/PCUAE. Main keys: CTRL + F1 for Carousel Gamelist Changer, CTRL + F3 for Carousel Version Changer, CTRL + F5 for Mode Changer (Amiga, Atari, linux etc), CTRL + F7 for PCUAE Options Menu.";
|
"For more Info on PCUAE go to https://github.com/CommodoreOS/PCUAE. Main keys: CTRL + F1 for Carousel Gamelist Changer, CTRL + F3 for Carousel Version Changer, CTRL + F5 for Mode Changer (Amiga, Atari, linux etc), CTRL + F7 for PCUAE Options Menu.";
|
||||||
|
@ -92,7 +94,7 @@ public class PreferencesModel extends AbstractModel implements CommonInfoModel
|
||||||
setDeleteOldInstallfilesAfterDownload(Boolean
|
setDeleteOldInstallfilesAfterDownload(Boolean
|
||||||
.parseBoolean(configuredProperties.getProperty(DELETE_OLD_INSTALL_FILES, "false")));
|
.parseBoolean(configuredProperties.getProperty(DELETE_OLD_INSTALL_FILES, "false")));
|
||||||
setCropScreenshots(Boolean.parseBoolean(configuredProperties.getProperty(CROP_SCREENSHOTS, "false")));
|
setCropScreenshots(Boolean.parseBoolean(configuredProperties.getProperty(CROP_SCREENSHOTS, "false")));
|
||||||
|
setShowCropDialogForCover(Boolean.parseBoolean(configuredProperties.getProperty(SHOW_CROP_DIALOG_FOR_COVER, "false")));
|
||||||
setFav1Alias(configuredProperties.getProperty(FAVORITES_1_ALIAS, fav1Alias));
|
setFav1Alias(configuredProperties.getProperty(FAVORITES_1_ALIAS, fav1Alias));
|
||||||
setFav2Alias(configuredProperties.getProperty(FAVORITES_2_ALIAS, fav2Alias));
|
setFav2Alias(configuredProperties.getProperty(FAVORITES_2_ALIAS, fav2Alias));
|
||||||
setFav3Alias(configuredProperties.getProperty(FAVORITES_3_ALIAS, fav3Alias));
|
setFav3Alias(configuredProperties.getProperty(FAVORITES_3_ALIAS, fav3Alias));
|
||||||
|
@ -515,6 +517,21 @@ public class PreferencesModel extends AbstractModel implements CommonInfoModel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setShowCropDialogForCover(boolean cropDialogForCover)
|
||||||
|
{
|
||||||
|
boolean old = isShowCropDialogForCover();
|
||||||
|
this.cropDialogForCover = cropDialogForCover;
|
||||||
|
if ((Boolean.compare(old, cropDialogForCover) != 0))
|
||||||
|
{
|
||||||
|
notifyChange();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isShowCropDialogForCover()
|
||||||
|
{
|
||||||
|
return cropDialogForCover;
|
||||||
|
}
|
||||||
|
|
||||||
public void savePreferences()
|
public void savePreferences()
|
||||||
{
|
{
|
||||||
Properties configuredProperties = FileManager.getConfiguredProperties();
|
Properties configuredProperties = FileManager.getConfiguredProperties();
|
||||||
|
@ -535,6 +552,7 @@ public class PreferencesModel extends AbstractModel implements CommonInfoModel
|
||||||
configuredProperties.put(SAVED_STATES_CAROUSEL, savedStatesCarouselVersion);
|
configuredProperties.put(SAVED_STATES_CAROUSEL, savedStatesCarouselVersion);
|
||||||
configuredProperties.put(DELETE_OLD_INSTALL_FILES, Boolean.toString(deleteOldInstallfilesAfterDownload));
|
configuredProperties.put(DELETE_OLD_INSTALL_FILES, Boolean.toString(deleteOldInstallfilesAfterDownload));
|
||||||
configuredProperties.put(CROP_SCREENSHOTS, Boolean.toString(cropScreenshots));
|
configuredProperties.put(CROP_SCREENSHOTS, Boolean.toString(cropScreenshots));
|
||||||
|
configuredProperties.put(SHOW_CROP_DIALOG_FOR_COVER, Boolean.toString(cropDialogForCover));
|
||||||
configuredProperties.put(FAVORITES_1_ALIAS, fav1Alias);
|
configuredProperties.put(FAVORITES_1_ALIAS, fav1Alias);
|
||||||
configuredProperties.put(FAVORITES_2_ALIAS, fav2Alias);
|
configuredProperties.put(FAVORITES_2_ALIAS, fav2Alias);
|
||||||
configuredProperties.put(FAVORITES_3_ALIAS, fav3Alias);
|
configuredProperties.put(FAVORITES_3_ALIAS, fav3Alias);
|
||||||
|
|
|
@ -85,6 +85,7 @@ public class FileManager
|
||||||
private static String currentSavedStatesCarouselVersion = "";
|
private static String currentSavedStatesCarouselVersion = "";
|
||||||
private static String deleteInstallFiles = "";
|
private static String deleteInstallFiles = "";
|
||||||
private static String cropScreenshots = "";
|
private static String cropScreenshots = "";
|
||||||
|
private static String showCropDialogForCover = "";
|
||||||
|
|
||||||
private MainViewModel model;
|
private MainViewModel model;
|
||||||
private InfoModel infoModel;
|
private InfoModel infoModel;
|
||||||
|
@ -1275,6 +1276,7 @@ public class FileManager
|
||||||
currentSavedStatesCarouselVersion = "";
|
currentSavedStatesCarouselVersion = "";
|
||||||
deleteInstallFiles = "";
|
deleteInstallFiles = "";
|
||||||
cropScreenshots = "";
|
cropScreenshots = "";
|
||||||
|
showCropDialogForCover = "";
|
||||||
try (OutputStream output = new FileOutputStream("./pcu.properties"))
|
try (OutputStream output = new FileOutputStream("./pcu.properties"))
|
||||||
{
|
{
|
||||||
// save properties to project root folder
|
// save properties to project root folder
|
||||||
|
@ -1368,6 +1370,15 @@ public class FileManager
|
||||||
return Boolean.parseBoolean(cropScreenshots);
|
return Boolean.parseBoolean(cropScreenshots);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isShowCropDialogForCover()
|
||||||
|
{
|
||||||
|
if (showCropDialogForCover.isEmpty())
|
||||||
|
{
|
||||||
|
showCropDialogForCover = FileManager.getConfiguredProperties().getProperty(PreferencesModel.SHOW_CROP_DIALOG_FOR_COVER, "false");
|
||||||
|
}
|
||||||
|
return Boolean.parseBoolean(showCropDialogForCover);
|
||||||
|
}
|
||||||
|
|
||||||
public static void backupDb(String targetFolderName)
|
public static void backupDb(String targetFolderName)
|
||||||
{
|
{
|
||||||
File outputFolder = new File(BACKUP + "/" + targetFolderName + "/");
|
File outputFolder = new File(BACKUP + "/" + targetFolderName + "/");
|
||||||
|
|
Loading…
Reference in New Issue