[AI CC-CC2023] Вопрос по ScriptUI. Как сделать кнопку switch?

romaya

Топикстартер
10 лет на форуме
Сообщения
334
Реакции
41
Всем привет! Вопрос в теме топика. Нужно на ScriptUI сделать кнопку/переключатель для инверсии значений полей ввода.

JavaScript:
// Нижний клапан
  var lowerValveGroup = valveContainer.add("group");
  lowerValveGroup.orientation = "column";
  lowerValveGroup.alignChildren = "center";
  lowerValveGroup.spacing = 5;
  lowerValveGroup.add("statictext", undefined, "Нижний");
  var lowerValveInput = lowerValveGroup.add("edittext", undefined, "1.5");
  lowerValveInput.characters = 8;
  lowerValveInput.active = true;

  // Кнопка switch
  var switchGroup = valveContainer.add("group");
  switchGroup.orientation = "column";
  switchGroup.alignChildren = "center";
  var switchButton = switchGroup.add("iconbutton", undefined, undefined, {name: 'switch'});
  switchButton.size = [30, 30];
  var switchText = switchGroup.add("statictext", undefined, "⇄");
  switchText.graphics.font = ScriptUI.newFont("Helvetica", "BOLD", 16);

  // Верхний клапан
  var topValveGroup = valveContainer.add("group");
  topValveGroup.orientation = "column";
  topValveGroup.alignChildren = "center";
  topValveGroup.spacing = 5;
  topValveGroup.add("statictext", undefined, "Верхний");
  var topValveInput = topValveGroup.add("edittext", undefined, "4");
  topValveInput.characters = 8;

JavaScript:
  // Обработчик кнопки switch для инверсии значений
  switchButton.onClick = function() {
    var temp = lowerValveInput.text;
    lowerValveInput.text = topValveInput.text;
    topValveInput.text = temp;
    updateSleeveWidth();
  };

Написал такой код, но кнопка переключения отдельно, сам символ "⇄" отдельно, мне надо как-то объединить их. Как это можно сделать, может кто-нибудь подскажет?
 
Ну да, из кода видно должно быть. Собственно и кнопка то не нужна, просто как повесить обработчик на statictext я не знаю.
 
Вот скриншот, чтобы было наглядно понятно в чем засада.

1766402386901.png
 
Не помню, есть ли вообще в скриптовом UI люстры кнопка типа switch.
Давным-давно делал так:

1. создается группа, в которой картинки двух состояний кнопки вкл и выкл, - одна кнопка под другой
Код:
aaa2: Group { orientation: 'stack', \
b1: IconButton { icon:'"+app.path+"/Presets/en_US/Scripts/buttons/ru1.png' , size:[41, 20] }, \
b2: IconButton { icon:'"+app.path+"/Presets/en_US/Scripts/buttons/rd1.png' , size:[41, 20] }, \
}, \
2. при создании основного окна программы дальше в коде, одна кнопка скрывается ....b1.visible=false, а другая показывается ....b2.visible=true
3. в обработчиках обеих кнопок - меняем состояние видимости кнопок и запоминаем в глобальной переменной это состояние, которое потом используем где-то дальше в коде
 
Последнее редактирование:
Не помню, есть ли вообще в скриптовом UI люстры кнопка типа switch.
Давным-давно делал так:

1. создается группа, в которой картинки двух состояний кнопки вкл и выкл, - одна кнопка под другой
Код:
aaa2: Group { orientation: 'stack', \
b1: IconButton { icon:'"+app.path+"/Presets/en_US/Scripts/buttons/ru1.png' , size:[41, 20] }, \
b2: IconButton { icon:'"+app.path+"/Presets/en_US/Scripts/buttons/rd1.png' , size:[41, 20] }, \
}, \
2. при создании основного окна программы дальше в коде, одна кнопка скрывается ....b1.visible=false, а другая показывается ....b2.visible=true
3. в обработчиках обеих кнопок - меняем состояние видимости кнопок и запоминаем в глобальной переменной это состояние, которое потом используем где-то дальше в коде
Мне собственно не нужно менять состояние кнопок. Текстового символа "⇄" достаточно, нужно только на него как-то обработчик повесить.
 
