Wie (mit PSS o.ä.) Buttons erstellen, die sich ändern ("toggelnde" Buttons)

Begonnen von DeltaB, 12. Juli 2011, 05:14:41

Vorheriges Thema - Nächstes Thema

DeltaB

Guten Morgen Forengemeinde,

seit ein paar Tagen bin ich damit beschäftigt, mein Foobar auf den aktuellen Stand zu bringen und anzupassen - zuletzt habe ich das 2005 gemacht, es wurde also höchste Zeit. ::)

Da viele Plugins von damals inzwischen EOL sind, habe ich gleich bei Null angefangen und alles neu aufgebaut. Dazu habe ich mich leidlich in ElPlaylist und PSS eingearbeitet und bin schon ganz zufrieden mit dem Erreichten. Die ElPlaylist macht noch ein paar Probleme aber das ist ein anderes Thema.

Zum Grund meines Posts: Ich würde gerne für diverse Befehle Buttons erstellen - beispielsweise für "stop after current" oder auch den Wiedergabemodus (normal/repeat Playlist etc). Soweit kein Problem, allerdings macht das ganze IMHO nur Sinn, wenn die Buttons den Status der Option visualisieren. Einfaches Beispiel: Ist "stop after current" aktiv, soll der entsprechende Button in rot statt grün erscheinen.

Natürlich habe ich schon gesucht, wie so etwas zu machen ist. Es hat mich dabei überrascht, dass man wohl nicht einfach eine Variable abfragen kann (%is_stop_after_current% oder ähnlich). Das Plugin foo_cwb_hooks konnte dies wohl, ist aber EOL und nicht mit aktuellen Foobar-Versionen kompatibel. Im HydrogenAudio-Forum habe ich aufgeschnappt, dass das Plugin WSH Mod Panel wohl die von mir gewünschte Funktion bietet - wenngleich ich nicht ganz verstehe, wie genau...

Nun, worauf ich hinaus will: Ich habe nun die TF-Syntax, die Query-Syntax von Playlist Tree Mod (geniales Plugin BTW) und die (ganz schön verwirrende) Syntax von ElPlaylist / PSS in mein Hirn gequetscht. Bin nun eher mäßig begeistert von der Aussicht, nun auch noch JS zu lernen, zumal es nur um ein paar Buttons geht...

Gibt es mit Bordmitteln, Plugins oder PSS auch einen Weg, der zu "toggelnden" Buttons führt?

Bei HydrogenAudio hat jemand auf eine ähnliche Frage übrigens mal geantwortet, das sei alles sehr wohl mit PSS zu machen - außer einem Beispiel mit $if(%ps_isplaying%,...) hat er aber dann auch nichts mehr geschrieben...

Falls das eine Rolle spielt: Konkret sind derzeit folgende "toggelnde" Buttons geplant:


  • Play*
  • Pause*
  • Stop

  • Wiedergabemodus normal
  • Wiedergabemodus repeat Playlist
  • Wiedergabemodus repeat Track

  • Stop after current
  • Remove played tracks**
  • Remove skipped tracks**

  • Replaygain an/aus

* Ist über %ps_isplaying% realisierbar
** Nicht wundern, kommt von einem kleinen Plugin namens foo_removeplayed

Ich bedanke mich im Voraus für Anregungen und Ideen!  :top:

Beste Grüße,
DeltaB


EDIT: Was ich vergessen hatte: Ich hoffe im richtigen Unterforum unterwegs zu sein - es geht ja um eine Funktion, die es (vermutlich) nur mit Plugins gibt. Falls meine Frage ins "Customize" gehört sorry und danke an den fleißigen Mod, der den Fred verschiebt...

Richtig erkannt. Zwar geht es nur mit zusätzlichen Plugins, trotzdem handelt es sich um das Anpassen der Nutzeroberfläche, also "Customize". Deshalb: Thread verschoben - tedgo

grimes

Eine Möglichkeit von "toggelnden" buttons ist unter CUI in die Button-Toolbar "stop after current" zu integrieren.

DeltaB

Zunächst danke für die Antwort :top:

Leider funktioniert dein Workaround nur für "stop after current", das ist leider nicht mal die halbe Miete...
Daneben ist es mir noch nicht gelungen, über die Button-Toolbar Schaltflächen beliebiger Größe darzustellen - habe ich Tomaten auf den Augen oder geht nur die Standardgröße?

Bin sehr dankbar für weitere Tipps und Kommentare ;)

grimes

Die Grö0e lässt sich auch ändern. Einfach mal ein 22x22 Icon als Custom Image einfügen...  ...dann sind alle Buttons 22x22.
Unterschiedliche Größen (innerhalb) gibts nicht.

