ScriptUI: Два события на одну кнопку в зависимости от Shift

Статус
Закрыто для дальнейших ответов.

Eugenyus

Модератор
Топикстартер
12 лет на форуме
Сообщения
1 960
Реакции
3 588
Подскажите, как в окне типа palette на одну кнопку повесить два варианта событий в зависимости от того, нажата ли кнопка с Shift-ом или без него. Я так понимаю, надо обрабатывать два события: keydown и mousedown, а как собрать до кучи, сообразить не могу. У кого есть пример реализации такого кода, просьба поделиться. Спасибо.
 

iv-mi

15 лет на форуме
Сообщения
546
Реакции
352
Ответ: ScriptUI: Два события на одну кнопку в зависимости от Shift

Евгений, а вот перевод из той книги Питера Карела не поможет?

Мониторинг клавиатуры
Для отслеживания работы с клавиатурой определим перехватчик события (event listener) при помощи события keydown. Вот скрипт, демонстрирующий некоторые свойства этого события работы с клавиатурой (скрипт работать не будет, если не будет явного указания, что он исполняется не в ESTK, а в программе InDesign — для объявления этого в тексте скрипта должна строка #target indesign):
#target indesign
var w = new Window ("dialog");
var edit = w.add ("edittext");
edit.active = true;
edit.characters = 30;
w.addEventListener ("keydown", function (kd) {pressed (kd)});
function pressed (k)
{
$.writeln (k.keyName);
$.writeln (k.keyIdentifier);
$.writeln (k.shiftKey ? "Shift pressed" : "Shift not pressed");
$.writeln (k.altKey ? "Alt pressed" : "Alt not pressed");
$.writeln (k.ctrlKey ? "Ctrl pressed" : "Ctrl not pressed");
}
w.show ();

У каждой клавиши есть имя (А, D, Space, Shift, …) и код (шестнадцатеричное значение в формате U+0000 или имя, если это одна из управляющих клавиш), если клавиша нажата одновременно с управляющей клавишей, то выводится информация об этом.
Следующий скрипт отображает список, в котором можно перемещаться с помощью клавиш _ стрелка_вверх/стрелка вниз или PgUp/PgDn. При нажатии на клавишу PgUp выбирается первая строка списка, при нажатии PgDn — последняя.

var w = new Window ("dialog");
var list = w.add ("listbox", undefined, ["one", "two", "three", "four"]);
list.selection = 0;
w.addEventListener ("keydown", function (k) {move_highlight (k.keyName)});
function move_highlight (key)
{
function go_down ()
{
if (list.selection.index < list.items.length-1)
list.selection = list.selection.index+1;
else
list.selection = 0;
} // go_down
function go_up ()
{
if (list.selection.index == 0)
list.selection = list.items.length-1;
else
list.selection = list.selection.index-1;
} // go_up
switch (key)
{
case "Up": go_up (); break;
case "PageUp": list.selection = 0; break;
case "PageDown": list.selection = list.items.length-1; break;
case "Down": go_down (); break;
}
}
w.show ();
 

Eugenyus

Модератор
Топикстартер
12 лет на форуме
Сообщения
1 960
Реакции
3 588
Ответ: ScriptUI: Два события на одну кнопку в зависимости от Shift

Не хочет оно у меня с набега работать так, как мне надо. Придется досуг выделять, плотно разбираться. Как получится, отпишусь, а пока решил задачу другим путём. Спасибо.
 

Eugenyus

Модератор
Топикстартер
12 лет на форуме
Сообщения
1 960
Реакции
3 588
Ответ: ScriptUI: Два события на одну кнопку в зависимости от Shift

Получилось!
Вот простейший пример: по нажатию на кнопку без удержания Shift-а выделенный текст берётся в обычные скобки (); с Shift-ом — в квадратные []:
Код:
#targetengine "skobki";
var mySKey = false;

var w = new Window ("palette");
var myBut = w.add("button",undefined,"() <=> []");

myBut.addEventListener ("keydown", function (kd) {pressed (kd)});

function pressed (k){
	if (k.keyName == "Shift"){
        mySKey = true;
        }
	}

myBut.onClick = function(){
    if (mySKey){
        app.activeDocument.selection[0].insertionPoints[-1].contents = "]";
        app.activeDocument.selection[0].insertionPoints[0].contents = "[";
        mySKey = false;
        }
    else{
        app.activeDocument.selection[0].insertionPoints[-1].contents = ")";
        app.activeDocument.selection[0].insertionPoints[0].contents = "(";
        mySKey = false;
        }
    app.activate();
    }
w.show();
 

Skvoznyak

15 лет на форуме
Сообщения
5 478
Реакции
2 158
Ответ: ScriptUI: Два события на одну кнопку в зависимости от Shift

надо еще у самой кнопки по нажатию на shift текст менять )
 

Eugenyus

Модератор
Топикстартер
12 лет на форуме
Сообщения
1 960
Реакции
3 588
Ответ: ScriptUI: Два события на одну кнопку в зависимости от Shift

При таком алгоритме, наверное, и не получится. Всё, чего я добился, это при нажатом shift-e смена текста в момент нажатия кнопки мыши и возвращение исходного текста в момент отпускания. А вот как менять текст именно в момент нажатия shift-a — вопрос.
 
Статус
Закрыто для дальнейших ответов.