Skip to content

Commit f4fbe3b

Browse files
committed
💄 Add hue preview circle to Aura Glow preferences
1 parent 18d22e1 commit f4fbe3b

File tree

3 files changed

+75
-2
lines changed

3 files changed

+75
-2
lines changed

‎resources/ui/adw/aura-glow.ui

+11-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,16 @@ SPDX-License-Identifier: GPL-3.0-or-later
6767
<child>
6868
<object class="AdwActionRow" id="aura-glow-action-row">
6969
<property name="title" translatable="yes">Start Hue</property>
70-
70+
<child>
71+
<object class="GtkDrawingArea" id="aura-glow-hue-preview">
72+
<property name="valign">3</property>
73+
<property name="halign">2</property>
74+
<property name="hexpand">true</property>
75+
<property name="vexpand">true</property>
76+
<property name="height-request">16</property>
77+
<property name="width-request">16</property>
78+
</object>
79+
</child>
7180
<child>
7281
<object class="GtkScale" id="aura-glow-start-hue-slider">
7382
<property name="valign">center</property>
@@ -135,7 +144,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
135144
<object class="AdwActionRow">
136145
<property name="title" translatable="yes">Saturation</property>
137146
<child>
138-
<object class="GtkScale">
147+
<object class="GtkScale" id="aura-glow-saturation-slider">
139148
<property name="valign">center</property>
140149
<property name="draw-value">1</property>
141150
<property name="digits">2</property>

‎src/effects/AuraGlow.js

+25
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,31 @@ export default class Effect {
103103
dialog.bindAdjustment('aura-glow-edge-hardness');
104104
dialog.bindAdjustment('aura-glow-blur');
105105

106+
dialog.getBuilder()
107+
.get_object('aura-glow-hue-preview')
108+
.set_draw_func((area, cairo) => {
109+
const hueScale = dialog.getBuilder().get_object('aura-glow-start-hue-slider');
110+
const satScale = dialog.getBuilder().get_object('aura-glow-saturation-slider');
111+
const color = utils.hsvToRgb(hueScale.get_value(), satScale.get_value(), 1);
112+
const height = area.get_allocated_height();
113+
const width = area.get_allocated_width();
114+
cairo.setSourceRGB(color.r, color.g, color.b);
115+
cairo.arc(width / 2, height / 2, width / 2, 0.0, 2 * Math.PI);
116+
cairo.fill();
117+
});
118+
119+
function redrawHuePreview() {
120+
dialog.getBuilder().get_object('aura-glow-hue-preview').queue_draw();
121+
}
122+
123+
dialog.getBuilder()
124+
.get_object('aura-glow-start-hue-slider')
125+
.connect('value-changed', redrawHuePreview);
126+
127+
dialog.getBuilder()
128+
.get_object('aura-glow-saturation-slider')
129+
.connect('value-changed', redrawHuePreview);
130+
106131
// enable and disable the one slider
107132
function enableDisablePref(dialog, state) {
108133
dialog.getBuilder().get_object('aura-glow-start-hue-slider').set_sensitive(!state);

‎src/utils.js

+39
Original file line numberDiff line numberDiff line change
@@ -195,3 +195,42 @@ export function parseColor(string) {
195195

196196
return [color.red / 255, color.green / 255, color.blue / 255, color.alpha / 255];
197197
}
198+
199+
// Converts a color in hsv space into rgb.
200+
// https://stackoverflow.com/a/17243070
201+
export function hsvToRgb(h, s, v) {
202+
var r, g, b, i, f, p, q, t;
203+
if (arguments.length === 1) {
204+
(s = h.s), (v = h.v), (h = h.h);
205+
}
206+
i = Math.floor(h * 6);
207+
f = h * 6 - i;
208+
p = v * (1 - s);
209+
q = v * (1 - f * s);
210+
t = v * (1 - (1 - f) * s);
211+
switch (i % 6) {
212+
case 0:
213+
(r = v), (g = t), (b = p);
214+
break;
215+
case 1:
216+
(r = q), (g = v), (b = p);
217+
break;
218+
case 2:
219+
(r = p), (g = v), (b = t);
220+
break;
221+
case 3:
222+
(r = p), (g = q), (b = v);
223+
break;
224+
case 4:
225+
(r = t), (g = p), (b = v);
226+
break;
227+
case 5:
228+
(r = v), (g = p), (b = q);
229+
break;
230+
}
231+
return {
232+
r,
233+
g,
234+
b,
235+
};
236+
}

0 commit comments

Comments
 (0)