DeltaB

Danke für die Antwort - Wunderbar, das ist ja schon mal was ;) Ich hab verzweifelt ein Menü gesucht, auf die Idee die Toolbar einfach mal mit größeren custom Images zu füttern bin ich gar nicht gekommen ::) Mehrere Größen innerhalb einer Button-Toolbar braucht es ja nicht, wenn ich das brauche mache ich eben mehrere Toolbars...

Aber wie gesagt, für andere Einträge als "stop after current" läuft deine Idee nicht, mir geht es da insbesondere um die im Eingangspost erwähnten Plugins bzw. deren Optionen "Remove played tracks" und "Remove skipped tracks". Dazu eine Idee?

grimes

Das müsste der plugin-Entwickler machen.
Z.B. ein SDK fürs plugin (sehr unwahrscheinlich) (wie die foobar2000-SDK-Funktion toggle_stop_after_current()).
Dann müsste diese SDK-Funktion von den jeweiligen Entwicklern in eine PSS- oder WSH_panel_mod-Funktion "übersetzt" werden (noch viel unwahrscheinlicher).

DeltaB

Zitat von: grimes in 14. Juli 2011, 08:24:45
(...) sehr unwahrscheinlich (...) noch viel unwahrscheinlicher (...)

Ah ja, genau das wollte ich nicht hören :D

Mal anders gefragt: Was fällt dir (oder einem anderen User) generell dazu ein? Wenn du das machen wolltest, wie würdest du vorgehen? Geht das problemlos via WSH Panel Mod? Lohnt es sich also, sich ein wenig JS anzutrainieren - oder soll ich das Plugin gleich selbst schreiben? (Wobei letzteres nicht ganz ernst gemeint ist...)

Hier mal noch ein Screenshot aus dem Playback-Menü, wie man sieht ganz normale Menüeinträge, je nach Status mit oder ohne Haken... Das muss doch irgendwie abfragbar sein :'(




Nicht zu vergessen der Wiedergabemodus (normal / repeat track / etc.), den brauche ich ja auch noch... Eiwei, kompliziert das alles...

Danke im Voraus für weiteren kreativen Input ;)

tedgo

Möglich wäre sowas schon, sowohl im PSS als auch im WSH Panel mod.
Nur nicht sehr zweckmäßig...

Man könnte im PSS z. B. beim Schalten von "Remove played tracks" eine globale Variable setzen (mit SETGLOBAL:blabla:1) und dann beim Buttonbild abfragen, $ifequal(%blabla%,1,bild_an,bild_aus).
Nur bekäme der PSS - genauso wenig wie das WSH Panel mod - halt nicht mit, wenn anderweitig, z. B. über das Menü, der "Modus" umgeschaltet würde.

Stop After Current und Playback Order sind hingegen mit dem WSH Panel mod lösbar (bedingt auch mit dem PSS).
Es gibt auch einige Beispielscripts fürs WSH Panel mod: Samples.
Vielleicht ist ja da schon was passendes dabei :)

DeltaB

Vielen Dank auch an dich, tedgo, für die Antwort! Die Lösung mit der globalen Variablen hatte ich bereits im Hinterkopf - ist halt so was von unprofessionell ;)

Ich merke schon, dass du tendenziell für die Verwendung des WSH Panel Mod plädierst, in diesem Zusammenhang auch danke für den Link. Ich hatte die Beispiele schon zuvor entdeckt und verstehe mehrheitlich Bahnhof. Über C&P der Beispiele bin ich spontan nicht hinausgekommen... Meine Programmierkenntnisse beschränken sich auf etwas PHP und sehr wenig BASIC im Zusammenhang mit Microcontrollern. Ich bin also nicht auf dem Level, dass ich mal eben JS lerne. Möglich wäre es wohl - aber der blöde Tag hat traurigerweise immer nur 24 Stunden...  :^^:

Darf ich deshalb nochmal wo anders nachbohren? Du schreibst
ZitatStop After Current und Playback Order sind hingegen mit dem WSH Panel mod lösbar (bedingt auch mit dem PSS).

Wo genau liegt der Trick, wie lautet der Befehl, auf den ich nicht komme und wie ist in diesem Zusammenhang das Wort "bedingt" zu verstehen?

Vielen Dank im Voraus :top:

tedgo

"Bedingt" meint die bereits erwähnten Einschränkungen: Dass also der PSS nicht mitbekommt, wenn sich ein Status ändert.
Zumindest nicht sofort. Erst nach dem nächsten Refresh/Titelwechsel würde die Playback Order korrekt angezeigt, wenn man sie nicht aus dem PSS heraus umschaltet.

