LabelColorUI.jsx

(function() {
    function createLabelColorPanel(thisObj) {
        var win = (thisObj instanceof Panel) ? thisObj : new Window("palette", "Change Layer Label", undefined, { resizeable: false });

        var labelColors = [
            { name: "None",      id: 0,  color: [102/255, 102/255, 102/255] },
            { name: "Red",       id: 1,  color: [181/255,  56/255,  56/255] },
            { name: "Yellow",    id: 2,  color: [228/255, 216/255,  76/255] },
            { name: "Aqua",      id: 3,  color: [169/255, 203/255, 199/255] },
            { name: "Pink",      id: 4,  color: [229/255, 188/255, 201/255] },
            { name: "Lavender",  id: 5,  color: [169/255, 169/255, 202/255] },
            { name: "Peach",     id: 6,  color: [221/255, 193/255, 158/255] },
            { name: "Sea Foam",  id: 7,  color: [179/255, 199/255, 179/255] },
            { name: "Blue",      id: 8,  color: [103/255, 125/255, 224/255] },
            { name: "Green",     id: 9,  color: [ 74/255, 164/255,  76/255] },
            { name: "Purple",    id: 10, color: [142/255,  44/255, 154/255] },
            { name: "Orange",    id: 11, color: [232/255, 146/255,  13/255] },
            { name: "Brown",     id: 12, color: [127/255,  69/255,  42/255] },
            { name: "Fuchsia",   id: 13, color: [244/255, 109/255, 214/255] },
            { name: "Cyan",      id: 14, color: [ 61/255, 162/255, 165/255] },
            { name: "Sandstone", id: 15, color: [168/255, 150/255, 119/255] },
            { name: "Dark Green", id: 16, color: [ 30/255,  64/255,  30/255] }
        ];

        var btnGroup = win.add("group");
        btnGroup.orientation = "column";
        btnGroup.alignment = ["left", "top"];
        btnGroup.spacing = 3; // 余白を最適化

        for (var i = 0; i < labelColors.length; i++) {
            (function(colorObj) {
                var row = btnGroup.add("group");
                row.orientation = "row";
                row.alignment = ["fill", "center"];
                row.spacing = 2;

                // **ボタンの代わりに Panel をクリック可能に**
                var colorPanel = row.add("panel", undefined, undefined, { borderStyle: "sunken" });
                colorPanel.size = [22, 22];  // サイズを大きく
                colorPanel.minimumSize = [22, 22];  // 縮小を防ぐ

                try {
                    var g = colorPanel.graphics;
                    g.backgroundColor = g.newBrush(g.BrushType.SOLID_COLOR, colorObj.color);
                } catch (e) {
                    alert("Error applying color: " + e.toString());
                }

                // **Panel にクリックイベントを追加**
                colorPanel.addEventListener("click", function() {
                    var comp = app.project.activeItem;
                    if (!comp || !(comp instanceof CompItem)) {
                        alert("Please select a composition first.");
                        return;
                    }
                    if (comp.selectedLayers.length === 0) {
                        alert("Please select at least one layer.");
                        return;
                    }

                    app.beginUndoGroup("Change Layer Label");
                    for (var j = 0; j < comp.selectedLayers.length; j++) {
                        comp.selectedLayers[j].label = colorObj.id;
                    }
                    app.endUndoGroup();
                });
            })(labelColors[i]);
        }

        win.layout.layout(true);
        win.layout.resize();
        win.onResizing = win.onResize = function() { win.layout.resize(); };

        if (win instanceof Window) {
            win.center();
            win.show();
        }
    }

    createLabelColorPanel(this);
})();


OLD

