[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt ScriptUI, ColorPicker und Dialoge

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

ScriptUI, ColorPicker und Dialoge

Gerald Singelmann
  
Beiträge gesamt: 6290

31. Jan 2025, 21:52
Beitrag # 1 von 3
Bewertung:
(8178 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,

ich hab grad was seltsames und dachte, vielleicht hatte das schon mal jemand anderes gelöst.

Da ist ein Dialog und eine der Sachen, die da gehen sollen ,ist die Auswahl einer Farbe. $.colorPicker() ... alles klar.

Aber: Auf dem Mac wählt man eine Farbe (meines Wissens) aus, indem man das Fenster des Pickers schließt. Das schließt aber sofort den Dialog, aus dem der Picker aufgerufen wurde.

Ist das normal?
Lässt sich das verhindern?
Kann man da einen Event abfangen?

Mein vereinfachter Beispielcode zum Nachvollziehen:
Code
pick(); 

function pick() {
var prefs = {
indicatorColor: [100, 150, 200]
}
var w = new Window("dialog");
var g = w.add("group {orientation: 'row', alignChildren: ['left', 'fill']}");

g.add("statictext", undefined, "#" + array2hex(prefs.indicatorColor))

w.colorsample = g.add("group", [undefined, undefined, 20, 20]);

w.colorbtn = g.add("button", undefined, "select")
w.colorbtn.onClick = get_color;

fill_sample();

w.show();


function get_color() {
var c = 0x10000 * prefs.indicatorColor[0] + 0x100 * prefs.indicatorColor[1] + prefs.indicatorColor[2]
c = $.colorPicker( c );
prefs.indicatorColor = nr2array(c);
fill_sample();
}
function fill_sample() {
w.colorsample.graphics.backgroundColor = w.graphics.newBrush (
w.graphics.BrushType.SOLID_COLOR,
[
prefs.indicatorColor[0] / 255,
prefs.indicatorColor[1] / 255,
prefs.indicatorColor[2] / 255
]
);
}

function nr2array( nr ) {
if ( typeof nr == "string") {
var c = nr;
} else {
var c = ("00" + nr.toString(16) ).substr(-6);
}
var r = parseInt( c.substring(0,2), 16);
var g = parseInt( c.substring(2,4), 16);
var b = parseInt( c.substring(4,6), 16);
return [r,g,b];
}
function array2hex( a ) {
var c = r( a[0].toString(16) ) +
r( a[1].toString(16) ) +
r( a[2].toString(16) );
return c;
function r(x) {
return ("0" + x).substr(-2);
}
}
}

X

ScriptUI, ColorPicker und Dialoge

Gerald Singelmann
  
Beiträge gesamt: 6290

31. Jan 2025, 22:11
Beitrag # 2 von 3
Beitrag ID: #589367
Bewertung:
(8131 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ergänzung: onClose soll man laut Handbuch mit einem "return false" abbrechen können. Also habe ich das eingebaut:

Code
  w.de = w.add("button", undefined, "OK"); 
w.de.onClick = function() {
this.window.really_close = true;
this.window.close();
}
w.ce = w.add("button", undefined, "Nö");
w.ce.onClick = function() {
this.window.really_close = false;
this.window.close();
}
w.onClose = function() {
if ( this.really_close !== true ) {
return false;
} else {
return true;
}
}
w.show();


Das klappt auch, wenn's um die Buttons geht ("OK" schließt, "Nö" nicht), aber der ColorPicker schließt trotzdem.
Nebenbei: Nur auf Mac. Da der Windows ColorPicker einen anständigen "OK"-Button hat, verhält er sich zivilisiert.


als Antwort auf: [#589365]

ScriptUI, ColorPicker und Dialoge

Gerald Singelmann
  
Beiträge gesamt: 6290

6. Feb 2025, 09:36
Beitrag # 3 von 3
Beitrag ID: #589385
Bewertung:
(7150 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Um dieses Selbstgespräch kurz zu beenden...

Bevor ich beschloss, dass das Script gar keinen ColourPicker braucht (Der User soll gefälligst die InDesign-eigenen Features benutzen, um der Ebene eine Farbe zu geben), hatte ich noch eine Lösungsskizze gebaut, die vielleicht diesem oder jenem Leser irgendwann weiterhilft:

Code
 
/**
* Zeigt unter Windows den Windows-Colour-Picker, baut unter Mac einen einfachen eigenen
* @param {any} Array of [R, G, B] each 0..255
* @returns [R, G, B]
*/
function get_color( initial_colour ) {
if ( ! initial_colour ) initial_colour = [200, 150, 100];
if ( File.fs == "Macintosh" ) {
var cw = new Window("dialog {orientation: 'column', alignChildren: ['fill', 'fill']}");
// Eine Farbfläche zur Vorschau
cw.sample = cw.add("group", [undefined, undefined, 300, 40])
// Function um Farbfläche zu färben
color_sample( cw.sample, initial_colour);
// Drei Slider für RGB
cw.r = cw.add("slider");
cw.g = cw.add("slider");
cw.b = cw.add("slider");
cw.r.minvalue = 0;
cw.r.maxvalue = 255;
cw.r.value = initial_colour[0]
cw.g.minvalue = 0;
cw.g.maxvalue = 255;
cw.g.value = initial_colour[1]
cw.b.minvalue = 0;
cw.b.maxvalue = 255;
cw.b.value = initial_colour[2]
cw.btns = cw.add("group {orientation: 'row', alignChildren: ['fill', 'fill']}")
cw.cancelElement = cw.btns.add("button", undefined, __("cancel"))
cw.defaultElement = cw.btns.add("button", undefined, "OK")
cw.r.onChanging = cw.g.onChanging = cw.b.onChanging = function() {
this.value = Math.round( this.value );
color_sample( cw.sample, [cw.r.value, cw.g.value, cw.b.value ]);
}
if ( cw.show() == 1 ) {
return [ cw.r.value, cw.g.value, cw.b.value ];
}
return null;
} else {
// Windows Colour Picker nimmt einen langen Integer(den Hex-Farbwert) als Parameter und Rückgabewert
var c = 0x10000 * initial_colour[0] + 0x100 * initial_colour[1] + initial_colour[2]
c = $.colorPicker( c );
return nr2array(c);
}
}
function color_sample( obj, colour ) {
obj.graphics.backgroundColor = obj.graphics.newBrush (
w.graphics.BrushType.SOLID_COLOR,
[
colour[0] / 255,
colour[1] / 255,
colour[2] / 255
]
);
}
function nr2array( nr ) {
if ( typeof nr == "string") {
var c = nr;
} else {
var c = ("00" + nr.toString(16) ).substr(-6);
}
var r = parseInt( c.substring(0,2), 16);
var g = parseInt( c.substring(2,4), 16);
var b = parseInt( c.substring(4,6), 16);
return [r,g,b];
}



als Antwort auf: [#589367]