wsh panel mod + custom buttons via "run comand"

Begonnen von Sputnik83, 28. November 2010, 03:58:44

Vorheriges Thema - Nächstes Thema

Sputnik83

Also,
Ziel und SInn des ganzen, ist es eine art Sidebar zu bauen, auf die ich custom buttons setzen kann, die Befehle aus dem Menu, wie last.fm radio Stationen, die Album List, aber auch custom Befehle über den "run-service" wie google suche nach Interpret etc. ausführen können.
Die Buttons sollen auf wsh panel mod gescripted werden.
Da ich selbst viel zu dämlich und unerfahren bin, war ich etwas bei viel viel besseren entwicklern "leihen".

Zur Anregugung hab ich mir dieses hier angeschaut:
Code by tedGo and Arnie77
entnommen aus dem großartigen Silent Night Skin.

// LastFM Menu
// Code by tedGo and Arnie77
//
// ==PREPROCESSOR==
// @import "%fb2k_path%Silent Night\scripts\Global Button Script.js"
// ==/PREPROCESSOR==

var compCheck = utils.CheckComponent("foo_lastfm_radio", true);
var isLFM = compCheck ? 0 : 1;

var ww = 80; wh = 16;
// ----- CREATE BUTTON ---------------------------------------------
var imgPath = fb.FoobarPath + "Silent Night\\images\\";
Buttons = {
but1: new Button(0, 0, ww, wh, {normal: imgPath + "bt_lastfm_0.png", hover: imgPath + "bt_lastfm_1.png"}, function(){}, "")
}

// ----- CREATE MENU -----------------------------------------------
function on_mouse_lbtn_down(x, y) {
var basemenu = window.CreatePopupMenu();
    var ret;
   
var a = window.CreatePopupMenu();
   
    var idx;

a.AppendMenuItem(isLFM, 1, "Open a custom station...");
    a.AppendMenuItem(2048, 0, 0);
a.AppendMenuItem(isLFM, 2, "Personal Last.fm radio");
    a.AppendMenuItem(isLFM, 3, "Recommended Last.fm radio");
    a.AppendMenuItem(isLFM, 4, "Neighbours' Last.fm radio");
    a.AppendMenuItem(isLFM, 5, "Playlist Last.fm radio");
    a.AppendMenuItem(2048, 0, 0);
a.AppendMenuItem(isLFM, 6, "Friends of foobar2000 group radio");
    a.AppendMenuItem(2048, 0, 0);
a.AppendMenuItem(0, 7, "Now playing artist@Last.fm");

idx = a.TrackPopupMenu(x, y);

switch (true) {
           
        case (idx == 1):
fb.RunMainMenuCommand("File/Open Last.fm Radio Station/A custom Last.fm station.");
break;
           
        case (idx == 2):
fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Your personal Last.fm radio.");
break;
           
        case (idx == 3):
fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Your recommended Last.fm radio.");
break;
           
        case (idx == 4):
fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Your neighbours' Last.fm radio.");
break;
           
        case (idx == 5):
fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Your playlist Last.fm radio.");
break;
           
        case (idx == 6):
fb.RunMainMenuCommand("File/Open Last.fm Radio Station/Open Friends of foobar2000 Last.fm group.");
break;
           
        case (idx == 7):
            fb.RunContextCommand("Run service/LastFM Artist");
break;
           
}
a.Dispose();
}


//Fixed coords for menu

// ----- DRAW ------------------------------------------------------
function on_paint(gr) {
buttonsDraw(gr);
}

// ----- EVENTS ----------------------------------------------------
function on_size() {
ww = window.Width;
wh = window.Height;

}

//Fixed coords for menu
function on_mouse_mbtn_down(x, y) {
    window.ShowConfigure();
}

function on_mouse_rbtn_down(x, y) {

}function on_mouse_rbtn_down(x, y, vkey){
rbtnDown = vkey==6 ? true : false;
}

function on_mouse_rbtn_up(x, y, vkey){
if (rbtnDown) {
rbtnDown=false;
return vkey==4 ? false : true;
} else
return true;
}


Wenn ich das ganze 1 zu 1 übernehme, haut das auch wunderbar hin.
Sprich:
im Silent Night Skin liegen die Buttons im Verzeichniss "images" im Überverzeichniss "Silent Night" im Hauptverzeichnis von fb2k.
Kopier ich also den gesammten Silent Night Ordner in mein Foobar-Verzeichniss und Importier das Skript 1 zu 1, klappt alles wunderbar.
Nur, und da werden mir die Entwickler wohl zustimmen, ist das nicht ganz Sinn der Sache.
Auch liegt es hier nicht in meinem Interesse, stumpf irgendweine Fremdarbeit zu klauen, sondern will auch verstehen wie es funktioniert, eigene Icons etwerfen, das script an meine Bedürfnisse anpassen und nicht nur auf fremde resource zurückgreifen...
Aber:
Es fängt schon bei der Pfadangabe an...
Versuche ich nur den Ordner "images" aus dem "silent Night" Überverzeichniss heraus zu ziehen und das Script dahingehend zu ändern, bekomme ich script Fehler...
An eigene Icons an einem Dateipfad meiner Wahl garnicht zu denken ...
Den Code hab ich wie folgt versucht zu ändern um wenigstens dieses erste Teilziel zu erreichen:
Pfad von:
var imgPath = fb.FoobarPath + "Silent Night\\images\\";
versucht habe ich:
var imgPath = fb.FoobarPath + "\\images\\";
var imgPath = fb.FoobarPath + "images";
var imgPath = fb.FoobarPath + images;
var imgPath = fb.FoobarPath + \\images\\;