Mit Stop-After-Current sieht es so aus, dass der PSS da gar keine Möglichkeit hat, den Status festzustellen. Das ginge ausschließlich über globale Variablen (soweit ich weiß... Ich nutze für beides das WSH Panel mod).

Ich häng dir mal eine englische Übersetzung (Google... also nicht wundern, wenn du nur die Hälfte verstehst :D) der letzten japanischen Textdatei des PSS an, darin findest du z. B. das Feld %ps_playback_order%. Wie man das nutzt oder was es zurückgibt, weiß ich allerdings nicht...

DeltaB

Ja super, da werde ich mal ein wenig lesen. Vielen Dank dafür, ich werde berichten ob und wie ich Erfolg hatte...

Dein txt in schlechtem Englisch hilft mir allemal sehr viel mehr als ein japanisches txt, das ich noch nicht mal in den Translator kopieren kann weil es mir kein Editor darstellt :uglystupid2:

DeltaB

Sodala,

man möchte es kaum glauben, es hat Vorteile wenn das Wetter schlecht ist und man Urlaub hat - man kann ohne schlechtes Gewissen die ganze Nacht am Rechner basteln 8)

Die ganze Sache funktioniert besser als gedacht. Bis auf die etwas unschöne Lösung mit globalen Variablen für manche Einstellungen ist die von mir gewünschte Funktionalität wunderbar mit dem Panel Stack Splitter realisierbar.

Einziges verbleibendes Problem: Alle Menübefehle lassen sich mit einem Imagebutton wunderbar aufrufen, nur sortieren funktioniert nicht. "Edit -> Sort -> Sorty by album" aus dem normalen Menü aufzurufen klappt wunderbar. Nicht funktionieren tut hingegen ein Imagebutton mit "COMMAND: Edit/Selection/Sort/Sort by artist".

Um die Verwirrung perfekt zu machen: Aus dem Menü "Edit -> Sort" funktioniert kein Kommando mit dem Imagebutton außer "Sort by fields...". Ich werde daraus leider überhaupt nicht schlau... Ich wäre sehr dankbar, wenn noch mal einer von euch Gurus was dazu sagen könnte...

######################################################################################

Ansonsten: Eine Community besteht aus geben und nehmen... Deshalb hier ein paar Tipps zum PSS speziell mit Image- oder Textbuttons. Die folgenden sind so die Punkte, bei denen ich zunächst Federn und Zeit gelassen habe. Vielleicht nutzt es ja mal jemandem, der über diesen Thread stolpert. Wenngleich es sich wohl eher um Anfägertipps ahndelt, tedgo, grimes und Konsorten werde ich damit wohl weniger beeindrucken ;)

• Ich dachte zunächst, man muss mit "per second" arbeiten, zwecks updaten und so. Braucht es aber gar nicht, man kann wunderbar im "per track" werkeln. Wunder wirkt dabei der Befehl "REFRESH" im Command-Teil eines Imagebuttons. Einfach die relevanten Schalter damit ausstatten und der PSS "refresht" nach jedem Klick auf den Button - öfter brauchts ja i.d.R. nicht. Mehrere Kommandos im Command-Teil werden übrigens per ";" getrennt. So lassen sich wunderbar Schalter konstruieren, die z.B. je nach Status die Farbe wechseln...

Beispiel:
$ifequal($get_ps_global(sacstatus),1,

$imagebutton(x,y,w,h,%ps_foobar2000_path%\images\stopaftercurrent_aktiv.jpg,%ps_foobar2000_path%\images\stopaftercurrent_aktiv_hover.jpg,SETGLOBAL:sacstatus:$mul($get_ps_global(sacstatus),-1);REFRESH;'COMMAND: Playback/Stop after current',left top,left top),

$imagebutton(x,y,w,h,%ps_foobar2000_path%\images\stopaftercurrent_nichtaktiv.jpg,%ps_foobar2000_path%\images\stopaftercurrent_nichtaktiv_hover.jpg,SETGLOBAL:sacstatus:$mul($get_ps_global(sacstatus),-1);REFRESH;'COMMAND: Playback/Stop after current',left top,left top))


• Innerhalb eines Imagebuttons geht "$set_ps_global(x,y)" nicht, man muss mit "SETGLOBAL:x:y" arbeiten (siehe Beispiel oben).

• Für Kontextmenü-bezogene Befehle im Command-Teil des Imagebuttons wählt man per "TFMODE:x", ob sich der Befehl auf den gerade laufenden oder den gerade ausgewählten Playlisteneintrag bezieht.

