Skip to content

Commit e755428

Browse files
authored
Feature/update for new rust UI (#29)
* Updated Color Preview coordinates
1 parent 2ab1c95 commit e755428

32 files changed

+892
-431
lines changed

.gitignore

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
# gradle
2-
32
.gradle/
43
build/
54
out/
65
classes/
76
logs/
87

98
# idea
10-
119
.idea/
1210
*.iml
1311
*.ipr
@@ -18,15 +16,11 @@ logs/
1816
target/
1917

2018
# vscode
21-
22-
.settings/
2319
.vscode/
2420
bin/
2521
.classpath
2622
.project
2723

2824
# project
29-
logs/
3025
bobrust.properties
31-
.project
32-
.classpath
26+
hs_err_pid*.log

build.gradle

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@ repositories {
1717
project.ext {
1818
lwjglVersion = '3.2.3'
1919
log4jVersion = '2.17.1'
20+
gsonVersion = '2.10.1'
21+
2022
majorVersion = '0'
21-
minorVersion = '4'
23+
minorVersion = '5'
2224
}
2325

24-
version = "${majorVersion}.${minorVersion}.${getBuildId()}"
26+
version = "${majorVersion}.${minorVersion}.${getBuildId()}" + ""
2527
group = "Bob-Rust-Java"
2628
description = "Bob-Rust-Java"
2729
java.sourceCompatibility = JavaVersion.VERSION_16
@@ -70,6 +72,15 @@ dependencies {
7072

7173
packImpl "org.apache.logging.log4j:log4j-api:$log4jVersion"
7274
packImpl "org.apache.logging.log4j:log4j-core:$log4jVersion"
75+
76+
packImpl "com.google.code.gson:gson:$gsonVersion"
77+
78+
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
79+
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
80+
}
81+
82+
test {
83+
useJUnitPlatform()
7384
}
7485

7586

src/main/java/com/bobrust/gui/ApplicationWindow.java

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,18 @@
33
import com.bobrust.gui.comp.JToolbarButton;
44
import com.bobrust.gui.dialog.*;
55
import com.bobrust.settings.Settings;
6-
import com.bobrust.util.ResourceUtil;
7-
import com.bobrust.util.ImageUtil;
8-
import com.bobrust.util.UrlUtils;
6+
import com.bobrust.util.*;
97
import com.bobrust.util.data.AppConstants;
8+
import org.apache.logging.log4j.LogManager;
9+
import org.apache.logging.log4j.Logger;
1010

1111
import javax.imageio.ImageIO;
1212
import javax.swing.*;
1313
import javax.swing.event.HyperlinkEvent;
1414
import javax.swing.filechooser.FileNameExtensionFilter;
1515
import java.awt.*;
1616
import java.awt.event.*;
17+
import java.awt.image.BufferedImage;
1718
import java.io.File;
1819
import java.io.IOException;
1920

@@ -25,6 +26,8 @@
2526
* @author HardCoded
2627
*/
2728
public class ApplicationWindow extends JDialog {
29+
private static final Logger LOGGER = LogManager.getLogger(ApplicationWindow.class);
30+
2831
private final RustFileDialog fileDialog;
2932
private final SignPickerDialog signPickerDialog;
3033
private final SettingsDialog settingsDialog;
@@ -74,6 +77,26 @@ public void windowClosing(WindowEvent e) {
7477
panel.add(createToolbar(), BorderLayout.CENTER);
7578
panel.add(createVersion(), BorderLayout.SOUTH);
7679
setContentPane(panel);
80+
81+
// If we are running from an IDE then we want to add some debug stuff
82+
if (AppConstants.IS_IDE && AppConstants.DEBUG_AUTO_IMAGE) {
83+
canvasAreaButton.setEnabled(true);
84+
imageAreaButton.setEnabled(true);
85+
drawButton.setEnabled(true);
86+
87+
monitor = GraphicsEnvironment.getLocalGraphicsEnvironment()
88+
.getDefaultScreenDevice()
89+
.getDefaultConfiguration();
90+
91+
canvasRect.setRect(98, 170, 1348, 671);
92+
imageRect.setRect(473, 172, 691, 669);
93+
94+
try {
95+
drawImage = ImageIO.read(new File("src/test/resources/draw-test/draw_0.png"));
96+
} catch (IOException e) {
97+
LOGGER.error("Could not find image", e);
98+
}
99+
}
77100
}
78101

79102
private JPanel createToolbar() {
@@ -123,9 +146,20 @@ private void importImage() {
123146
}
124147

125148
try {
126-
drawImage = ImageIO.read(image);
149+
BufferedImage bi = ImageIO.read(image);
150+
if (bi == null) {
151+
LOGGER.warn("Unsupported image file format '{}'", image.getAbsolutePath());
152+
RustWindowUtil.showWarningMessage(
153+
"The file '%s' is not a readable image format, try converting the image to a png before using"
154+
.formatted(image.getAbsolutePath()),
155+
"Failed to read image file"
156+
);
157+
return;
158+
}
159+
drawImage = bi;
127160
canvasAreaButton.setEnabled(true);
128161
} catch (IOException e) {
162+
LOGGER.error("Invalid file format of image", e);
129163
e.printStackTrace();
130164
}
131165
}
@@ -135,12 +169,31 @@ private void selectCanvasRegion() {
135169
monitor = region.monitor();
136170
canvasRect.setBounds(region.selection());
137171
imageAreaButton.setEnabled(true);
172+
173+
if (region.hasChanged()) {
174+
LOGGER.info("Selected canvas region [ monitor={}, size=[x={}, y={}, width={}, height={}] ]",
175+
region.monitor().getDevice(),
176+
region.selection().x,
177+
region.selection().y,
178+
region.selection().width,
179+
region.selection().height
180+
);
181+
}
138182
}
139183

140184
private void selectImageRegion() {
141185
var region = regionSelectionDialog.openDialog(monitor, false, drawImage, imageRect);
142186
imageRect.setBounds(region.selection());
143187
drawButton.setEnabled(true);
188+
189+
if (region.hasChanged()) {
190+
LOGGER.info("Selected image region [ size=[x={}, y={}, width={}, height={}] ]",
191+
region.selection().x,
192+
region.selection().y,
193+
region.selection().width,
194+
region.selection().height
195+
);
196+
}
144197
}
145198

146199
private JToolbarButton createButton(String iconPath, String tooltip, int rgb, ActionListener action) {
Lines changed: 82 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,112 @@
11
package com.bobrust.gui.comp;
22

3-
import java.awt.event.ActionEvent;
4-
import java.awt.event.KeyEvent;
5-
import java.text.NumberFormat;
6-
import java.util.Locale;
7-
83
import javax.swing.*;
9-
import javax.swing.text.NumberFormatter;
4+
import javax.swing.event.DocumentEvent;
5+
import javax.swing.event.DocumentListener;
6+
import java.awt.*;
7+
import java.awt.event.*;
108

11-
public class JIntegerField extends JFormattedTextField {
12-
private final NumberFormatter formatter;
9+
public class JIntegerField extends JTextField {
10+
private int minimumValue;
11+
private int maximumValue;
12+
13+
// Last valid value when focus lost or when enter was pressed
14+
private int lastValidValue;
15+
private boolean hasBeeped;
1316

1417
public JIntegerField(int value, int min, int max) {
15-
NumberFormat format = NumberFormat.getIntegerInstance(Locale.US);
16-
format.setGroupingUsed(false);
18+
this.maximumValue = max;
19+
this.minimumValue = min;
20+
this.lastValidValue = value;
1721

18-
formatter = new NumberFormatter(format);
19-
formatter.setValueClass(Integer.class);
20-
formatter.setMinimum(min);
21-
formatter.setMaximum(max);
22-
formatter.setAllowsInvalid(false);
23-
formatter.setCommitsOnValidEdit(true);
24-
formatter.setOverwriteMode(false);
25-
formatter.setFormat(format);
22+
setText("" + value);
23+
setForeground(Color.black);
2624

27-
setFormatterFactory(new AbstractFormatterFactory() {
25+
getDocument().addDocumentListener(new DocumentListener() {
2826
@Override
29-
public AbstractFormatter getFormatter(JFormattedTextField tf) {
30-
return formatter;
27+
public void insertUpdate(DocumentEvent e) {
28+
update();
3129
}
32-
});
33-
34-
getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "enterAction");
35-
getActionMap().put("enterAction", new AbstractAction() {
30+
3631
@Override
37-
public void actionPerformed(ActionEvent e) {
38-
JIntegerField.this.fireActionPerformed();
39-
}
40-
});
41-
42-
Object backspaceKey = getInputMap().get(KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0));
43-
Action backspaceAction = getActionMap().get(backspaceKey);
44-
45-
getActionMap().put(backspaceKey, new AbstractAction() {
46-
public boolean isDelegate() {
47-
return getText().length() != 1;
32+
public void removeUpdate(DocumentEvent e) {
33+
update();
4834
}
4935

5036
@Override
51-
public boolean accept(Object sender) {
52-
if (isDelegate()) {
53-
return backspaceAction.accept(sender);
54-
} else {
55-
return super.accept(sender);
56-
}
37+
public void changedUpdate(DocumentEvent e) {
38+
update();
5739
}
5840

41+
public void update() {
42+
processInput(getText(), false);
43+
}
44+
});
45+
46+
addActionListener(e -> processInput(getText(), true));
47+
addFocusListener(new FocusAdapter() {
5948
@Override
60-
public void actionPerformed(ActionEvent e) {
61-
if (isDelegate()) {
62-
backspaceAction.actionPerformed(e);
63-
} else {
64-
JIntegerField.this.selectAll();
65-
}
49+
public void focusLost(FocusEvent e) {
50+
processInput(getText(), true);
6651
}
6752
});
53+
}
54+
55+
private void processInput(String text, boolean enter) {
56+
boolean invalid;
57+
int value = 0;
58+
try {
59+
value = Integer.parseInt(text);
60+
invalid = value < minimumValue || value > maximumValue;
61+
} catch (NumberFormatException ignore) {
62+
invalid = true;
63+
}
64+
65+
setForeground(invalid
66+
? Color.red
67+
: Color.black);
68+
69+
if (invalid) {
70+
if (!text.isEmpty() && !hasBeeped) {
71+
Toolkit.getDefaultToolkit().beep();
72+
hasBeeped = true;
73+
}
74+
} else {
75+
hasBeeped = false;
76+
}
6877

69-
setText(Integer.toString(value));
78+
if (enter) {
79+
if (!invalid) {
80+
lastValidValue = value;
81+
}
82+
83+
setText("" + lastValidValue);
84+
setForeground(Color.black);
85+
hasBeeped = false;
86+
}
7087
}
7188

7289
public void setMinimum(int value) {
73-
formatter.setMinimum(value);
90+
minimumValue = value;
7491
}
7592

7693
public void setMaximum(int value) {
77-
formatter.setMaximum(value);
94+
maximumValue = value;
95+
}
96+
97+
public int getMinimumValue() {
98+
return minimumValue;
99+
}
100+
101+
public int getMaximumValue() {
102+
return maximumValue;
103+
}
104+
105+
public void setValue(int value) {
106+
this.lastValidValue = Math.max(minimumValue, Math.min(maximumValue, value));
78107
}
79108

80-
public int getNumberValue() throws NumberFormatException {
81-
return Integer.parseInt(this.getText());
109+
public int getNumberValue() {
110+
return lastValidValue;
82111
}
83112
}

0 commit comments

Comments
 (0)