was mach ich falsch?
wo liegt der Fehler?

tedgo

#1

var imgPath = fb.FoobarPath + "images\\";


Außerdem wird auch script geladen. Hast du das gesehen?

// ==PREPROCESSOR==
// @import "%fb2k_path%Silent Night\scripts\Global Button Script.js"
// ==/PREPROCESSOR==


Wenn du deine Dateien woanders ablegst, musst du natürlich auch diesen Pfad ändern. Du kannst dieses Script zu den Images verschieben, so hast du im ganzen Script nur einen Pfad. Im PREPROCESSOR lautete der dann:

// ==PREPROCESSOR==
// @import "%fb2k_path%images\Global Button Script.js"
// ==/PREPROCESSOR==

In diesem Script wird übrigens das Objekt "Button" erstellt.
Im eigentlichen, von dir zu ändernden Script der Button dann definiert (Platzierung, Funktion).

Sputnik83

Ich habs gesehen, hab aber angenommen, das es erstens unwichtig sei, da es auch ohne funktionierte ^^ und zweitens auskommentiert sei (ist es das nicht?)

Das ich dann beide Pfade ändern muss, ist klar, wenn man denn dann begriffen hat, das sich die \\ immer nur auf einen Ordner beziehen. Danke dafür.

Warum muss das eigentlich alles so kopliziert sein oO

tedgo

#3
// ==PREPROCESSOR==
// @dingens "blablabla"
// ==/PREPROCESSOR==
ist eine "Spezialfunktion", mit der man generelles angeben kann.
Nicht nur vorgefertigte Scripts laden (was sehr nützlich ist, wenn man mehrere Panel verbaut und in allen das gleiche Objekt erstellen muss. Denn dann muss man das Script für dieses Objekt nur einmal schreiben und kann es dann in die betreffenden Scripts laden), sondern auch den Namen des Scripts, die Version, Name des Authors in der Console ausgeben kann.
So kann man bei einem Fehler leichter feststellen, welches Script den Fehler verursacht hat (normalerweise würde da sonst nur eine unübersichtliche Zeichenkette stehen...).

Sputnik83

#4
Soooo bin schon nen ganzes Stück weiter, aber ddie Geschichte mit den wsh panel buttons bekomm ich noch immer nicht ganz hin.

defekter link entfernt - grimes

und zwar versuche ich die Buttons auf der linken Seite an zu ordnen, leider ohne Erfolg.

Ich hätte gerne, beide Buttons weiter unten auf der Sidebar liegen und enen größeren Abstand zwichen ihnen.

Ich hab als erstes, die Buttons auf 16*16 Pixel getrimmt, da sie ursprünglich 80*16 waren, um den dahinterstehenden Text mit klickbar zu machen.
Die entsprechenden Variablen im Script auf 16*16 gestellt und in den settings die ize auf 16 gestellt und ein Häkchen bei "lock size" gesetzt.
So weit so gut...
Ich dachte nun, die Abstände des Icons von den Rändern über die Padding Funktion einstellen zu können.
Erhöhe ich nun beim zweiten Button den Wert "Top", wird mir der Button nur auf der Unterseite abgeschnitten, bis er dann ab einem wert von ca 10 ganz vershwunden ist...
Ich hab jetzt schon jede menge ausprobiert.... allle mölglichen Werte versucht zu ändern, ohne Erfolg....
Meistens verschwindet der Button einfach ganz...
Wo liegt mein Fehler?

Ausserdem kann ich irgendwie nur die Höhe des Panles einstellen, die Breite der klickbaren Bereiche, vergrößert sich mit der Sidebar automatisch mit, an welcher Stelle, kann ich die Breite des Panles definieren?

Hier noch der minimal geäderte code der Buttons:

// Mini Menu
// Code by tedGo and Arnie77
//
// ==PREPROCESSOR==
// @import "%fb2k_path%\scripts\Global Button Script.js"
// ==/PREPROCESSOR==
var compCheck = utils.CheckComponent("foo_cdda", true);
var isCDA = compCheck ? 0 : 1;
var compCheck2 = utils.CheckComponent("foo_albumlist", true);
var isAL = compCheck2 ? 0 : 1;
var isLIB = 0;
function on_playback_new_track (metadb) {isLIB = fb.IsMetadbInMediaLibrary(metadb) ? 1 : 0;}

