Окна InDesign ScriptUI исчезают сразу после появления

Прошло некоторое время с тех пор, как у меня была проблема с ExtendScript / ScriptUI, которая меня настолько ошеломила, что мне пришлось обратиться к экспертам. Полагаю, это значит, что я учусь! : ~)

Ниже приводится фрагмент кода, который я пытаюсь заставить работать. Теоретически он должен позволять открывать 1, 2 или 3 окна палитры (в зависимости от того, сколько операторов true в массиве pSpecial), затем ждать, пока пользователь выберет некоторые элементы в каждом из них, и нажать кнопку Continue в 4-м. палитра. Заранее прошу прощения за сложность этого. Я все еще относительно новичок во всем этом, поэтому код может быть немного трудным для понимания, но, вероятно, это можно было бы свести к простому открытию одной или двух простых палитр.

var aFoils = ["Choose one…", "-", "Shiny Gold", "Matte Gold", "Shiny Silver", "Matte Silver", "Copper", "Green", "Dark Purple", "Blue", "Teal", "Red", "Burgundy"];
var swatchObjects = ["123u", "871c", "Black"];
var pSpecial = [false, true, false];

// The xDelta variable specifies how far to move the palettes away from each other.
// xMove will be the X LOCATION for the new window.
var xDelta = 300;
var xMove;
var hsChecks = [], hsDropdowns = [], dbRadios = [], ebRadios = [];
var hotstampColors = [];
var debossColor, embossColor;

// If one of the specials is checked (hotstamp/deboss/emboss), then let's handle it.
// Define the Hotstamp window.
var hotstampWin = new Window("palette");
    hotstampWin.onShow = function ()
    {
        hotstampWin.location.x = xMove;
    }
    hotstampWin.add("statictext", undefined, "Please select Hotstamping foils:");
    var hsGroups = hotstampWin.add("group");
        var hsCheckGrp = hsGroups.add("group");
            hsCheckGrp.orientation = "column";
            hsCheckGrp.alignChildren = "left";
        var hsDDGrp = hsGroups.add("group");
            hsDDGrp.orientation = "column";
            hsDDGrp.alignChildren = "left";
            for (var h = 0; h < swatchObjects.length; h++)
            {
                hsChecks.push(hsCheckGrp.add("checkbox", undefined, swatchObjects[h]));
                hsDropdowns.push(hsDDGrp.add("dropdownlist", undefined, aFoils));
            }

// Define the Deboss window.
var debossWin = new Window("palette");
    debossWin.onShow = function ()
    {
        debossWin.location.x = xMove;
    }
    debossWin.add("statictext", undefined, "Please check which color is Debossed:");
    var dbGroup = debossWin.add("panel");
        for (var d = 0; d < swatchObjects.length; d++)
        {
            dbRadios.push(dbGroup.add("radiobutton", undefined, swatchObjects[d]));
        }

// Define the Emboss window.
var embossWin = new Window("palette");
    embossWin.onShow = function ()
    {
        embossWin.location.x = xMove;
    }
    embossWin.add("statictext", undefined, "Please check which color is Embossed:");
    var ebGroup = embossWin.add("panel");
        for (var e = 0; e < swatchObjects.length; e++)
        {
            ebRadios.push(ebGroup.add("radiobutton", undefined, swatchObjects[e]));
        }
// Define the window with the "Continue" button.
var continueWin = new Window("palette"/*, undefined, undefined, {borderless: true}*/);
    continueWin.onShow = function ()
    {
        continueWin.location.y = ($.screens[0].bottom / 2) - (continueWin.size[1] / 2) + 75 + (25 * swatchObjects.length);
    }
    var bContinue = continueWin.add("button", undefined, "Continue", {name: "ok"});
        bContinue.onClick = function ()
        {
            if (dbRadios.length > 0) {debossColor = selected_rbutton(dbGroup);}
            if (ebRadios.length > 0) {embossColor = selected_rbutton(ebGroup);}
            if (hsChecks.length > 0)
            {
                for (var j = 0; j < hsChecks.length; j++)
                {
                    if (hsChecks[j].value)
                    {
                        hotstampColors.push([swatchObjects[j], hsDropdowns[j].selection.text]);
                    }
                }
            }
            aSpecial[0].close();
            this.parent.close();
        }