навесить на statictext обработчик можно так:

допустим statictext
Код:
ed1: EditText { preferredSize: [92, 20], text:'имя', justify:'center' } \

навешиваем
Код:
бла-бла.ed1.addEventListener ("click", function (k) {eee (k)});

внутри функции что-то делаем
Код:
function eee (p)
{
 alert ("жмакнул по statictext");
}

ЗЫ. Но, лично у меня в люстре, это будет срабатывать если нажимаешь мышкой только где-то в этом районе statictext
1766404998533.png

а если по центру щелкать - то ничего не будет происходить. Заморачиваться и разбираться почему так это происходит я забил уже давно, работает и ладно, а что там индусы накодили, что это так - хз
 
Последнее редактирование:
  • Спасибо
Реакции: romaya
Можно обычную кнопку и onClick, только задать габариты кнопки. Не iconbutton. Можно статичный текст и на него событие мышки в прослушиватель.

JavaScript:
(function(){
  // DIALOG
  var win = new Window("dialog");
      win.text = "Dialog";
      win.orientation = "column";
      win.alignChildren = ["center","top"];

  var group1 = win.add("group");
      group1.orientation = "row";
      group1.alignChildren = ["left","center"];

  var edittext1 = group1.add("edittext", undefined, "30");
      edittext1.preferredSize.width = 40;

  var switchBtn = group1.add("button", undefined, "⇄");
      switchBtn.preferredSize.width = 30;
      switchBtn.preferredSize.height = 30;

  var edittext2 = group1.add("edittext", undefined, "10");
      edittext2.preferredSize.width = 40;

  var group2 = win.add("group");
      group2.orientation = "row";
      group2.alignChildren = ["left","center"];

  var edittext3 = group2.add("edittext", undefined, "30");
      edittext3.preferredSize.width = 40;

  var switchLabel = group2.add("statictext", undefined, "⇄");

  var edittext4 = group2.add("edittext", undefined, "10");
      edittext4.preferredSize.width = 40;

  var closeBtn = win.add("button", undefined, "Close", {name: "ok"});

  // EVENTS
  switchBtn.onClick = function () {
    var temp = edittext1.text;
    edittext1.text = edittext2.text;
    edittext2.text = temp;
    this.active = true;
    this.active = false;
  };

  switchLabel.addEventListener('mousedown', function () {
    var temp = edittext3.text;
    edittext3.text = edittext4.text;
    edittext4.text = temp;
  });

  closeBtn.onClick = win.close;

  win.show();
})();
 

Вложения

  • switch.gif
    switch.gif
    65.6 КБ · Просм.: 19
Спасибо, попробую, если первый вариант не прокатит.
 
Первый вариант подошел, всем спасибо. Ниже рабочий код.

JavaScript:
// Нижний клапан
  var lowerValveGroup = valveContainer.add("group");
  lowerValveGroup.orientation = "column";
  lowerValveGroup.alignChildren = "center";
  var lowerValveInput = lowerValveGroup.add("edittext", undefined, "1.5");
  lowerValveInput.characters = 8;
  lowerValveInput.active = true;

  // Кнопка switch
  var switchGroup = valveContainer.add("group");
  switchGroup.orientation = "column";
  switchGroup.alignChildren = "center";

  // Создаем сам элемент кнопки (статический текст)
  var switchButton = switchGroup.add("statictext", undefined, "⇄");
  switchButton.graphics.font = ScriptUI.newFont("Helvetica", "BOLD", 16);

  // Добавляем обработчик клика
  switchButton.addEventListener("click", function() {
    var temp = lowerValveInput.text;
    lowerValveInput.text = topValveInput.text;
    topValveInput.text = temp;
    updateSleeveWidth();
  });

  // Верхний клапан
  var topValveGroup = valveContainer.add("group");
  topValveGroup.orientation = "column";
  topValveGroup.alignChildren = "center";
  var topValveInput = topValveGroup.add("edittext", undefined, "4");
  topValveInput.characters = 8;

Тему можно закрывать.
 