var ww = 16; wh = 16;
// ----- CREATE BUTTON ---------------------------------------------
var imgPath = fb.FoobarPath + "images\\";
Buttons = {
but1: new Button(0, 0, ww, wh, {normal: imgPath + "bt_music_0.png", hover: imgPath + "bt_music_1.png"}, function(){}, "")
}
// ----- CREATE MENU -----------------------------------------------
function on_mouse_lbtn_down(x, y) {
var basemenu = window.CreatePopupMenu();
   var ret;
   
var a = window.CreatePopupMenu();
var b = window.CreatePopupMenu();
var idx;
b.AppendMenuItem(isLIB, 101, "Artist");
b.AppendMenuItem(isLIB, 102, "Album");
b.AppendMenuItem(isLIB, 103, "Track Number");
   b.AppendMenuItem(isLIB, 104, "File Path");
   b.AppendMenuItem(isLIB, 105, "Title");
   b.AppendMenuItem(2048, 0, 0);
   b.AppendMenuItem(isLIB, 106, "by fields...");
   b.AppendMenuItem(isLIB, 107, "by...");
   b.AppendMenuItem(2048, 0, 0);
   b.AppendMenuItem(isLIB, 108, "Randomize");
   b.AppendMenuItem(isLIB, 109, "Reverse");

a.AppendMenuItem(0 | 16, b.ID, "Sort by ...");
a.AppendMenuItem(2048, 0, 0);
a.AppendMenuItem(isAL, 1, "Album List");
a.AppendMenuItem(0, 2, "Configure Library");
   a.AppendMenuItem(2048, 0, 0);
   a.AppendMenuItem(isCDA, 3, "Open Audio CD ...");
   a.AppendMenuItem(2048, 0, 0);
a.AppendMenuItem(0, 4, "Playlist Manager");
a.AppendMenuItem(0, 5, "Console");

idx = a.TrackPopupMenu(x, y);

switch (true) {
case (idx == 1):
fb.RunMainMenuCommand("Library/Album List");
break;
           
       case (idx == 2):
fb.RunMainMenuCommand("Library/Configure");
break;
           
       case (idx == 3):
fb.RunMainMenuCommand("File/Open Audio CD...");
break;
           
       case (idx == 4):
fb.RunMainMenuCommand("View/Playlist Manager");
break;
           
       case (idx == 5):
fb.RunMainMenuCommand("View/Console");
break;
           
       case (idx == 101):
fb.RunMainMenuCommand("Edit/Sort/Sort by Artist");
break;
           
case (idx == 102):
fb.RunMainMenuCommand("Edit/Sort/Sort by Album");
break;
           
       case (idx == 103):
fb.RunMainMenuCommand("Edit/Sort/Sort by Track Number");
break;
           
       case (idx == 104):
fb.RunMainMenuCommand("Edit/Sort/Sort by File Path");
break;
           
       case (idx == 105):
fb.RunMainMenuCommand("Edit/Sort/Sort by Title");
break;
           
       case (idx == 106):
fb.RunMainMenuCommand("Edit/Sort/Sort by fields...");
break;
           
       case (idx == 107):
fb.RunMainMenuCommand("Edit/Sort/Sort by...");
break;
           
       case (idx == 108):
fb.RunMainMenuCommand("Edit/Sort/Randomize");
break;
           
       case (idx == 109):
fb.RunMainMenuCommand("Edit/Sort/Reverse");
break;
           
}
           

a.Dispose();
b.Dispose();
}


//Fixed coords for menu

// ----- DRAW ------------------------------------------------------
function on_paint(gr) {
buttonsDraw(gr);
}

// ----- EVENTS ----------------------------------------------------
function on_size() {
ww = window.Width;
wh = window.Height;

}

//Fixed coords for menu
function on_mouse_mbtn_down(x, y) {
   window.ShowConfigure();
}

function on_mouse_rbtn_down(x, y) {

}function on_mouse_rbtn_down(x, y, vkey){
rbtnDown = vkey==6 ? true : false;
}

function on_mouse_rbtn_up(x, y, vkey){
if (rbtnDown) {
rbtnDown=false;
return vkey==4 ? false : true;
} else
return true;
}


Danke für eure Hilfe ;)

tedgo

Vergiss "Lock size", die Funktion bringt nix.

Aktiviere "Forced Layout" und gib Werte für left, top, width und height an.
So kannst du deine Buttons individuell platzieren.

In deinem Script nützt die Änderung ww = 16 und wh = 16 übrigens nichts...
Denn die Werte werden in function on_size() nachkorrigiert und da hast du sie auf window.Width und window.Height belassen...

Geh lieber in die Zeile deines Buttons und ersetze da ww und wh durch 16.
Dann kannst du die Variablen ww und wh auch komplett aus dem Script schmeißen (an beiden Stellen, also oben und in function_on_size).

Sputnik83

Hat super funktioniert, danke für die schnelle Antwort.
Ohne dich wär ich hier aufgeschmissen.