Updated and simplified IconUtil API
This commit is contained in:
parent
d3a040c8c3
commit
a16f8966fb
@ -11,8 +11,6 @@ import javafx.scene.layout.Background;
|
|||||||
import javafx.scene.layout.ColumnConstraints;
|
import javafx.scene.layout.ColumnConstraints;
|
||||||
import javafx.scene.layout.GridPane;
|
import javafx.scene.layout.GridPane;
|
||||||
|
|
||||||
import envoy.client.data.Settings;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class offers a text field that is automatically equipped with a clear
|
* This class offers a text field that is automatically equipped with a clear
|
||||||
* button.
|
* button.
|
||||||
@ -49,10 +47,7 @@ public class ClearableTextField extends GridPane {
|
|||||||
public ClearableTextField(String text, int size) {
|
public ClearableTextField(String text, int size) {
|
||||||
// initializing the textField and the button
|
// initializing the textField and the button
|
||||||
textField = new TextField(text);
|
textField = new TextField(text);
|
||||||
clearButton = new Button("",
|
clearButton = new Button("", new ImageView(IconUtil.loadDefaultThemeSensitive("clear_button_", size)));
|
||||||
new ImageView(IconUtil.load(
|
|
||||||
Settings.getInstance().getCurrentTheme().equals("dark") ? "/icons/clear_button_white.png" : "/icons/clear_button_black.png",
|
|
||||||
size)));
|
|
||||||
clearButton.setOnAction(e -> textField.clear());
|
clearButton.setOnAction(e -> textField.clear());
|
||||||
clearButton.setFocusTraversable(false);
|
clearButton.setFocusTraversable(false);
|
||||||
clearButton.getStyleClass().clear();
|
clearButton.getStyleClass().clear();
|
||||||
|
@ -2,9 +2,13 @@ package envoy.client.ui;
|
|||||||
|
|
||||||
import java.util.EnumMap;
|
import java.util.EnumMap;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
import javafx.scene.image.Image;
|
import javafx.scene.image.Image;
|
||||||
|
|
||||||
|
import envoy.client.data.Settings;
|
||||||
|
import envoy.util.EnvoyLog;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides static utility methods for loading icons from the resource
|
* Provides static utility methods for loading icons from the resource
|
||||||
* folder.
|
* folder.
|
||||||
@ -27,7 +31,16 @@ public class IconUtil {
|
|||||||
* @return the icon
|
* @return the icon
|
||||||
* @since Envoy Client v0.1-beta
|
* @since Envoy Client v0.1-beta
|
||||||
*/
|
*/
|
||||||
public static Image load(String path) { return new Image(IconUtil.class.getResource(path).toExternalForm()); }
|
public static Image load(String path) {
|
||||||
|
Image image;
|
||||||
|
try {
|
||||||
|
image = new Image(IconUtil.class.getResource(path).toExternalForm());
|
||||||
|
} catch (final NullPointerException e) {
|
||||||
|
EnvoyLog.getLogger(IconUtil.class).log(Level.WARNING, String.format("Could not load image at path %s: ", path), e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads an icon from the resource folder and scales it to a given size.
|
* Loads an icon from the resource folder and scales it to a given size.
|
||||||
@ -38,8 +51,92 @@ public class IconUtil {
|
|||||||
* @since Envoy Client v0.1-beta
|
* @since Envoy Client v0.1-beta
|
||||||
*/
|
*/
|
||||||
public static Image load(String path, int size) {
|
public static Image load(String path, int size) {
|
||||||
return new Image(IconUtil.class.getResource(path).toExternalForm(), size, size, true, true);
|
Image image;
|
||||||
|
try {
|
||||||
|
image = new Image(IconUtil.class.getResource(path).toExternalForm(), size, size, true, true);
|
||||||
|
} catch (final NullPointerException e) {
|
||||||
|
EnvoyLog.getLogger(IconUtil.class).log(Level.WARNING, String.format("Could not load image at path %s: ", path), e);
|
||||||
|
throw e;
|
||||||
}
|
}
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads a {@code .png} icon from the sub-folder {@code /icons/} of the resource
|
||||||
|
* folder and scales it to 16px.<br>
|
||||||
|
* The suffix {@code .png} is automatically appended.
|
||||||
|
*
|
||||||
|
* @param name the image name without the .png - suffix
|
||||||
|
* @return the loaded image
|
||||||
|
* @since Envoy Client v0.1-beta
|
||||||
|
* @apiNote let's take a sample image {@code abc.png} in the folder
|
||||||
|
* {@code /icons/}.
|
||||||
|
* <br>
|
||||||
|
* To do that, we only have to call
|
||||||
|
* {@code IconUtil.loadDefault("abc")}
|
||||||
|
*/
|
||||||
|
public static Image loadDefault(String name) { return load("/icons/" + name + ".png"); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads a {@code .png} icon from the sub-folder {@code /icons/} of the resource
|
||||||
|
* folder and scales it to a given size.<br>
|
||||||
|
* The suffix {@code .png} is automatically appended.
|
||||||
|
*
|
||||||
|
* @param name the image name without the .png - suffix
|
||||||
|
* @param size the size of the image to scale to
|
||||||
|
* @return the loaded image
|
||||||
|
* @since Envoy Client v0.1-beta
|
||||||
|
* @apiNote let's take a sample image {@code abc.png} in the folder
|
||||||
|
* {@code /icons/} and load it in size 16.
|
||||||
|
* <br>
|
||||||
|
* To do that, we only have to call
|
||||||
|
* {@code IconUtil.loadDefault("abc", 16)}
|
||||||
|
*/
|
||||||
|
public static Image loadDefault(String name, int size) { return load("/icons/" + name + ".png", size); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads a {@code .png} icon whose design depends on the currently active theme
|
||||||
|
* from the sub-folder {@code /icons/} of the resource folder.
|
||||||
|
* <p>
|
||||||
|
* In case of the dark theme, the suffix {@code "white"} will be appended, else
|
||||||
|
* the suffix {@code "black"} will be appended.
|
||||||
|
* <p>
|
||||||
|
* The suffix {@code .png} is automatically appended.
|
||||||
|
*
|
||||||
|
* @param name the image name without the "black" or "white" suffix and without
|
||||||
|
* the .png - suffix
|
||||||
|
* @return the loaded image
|
||||||
|
* @since Envoy Client v0.1-beta
|
||||||
|
* @apiNote let's take two sample images {@code abc_black.png} and
|
||||||
|
* {@code abc_white.png} in the folder {@code /icons/} and load them.
|
||||||
|
* <br>
|
||||||
|
* To do that theme sensitve, we only have to call
|
||||||
|
* {@code IconUtil.loadDefaultThemeSensitive("abc_")}
|
||||||
|
*/
|
||||||
|
public static Image loadDefaultThemeSensitive(String name) { return loadDefault(name + themeSpecificSuffix()); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads a {@code .png} icon whose design depends on the currently active theme
|
||||||
|
* from the sub-folder {@code /icons/} of the resource
|
||||||
|
* folder and scales it to the given size.
|
||||||
|
* <p>
|
||||||
|
* In case of the dark theme, the suffix {@code "white"} will be appended, else
|
||||||
|
* the suffix {@code "black"} will be appended.
|
||||||
|
* <p>
|
||||||
|
* The suffix {@code .png} is automatically appended.
|
||||||
|
*
|
||||||
|
* @param name the image name without the .png - suffix
|
||||||
|
* @param size the size of the image to scale to
|
||||||
|
* @return the loaded image
|
||||||
|
* @since Envoy Client v0.1-beta
|
||||||
|
* @apiNote let's take two sample images {@code abc_black.png} and
|
||||||
|
* {@code abc_white.png} in the folder {@code /icons/} and load it in
|
||||||
|
* size 16.
|
||||||
|
* <br>
|
||||||
|
* To do that theme sensitve, we only have to call
|
||||||
|
* {@code IconUtil.loadDefaultThemeSensitive("abc_", 16)}
|
||||||
|
*/
|
||||||
|
public static Image loadDefaultThemeSensitive(String name, int size) { return loadDefault(name + themeSpecificSuffix(), size); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -62,4 +159,15 @@ public class IconUtil {
|
|||||||
icons.put(e, load(path + e.toString().toLowerCase() + ".png", size));
|
icons.put(e, load(path + e.toString().toLowerCase() + ".png", size));
|
||||||
return icons;
|
return icons;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method should be called if the display of an icon depends upon the
|
||||||
|
* currently active theme.<br>
|
||||||
|
* In case of the dark theme, the suffix {@code "white"} will be appended, else
|
||||||
|
* the suffix {@code "black"} will be appended.
|
||||||
|
*
|
||||||
|
* @return the theme specific suffix
|
||||||
|
* @since Envoy Client v0.1-beta
|
||||||
|
*/
|
||||||
|
public static String themeSpecificSuffix() { return Settings.getInstance().getCurrentTheme().equals("dark") ? "white" : "black"; }
|
||||||
}
|
}
|
||||||
|
@ -102,7 +102,7 @@ public final class Startup extends Application {
|
|||||||
messageStatusCache = new Cache<>();
|
messageStatusCache = new Cache<>();
|
||||||
|
|
||||||
stage.setTitle("Envoy");
|
stage.setTitle("Envoy");
|
||||||
stage.getIcons().add(IconUtil.load("/icons/envoy_logo.png"));
|
stage.getIcons().add(IconUtil.loadDefault("envoy_logo"));
|
||||||
|
|
||||||
final var sceneContext = new SceneContext(stage);
|
final var sceneContext = new SceneContext(stage);
|
||||||
sceneContext.load(SceneInfo.LOGIN_SCENE);
|
sceneContext.load(SceneInfo.LOGIN_SCENE);
|
||||||
|
@ -110,7 +110,7 @@ public final class ChatScene implements Restorable {
|
|||||||
messageList.setCellFactory(MessageListCellFactory::new);
|
messageList.setCellFactory(MessageListCellFactory::new);
|
||||||
userList.setCellFactory(ContactListCellFactory::new);
|
userList.setCellFactory(ContactListCellFactory::new);
|
||||||
|
|
||||||
settingsButton.setGraphic(new ImageView(IconUtil.load("/icons/settings.png", 16)));
|
settingsButton.setGraphic(new ImageView(IconUtil.loadDefault("settings", 16)));
|
||||||
|
|
||||||
// Listen to received messages
|
// Listen to received messages
|
||||||
eventBus.register(MessageCreationEvent.class, e -> {
|
eventBus.register(MessageCreationEvent.class, e -> {
|
||||||
@ -222,9 +222,9 @@ public final class ChatScene implements Restorable {
|
|||||||
if (recorder.isRecording()) {
|
if (recorder.isRecording()) {
|
||||||
recorder.cancel();
|
recorder.cancel();
|
||||||
recording = false;
|
recording = false;
|
||||||
voiceButton.setText("Record Voice Message");
|
|
||||||
}
|
}
|
||||||
pendingAttachment = null;
|
pendingAttachment = null;
|
||||||
|
attachmentView.setVisible(false);
|
||||||
|
|
||||||
remainingChars.setVisible(true);
|
remainingChars.setVisible(true);
|
||||||
remainingChars
|
remainingChars
|
||||||
@ -270,8 +270,7 @@ public final class ChatScene implements Restorable {
|
|||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
voiceButton.setText("Record Voice Message");
|
voiceButton.setText("Record Voice Message");
|
||||||
checkPostConditions(false);
|
checkPostConditions(false);
|
||||||
attachmentView.setImage(IconUtil.load(settings.getCurrentTheme().equals("dark") ? "/icons/attachment_present_white.png"
|
attachmentView.setImage(IconUtil.loadDefaultThemeSensitive("attachment_present_", 20));
|
||||||
: "/icons/attachment_present_black.png", 20));
|
|
||||||
attachmentView.setVisible(true);
|
attachmentView.setVisible(true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -311,7 +310,7 @@ public final class ChatScene implements Restorable {
|
|||||||
private void checkPostConditions(boolean sendKeyPressed) {
|
private void checkPostConditions(boolean sendKeyPressed) {
|
||||||
if (!postingPermanentlyDisabled) {
|
if (!postingPermanentlyDisabled) {
|
||||||
if (!postButton.isDisabled() && sendKeyPressed) postMessage();
|
if (!postButton.isDisabled() && sendKeyPressed) postMessage();
|
||||||
postButton.setDisable((messageTextArea.getText().isBlank() && pendingAttachment == null) || currentChat == null);
|
postButton.setDisable(messageTextArea.getText().isBlank() && pendingAttachment == null || currentChat == null);
|
||||||
} else {
|
} else {
|
||||||
final var noMoreMessaging = "Go online to send messages";
|
final var noMoreMessaging = "Go online to send messages";
|
||||||
if (!infoLabel.getText().equals(noMoreMessaging))
|
if (!infoLabel.getText().equals(noMoreMessaging))
|
||||||
@ -373,6 +372,7 @@ public final class ChatScene implements Restorable {
|
|||||||
if (pendingAttachment != null) {
|
if (pendingAttachment != null) {
|
||||||
builder.setAttachment(pendingAttachment);
|
builder.setAttachment(pendingAttachment);
|
||||||
pendingAttachment = null;
|
pendingAttachment = null;
|
||||||
|
attachmentView.setVisible(false);
|
||||||
}
|
}
|
||||||
final var message = builder.build();
|
final var message = builder.build();
|
||||||
|
|
||||||
|
@ -117,7 +117,7 @@
|
|||||||
</GridPane.margin>
|
</GridPane.margin>
|
||||||
<buttons>
|
<buttons>
|
||||||
<Button fx:id="voiceButton" disable="true"
|
<Button fx:id="voiceButton" disable="true"
|
||||||
onAction="#voiceButtonClicked" text="_Record Voice Message">
|
onAction="#voiceButtonClicked">
|
||||||
<padding>
|
<padding>
|
||||||
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
|
||||||
</padding>
|
</padding>
|
||||||
|
Reference in New Issue
Block a user