Add Image Caching (#95)
Add image caching Co-authored-by: kske <kai@kske.dev> Reviewed-on: https://git.kske.dev/zdm/envoy/pulls/95 Reviewed-by: kske <kai@kske.dev> Reviewed-by: DieGurke <maxi@kske.dev>
This commit is contained in:
		@@ -132,7 +132,6 @@ public final class ChatScene implements EventListener, Restorable {
 | 
			
		||||
 | 
			
		||||
	private Chat				currentChat;
 | 
			
		||||
	private FilteredList<Chat>	chats;
 | 
			
		||||
	private boolean				recording;
 | 
			
		||||
	private Attachment			pendingAttachment;
 | 
			
		||||
	private boolean				postingPermanentlyDisabled;
 | 
			
		||||
	private boolean				isCustomAttachmentImage;
 | 
			
		||||
@@ -354,7 +353,8 @@ public final class ChatScene implements EventListener, Restorable {
 | 
			
		||||
			// Discard the pending attachment
 | 
			
		||||
			if (recorder.isRecording()) {
 | 
			
		||||
				recorder.cancel();
 | 
			
		||||
				recording = false;
 | 
			
		||||
				voiceButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("microphone", DEFAULT_ICON_SIZE)));
 | 
			
		||||
				voiceButton.setText(null);
 | 
			
		||||
			}
 | 
			
		||||
			pendingAttachment = null;
 | 
			
		||||
			updateAttachmentView(false);
 | 
			
		||||
@@ -414,18 +414,16 @@ public final class ChatScene implements EventListener, Restorable {
 | 
			
		||||
	private void voiceButtonClicked() {
 | 
			
		||||
		new Thread(() -> {
 | 
			
		||||
			try {
 | 
			
		||||
				if (!recording) {
 | 
			
		||||
					recording = true;
 | 
			
		||||
				if (!recorder.isRecording()) {
 | 
			
		||||
					Platform.runLater(() -> {
 | 
			
		||||
						voiceButton.setText("Recording");
 | 
			
		||||
						voiceButton.setGraphic(new ImageView(IconUtil.loadIcon("microphone_recording", DEFAULT_ICON_SIZE)));
 | 
			
		||||
					});
 | 
			
		||||
					recorder.start();
 | 
			
		||||
				} else {
 | 
			
		||||
					pendingAttachment	= new Attachment(recorder.finish(), "Voice_recording_"
 | 
			
		||||
					pendingAttachment = new Attachment(recorder.finish(), "Voice_recording_"
 | 
			
		||||
							+ DateTimeFormatter.ofPattern("yyyy_MM_dd-HH_mm_ss").format(LocalDateTime.now()) + "." + AudioRecorder.FILE_FORMAT,
 | 
			
		||||
							AttachmentType.VOICE);
 | 
			
		||||
					recording			= false;
 | 
			
		||||
					Platform.runLater(() -> {
 | 
			
		||||
						voiceButton.setGraphic(new ImageView(IconUtil.loadIconThemeSensitive("microphone", DEFAULT_ICON_SIZE)));
 | 
			
		||||
						voiceButton.setText(null);
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,10 @@ import envoy.util.EnvoyLog;
 | 
			
		||||
 */
 | 
			
		||||
public final class IconUtil {
 | 
			
		||||
 | 
			
		||||
	private static final HashMap<String, Image>			cache		= new HashMap<>();
 | 
			
		||||
	private static final HashMap<String, Image>			scaledCache	= new HashMap<>();
 | 
			
		||||
	private static final HashMap<String, BufferedImage>	awtCache	= new HashMap<>();
 | 
			
		||||
 | 
			
		||||
	private IconUtil() {}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -30,7 +34,7 @@ public final class IconUtil {
 | 
			
		||||
	 * @return the loaded image
 | 
			
		||||
	 * @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) { return cache.computeIfAbsent(path, p -> new Image(IconUtil.class.getResource(p).toExternalForm())); }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Loads an image from the resource folder and scales it to the given size.
 | 
			
		||||
@@ -41,12 +45,13 @@ public final class IconUtil {
 | 
			
		||||
	 * @since Envoy Client v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public static Image load(String path, int size) {
 | 
			
		||||
		return new Image(IconUtil.class.getResource(path).toExternalForm(), size, size, true, true);
 | 
			
		||||
		return scaledCache.computeIfAbsent(path + size, p -> new Image(IconUtil.class.getResource(path).toExternalForm(), size, size, true, true));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Loads a {@code .png} image from the sub-folder {@code /icons/} of the
 | 
			
		||||
	 * resource folder.<br>
 | 
			
		||||
	 * resource folder.
 | 
			
		||||
	 * <p>
 | 
			
		||||
	 * The suffix {@code .png} is automatically appended.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param name the image name without the .png suffix
 | 
			
		||||
@@ -138,13 +143,14 @@ public final class IconUtil {
 | 
			
		||||
	 * @since Envoy Client v0.2-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public static BufferedImage loadAWTCompatible(String path) {
 | 
			
		||||
		BufferedImage image = null;
 | 
			
		||||
		try {
 | 
			
		||||
			image = ImageIO.read(IconUtil.class.getResource(path));
 | 
			
		||||
		} catch (final IOException e) {
 | 
			
		||||
			EnvoyLog.getLogger(IconUtil.class).log(Level.WARNING, String.format("Could not load image at path %s: ", path), e);
 | 
			
		||||
		}
 | 
			
		||||
		return image;
 | 
			
		||||
		return awtCache.computeIfAbsent(path, p -> {
 | 
			
		||||
			try {
 | 
			
		||||
				return ImageIO.read(IconUtil.class.getResource(path));
 | 
			
		||||
			} catch (IOException e) {
 | 
			
		||||
				EnvoyLog.getLogger(IconUtil.class).log(Level.WARNING, String.format("Could not load image at path %s: ", path), e);
 | 
			
		||||
				return null;
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
 
 | 
			
		||||
@@ -175,7 +175,7 @@
 | 
			
		||||
								<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
 | 
			
		||||
							</padding>
 | 
			
		||||
							<HBox.margin>
 | 
			
		||||
								<Insets bottom="35.0" left="5.0" top="35.0"/>
 | 
			
		||||
								<Insets bottom="35.0" left="5.0" top="35.0" />
 | 
			
		||||
							</HBox.margin>
 | 
			
		||||
						</Button>
 | 
			
		||||
					</children>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user