Copy link to clipboard
Copied
I have discovered a cool ScriptUI snippet on the illustrator fora, but it only works flawlessly when ESTK is targeted, not when Ps is targeted. So far, I haven't find a way to make the ui to redraw on request ( onChange or onChanging). I have tried to use "notify" or "layout.layout" but my tries were unsuccessfull.
If someone wants to have a look, here is the original code :
// Panel dialog with drawGradientInScriptUI
// Author: Silly-V and Schroef
// Source: https://community.adobe.com/t5/illustrator/draw-gradient-in-scriptui-panel/m-p/9517915
// function is actually(x, y, width, height)
// #target illustrator
#target photoshop
function callDialog() {
var color_1 = [255, 0, 0];
var color_2 = [255, 255, 0];
function makeRGBGradientArray(color_1, color_2, steps) {
var arr = [];
var thisArr;
for (var i = 0; i < steps; i++) {
thisArr = [];
thisArr[0] = (((color_2[0] - color_1[0]) / steps) * i) + color_1[0];
thisArr[1] = (((color_2[1] - color_1[1]) / steps) * i) + color_1[1];
thisArr[2] = (((color_2[2] - color_1[2]) / steps) * i) + color_1[2];
arr.push(thisArr);
}
return arr;
};
function drawGradientInAI(gradArr) {
var thisArr;
var thisColor;
var doc = app.activeDocument;
var yPos = 0;
var xPos = 0;
var width = 10;
var height = 40;
var newRect;
for (var i = 0; i < gradArr.length; i++) {
thisArr = gradArr;
thisColor = new RGBColor();
thisColor.red = Math.round(thisArr[i][0]);
thisColor.green = Math.round(thisArr[i][1]);
thisColor.blue = Math.round(thisArr[i][2]);
newRect = doc.pathItems.rectangle(yPos, xPos, width, height);
newRect.fillColor = thisColor;
xPos += width;
}
};
function drawGradientInScriptUI(gradArr, canvasArea) {
var canvas = canvasArea.graphics;
var yPos = 0;
var xPos = 0;
var width = 13;
var height = 40;
var thisArr;
for (var i = 0; i < gradArr.length; i++) {
thisArr = gradArr[i];
thisArr[0] = (thisArr[0] / 255).toFixed(2) * 1;
thisArr[1] = (thisArr[1] / 255).toFixed(2) * 1;
thisArr[2] = (thisArr[2] / 255).toFixed(2) * 1;
canvas.newPath();
canvas.rectPath(xPos, yPos, width, height);
var myBrush = canvas.newBrush(canvas.BrushType.SOLID_COLOR, [thisArr[0], thisArr[1], thisArr[2]]);
canvas.fillPath(myBrush);
canvas.closePath();
xPos += width;
}
};
var spacing = 8;
var margins = [0,10,0,0];
// This the second example, showing a dialog the gradient and interactive sliders
var w = new Window("dialog", "Gradient Dialog");
var p = w.add("panel");
p.size = [200, 50];
// p.orientation = "row";
// p.alignChildren = ["left","center"];
p.spacing = spacing;
p.margins = margins;
p.alignment = ["fill","top"];
p.onDraw = function() {
drawGradientInScriptUI(makeRGBGradientArray(color_1, color_2, 20), this);
};
// Group sldiers 1 and 2
var g_sliders = w.add("group");
g_sliders.orientation = "row";
// g_sliders.alignChildren = ["left","center"];
g_sliders.alignment = ["fill","top"];
// Group sliders 1
var g_sliders_1 = g_sliders.add("group");
g_sliders_1.orientation = "column";
g_sliders_1.alignChildren = ["left","center"];
g_sliders_1.spacing = spacing;
g_sliders_1.margins = margins;
g_sliders_1.alignment = ["fill","top"];
var colOneLabel = g_sliders_1.add("statictext", undefined, undefined, {name: "colOneLabel"});
colOneLabel.alignment = ["fill","top"];
colOneLabel.text = " Color 1";
// Group sliders 2
var g_sliders_2 = g_sliders.add("group");
g_sliders_2.orientation = "column";
g_sliders_2.alignChildren = ["left","center"];
g_sliders_2.spacing = spacing;
g_sliders_2.margins = margins;
g_sliders_2.alignment = ["fill","top"];
var colTwoLabel = g_sliders_2.add("statictext", undefined, undefined, {name: "colTwoLabel"});
colTwoLabel.alignment = ["fill","top"];
colTwoLabel.text = " Color 2";
// Sliders color_1
var slider_1_rGrp = g_sliders_1.add("group");
slider_1_rGrp.orientation = "row";
slider_1_rGrp.alignment = ["fill","top"];
var colOneRlabel = slider_1_rGrp.add("statictext", undefined, undefined, {name: "colOneRlabel"}
);
colOneRlabel.text = "R";
var slider_1_r = slider_1_rGrp.add("slider");
slider_1_r.minvalue = 0;
slider_1_r.maxvalue = 255;
slider_1_r.value = color_1[0];
var slider_1_gGrp = g_sliders_1.add("group");
slider_1_gGrp.orientation = "row";
slider_1_gGrp.alignment = ["fill","top"];
var colOneGlabel = slider_1_gGrp.add("statictext", undefined, undefined, {name: "colOneRlabel"}
);
colOneGlabel.text = "G";
var slider_1_g = slider_1_gGrp.add("slider");
slider_1_g.minvalue = 0;
slider_1_g.maxvalue = 255;
slider_1_g.value = color_1[1];
var slider_1_bGrp = g_sliders_1.add("group");
slider_1_bGrp.orientation = "row";
slider_1_bGrp.alignment = ["fill","top"];
var colOneBlabel = slider_1_bGrp.add("statictext", undefined, undefined, {name: "colOneRlabel"}
);
colOneBlabel.text = "B";
var slider_1_b = slider_1_bGrp.add("slider");
slider_1_b.minvalue = 0;
slider_1_b.maxvalue = 255;
slider_1_g.value = color_1[2];
// Sliders color_2
var slider_2_rGrp = g_sliders_2.add("group");
slider_2_rGrp.orientation = "row";
slider_2_rGrp.alignment = ["fill","top"];
var colOneRlabel = slider_2_rGrp.add("statictext", undefined, undefined, {name: "colOneRlabel"}
);
colOneRlabel.text = "R";
var slider_2_r = slider_2_rGrp.add("slider");
slider_2_r.minvalue = 0;
slider_2_r.maxvalue = 255;
slider_2_r.value = color_2[0];
var slider_2_gGrp = g_sliders_2.add("group");
slider_2_gGrp.orientation = "row";
slider_2_gGrp.alignment = ["fill","top"];
var colOneRlabel = slider_2_gGrp.add("statictext", undefined, undefined, {name: "colOneRlabel"}
);
colOneRlabel.text = "G";
var slider_2_g = slider_2_gGrp.add("slider");
slider_2_g.minvalue = 0;
slider_2_g.maxvalue = 255;
slider_2_g.value = color_2[1];
var slider_2_bGrp = g_sliders_2.add("group");
slider_2_bGrp.orientation = "row";
slider_2_bGrp.alignment = ["fill","top"];
var colOneRlabel = slider_2_bGrp.add("statictext", undefined, undefined, {name: "colOneRlabel"}
);
colOneRlabel.text = "B";
var slider_2_b = slider_2_bGrp.add("slider");
slider_2_b.minvalue = 0;
slider_2_b.maxvalue = 255;
slider_2_b.value = color_2[2];
// Interactive sliders
slider_1_r.onChanging = slider_1_g.onChanging = slider_1_b.onChanging = slider_2_r.onChanging = slider_2_g.onChanging = slider_2_b.onChanging = function() {
color_1 = [slider_1_r.value, slider_1_g.value, slider_1_b.value];
color_2 = [slider_2_r.value, slider_2_g.value, slider_2_b.value];
p.hide();
p.show();
};
w.show();
};
callDialog();
See JavaScript Tools Guide p. 164-165 (custom element class ).
But it seems that onDraw() with flickering is a feature of Photoshop ¯ \ _ (ツ) _ / ¯
// Panel dialog with drawGradientInScriptUI
// Author: Silly-V and Schroef
// Source: https://community.adobe.com/t5/illustrator/draw-gradient-in-scriptui-panel/m-p/9517915
// function is actually(x, y, width, height)
// #target illustrator
#target photoshop
function callDialog() {
var color_1 = [255, 0, 0];
var color_2 = [255, 255, 0];
function ma
...
Copy link to clipboard
Copied
See JavaScript Tools Guide p. 164-165 (custom element class ).
But it seems that onDraw() with flickering is a feature of Photoshop ¯ \ _ (ツ) _ / ¯
// Panel dialog with drawGradientInScriptUI
// Author: Silly-V and Schroef
// Source: https://community.adobe.com/t5/illustrator/draw-gradient-in-scriptui-panel/m-p/9517915
// function is actually(x, y, width, height)
// #target illustrator
#target photoshop
function callDialog() {
var color_1 = [255, 0, 0];
var color_2 = [255, 255, 0];
function makeRGBGradientArray(color_1, color_2, steps) {
var arr = [];
var thisArr;
for (var i = 0; i < steps; i++) {
thisArr = [];
thisArr[0] = (((color_2[0] - color_1[0]) / steps) * i) + color_1[0];
thisArr[1] = (((color_2[1] - color_1[1]) / steps) * i) + color_1[1];
thisArr[2] = (((color_2[2] - color_1[2]) / steps) * i) + color_1[2];
arr.push(thisArr);
}
return arr;
};
function drawGradientInAI(gradArr) {
var thisArr;
var thisColor;
var doc = app.activeDocument;
var yPos = 0;
var xPos = 0;
var width = 10;
var height = 40;
var newRect;
for (var i = 0; i < gradArr.length; i++) {
thisArr = gradArr;
thisColor = new RGBColor();
thisColor.red = Math.round(thisArr[i][0]);
thisColor.green = Math.round(thisArr[i][1]);
thisColor.blue = Math.round(thisArr[i][2]);
newRect = doc.pathItems.rectangle(yPos, xPos, width, height);
newRect.fillColor = thisColor;
xPos += width;
}
};
function drawGradientInScriptUI(gradArr, canvasArea) {
var canvas = canvasArea.graphics;
var yPos = 0;
var xPos = 0;
var width = 13;
var height = 40;
var thisArr;
for (var i = 0; i < gradArr.length; i++) {
thisArr = gradArr[i];
thisArr[0] = (thisArr[0] / 255).toFixed(2) * 1;
thisArr[1] = (thisArr[1] / 255).toFixed(2) * 1;
thisArr[2] = (thisArr[2] / 255).toFixed(2) * 1;
canvas.newPath();
canvas.rectPath(xPos, yPos, width, height);
var myBrush = canvas.newBrush(canvas.BrushType.SOLID_COLOR, [thisArr[0], thisArr[1], thisArr[2]]);
canvas.fillPath(myBrush);
canvas.closePath();
xPos += width;
}
};
var spacing = 8;
var margins = [0,10,0,0];
// This the second example, showing a dialog the gradient and interactive sliders
var res = """dialog {margins: 10, spacing: 15, orientation: 'column', alignChildren: ['fill','top'], text: 'Gradient Dialog',
p: Custom {preferredSize: [200, 50], alignment: ['fill','top'] }}"""
var w = new Window (res);
w.p.onDraw = function() {
drawGradientInScriptUI(makeRGBGradientArray(color_1, color_2, 20), this);
};
var g_sliders = w.add("group");
g_sliders.orientation = "row";
g_sliders.alignment = ["fill","top"];
var g_sliders_1 = g_sliders.add("group");
g_sliders_1.orientation = "column";
g_sliders_1.alignChildren = ["left","center"];
g_sliders_1.alignment = ["fill","top"];
var colOneLabel = g_sliders_1.add("statictext", undefined, undefined, {name: "colOneLabel"});
colOneLabel.alignment = ["fill","top"];
colOneLabel.text = " Color 1";
var g_sliders_2 = g_sliders.add("group");
g_sliders_2.orientation = "column";
g_sliders_2.alignChildren = ["left","center"];
g_sliders_2.alignment = ["fill","top"];
var colTwoLabel = g_sliders_2.add("statictext", undefined, undefined, {name: "colTwoLabel"});
colTwoLabel.alignment = ["fill","top"];
colTwoLabel.text = " Color 2";
var slider_1_rGrp = g_sliders_1.add("group");
slider_1_rGrp.orientation = "row";
slider_1_rGrp.alignment = ["fill","top"];
var colOneRlabel = slider_1_rGrp.add("statictext", undefined, undefined, {name: "colOneRlabel"}
);
colOneRlabel.text = "R";
var slider_1_r = slider_1_rGrp.add("slider");
slider_1_r.minvalue = 0;
slider_1_r.maxvalue = 255;
slider_1_r.value = color_1[0];
var slider_1_gGrp = g_sliders_1.add("group");
slider_1_gGrp.orientation = "row";
slider_1_gGrp.alignment = ["fill","top"];
var colOneGlabel = slider_1_gGrp.add("statictext", undefined, undefined, {name: "colOneRlabel"}
);
colOneGlabel.text = "G";
var slider_1_g = slider_1_gGrp.add("slider");
slider_1_g.minvalue = 0;
slider_1_g.maxvalue = 255;
slider_1_g.value = color_1[1];
var slider_1_bGrp = g_sliders_1.add("group");
slider_1_bGrp.orientation = "row";
slider_1_bGrp.alignment = ["fill","top"];
var colOneBlabel = slider_1_bGrp.add("statictext", undefined, undefined, {name: "colOneRlabel"}
);
colOneBlabel.text = "B";
var slider_1_b = slider_1_bGrp.add("slider");
slider_1_b.minvalue = 0;
slider_1_b.maxvalue = 255;
slider_1_g.value = color_1[2];
// Sliders color_2
var slider_2_rGrp = g_sliders_2.add("group");
slider_2_rGrp.orientation = "row";
slider_2_rGrp.alignment = ["fill","top"];
var colOneRlabel = slider_2_rGrp.add("statictext", undefined, undefined, {name: "colOneRlabel"}
);
colOneRlabel.text = "R";
var slider_2_r = slider_2_rGrp.add("slider");
slider_2_r.minvalue = 0;
slider_2_r.maxvalue = 255;
slider_2_r.value = color_2[0];
var slider_2_gGrp = g_sliders_2.add("group");
slider_2_gGrp.orientation = "row";
slider_2_gGrp.alignment = ["fill","top"];
var colOneRlabel = slider_2_gGrp.add("statictext", undefined, undefined, {name: "colOneRlabel"}
);
colOneRlabel.text = "G";
var slider_2_g = slider_2_gGrp.add("slider");
slider_2_g.minvalue = 0;
slider_2_g.maxvalue = 255;
slider_2_g.value = color_2[1];
var slider_2_bGrp = g_sliders_2.add("group");
slider_2_bGrp.orientation = "row";
slider_2_bGrp.alignment = ["fill","top"];
var colOneRlabel = slider_2_bGrp.add("statictext", undefined, undefined, {name: "colOneRlabel"}
);
colOneRlabel.text = "B";
var slider_2_b = slider_2_bGrp.add("slider");
slider_2_b.minvalue = 0;
slider_2_b.maxvalue = 255;
slider_2_b.value = color_2[2];
// Interactive sliders
slider_1_r.onChanging = slider_1_g.onChanging = slider_1_b.onChanging = slider_2_r.onChanging = slider_2_g.onChanging = slider_2_b.onChanging = function() {
color_1 = [slider_1_r.value, slider_1_g.value, slider_1_b.value];
color_2 = [slider_2_r.value, slider_2_g.value, slider_2_b.value];
w.p.notify('onDraw');
};
w.show();
};
callDialog();
Copy link to clipboard
Copied
Well done, and thanks !
About Custom UI Elements, can we add them without employing resource string ? Since you mixed ui code style, I guess the answer is : no ?
Copy link to clipboard
Copied
Looks like no. I have come across the use of such elements several times and have always been forced to create in this way.
Find more inspiration, events, and resources on the new Adobe Community
Explore Now