Add Image Caching #95
| @@ -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,8 +414,7 @@ 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))); | ||||
| @@ -425,7 +424,6 @@ public final class ChatScene implements EventListener, Restorable { | ||||
| 					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; | ||||
| 		return awtCache.computeIfAbsent(path, p -> { | ||||
| 			try { | ||||
| 			image = ImageIO.read(IconUtil.class.getResource(path)); | ||||
| 		} catch (final IOException e) { | ||||
| 				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; | ||||
| 			} | ||||
| 		return image; | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
|   | ||||
| @@ -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