Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » Korrektes Schließen von ScriptUI Dialogen?

Korrektes Schließen von ScriptUI Dialogen?

JeT
Beiträge gesamt: 40

21. Sep 2018, 20:44
Bewertung:

gelesen: 3878

Beitrag als Lesezeichen
Hallo zusammen,

ich komm gerade nicht klar – ich bastel an einem Script, was mir u. a. ermöglicht eine ausgewählte Verknüpfung zu verschieben.

Problem: Das Relinken nach dem Verschieben klappt nicht, weil InDesign den Dialog anscheinend nicht korrekt zu schließen scheint:

Zitat Fehler: Die Anforderung kann nicht bearbeitet werden, da ein modales Dialogfeld oder eine modale Warnmeldung aktiv ist.


Ich könnte jetzt Window("palette") nutzen – das ist aber eigentlich nicht das, was ich will.


Hat jemand eine Idee?



Hier eine aufs nötigste reduzierte Variante:

Code
(function() { 
var gDoc = app.activeDocument;

if ((gDoc.allGraphics.length != 0) && (app.selection.length == 1)) {
switch (app.selection[0].constructor.name) {
case "Rectangle":
case "Oval":
case "Polygon":
if (app.selection[0].graphics.length != 0){
var cLink = app.selection[0].graphics.item(0).itemLink;
}
break;
case "Image":
case "EPS":
case "PDF":
var cLink = app.selection[0].itemLink;
break;
}
}

dialog(cLink);

function dialog(cLink) {
var dialog = new Window("dialog", "Verknüpfung verwalten");
var moveButton = dialog.add('button {text: "Datei zur indd verschieben..."}');
moveButton.onClick = function () { dialog.close(); moveLink(cLink); }

dialog.show();
}

function moveLink (cLink) {
if (cLink.status != LinkStatus.NORMAL) return;
if (gDoc.saved == true) var targetFolder = gDoc.filePath;
else {
var targetFolder = Folder(Folder.desktop).selectDlg();
if (targetFolder == null) exit();
}

var newFile = File(targetFolder.fsName+"/"+cLink.name);
if (!newFile.exists){
var cFile = File(cLink.filePath);
var copyMe = cFile.copy(newFile);
if (copyMe == true) {
try { cLink.relink(newFile); } catch(e) { alert(e); }
// cFile.remove();
}
} else { alert("Die Verknüpfung gibt es am Zielort bereits!\n-> keine Änderung"); }
}
})();



Grüße
Jens



Heute ist nicht aller Tage, ich komme wieder, keine Frage!

Korrektes Schließen von ScriptUI Dialogen?

Gerald Singelmann
  
Beiträge gesamt: 6269

22. Sep 2018, 11:40
Bewertung:

gelesen: 3850

Beitrag als Lesezeichen
Aus der Dokumentation im OMV:
Zitat Window.close(return:Any)
ScriptUI Classes
Closes this Window
If an onClose() callback is defined for the window, calls that function before closing the window.
return (optional:
A number (?) to be returned from the show() method that invoked this window as a modal dialog.


Mit anderen Worten: Mit show() geht's in den modalen Modus. Mit dem Befehl direkt nach show() bekommt das Script wieder die Kontrolle. Dazwischen steht die Bearbeitung des InDesign-Dokuments still. Nichts machbar. Es sei denn, man nimmt eine palette statt eines dialogs, denn die ist nicht modal.

Mit noch anderen Worten: Wir müssten wissen, wieso der folgende Ansatz nicht reicht, um zu beurteilen, wie eine Lösung aussehen kann
Code
function() { 
var doc = app.activeDocument;
var clink = fetch_link( app.selection );

if( confirm( "Got Link\rWanna move the link?" ) ) {
move_link( clink );
}

function fetch_link( obj_array ) {
// do something to extract link from array
return link;
}
function move_link( link ) {
// move the link
}
}

Korrektes Schließen von ScriptUI Dialogen?

JeT
Beiträge gesamt: 40

22. Sep 2018, 12:51
Bewertung:

gelesen: 3841

Beitrag als Lesezeichen
Hallo Gerald,

danke für deinen Tipp.


Mit folgender Anpassung konnte ich es jetzt lösen:

Zitat var move = false;
moveButton.onClick = function () { move = true; dialog.close(); }

dialog.show();
if (move == true) moveLink(cLink);



Grüße
Jens



Heute ist nicht aller Tage, ich komme wieder, keine Frage!

(Dieser Beitrag wurde von JeT am 22. Sep 2018, 12:52 geändert)

Korrektes Schließen von ScriptUI Dialogen?

Gerald Singelmann
  
Beiträge gesamt: 6269

22. Sep 2018, 14:21
Bewertung:

gelesen: 3829

Beitrag als Lesezeichen
globale Variablen sind sehr selten nicht böse.

Besser also:
Code
moveButton.onClick = function() { dialog.close(true) } 
dontMoveButton.onClick = function() {dialog.close(false); }

if ( dialog.show() ) move();

Korrektes Schließen von ScriptUI Dialogen?

JeT
Beiträge gesamt: 40

22. Sep 2018, 14:37
Bewertung:

gelesen: 3824

Beitrag als Lesezeichen
Antwort auf: globale Variablen sind sehr selten nicht böse.


Wieso global? Ist doch im dialog()-Scope? Oder verstehe ich da was falsch?


Abgesehen davon, brauche ich die Unterscheidung, welcher Button jetzt angeklickt wurde – mein komplettes Script hat noch einige andere Funktionen und Buttons (umbenennen, neu verlinken etc).

Habe hier nur einen Auszug, das mein Problem reproduzierbar machte...


Grüße
Jens



Heute ist nicht aller Tage, ich komme wieder, keine Frage!