Skip to content

Commit b19affc

Browse files
committed
Minimize sample color updates in color picker
Reduced flickering in the color picker by only updating the random color samples when the mouse button is released.
1 parent 990f79c commit b19affc

File tree

2 files changed

+24
-12
lines changed

2 files changed

+24
-12
lines changed

chunky/src/java/se/llbit/chunky/ui/SimpleColorPalette.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ public SimpleColorPalette(SimpleColorPicker colorPicker) {
153153
if (e.getCode() == KeyCode.ESCAPE) {
154154
e.consume();
155155
colorPicker.revertToOriginalColor();
156-
colorPicker.hide();
156+
colorPicker.hidePopup();
157157
}
158158
});
159159
} catch (IOException e) {
@@ -169,21 +169,21 @@ public SimpleColorPalette(SimpleColorPicker colorPicker) {
169169
// Handle color selection on click.
170170
colorSample.setOnMouseClicked(event -> {
171171
colorPicker.updateHistory();
172-
colorPicker.hide();
172+
colorPicker.hidePopup();
173173
});
174174

175175
webColorCode.textProperty().addListener(webColorListener);
176176

177177
saveBtn.setOnAction(event -> {
178178
colorPicker.updateHistory();
179-
colorPicker.hide();
179+
colorPicker.hidePopup();
180180
});
181181

182182
saveBtn.setDefaultButton(true);
183183

184184
cancelBtn.setOnAction(event -> {
185185
colorPicker.revertToOriginalColor();
186-
colorPicker.hide();
186+
colorPicker.hidePopup();
187187
});
188188

189189
satValueRect.setBackground(
@@ -270,6 +270,7 @@ public SimpleColorPalette(SimpleColorPicker colorPicker) {
270270

271271
huePickerOverlay.setOnMouseDragged(hueMouseHandler);
272272
huePickerOverlay.setOnMousePressed(hueMouseHandler);
273+
huePickerOverlay.setOnMouseReleased(event -> updateRandomColorSamples());
273274

274275
EventHandler<MouseEvent> mouseHandler = event -> {
275276
saturation.set(clamp(event.getX() / satValueRect.getWidth()));
@@ -278,6 +279,7 @@ public SimpleColorPalette(SimpleColorPicker colorPicker) {
278279

279280
valueOverlay.setOnMousePressed(mouseHandler);
280281
valueOverlay.setOnMouseDragged(mouseHandler);
282+
valueOverlay.setOnMouseReleased(event -> updateRandomColorSamples());
281283

282284
hue.addListener((observable, oldValue, newValue) -> updateCurrentColor(newValue.doubleValue(),
283285
saturation.get(), value.get()));
@@ -315,6 +317,17 @@ public SimpleColorPalette(SimpleColorPicker colorPicker) {
315317
}
316318
}
317319

320+
/**
321+
* Updates the nearby random color samples.
322+
*/
323+
void updateRandomColorSamples() {
324+
Color color = colorPicker.getColor();
325+
for (Region swatch : sample) {
326+
swatch.setBackground(new Background(
327+
new BackgroundFill(getRandomNearColor(color), CornerRadii.EMPTY, Insets.EMPTY)));
328+
}
329+
}
330+
318331
protected void setColor(Color color) {
319332
hue.set(color.getHue() / 360);
320333
saturation.set(color.getSaturation());
@@ -343,11 +356,7 @@ private static double clamp(double value) {
343356
private void updateCurrentColor(double hue, double saturation, double value) {
344357
Color newColor = Color.hsb(hue * 360, saturation, value);
345358

346-
for (Region swatch : sample) {
347-
swatch.setBackground(new Background(
348-
new BackgroundFill(getRandomNearColor(newColor), CornerRadii.EMPTY, Insets.EMPTY)));
349-
}
350-
colorPicker.setColor(newColor);
359+
colorPicker.colorProperty().set(newColor);
351360

352361
GraphicsContext gc = colorSample.getGraphicsContext2D();
353362
gc.setFill(newColor);
@@ -357,8 +366,10 @@ private void updateCurrentColor(double hue, double saturation, double value) {
357366
// TODO: make sure color values are rounded correctly.
358367
// Suspending the web color listener to avoid it tweaking the current color.
359368
webColorCode.textProperty().removeListener(webColorListener);
360-
webColorCode.setText(String.format("#%02X%02X%02X", (int) (newColor.getRed() * 255 + 0.5),
361-
(int) (newColor.getGreen() * 255 + 0.5), (int) (newColor.getBlue() * 255 + 0.5)));
369+
webColorCode.setText(String.format("#%02X%02X%02X",
370+
(int) (newColor.getRed() * 255 + 0.5),
371+
(int) (newColor.getGreen() * 255 + 0.5),
372+
(int) (newColor.getBlue() * 255 + 0.5)));
362373
webColorCode.textProperty().addListener(webColorListener);
363374
}
364375
}

chunky/src/java/se/llbit/chunky/ui/SimpleColorPicker.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public ObjectProperty<Color> colorProperty() {
8282

8383
public void setColor(Color value) {
8484
color.set(value);
85+
palette.updateRandomColorSamples();
8586
}
8687

8788
public Color getColor() {
@@ -91,7 +92,7 @@ public Color getColor() {
9192
/**
9293
* Hide the color picker popup.
9394
*/
94-
public void hide() {
95+
public void hidePopup() {
9596
popup.hide();
9697
}
9798

0 commit comments

Comments
 (0)