(function() {
    function createLabelColorPanel(thisObj) {
        var win = (thisObj instanceof Panel) ? thisObj : new Window("palette", "Change Layer Label", undefined, { resizeable: false });

        var labelColors = [
            { name: "None",      id: 0,  color: [0.5, 0.5, 0.5] },
            { name: "Red",       id: 1,  color: [0.79, 0.24, 0.24] },
            { name: "Yellow",    id: 2,  color: [0.85, 0.80, 0.41] },
            { name: "Aqua",      id: 3,  color: [0.50, 0.67, 0.64] },
            { name: "Pink",      id: 4,  color: [0.84, 0.54, 0.60] },
            { name: "Lavender",  id: 5,  color: [0.72, 0.62, 0.76] },
            { name: "Peach",     id: 6,  color: [0.80, 0.69, 0.57] },
            { name: "Sea Foam",  id: 7,  color: [0.61, 0.69, 0.55] },
            { name: "Blue",      id: 8,  color: [0.38, 0.54, 0.77] },
            { name: "Green",     id: 9,  color: [0.43, 0.62, 0.38] },
            { name: "Purple",    id: 10, color: [0.53, 0.32, 0.58] },
            { name: "Orange",    id: 11, color: [0.73, 0.42, 0.15] },
            { name: "Brown",     id: 12, color: [0.48, 0.35, 0.20] },
            { name: "Fuchsia",   id: 13, color: [0.76, 0.36, 0.55] },
            { name: "Cyan",      id: 14, color: [0.34, 0.63, 0.69] },
            { name: "Sandstone", id: 15, color: [0.69, 0.56, 0.41] },
            { name: "Dark Green", id: 16, color: [0.32, 0.42, 0.30] }
        ];

        var btnGroup = win.add("group");
        btnGroup.orientation = "column";
        btnGroup.alignment = ["left", "top"];
        btnGroup.spacing = 4; // 余白を最適化

        for (var i = 0; i < labelColors.length; i++) {
            (function(colorObj) {
                var row = btnGroup.add("group");
                row.orientation = "row";
                row.alignment = ["fill", "center"];
                row.spacing = 4;

                // **色付きの四角を Panel で作成**
                var colorPanel = row.add("panel", undefined, undefined, { borderStyle: "etched" });
                colorPanel.size = [20, 20];  // サイズを大きく
                colorPanel.minimumSize = [20, 20];  // 縮小を防ぐ

                try {
                    var g = colorPanel.graphics;
                    g.backgroundColor = g.newBrush(g.BrushType.SOLID_COLOR, colorObj.color);
                } catch (e) {
                    alert("Error applying color: " + e.toString());
                }

                // **ボタンを作成(少し小さめに)**
                var btn = row.add("button", undefined, colorObj.name);
                btn.size = [75, 25];  // ボタンサイズも調整

                // **ボタンの文字色を調整**
                var brightness = (colorObj.color[0] * 0.299) + (colorObj.color[1] * 0.587) + (colorObj.color[2] * 0.114);
                btn.graphics.foregroundColor = btn.graphics.newPen(
                    btn.graphics.PenType.SOLID_COLOR, 
                    brightness > 0.5 ? [0, 0, 0, 1] : [1, 1, 1, 1], 
                    1
                );

                btn.onClick = function() {
                    var comp = app.project.activeItem;
                    if (!comp || !(comp instanceof CompItem)) {
                        alert("Please select a composition first.");
                        return;
                    }
                    if (comp.selectedLayers.length === 0) {
                        alert("Please select at least one layer.");
                        return;
                    }

                    app.beginUndoGroup("Change Layer Label");
                    for (var j = 0; j < comp.selectedLayers.length; j++) {
                        comp.selectedLayers[j].label = colorObj.id;
                    }
                    app.endUndoGroup();
                };
            })(labelColors[i]);
        }

        win.layout.layout(true);
        win.layout.resize();
        win.onResizing = win.onResize = function() { win.layout.resize(); };

        if (win instanceof Window) {
            win.center();
            win.show();
        }
    }

    createLabelColorPanel(this);
})();