• %ps_playback_order% gibt Klartext zurück, plus einem Fragezeichen (wohl ein Bug). Eine mögliche Ausgabe wäre also "Default?". Um damit weiterzuarbeiten macht es Sinn, das ganze per $strcmp in eine Zahl zu übersetzen

$if($strcmp(%ps_playback_order%,'Default?'),$puts(playmode,1))

• Arbeitet man mit "stop after current" und speichert dessen Status in einer globalen Variable, sollte man sinnvollerweise unter Einstellungen -> Playback -> Other -> Stop playback ster current track den Haken bei "Reset when stopping" entfernen. Der Haken bewirkt nämlich ebenfalls einen Reset beim beenden und neu starten von Foobar. Und das kann man ja nun nicht (wie etwa einen Klick auf den Stopp-Schalter) einfach abfragen.

• Wer sich wundert, warum seine Bilder / Buttons nicht angezeigt werden oder Änderungen am Bild nicht sichtbar werden: Foobar einfach mal neu starten wirkt oft Wunder.

• Allgemein macht es *sehr* viel Sinn, das von tedgo hier im Thread gepostete txt zum PSS zu lesen, da stehen wichtige Dinge drin, die im HA-Wiki noch fehlen.

• Noch ein allgemeiner Hinweis: Im PSS kann man nur mit ganzen Zahlen (Integer) arbeiten. Wer also z.B. skalieren will und einen Zoomfaktor von 0,5 errechnet und diesen auf ein Objekt mit $mul anwenden will hat keinen Erfolg. Die Funktion $muldiv bietet ein Workaround.

$puts(zoomfaktor,$muldiv(100,%ps_width%,1678))
//Die 1678 kommt daher, dass ich zunächst mit Bildschirmbreite 1680 gearbeitet habe und die Skalier-Funktion später implementiert habe.
$puts(buttonbreite,$muldiv(125,$get(zoomfaktor),100))
//Auch die 125 ist natürlich nicht wörtlich zu nehmen und anzupassen...


So, nun werde ich Frühstücken und bedanke mich im Voraus für Anregungen zu oben angesprochener Problematik mit den Sort-Befehlen...

Beste Grüße,
DeltaB

tedgo

Zitat von: DeltaB in 19. Juli 2011, 06:12:38
Einziges verbleibendes Problem: Alle Menübefehle lassen sich mit einem Imagebutton wunderbar aufrufen, nur sortieren funktioniert nicht. "Edit -> Sort -> Sorty by album" aus dem normalen Menü aufzurufen klappt wunderbar. Nicht funktionieren tut hingegen ein Imagebutton mit "COMMAND: Edit/Selection/Sort/Sort by artist".

Um die Verwirrung perfekt zu machen: Aus dem Menü "Edit -> Sort" funktioniert kein Kommando mit dem Imagebutton außer "Sort by fields...". Ich werde daraus leider überhaupt nicht schlau... Ich wäre sehr dankbar, wenn noch mal einer von euch Gurus was dazu sagen könnte...
Kann ich dir auch nicht genau erklären, ich nutze solche Befehle gar nicht über Buttons (warum auch? Hat man leicht übers Kontextmenü oder - falls in der genutzten Playlistansicht vorhanden - über Klick auf den jeweiligen Spaltenkopf).

Zitat von: DeltaB in 19. Juli 2011, 06:12:38
Ich dachte zunächst, man muss mit "per second" arbeiten, zwecks updaten und so...
Würde sowieso nicht funktionieren, denn Buttons funktionieren nur unter "PerTrack"

Hier übrigens mal eine Vereinfachung deines Codes:

$puts(active,$ifequal(%sacstatus%,1,,nicht))
$imagebutton(x,y,w,h,%ps_foobar2000_path%\images\stopaftercurrent_$get(active)aktiv.jpg,%ps_foobar2000_path%\images\stopaftercurrent_$get(active)aktiv_hover.jpg,SETGLOBAL:sacstatus:$ifequal(%sacstatus%,1,0,1);REFRESH;'COMMAND: Playback/Stop after current',left top,left top)


Zitat von: DeltaB in 19. Juli 2011, 06:12:38
• Wer sich wundert, warum seine Bilder / Buttons nicht angezeigt werden oder Änderungen am Bild nicht sichtbar werden: Foobar einfach mal neu starten wirkt oft Wunder
Hast du denn auch für den Scriptstart dein %sacstatus% überhaupt definiert?
$init_ps_global(sacstatus,0)
Sollte mit meiner obigen $puts() Funktion nun aber überflüssig sein.

