Indicando progresso de um script no InDesign
A API JavaScript para InDesign provê diversos objetos de controle (control objects, se você for procurar no JavaScript Tools Guide) para criação de formulários e interfaces de usuário.
Quando desenvolvo algum script que efetua operações por muito tempo, deixando o InDesign inacessível, acho de bom tom exibir algum indicador de progresso. Isso evita, por exemplo, que o usuário termine o software prematuramente, acreditando que o processamento travou a máquina.
Num projeto grande, o uso de barras de progresso vai ser comum. Para simplificar a criação e exibição dessa ferramenta, eu criei um objeto prototípico que demanda dois valores somente: até onde contar – end – e a mensagem a ser exibida – message.
A função é a showProgress(end, message)
. Para utilizá-la, você vai precisar instanciá-la da seguinte maneira (exemplo):
var progresso = new showProgress(50, 'Teste de progresso');
Para exibir e fazer a barrinha se mover é necessário invocar o método pump()
do objeto:
progresso.pump()
Cada “bombeada” irá fazer o indicador de progresso se mover um certo percentual adequado ao número de itens a serem contados. Ou seja, se você tiver fornecido o valor quatro para o argumento end, cada pump()
ira mover a barra em 25%.
Onde usar a bomba? Dentro de alguma estrutura de controle, a.k.a. for(...)
. Por exemplo,
for (var i = 0; i < 4; i++) progresso.pump();
Escrevi um scriptzinho pra demonstrar isso melhor e pra ser alterado à vontade. Para usá-lo, salve o código mais abaixo num arquivo com extensão .jsx, clique duas vezes e autorize a execução.
O código é esse aqui, ó:
#target 'indesign'; #targetengine 'progress'; progressTest(); function progressTest(){ // VARIABLES var end = parseInt(Math.random() * 1000); var delay = parseInt(Math.random() * 50); var progress = new showProgress(end, 'Teste de progresso'); alert('Teste de barra de progresso para InDesign\n\nNúmero (aleatório) de itens: ' + end + '\nDelay (aleatório) entre itens: ' + delay + ' milisec.\n\nDaniel Dutra\nblogdofoobar.wordpress.com'); for(var i = 0; i < end; i++){ progress.pump(); $.sleep(delay); } } // End UI progressTest_UI /** * Show progress * @param end * @param message */ function showProgress(end, message){ // METHODS showProgress.prototype.pump = pump; // DIALOG LAYOUT this.dlg = new Window('palette', String(message));{ this.dlg.orientation = 'column'; this.dlg.alignChildren = 'center'; this.dlg.alignment = 'center'; } // Extra methods this.close = this.dlg.close; // CONTROL OBJECTS this.dlg.progress = this.dlg.add('progressbar', undefined, 0, end);{ this.dlg.progress.size = [200, 20]; } this.dlg.status = this.dlg.add('statictext', undefined);{ this.dlg.status.characters = 15; } this.dlg.center(); this.dlg.show(); /** * Increment dialog progress bar * @return */ function pump(){ // VARIABLES var currentValue = this.dlg.progress.value + 1; var currentProgress = (100 * currentValue) / end; if(currentValue < end){ var text = 'Progresso: '+currentProgress.toFixed(1)+'%'; this.dlg.status.text = text; this.dlg.progress.value = this.dlg.progress.value + 1; } else this.dlg.close(); } // End function pump } // End function showProgress