/*
QuickToolsPanel.jsx
Dockable ScriptUI Panel for Quick Layer Creation, Keyframing, and Effect Application
*/
(function (thisObj) {
function buildUI(thisObj) {
var pal = (thisObj instanceof Panel) ? thisObj : new Window("palette", "Quick Tools", undefined, { resizeable: true });
if (pal === null) return pal;
// Root Layout
pal.orientation = "column";
pal.alignChildren = ["fill", "top"];
pal.spacing = 8;
pal.margins = 10;
// --- HEADER ---
var headerGrp = pal.add("group");
headerGrp.orientation = "vertical";
headerGrp.alignChildren = ["center", "center"];
headerGrp.alignment = ["fill", "top"];
var title = headerGrp.add("statictext", undefined, "QUICK TOOLS");
title.graphics.font = ScriptUI.newFont("Tahoma", "BOLD", 12);
// --- LAYER CREATION PANEL ---
var layerGroup = pal.add("panel", undefined, "Create Layers");
layerGroup.orientation = "column";
layerGroup.alignChildren = ["fill", "top"];
layerGroup.alignment = ["fill", "top"];
layerGroup.spacing = 6;
var btnWhiteSolid = layerGroup.add("button", undefined, "Add White Solid");
var btnBlackSolid = layerGroup.add("button", undefined, "Add Black Solid");
var btnAdj = layerGroup.add("button", undefined, "Add Adjustment Layer");
var btnNull = layerGroup.add("button", undefined, "Add Null");
// --- KEYFRAMES & UTILITIES PANEL ---
var animGroup = pal.add("panel", undefined, "Animation Tools");
animGroup.orientation = "column";
animGroup.alignChildren = ["fill", "top"];
animGroup.alignment = ["fill", "top"];
animGroup.spacing = 6;
var btnFade = animGroup.add("button", undefined, "Add Opacity Fade In/Out");
// --- EFFECTS PANEL ---
var fxGroup = pal.add("panel", undefined, "Apply Effects");
fxGroup.orientation = "column";
fxGroup.alignChildren = ["fill", "top"];
fxGroup.alignment = ["fill", "top"];
fxGroup.spacing = 6;
var btnBlur = fxGroup.add("button", undefined, "Gaussian Blur");
var btnGlow = fxGroup.add("button", undefined, "Glow");
var btnCurves = fxGroup.add("button", undefined, "Curves");
var btnHueSat = fxGroup.add("button", undefined, "Hue / Saturation");
// --- HELPER FUNCTIONS ---
function getActiveComp() {
var comp = app.project.activeItem;
if (!comp || !(comp instanceof CompItem)) {
alert("Please select or open an active composition.");
return null;
}
return comp;
}
function applyEffectToSelected(matchName, displayName) {
var comp = getActiveComp();
if (!comp) return;
var selectedLayers = comp.selectedLayers;
if (selectedLayers.length === 0) {
alert("Please select at least one layer to apply " + displayName + ".");
return;
}
app.beginUndoGroup("Apply " + displayName);
for (var i = 0; i < selectedLayers.length; i++) {
var layer = selectedLayers[i];
var effects = layer.property("ADBE Effect Parade");
try {
effects.addProperty(matchName);
} catch (e1) {
try {
effects.addProperty(displayName);
} catch (e2) {
alert("Could not apply " + displayName + " to layer: " + layer.name);
}
}
}
app.endUndoGroup();
}
// --- BUTTON ACTIONS ---
// 1. Add White Solid
btnWhiteSolid.onClick = function () {
var comp = getActiveComp();
if (!comp) return;
app.beginUndoGroup("Add White Solid");
comp.layers.addSolid([1, 1, 1], "White Solid", comp.width, comp.height, comp.pixelAspect, comp.duration);
app.endUndoGroup();
};
// 2. Add Black Solid
btnBlackSolid.onClick = function () {
var comp = getActiveComp();
if (!comp) return;
app.beginUndoGroup("Add Black Solid");
comp.layers.addSolid([0, 0, 0], "Black Solid", comp.width, comp.height, comp.pixelAspect, comp.duration);
app.endUndoGroup();
};
// 3. Add Adjustment Layer
btnAdj.onClick = function () {
var comp = getActiveComp();
if (!comp) return;
app.beginUndoGroup("Add Adjustment Layer");
var adj = comp.layers.addSolid([1, 1, 1], "Adjustment Layer", comp.width, comp.height, comp.pixelAspect, comp.duration);
adj.adjustmentLayer = true;
app.endUndoGroup();
};
// 4. Add Null
btnNull.onClick = function () {
var comp = getActiveComp();
if (!comp) return;
app.beginUndoGroup("Add Null Layer");
comp.layers.addNull();
app.endUndoGroup();
};
// 5. Add Fade In / Fade Out Keyframes
btnFade.onClick = function () {
var comp = getActiveComp();
if (!comp) return;
var selectedLayers = comp.selectedLayers;
if (selectedLayers.length === 0) {
alert("Please select at least one layer to add fade keyframes.");
return;
}
app.beginUndoGroup("Add Opacity Fade Keyframes");
for (var i = 0; i < selectedLayers.length; i++) {
var layer = selectedLayers[i];
var opacityProp = layer.property("ADBE Transform Group").property("ADBE Opacity");
var inTime = layer.inPoint;
var outTime = layer.outPoint;
var layerDuration = outTime - inTime;
var fadeInEndTime = inTime + 1.0;
var fadeOutStartTime = outTime - 2.0;
// Handles layers shorter than 3 seconds proportionally
if (layerDuration < 3.0) {
fadeInEndTime = inTime + (layerDuration * 0.33);
fadeOutStartTime = inTime + (layerDuration * 0.67);
}
opacityProp.setValueAtTime(inTime, 0);
opacityProp.setValueAtTime(fadeInEndTime, 100);
opacityProp.setValueAtTime(fadeOutStartTime, 100);
opacityProp.setValueAtTime(outTime, 0);
}
app.endUndoGroup();
};
// 6. Add Gaussian Blur
btnBlur.onClick = function () {
applyEffectToSelected("ADBE Gaussian Blur 2", "Gaussian Blur");
};
// 7. Add Glow
btnGlow.onClick = function () {
applyEffectToSelected("ADBE Glo2", "Glow");
};
// 8. Add Curves
btnCurves.onClick = function () {
applyEffectToSelected("ADBE CurvesCustom", "Curves");
};
// 9. Add Hue / Saturation
btnHueSat.onClick = function () {
applyEffectToSelected("ADBE Hue Saturation", "Hue/Saturation");
};
// --- RESPONSIVE LAYOUT BINDINGS ---
pal.onResized = function () {
pal.layout.resize();
};
pal.layout.layout(true);
return pal;
}
var myPanel = buildUI(thisObj);
if (myPanel instanceof Window) {
myPanel.center();
myPanel.show();
}
})(this);