Frage zur Konfiguration vom WSH Panel MOD

Begonnen von Spirit_of_the_ocean, 08. April 2009, 22:54:20

Vorheriges Thema - Nächstes Thema

tedgo

So, nach mehreren Litern Kaffee und stundenlangem Überlegen das nächste Script, das vielleicht hilfreich ist:
Normale Buttons, ein Playback Order Button und eine Seekbar in einem Panel, sprich: ein komplettes Control Panel.
Freilich ist die Button-Belegung nur ein Beispiel (die muss natürlich geändert werden), aber es funktioniert.
Und da ich mein Script auch jemanden vorgelegt habe, der was von JScript versteht und der nichts zu bemängeln hatte, hänge ich auch das mal hier an.

Hinweis:
Die Erscheinung der Seekbar muss ab Zeile 170 festgelegt werden.
der Playback Order Button in Zeile 284 (aktuelle Playback Order) und ab Zeile 289.

Damit man sieht, was das Script bedeutet, habe ich mal Buttons aus meiner derzeitigen Konfiguration beigelegt.
Den "DarkOne"-Ordner dazu einfach in den foobar2000-Installationsordner kopieren und das Script in ein WSH Panel mod einfügen.

(im Script ist jetzt noch kein Tooltip und auch kein DrawRoundRect enthalten, das kommt erst mit der nächsten Version vom WSH Panel mod)

Spirit_of_the_ocean

Ich habe Problem mit den Playback Button zu integrieren. Ich hätte gerne einen Button der sein aussehen nach  Playbackorder ändert.Wenn du mir da weiterhelfen könntest wäre das toll. :)

Als Beispiel hatte ich den PBO Button. Aber wie gesagt ich bekomme den nicht integriert.

tedgo

#17
Hast du dir das letzte Script-Beispiel mal angesehen?
Da ist das drin, was du brauchst.
Geschaltet wird die Playback-Order mit einem Klick auf den Playback Order Button, woraufhin ein Kontextmenü aufklappt aus dem man die gewünschte Playback-Order wählt.
Daraufhin ändert sich das Bild des Buttons.
Das Bild ändert sich auch, wenn du die Playback Order außerhalb des WSH Panel mod änderst (z. B. übers Menü).

Wenn du das Script anpassen willst und deine Bilder anders benannt sind, gehe in Zeile 267 und gib hier die Namen deiner Images in der selben Reihenfolge an (also Bilder für Default, Repeat Playlist, Repeat, Random, Shuffle tracks, Shuffle albums, Shuffle folders - ohne Dateiendung!).
Den Pfad musst du in Zeile 284 und 289 angeben (also zwischen dem ersten und zweiten "+" Zeichen und evtl. auch die Dateiendung von .png auf .jpg ändern) und die Plazierung und Größe des Buttons in Zeile 291.

Für den Playback Order Button ist aber kein Mousehover Image im Script vorgesehen (da hatte ich einen Tooltip beabsichtigt, den gibt es aber erst mit der nächsten Version des WSH Panel mod).
Es ist aber möglich, ein Mousehover-Image mit zu benutzen. Falls das gewünscht ist, sag Bescheid, dann passe ich das Script noch mal an.

Ich hab ja schon mal gesagt, dass das alte PBOButton Script nicht sonderlich geeignet ist für das, was du offenbar beabsichtigst, da es weder ein Mouseover-Image bietet noch die Button Class sonderlich "elegant" gestaltet war.
Probier lieber, mein letztes Script anzupassen (so, wie ich mich an deinen Screenshot erinnere, den du mir mal geschickt hast, müsste das jetzt ideal für deine Bedürfnisse passen).

tedgo

Neue Version des WSH Panels ist raus.
Das selbe Script wie oben, nur mit Tooltip-Beispielen für die Buttons und Zeichnung der Seekbar mit gr.DrawRoundRect, ist angehängt.

(Statt bei der Seekbar die Umrandung mit zwei gr.DrawRoundRect zu zeichnen, wäre es auch möglich, die Linienstärke einer gr.DrawRoundRect auf 2.0 zu erhöhen und mit gr.SetSmoothingMode(4) zu glätten. Sieht aber meiner Meinung etwas schlechter aus.)

Spirit_of_the_ocean

Hey Tedgo viele Dank für deine Hilfe :)

Gibt es eine Möglichkeit die gespielte Zeit des aktuellen Songs anzeigen zu lassen? ich hab da nichts gefunden.

fbuser

#20
Entweder über fb.PlaybackTime zum Selberformatieren oder über fb.TitleFormat("%playback_time%").Eval() als formatierten Wert, der über gr.DrawString() im on_paint()-Event ausgegeben werden kann.

Funktion zum Selberformatieren:
function TimeFormatted(t)
{
  var zpad = function(n)
  {
    var str = n.toString();
    return (str.length<2) ? "0"+str : str;
  }

  var h = Math.floor(t/3600); t-=h*3600;
  var m = Math.floor(t/60); t-=m*60;
  var s = Math.floor(t);
  if(h>0) return h.toString()+":"+zpad(m)+":"+zpad(s);
  return m.toString()+":"+zpad(s);
}

Spirit_of_the_ocean