(function() {
    function createLabelColorPanel(thisObj) {
        var win = (thisObj instanceof Panel) ? thisObj : new Window("palette", "Change Layer Label", undefined, { resizeable: false });

        var labelColors = [
            { name: "None",      id: 0,  color: [0.5, 0.5, 0.5] },
            { name: "Red",       id: 1,  color: [0.79, 0.24, 0.24] },
            { name: "Yellow",    id: 2,  color: [0.85, 0.80, 0.41] },
            { name: "Aqua",      id: 3,  color: [0.50, 0.67, 0.64] },
            { name: "Pink",      id: 4,  color: [0.84, 0.54, 0.60] },
            { name: "Lavender",  id: 5,  color: [0.72, 0.62, 0.76] },
            { name: "Peach",     id: 6,  color: [0.80, 0.69, 0.57] },
            { name: "Sea Foam",  id: 7,  color: [0.61, 0.69, 0.55] },
            { name: "Blue",      id: 8,  color: [0.38, 0.54, 0.77] },
            { name: "Green",     id: 9,  color: [0.43, 0.62, 0.38] },
            { name: "Purple",    id: 10, color: [0.53, 0.32, 0.58] },
            { name: "Orange",    id: 11, color: [0.73, 0.42, 0.15] },
            { name: "Brown",     id: 12, color: [0.48, 0.35, 0.20] },
            { name: "Fuchsia",   id: 13, color: [0.76, 0.36, 0.55] },
            { name: "Cyan",      id: 14, color: [0.34, 0.63, 0.69] },
            { name: "Sandstone", id: 15, color: [0.69, 0.56, 0.41] },
            { name: "Dark Green", id: 16, color: [0.32, 0.42, 0.30] }
        ];

        var btnGroup = win.add("group");
        btnGroup.orientation = "column";
        btnGroup.alignment = ["left", "top"];
        btnGroup.spacing = 2; // 余白を減らす

        for (var i = 0; i < labelColors.length; i++) {
            (function(colorObj) {
                var row = btnGroup.add("group");
                row.orientation = "row";
                row.alignment = ["fill", "center"];
                row.spacing = 5;

                // 色を表現するための StaticText
                var colorBox = row.add("statictext", undefined, "■");
                colorBox.size = [15, 15];

                try {
                    var g = colorBox.graphics;
                    g.foregroundColor = g.newPen(g.PenType.SOLID_COLOR, colorObj.color, 1);
                } catch (e) {
                    alert("Error applying color: " + e.toString());
                }

                // ボタンを作成(小さめに調整)
                var btn = row.add("button", undefined, colorObj.name);
                btn.size = [80, 20];

                // ボタンの文字色を調整(明るい背景なら黒、暗い背景なら白)
                var brightness = (colorObj.color[0] * 0.299) + (colorObj.color[1] * 0.587) + (colorObj.color[2] * 0.114);
                btn.graphics.foregroundColor = btn.graphics.newPen(
                    btn.graphics.PenType.SOLID_COLOR, 
                    brightness > 0.5 ? [0, 0, 0, 1] : [1, 1, 1, 1], 
                    1
                );

                btn.onClick = function() {
                    var comp = app.project.activeItem;
                    if (!comp || !(comp instanceof CompItem)) {
                        alert("Please select a composition first.");
                        return;
                    }
                    if (comp.selectedLayers.length === 0) {
                        alert("Please select at least one layer.");
                        return;
                    }

                    app.beginUndoGroup("Change Layer Label");
                    for (var j = 0; j < comp.selectedLayers.length; j++) {
                        comp.selectedLayers[j].label = colorObj.id;
                    }
                    app.endUndoGroup();
                };
            })(labelColors[i]);
        }

        win.layout.layout(true);
        win.layout.resize();
        win.onResizing = win.onResize = function() { win.layout.resize(); };

        if (win instanceof Window) {
            win.center();
            win.show();
        }
    }

    createLabelColorPanel(this);
})();