Последнее редактирование:
Для какой версии Иллюстратора скрипт? Потому что с СС 2014 смысла нет в строке switchButton.graphics.font = ScriptUI.newFont("Helvetica", "BOLD", 16); . Стилизацию текста в диалогах отключили/забыли/перестали поддерживать адобовцы.
 
Тестировал в 23.0.3 и 25.2 версиях, в смысле в AI 2019 и 2021. Все работает, переключается туда-сюда.
 
Последнее редактирование:
Символ тоже отображается корректно.
 
Символ без этой строки будет отображаться. Я про другое: ScriptUI.newFont до CC 2014 позволяла кастомизировать шрифт в диалоге: жирноту, семейство, размер. С СС 2015 версии эта строка бесполезна в скриптах — шрифт принудительно стандартный в скриптовых диалогах теперь выводится.
newFont.jpg
 
Последнее редактирование:
  • Печаль
  • Спасибо
Реакции: Flame и romaya
Да, действительно так. Без нее тоже все прекрасно работает.

У меня другая проблема, с выпадающим списком, в нем три элемента, в AI 2021 все работает корректно, а в AI 2019 почему-то только два элемента отображаются. Не пойму почему так происходит. Ниже код.

JavaScript:
  // 3. Параметры шва с рамкой
  var seamPanel = dialog.add("panel", undefined, "Параметры шва");
  seamPanel.orientation = "column";
  seamPanel.alignChildren = "left";
  seamPanel.spacing = 10;
  seamPanel.margins = 15;

  var seamLocationGroup = seamPanel.add("group");
  seamLocationGroup.orientation = "row";
  seamLocationGroup.spacing = 10;
  seamLocationGroup.add("statictext", undefined, "Расположение:");

  var seamLocation = seamLocationGroup.add("dropdownlist", undefined, [
    "Шов посередине рукава",
    "Со смещением от левого края этикетки",
    "Со смещением от правого края этикетки"
  ]);
  seamLocation.selection = 0;

  var seamShiftGroup = seamPanel.add("group");
  seamShiftGroup.spacing = 10;
  seamShiftGroup.add("statictext", undefined, "Смещение шва (мм):");
  var seamShiftInput = seamShiftGroup.add("edittext", undefined, "");
  seamShiftInput.characters = 10;
  seamShiftInput.enabled = false;

  // Обработчик изменения выбора расположения шва
  seamLocation.onChange = function() {
    seamShiftInput.enabled = (this.selection.index > 0);
    if (seamShiftInput.enabled) {
      seamShiftInput.active = true;
    }
  };

Может тоже что-то посоветуете. Для UI я поленился сам код писать, ИИ отдал.
 
Из кода должно и так быть понятно, но вот скриншоты для полной ясности.
 

Вложения

  • 1.PNG
    1.PNG
    8.9 КБ · Просм.: 16
  • 2.PNG
    2.PNG
    7.1 КБ · Просм.: 17
Включено в 2019 масштабирование интерфейса для монитора?

1766560830634.png
 
Вроде как да.

1766561012841.png
 
Да, проблема в этом. У меня в системе дисплей масштабируется, если выбрать 100%, без масштабирования, то все три пункта видны в AI 2019, но тогда все остальные элементы интерфейса станут малюсенькими. В принципе клавишами можно выбрать третий пункт, если не заморачиваться.

1766561708345.png
 
В CC 2019 впервые этот слайдер масштабирования появился в настройках Иллюстратора и, когда слайдер сдвинут вправо, то есть больше 100% интерфейс Иллюстратора, был новый баг. В скриптовых окнах как раз в dropdownlist обрезались пункты списка. В CC 2020 и новее это Адоб узнали и пофиксили. Я писал об этом заметку в блоге. Поэтому в 2021 версии все нормально, так как через год Адоб исправили.

Кстати, спасибо за находку с масштабированием на уровне операционной системы. Я добавлю это в статью, что даже не в Иллюстраторе 2019, а в ОС масштаб влияет на выпадающий список. Хотя СС 2019 старая версия, но кто-то все равно ей пользуется и скрипты в ней запускает
 
Последнее редактирование:
  • Спасибо
Реакции: romaya
Конечно, добавляйте) Рад помочь.