Message for marc2k3:
I don't know if it will be abusing you. But I ask you if you have a routine that does what I need.
It is a routine that I had in Foobar2000 32-bit in a WSH panel that eliminated when painting the metadata %album% and %title% all the text that was to the right of the "(" except that it was at the beginning of the text. When trying to write it in JScript Panel3 I give me continuous syntax errors.
Therefore the entire text will be eliminated from the first "(" until the end of the text except that "(" is at the beginning of the text.
In the following examples the red text indicates what should not be painted:
metadato Paint
---------------------------------------------------------------- ------------------------------------------
Three Seasons (Music From The Motion Picture) Three Seasons
Byrd Jazz (Live at London) aka "Yusef" (Delmark DL-407) Byrd Jazz
Do Ai (Dhuong Vi..... The Red Blindfo) Do Ai
(Down Home) Blues (together) (Down Home) Blues
This is my routine for wsh panel 32-bit:
// obtengo el titulo pintando la primera frase entre () si está al principio
// seguido de las palabras anteriores a la siguiente frase entre ()
$puts(cam,%title%)
//////////////////// Fase 1: proceso hasta la 1ª palabra entre parentesis /////////////////////
$puts(tx1,)$puts(tx2,)$puts(pri,)$puts(ult,)
$puts(var,)$puts(var2,)
$puts(pri,$strchr($get(cam),'('))
$puts(ult,$strchr($get(cam),')'))
// si no hay '('
$ifequal(pri,0,var1 = 1,)
// si no hay ')'
$ifequal(ult,0,var1 = 1,)
// si '(' está despues del ')'
$ifgreater(pri,ult,var var1 = 1,)
// si '(' está al principio
$ifequal(pri,1,var var2 = 1,)
$ifequal(var1,1
,
var trz1 = cam
var tx1 = cam
,
var trz1 = $left(cam,ult)
var tx1 = $left(trz1,$add(pri,-1))
var tx2 = $substr(trz1,pri,ult)
)
$ifequal(var2,1
,var titulo = tx2
,var titulo = tx1
)
//////////// Fase 2: proceso desde el final del 1er trozo hasta el final /////////////
//////////// Vuelvo a subdividir el resto
$ifgreater($len(cam),trz1
,
//$puts(resto,$replace($get(cam),$get(trz1),))
var resto = $right(cam,$sub($len(cam),$len(trz1)))
var tx1 =
var tx2 =
var pri =
var ult =
var pri = $strchr(resto,'(')
var ult = $strchr(resto,')')
// si no hay '('
$ifequal(pri,0,var var1 = 1,)
// si no hay ')'
$ifequal(ult,0,var var1 = 1,)
// si '(' está despues del ')'
$ifgreater(pri,ult,var var1 = 1,)
$ifequal(var,1
,
var trz2 = resto
var tx1 = resto
,
var trz2 = $left(resto, ult)
var tx1 = $left(trz2,$add(pri,-1))
var tx2 = $substr(trz2,pri,ult)
)
,
)
$ifequal(var2,1
,var titulo = titulotx1
,
)
This is my current script for JScript Panel3:
// ==PREPROCESSOR==
// @name "Track Info + Seekbar + Buttons"
// @author "marc2003"
// @import "%fb2k_component_path%helpers.txt"
// @import "%fb2k_component_path%samples\js\lodash.min.js"
// @import "%fb2k_component_path%samples\js\common.js"
// @import "%fb2k_component_path%samples\js\panel.js"
// @import "%fb2k_component_path%samples\js\seekbar.js"
// ==/PREPROCESSOR==
//PIE que lleva 2 panel3:
//1 con la minicover, los botones, la seekbar, los textos de la izquierda y los tiempos
//2 un triple panel a derecha del pie: 1 para los textos arriba, 1 para el volumen y 1 para los textos abajo
//////////////////////////////////////////////////////////////
//tamaño botones
var bs = _scale(25);
var sep_bot = 3;
//posicion vertical botones
var posi_horiz_bot = -1;
var posi_horiz_bot2 = -0.1;
var LM = 324;
//posiciones para el botón speaker
var posi_horiz_bot3 = -1;
var LM2 = -64;
//posiciones seekbar
var posi_vert_seekbar_ini = 59;
var ancho_seekbar = _scale(550);
var alto_seekbar = _scale(5)
//el valor _scale(-xxx) marca el límite en que se corta el texto con ...
var limite1 = _scale(-496);
var posi_vert_lin_izq = 10;
var posi_horiz_lin1 = -5;
var posi_horiz_lin2 = 23;
//Recuadro de tiempos
//desplazamiento vertical
var time_x = 1365
//desplazamiento horizontal
var time_y = 21.5
//ancho de izq. a dcha.
var time_w = -240
//alto
var time_h = 26
var posi_horiz_time = 1;
var sep_time = 161;
var posi_vert_time_actual = _scale(1731);
var posi_vert_time_resto = posi_vert_time_actual + sep_time;
var posi_vert_time_total = posi_vert_time_resto + sep_time;
//fuentes para los textos
var normal1_font = CreateFontString('Segoe UI', 11);
var normal2_font = CreateFontString('Segoe UI', 12);
var normal3_font = CreateFontString('Segoe UI', 13);
var normal4_font = CreateFontString('Segoe UI', 14);
var normal5_font = CreateFontString('Eras ITC', 14);
var bold_font = CreateFontString('Segoe UI', 12, true);
//aquí se definen los colores
var colours = {
buttons : RGB(220, 220, 220),
background : RGB(40, 40, 40),
artist : RGB(170, 170, 170),
año : RGB(230, 230, 230),
album : RGB(200, 200, 200),
composer : RGB(170, 170, 170),
dato1 : RGB(150, 150, 150),
negro : RGB(0, 0, 0),
track : RGB(200, 200, 200),
title : RGB(215, 215, 215),
porcen : RGB(180, 180, 180),
time : RGB(180, 180, 180),
time_total : RGB(220, 220, 220),
time_reborde : RGB(32, 32, 32),
time_recuadro_sup : RGB(50, 50, 50),
time_recuadro_inf : RGB(25, 25, 25),
codec : RGB(170, 170, 170),
samplerate1 : RGB(170, 170, 170),
rgain : RGB(190, 190, 190),
seekbar_background : RGB(15, 15, 15),
seekbar_progress : RGB(70, 70, 70),
seekbar_progress_degra : RGB(20, 20, 20),
seekbar_borde : RGB(50, 50, 50),
seekbar_knob : RGB(230, 0, 0),
sac : RGB(196, 30, 35),
};
var tfo1 = fb.TitleFormat('$if($strcmp($cut(%genre%,7),Clásica),%album% %date% %artist%^^"$upper(%composer%)" ,%artist% %date% %album%^^)%tracknumber%. %title%^^[%playback_time% ]^^$ifgreater(%length%,0,$div($mul(%_time_elapsed_seconds%,100),%_time_total_seconds%) ٪,LIVE)');
/////////////////////////////////////////////////////////////////////////////////////////
var chars = {
vol : '\uF027',
activate3 : '\uF054',
prev : '\uF049',
next : '\uF050',
play : '\uF04B',
pause : '\uF04C',
stop : '\uF04D',
}
var panel = new _panel();
var seekbar = new _seekbar(0, 0, 0, 0);
var buttons = new _buttons();
var img = null;
window.MaxHeight = _scale(150);
on_playback_new_track();
buttons.update = function () {
var y = (Math.round((panel.h - bs) / 2)) + posi_horiz_bot;
this.buttons.stop = new _button(panel.w - LM - (sep_bot * 4) - (bs * 8), y, bs, bs, { char : chars.stop, colour:fb.StopAfterCurrent ? colours.sac : colours.buttons}, null, function () { fb.Stop(); }, 'Stop');
this.buttons.previous = new _button(panel.w - LM - (sep_bot * 3) - (bs * 7), y, bs, bs, { char : chars.prev, colour:colours.buttons }, null, function () { fb.Prev(); }, 'Previous');
this.buttons.play = new _button(panel.w - LM - (sep_bot * 2) - (bs * 6), y, bs, bs, { char : !fb.IsPlaying || fb.IsPaused ? chars.play : chars.pause, colour:colours.buttons}, null, function () { fb.PlayOrPause(); }, !fb.IsPlaying || fb.IsPaused ? 'Play' : 'Pause');
this.buttons.next = new _button(panel.w - LM-sep_bot - (bs * 5), y, bs, bs, { char : chars.next, colour:colours.buttons }, null, function () { fb.Next(); }, 'Next');
var y = (Math.round((panel.h - bs) / 2)) + posi_horiz_bot2;
this.buttons.activate = new _button(panel.w - LM - (bs * 4), y, bs, bs, { char : chars.activate3, colour:colours.buttons }, null, function () { fb.RunMainMenuCommand('View/Playlist view/Activate now playing'); }, 'Activate now playing');
var y = (Math.round((panel.h - bs) / 2)) + posi_horiz_bot3;
this.buttons.vol = new _button(panel.w - LM2 - (bs * 3), y, bs, bs, { char : chars.vol, colour:colours.buttons }, null, function () { fb.RunMainMenuCommand('Playback/Volume/Mute'); }, 'Mute');
}
function update_album_art(metadb) {
_dispose(img);
img = null;
if (metadb) {
img = metadb.GetAlbumArt();
}
window.Repaint();
}
function on_mouse_lbtn_down(x, y) {
seekbar.lbtn_down(x, y);
}
function on_mouse_lbtn_up(x, y) {
if (x < panel.h && fb.IsPlaying && img) {
fb.GetNowPlaying().ShowAlbumArtViewer();
return;
}
if (buttons.lbtn_up(x, y)) {
return;
}
if (seekbar.lbtn_up(x, y)) {
return;
}
fb.RunMainMenuCommand('View/Show now playing in playlist');
}
function on_mouse_leave() {
buttons.leave();
}
function on_mouse_move(x, y) {
window.SetCursor(x < panel.h && fb.IsPlaying && img ? IDC_HAND : IDC_ARROW);
if (buttons.move(x, y)) {
return;
}
seekbar.move(x, y);
}
function on_mouse_rbtn_up(x, y) {
return panel.rbtn_up(x, y);
}
//aquí cancelo que al mover la rueda del ratón se dispare el volumen
function on_mouse_wheel(s) {
if (seekbar.wheel(s)) {
return;
}
// if (s == 1) {
// fb.VolumeUp();
// } else {
// fb.VolumeDown();
// }
}
function on_paint(gr) {
// aquí se pinta el background de todo el pie
gr.FillRectangle(0, 0, panel.w, panel.h, colours.background);
// aquí se pinta la barra nula
gr.FillGradientRectangle(seekbar.x, seekbar.y, seekbar.w + _scale(6), seekbar.h, 0, RGB(50, 50, 50), RGB(0, 0, 0));
buttons.paint(gr);
// aquí se pinta la miniatura fuera de If (fb.IsPlaying) para que no se borre al pulsar stop --------
if (img) {
_drawImage(gr, img, 0, 0, panel.h - 2, panel.h - 2, image.centre);
}
if (fb.IsPlaying) {
var arr1 = tfo1.Eval().split('^^');
// aquí se pinta la linea 1 izq: artist, año, album
gr.WriteText(arr1[0], normal2_font, colours.artist, panel.h + posi_vert_lin_izq, posi_horiz_lin1, seekbar.x - panel.h - limite1, panel.h * 0.5, DWRITE_TEXT_ALIGNMENT_LEADING, DWRITE_PARAGRAPH_ALIGNMENT_CENTER, DWRITE_WORD_WRAPPING_NO_WRAP, DWRITE_TRIMMING_GRANULARITY_CHARACTER);
// aquí se repinta en alta luminosidad la linea 1 izq: ALbum+Año o Artist+Año
var dato1_2 = fb.TitleFormat('$if($strcmp($cut(%genre%,7),Clásica),%album% %date%,%artist% %date%)').Eval();
gr.WriteText(dato1_2, normal2_font, colours.año, panel.h + posi_vert_lin_izq, posi_horiz_lin1, seekbar.x - panel.h - limite1, panel.h * 0.5, DWRITE_TEXT_ALIGNMENT_LEADING, DWRITE_PARAGRAPH_ALIGNMENT_CENTER, DWRITE_WORD_WRAPPING_NO_WRAP, DWRITE_TRIMMING_GRANULARITY_CHARACTER);
// aquí se repinta la linea 1 izq: ALbum o Artist (primero se pinta en negro y luego se vuelve a repintar en su color)
var dato1 = fb.TitleFormat('$if($strcmp($cut(%genre%,7),Clásica),%album%,%artist%)').Eval();
gr.WriteText(dato1, normal2_font, colours.negro, panel.h + posi_vert_lin_izq, posi_horiz_lin1, seekbar.x - panel.h - limite1, panel.h * 0.5, DWRITE_TEXT_ALIGNMENT_LEADING, DWRITE_PARAGRAPH_ALIGNMENT_CENTER, DWRITE_WORD_WRAPPING_NO_WRAP, DWRITE_TRIMMING_GRANULARITY_CHARACTER);
gr.WriteText(dato1, normal2_font, colours.artist, panel.h + posi_vert_lin_izq, posi_horiz_lin1, seekbar.x - panel.h - limite1, panel.h * 0.5, DWRITE_TEXT_ALIGNMENT_LEADING, DWRITE_PARAGRAPH_ALIGNMENT_CENTER, DWRITE_WORD_WRAPPING_NO_WRAP, DWRITE_TRIMMING_GRANULARITY_CHARACTER);
// aquí se pinta la linea 2 izq: composer, track, title
gr.WriteText(arr1[1], normal2_font, colours.title, panel.h + posi_vert_lin_izq, posi_horiz_lin2, seekbar.x - panel.h - limite1, panel.h * 0.9, DWRITE_TEXT_ALIGNMENT_LEADING, DWRITE_PARAGRAPH_ALIGNMENT_CENTER, DWRITE_WORD_WRAPPING_NO_WRAP, DWRITE_TRIMMING_GRANULARITY_CHARACTER);
// aquí se repinta en baja luminosidad la linea 2 izq: composer (solo para clásica)
var tfo_composer = fb.TitleFormat('$if($strcmp($cut(%genre%,7),Clásica),"$upper(%composer%)",)').Eval();
gr.WriteText(tfo_composer, normal2_font, colours.composer, panel.h + posi_vert_lin_izq, posi_horiz_lin2, seekbar.x - panel.h - limite1, panel.h * 0.9, DWRITE_TEXT_ALIGNMENT_LEADING, DWRITE_PARAGRAPH_ALIGNMENT_CENTER, DWRITE_WORD_WRAPPING_NO_WRAP, DWRITE_TRIMMING_GRANULARITY_CHARACTER);
// aquí se pinta el porcen que lleva el track a la dcha. de la seekbar
gr.WriteText(arr1[3], normal3_font, colours.porcen, seekbar.x + seekbar.w + _scale(12), 0, _scale(130), panel.h, DWRITE_TEXT_ALIGNMENT_LEADING, DWRITE_PARAGRAPH_ALIGNMENT_CENTER, DWRITE_WORD_WRAPPING_NO_WRAP, DWRITE_TRIMMING_GRANULARITY_CHARACTER);
// aquí se pinta el recuadro con reborde que aloja los tiempos
gr.FillGradientRectangle(time_x, time_y, time_w, time_h, 0, colours.time_recuadro_sup, colours.time_recuadro_inf);
// aquí se pinta el reborde del recuadro
DrawRectangle(gr, time_x, time_y, time_w, time_h, colours.time_reborde);
// tiempo transcurrido
var time_actual = fb.TitleFormat('%playback_time%').Eval();
gr.WriteText(time_actual, normal5_font, colours.time, seekbar.x - _scale(50), posi_horiz_time, posi_vert_time_actual, panel.h, DWRITE_TEXT_ALIGNMENT_CENTER, DWRITE_PARAGRAPH_ALIGNMENT_CENTER, DWRITE_WORD_WRAPPING_NO_WRAP, DWRITE_TRIMMING_GRANULARITY_CHARACTER);
// tiempo restante
var time_resto = fb.TitleFormat('- %playback_time_remaining%').Eval();
gr.WriteText(time_resto, normal5_font, colours.time, seekbar.x - _scale(50), posi_horiz_time, posi_vert_time_resto, panel.h, DWRITE_TEXT_ALIGNMENT_CENTER, DWRITE_PARAGRAPH_ALIGNMENT_CENTER, DWRITE_WORD_WRAPPING_NO_WRAP, DWRITE_TRIMMING_GRANULARITY_CHARACTER);
// tiempo total
var time_total = fb.TitleFormat('%length%').Eval();
gr.WriteText(time_total, normal5_font, colours.time_total, seekbar.x - _scale(50), posi_horiz_time, posi_vert_time_total, panel.h, DWRITE_TEXT_ALIGNMENT_CENTER, DWRITE_PARAGRAPH_ALIGNMENT_CENTER, DWRITE_WORD_WRAPPING_NO_WRAP, DWRITE_TRIMMING_GRANULARITY_CHARACTER);
if (fb.PlaybackLength > 0) {
var pos = seekbar.pos();
// aquí se pinta la parte izquierda de la seekbar
gr.FillGradientRectangle(seekbar.x, seekbar.y, pos, seekbar.h, 0, RGB(80, 80, 80), RGB(30, 30, 30));
// aquí se pinta el knob avanzando
gr.FillGradientRectangle(seekbar.x + pos, seekbar.y - 1, _scale(8), seekbar.h +2, 0, RGB(230, 0, 0), RGB(0, 0, 0));
}
}
}
function on_playback_dynamic_info_track(type) {
if (type == 0) window.Repaint();
else update_album_art(fb.GetNowPlaying());
}
function on_playback_edited() {
window.Repaint();
}
function on_playback_new_track(metadb) {
update_album_art(metadb);
}
function on_playback_pause() {
buttons.update();
window.Repaint();
}
function on_playback_seek() {
seekbar.playback_seek();
}
function on_playback_starting() {
buttons.update();
window.Repaint();
}
function on_playback_stop() {
buttons.update();
window.Repaint();
}
function on_playback_time() {
//la linea siguiente la sustituí por la siguiente según me indicó marc2k3 en el foro para arreglar el que no se pintaban los tiempos per second
// window.RepaintRect(panel.h, 0, seekbar.x - panel.h, panel.h);
window.Repaint();
}
function on_playlist_stop_after_current_changed() {
buttons.update();
window.Repaint();
}
//aquí se definen las coordenadas de la seekbar
function on_size() {
panel.size();
seekbar.x = _scale(posi_vert_seekbar_ini);
seekbar.w = panel.w - seekbar.x - ancho_seekbar;
seekbar.h = alto_seekbar;
seekbar.y = (panel.h - seekbar.h) / 2;
buttons.update();
}