function selected_rbutton (rbuttons)
{
    for (var i = 0; i < rbuttons.children.length; i++)
    {
        if (rbuttons.children[i].value == true) {return rbuttons.children[i].text;}
    }
}

var aSpecial = new Array;
if (pSpecial[0]) {aSpecial.push(hotstampWin);}
if (pSpecial[1]) {aSpecial.push(debossWin);}
if (pSpecial[2]) {aSpecial.push(embossWin);}

switch (aSpecial.length)
{
    case 1:
        aSpecial[0].show();
        xMove = ($.screens[0].right / 2) - (aSpecial[0].size[0] / 2);
        aSpecial[0].show();
        if (continueWin.show() == 1)
        {
            aSpecial[0].close();
            continueWin.close();
        }
        else
        {
            exit();
        }
        break;
    case 2:
        aSpecial[0].show();
        xMove = ($.screens[0].right / 2) - (aSpecial[0].size[0] / 2) - xDelta;
        aSpecial[0].show();
        aSpecial[1].show();
        xMove = ($.screens[0].right / 2) - (aSpecial[1].size[0] / 2) + xDelta;
        aSpecial[1].show();
        if (continueWin.show() == 1)
        {
            aSpecial[0].close();
            aSpecial[1].close();
            continueWin.close();
        }
        else
        {
            exit();
        }
        break;
    case 3:
        aSpecial[0].show();
        xMove = ($.screens[0].right / 2) - (aSpecial[0].size[0] / 2) - (xDelta * 1.5);
        aSpecial[0].show();
        aSpecial[1].show();
        xMove = ($.screens[0].right / 2) - (aSpecial[1].size[0] / 2);
        aSpecial[1].show();
        aSpecial[2].show();
        xMove = ($.screens[0].right / 2) - (aSpecial[2].size[0] / 2) + (xDelta * 1.5);
        aSpecial[2].show();
        if (continueWin.show() == 1)
        {
            aSpecial[0].close();
            aSpecial[1].close();
            aSpecial[2].close();
            continueWin.close();
        }
        else
        {
            exit();
        }
        break;
    default:
        break;
}

Проблема, с которой я столкнулся с этим кодом, заключается в том, что при запуске палитры открываются, а затем немедленно закрываются. Нет возможности взаимодействия с пользователем. Почему они закрываются?

Кроме того, я попытался изменить одно или несколько окон на тип dialog, но затем это окно вступает во владение и не позволяет пользователю взаимодействовать с другими, пока это окно не будет закрыто.

Я также открыт для других идей, таких как объединение всего в одно диалоговое окно, но тогда я бы хотел, чтобы его размер изменялся динамически в зависимости от того, сколько "true" находится в этом массиве pSpecial.


person Sturm    schedule 29.08.2013    source источник


Ответы (1)


Если запустить из ESTK, то работает. По крайней мере, в моем IDCC.

Но чтобы он запускался из панели сценариев ID, вам нужно добавить:

#targetengine'foo';

в начале вашего скрипта. (или любой другой targetengine) Имейте в виду, что все глобальные объекты в #targetengine 'foo' будут существовать, пока вы не закроете InDesign. Итак, вы должны превратить ваш скрипт в функцию. Также я бы рекомендовал использовать return вместо exit()

person fabianmoronzirfas    schedule 30.08.2013
comment
У нас здесь только InDesign CS6, и он демонстрирует это поведение на панели сценариев и ESTK. Ваше дополнение позволяет ему работать сейчас, спасибо. Я предполагаю, что под «глобальными переменными» вы подразумеваете все те переменные, объявленные в начале сценария, а также четыре палитры, определенные в первой половине сценария. Что ж, все это будет заключено в функцию в основном скрипте, так что я думаю, что все в порядке. Думаю, я, вероятно, переделаю все это заново, поместив все это в одно dialog окно, так как у меня есть некоторые идеи, как сделать это не так уродливо. Спасибо за помощь, @fabiantheblind! - person Sturm; 30.08.2013