aboutsummaryrefslogtreecommitdiff
path: root/.config/ags/service/colorpicker.ts
blob: 5918f31c6a10226a77d34d9f357b6c3b78654e25 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import icons from "lib/icons"
import { bash, dependencies } from "lib/utils"

const COLORS_CACHE = Utils.CACHE_DIR + "/colorpicker.json"
const MAX_NUM_COLORS = 10

class ColorPicker extends Service {
    static {
        Service.register(this, {}, {
            "colors": ["jsobject"],
        })
    }

    #notifID = 0
    #colors = JSON.parse(Utils.readFile(COLORS_CACHE) || "[]") as string[]

    get colors() { return [...this.#colors] }
    set colors(colors) {
        this.#colors = colors
        this.changed("colors")
    }

    // TODO: doesn't work?
    async wlCopy(color: string) {
        if (dependencies("wl-copy"))
            bash(`wl-copy ${color}`)
    }

    readonly pick = async () => {
        if (!dependencies("hyprpicker"))
            return

        const color = await bash("hyprpicker -a -r")
        if (!color)
            return

        this.wlCopy(color)
        const list = this.colors
        if (!list.includes(color)) {
            list.push(color)
            if (list.length > MAX_NUM_COLORS)
                list.shift()

            this.colors = list
            Utils.writeFile(JSON.stringify(list, null, 2), COLORS_CACHE)
        }

        this.#notifID = await Utils.notify({
            id: this.#notifID,
            iconName: icons.ui.colorpicker,
            summary: color,
        })
    }
}

export default new ColorPicker