Zitat von: DeltaB in 19. Juli 2011, 06:12:38
• Noch ein allgemeiner Hinweis: Im PSS kann man nur mit ganzen Zahlen (Integer) arbeiten...
Ist allgemein so beim Titleformatting. Es ist ja auch nicht für Berechnungen entwickelt worden, wird nur vom PSS oder ähnlichen Plugins dazu missbraucht.

Aber schön zu sehen, dass du Fortschritte machst :)

DeltaB

Danke für die ausführliche Antwort zu früher Stunde :top:

Zitat von: tedgo in 19. Juli 2011, 08:39:05
Kann ich dir auch nicht genau erklären, ich nutze solche Befehle gar nicht über Buttons (warum auch? Hat man leicht übers Kontextmenü).

Schade dass dir dazu nichts einfällt... Es geht mir um die Sortierung der ganzen Playlist, da ist es umständlich, wenn man erst alles markieren muss...

Zitat von: tedgo in 19. Juli 2011, 08:39:05
Würde sowieso nicht funktionieren, denn Buttons funktionieren nur unter "PerTrack"

Ist klar, dennoch kann man ja Verrenkungen anstellen indem man globale Variablen "per second" ausliest / setzt, im "per second" farbige Kästchen über die Buttons spannt und andere derartige Scherze... Hab ich alles hinter mir :idiot2: ;)

Zitat von: tedgo in 19. Juli 2011, 08:39:05
Hier übrigens mal eine Vereinfachung deines Codes: [...]

Deinen ersten Kniff (dynamische Einbindung des Bildnamens) finde ich persönlich etwas verwirrend - wenngleich es natürlich "professioneller" ist. Der zweite Trick mit $ifequal(%sacstatus%,1,0,1) ist nice ;)

Zitat von: tedgo in 19. Juli 2011, 08:39:05
Hast du denn auch für den Scriptstart dein %sacstatus% überhaupt definiert?

Habe ich - genau so wie du es beschreibst. Aber danke für den Hinweis.

Zitat von: tedgo in 19. Juli 2011, 08:39:05
Ist allgemein so beim Titleformatting. Es ist ja auch nicht für Berechnungen entwickelt worden, wird nur vom PSS oder ähnlichen Plugins dazu missbraucht.

Ja, deshalb der "allgemeine Hinweis". Aber du hast Recht, ich hab mich nicht korrekt ausgedrückt ("Im PSS kann man nur..."). Ist eh ganz witzig, was aus TF so "rausgeprügelt" wird ;) Habe da auf HA auch mal aufgeschnappt, dass das eigentlich seitens des Foobar-Autors gar nicht so gern gesehen ist... Naja, was Foobar halt irgendwie fehlt ist eine "globale" Scriptsprache, dann hätte auch nicht jedes Plugin seine eigene Syntax... Aber gut, das ist eine Grundsatzdiskussion und hier OT...


Zitat von: tedgo in 19. Juli 2011, 08:39:05
Aber schön zu sehen, dass du Fortschritte machst :)

Danke, an der Stelle auch nochmal merci für deine Tipps und das txt. Ohne diese beiden Zutaten hätte ich vermutlich schon aufgegeben... Ansonsten: Falls dir oder jemand anderem noch was zum Thema Sortier-Buttons einfällt - wäre ganz großes Kino... Oder - um die Frage allgemeiner zu stellen - welche Gründe kann es haben, wenn im PSS allgemein ein Menüeintrag nicht per "COMMAND" aufrufbar ist?

Falls niemand etwas dazu einfällt könnte man das Problem noch von einer anderen Seite aufziehen: Fällt dir / jemand anderem ein simples Plugin ein, das (die ganze Playlist) sortieren kann und sich im Menü oder Kontextmenü einhängt? Weil dann bleibt die ursprüngliche Frage halt ungeklärt und ich rufe per "COMMAND: Playback/Pluginxy/Sort by xyz" das Plugin auf. Wäre nicht schön aber es wäre eine Lösung.

Beste Grüße,
DeltaB

tedgo

Mir fällt nur ein möglicher Grund ein, warum die Sort-Befehle nicht funktionieren:
Der PSS kann ja nur Aktionen für den gerade spielenden/gerade ausgewählten Track ausführen, nicht für eine Auswahl an Tracks.
Wie willst du nun einen Track sortieren?  ???

EDIT:
Lösung:
Stell das PSS von "Now playing" auf "Follow cursor", dann wirken sich die Aktionen auf eine jeweilige Auswahl an Tracks aus.