gr.DrawString(fb.TitleFormat("%playback_time%).Eval(),g_font_b,RGB(192,192,192),3,-10,54,16,DT_CENTER | DT_TOP | DT_SINGLELINE);


Das habe ich hinzugefügt bei on paint. Aber das gibt einen Fehler aus. Mein Problem ist, dass ich keien Ahnung von JScript habe und das meiste mehr raten als verstehen ist.

Wo ist denn der Fehler?

fbuser

Ich hatte hinter %playback_time% die " vergessen. Die fehlen bei dir auch. Habe meinen Beitrag entsprechend angepasst.

Spirit_of_the_ocean

Meine Zeit aktualisiert sich aber nicht. Es muss also etwas fehlen. ???

fbuser

Möglicherweise das:

function on_playback_time(time)
{
  window.Repaint();
}

Spirit_of_the_ocean


tedgo

#26
@Spirit
Du benutzt die falschen Flags für deinen Text-String!
Diejenigen, die du benutzt sind für gr.GdiDrawText.
Du bekommst zwar möglicherweise keine Fehlermeldung, weil die Flags ja im Skript definiert sind, die Flags sind aber (zumindest zum Teil) in DrawString wirkungslos.

Besser du änderst das ab ;)


gr.GdiDrawText(fb.TitleFormat("%playback_time%").Eval(),g_font_b,RGB(192,192,192),3,-10,54,16,DT_CENTER | DT_TOP | DT_SINGLELINE);



Du kannst natürlich auch DrawString benutzen, musst dann aber die Flags für DrawString ins Skript schreiben.
Außerdem sieht DrawString etwas schlechter aus. Das kann man aber mit gr.SetTextRenderingHint(5) (die 5 setzt auf ClearType) ausgleichen.

EDIT:
Du hast ja mehrere Elemente in einem Skript (oder hatte ich dich falsch verstanden und es ist ein neues Skript?).
Da wäre es vielleicht sinnvoll, unter on_playback_time nicht das ganze Fenster bei jeder Änderung der Abspielzeit neu zu zeichnen, sondern nur den Bereich, in dem du die Zeit anzeigst.
Es macht ja keinen Sinn, jede Sekunde Buttons oder andere von der Abspielzeit unabhängige Elemente neu zu zeichnen ;)

Ich schlage also vor:

function on_playback_time(time) {
window.RepaintRect(3, -10, 54, 16);
}

(Die Angaben für x, y, w und h sollten sich natürlich mit dem DrawText decken, mit dem du die Zeit anzeigen lässt ;))

Spirit_of_the_ocean

Super danke Tedgo :)
Also inzwischen hab ich eine Panel mit Buttons, Seekbar und Playbacktime :) Das ist wirklich super  :top:
Danke für eure Hilfe. Ich bin noch bei der 1.1.4er Version. Ich will mein panel erstmal dort fertigstellen bevor ich migriere. Das mit dem GDI Text ist mir schon aufgefallen. Da ich LCDMono benutze, und es sehr komisch angzeigt wurde.

Danke auch für den Tipp mit dem Window.repaint. Ich dachte mir schon, dass es blödinn ist das komplette Fenster zu aktualisieren, wenn es doch nur um einen kleinen Bereich geht.

Vorschlag: Was haltet ihr davon ein Tutorial mit einigen Beispiel Scripts zu machen? Also für Anfänger und Leute, die wie ich keinen Plan haben von JScript. Damitman ungefähr weiß, wo man was ändern muss.

Ich habe nur einiges aus deines Script, dass ich aber mit /* und */ unschädlcih gemacht habe. Gut, dass ich mich mal mit Pascal irgendwann beschäftigt hab.

Es werden wohl noch weitere Fragen folgen. Aber langsam wirds das, was ich haben möchte.

Noch eine Frage: Kann mir jemand was zum Resoourcenverbrauch des Panels sagen? Also mir ging es darum, alles was ich haben möchte in einem Panel zu machen und nicht 5 verschiedene WSH Panels in den Splitter zu integrieren.

tedgo

#28
Zum Ressourcenverbrauch kann ich noch nicht allzu viel sagen.
Ich habe mittlerweile an die 10 WSH Panel in meiner Config (bin aber dabei die ein bisschen zu vereinen - soweit möglich, denn sie liegen über das gesamte Layout verstreut ;)).

Mir ist im Vergleich zu PSS bislang kein nennenswerter Unterschied aufgefallen.

Und wie bitte?
Du hast einiges aus meinem liebevoll geklöppelten Skript unschädlich gemacht??
Wie gemein...  :'(  :D

EDIT:
Ein Tutorial wäre nicht schlecht.
Da müssen aber andere ran...
Ich lerne JScript ja mehr oder weniger selber erst zu nutzen (glücklicherweise lerne ich recht schnell :)), aber für ein Tutorial fühle ich mich nicht berufen.
Ich kämpfe zum Beispiel selbst schon seit Wochen an einer vernünftigen Button Class für mein Rating Panel und krieg es einfach nicht hin...

Spirit_of_the_ocean

Ich hab nur folgendes festgestellt: Ich habe eine Config mit dem Chronflow laufen und in einem Tab hatte ich an die 4 WSH und da hatte ich seltsamerweise crashes von eminem NVidis driver. Jetzt hab ich eine Config mit dem Chronflow und nur einem WSH Panel und zwar nicht im Tab und keine Crashes. Das ist alles etwas merkwürdig.