Copy link to clipboard
Copied
I built a ScriptUI palette, that calls a function, which takes some time to finnish.
While the function is running, I want to show, whats going on.
To archive this, I tried to change staticText in the palette, before running the function.
Unfortunately, the updated text only is shown after the function has finished. Here’s my code:
var dialog = new Window("palette");
var st_processing = dialog.add("statictext", undefined, undefined, {name: "st_processing", truncate: "end"});
st_processing.text = "";
st_processing.preferredSize.width = 240;
var ok = dialog.add("button", undefined, undefined, {name: "ok"});
ok.text = "OK";
ok.onClick = function(){
st_processing.text = "Doing something …";
function_one();
// st_processing.text = "";
// function_two();
// dialog.close();
};
dialog.show();
function function_one(){
// do sth.
}
If I un-comment the last three lines in the onClick function, I don’t see anything.
The way it is now, the function is run and the text is updated only after the function has finnished.
I tried changing the size of staticText (similar to what Peter Karel is describing in »Fixing display problems in listbox controls« on p 40 in his ScriptUI tutorial).
st_processing.text = "Doing something …";
var s = st_processing.size;
st_processing.size = [s[0] + 1, s[1] + 1];
st_processing.size = s;
Unfortunately this doesn’t help.
I also tried this:
st_processing.text = "Doing something …";
st_processing.refresh();
This does actually show the message immediately.
But this way the function is never run.
Is there a way, to show the updated text immediately?
Thanks for any suggestions,
Martin
Try with a different button.
The ok and close buttons are detected by name and handled differently.
Have you already used the function update() ? I don't know whether it still works.
Below a screenshot from the Javascript Tools Guide.
Note also the third paragraph of show(), for your modal dialog experiments.
You'd enter some values in the dialog and perform your actual changes after show() returns.
Copy link to clipboard
Copied
If you want the prompt to appear before you click OK, you should make it part of the dialog, not of the callback.
Copy link to clipboard
Copied
Thanks for your feedback. Maybe I didn’t explain it well. I want this to happen:
So adding the text to the dialog doesn’t do what I want.
For now, I tried to change the text before the function is run (as shown in my example code).
I also tried to change it from within "function_one()", but this didn’t change the behaviour.
- Martin
Copy link to clipboard
Copied
Aha, ok. Then make the prompt part of the called function, not of the callback:
ok.onClick = function(){
function_one();
// function_two();
// dialog.close();
};
dialog.show();
function function_one(){
st_processing.text = "Doing something …";
// Do something
st_processing.text = "";
}
Copy link to clipboard
Copied
HI @Peter Kahrel! I tried this before, without success.
Just to be sure, I made another attempt. Still doesn’t work.
To see what’s going on, I added a bunch of alerts:
ok.onClick = function(){
alert("1 " + st_processing.text);
function_one();
alert("4 " + st_processing.text);
};
dialog.show();
function function_one(){
st_processing.text = "Doing something …";
alert("2 " + st_processing.text);
// Do something
st_processing.text = "";
alert("3 " + st_processing.text);}
With the alerts it does exactly what one would expect:
As soon as I remove the alerts, it’s going back to the way it behaved before.
This is in noy way critical, so I think I will just leave it as it is (without any feedback on progress).
Thanks, Martin
Copy link to clipboard
Copied
Ok, one last shot then. It works ok for me (if I understand it correctly). Open the Pages panel, then use the below amendments. I added sleeps so that you can actually see what happens. When I run this, I can see the prompts change when the functions are called.
ok.onClick = function(){
function_one();
function_two();
};
function function_one(){
st_processing.text = "Doing something …";
var d = app.documents.add();
for (var i = 0; i < 10; i++) {
d.pages.add();
$.sleep(140);
}
st_processing.text = "";
}
function function_two(){
st_processing.text = "Doing something else …";
var p = app.documents[0].pages.everyItem().getElements();
for (var i = p.length-1; i > 0; i--) {
p[i].remove();
$.sleep(140);
}
st_processing.text = "";
}
Copy link to clipboard
Copied
I’m pretty sure, when I tried, I did exactly what you do in function_one(), but It didn’t work at all, when I tried it.
With your script, it immediately shows »Doing something …«.
But it never shows »Doing something else …«.
I did keep my dialog code, removed everything else and added your two functions.
Besides that, I did restart InDesign, to make sure, there’s nothing in memory that could interfere.
However, when I change your function_one() to app.documents[0], it doesn’t work either:
// var d = app.documents.add();
var d = app.documents[0];
It seems to me, like InDesign only updates if something changes in the UI (like an alert or a new doc). For my script this could actually do it:
For now, I’m only working on the active document. But the main goal of my script is, to open all documents of a book (seperately) and find some information. In a second step, I will open the documents again and modify said information.
With what I found out with your help, I think it’s very likely, I get an visible update of my window for each opened document.
I still don’t understand, why you see »Doing something else …«, and I don’t.
Thank’s again,
Martin
Copy link to clipboard
Copied
Try with a different button.
The ok and close buttons are detected by name and handled differently.
Have you already used the function update() ? I don't know whether it still works.
Below a screenshot from the Javascript Tools Guide.
Note also the third paragraph of show(), for your modal dialog experiments.
You'd enter some values in the dialog and perform your actual changes after show() returns.
Copy link to clipboard
Copied
Thanks a lot!
window.update() did the trick.
It is so much nicer, if the panel can give some feedback.
Martin