Кнопка на панели WSH для вывода меню фубара начиная с указанной секции.

Список разделов Аудиоплеер foobar2000 Секреты foobar2000 Интерфейс - CUI

Сообщение #1 imfam » 18.01.2023, 00:07

До некоторых пунктов меню/контекстного меню приходится долго спускаться по лестнице подпунктов.
Хотелось бы сделать кнопку, открывающую сразу нужный подпункт. Как?
Я видел в сборках код для SMP. Для WSH панели думаю тоже должен быть вариант.
Помогите, кто в этом разбирается.
Моя сборка: http://d9819506.bget.ru/foobar_my.html
imfam M
Автор темы
Откуда: Германия
Репутация: 25
С нами: 9 лет 8 месяцев

Сообщение #2 SergPuh.68 » 18.01.2023, 14:13

imfam,изображение кнопки положить в папку images
А код вот такой:
Код: Выделить всё
// ==PREPROCESSOR==
// @name "Menu"
// @author "SergPuh.68"
// @import "%fb2k_component_path%samples\js\lodash.min.js"
// @import "%fb2k_component_path%samples\js\helpers.js"
// ==/PREPROCESSOR==

function RGB(r,g,b) { return (0xff000000|(r<<16)|(g<<8)|(b)) };

var ColourTypeCUI = {
    text: 0,
    selection_text: 1,
    inactive_selection_text: 2,
    background: 3,
    selection_background: 4,
    inactive_selection_background: 5,
    active_item_frame: 6
};

var color = RGB(52,52,55);

function on_size() {
   ww = window.Width;
   wh = window.Height;
   buttons.update();   
}

function on_paint(gr) {
    ww = window.Width;   
    wh = window.Height;   
   gr.FillSolidRect(0, 0, ww, wh, color);
   buttons.paint(gr);   
}

var buttons = new _buttons();

buttons.update = function () {
    ww = window.Width;
    wh = window.Height;   
   this.buttons.d = new _button(0, 0, 22, 23, {normal : 'profile\\images\\drop-menu.png', hover : 'profile\\images\\drop-menu_over.png'}, DropMenuPlaylist, '');   
}

function on_mouse_leave() {
   buttons.leave();
   window.Repaint();   
}

function on_mouse_lbtn_up(x, y, mask) {
   buttons.lbtn_up(x, y, mask);
   buttons.update();
   window.Repaint();
}

function on_mouse_move(x, y) {
   buttons.move(x, y);   
   if(buttons.move(x, y)) {
      window.SetCursor(32649);
   } else {
       window.SetCursor(32512);
    }
}

function on_playback_starting() {
   buttons.update();
   window.Repaint();
}

function on_playback_pause() {
   buttons.update();
   window.Repaint();
}

function on_playback_stop() {
   buttons.update();
   window.Repaint();
}

function DropMenuPlaylist(x, y){
   var _menu = window.CreatePopupMenu();   
   _menu.AppendMenuItem(0x00000000, 1, "Select all");
   var ret = _menu.TrackPopupMenu(x, y);
   switch (ret){
      case 1: fb.RunMainMenuCommand("Edit/Select all"); break;      
   }
   _menu.Dispose();
}

function on_mouse_rbtn_up(x, y, mask) {
    return true;   
}
YouTube Music
SergPuh.68 M
Аватара
Откуда: Украина
Репутация: 140
С нами: 4 года

Сообщение #3 imfam » 18.01.2023, 14:34

SergPuh.68, похоже, это код для исполнения пункта (команды) меню. Вечером попробую,когда до компа доберусь. Я спрашивал про другое. Показать само меню начиная с указанной позиции в лестнице меню. Я ожидал команды getmainmenuitem и код для определения menuitem. Или всё совсем не так. Но в данном коде я не вижу, с какой именно позиции меню он работает.
Моя сборка: http://d9819506.bget.ru/foobar_my.html
imfam M
Автор темы
Откуда: Германия
Репутация: 25
С нами: 9 лет 8 месяцев

Сообщение #4 SergPuh.68 » 18.01.2023, 15:04

imfam:похоже, это код для исполнения пункта (команды) меню
Это код для составления собственного всплывающего меню с нужными командами при нажатии на кнопку
YouTube Music
SergPuh.68 M
Аватара
Откуда: Украина
Репутация: 140
С нами: 4 года

Сообщение #5 imfam » 18.01.2023, 15:20

SergPuh.68, спасибо, буду пробовать.

Добавлено спустя 5 часов 56 минут:
Error: WSH Panel Mod (Menu by SergPuh.68): Microsoft JScript runtime error:
'_buttons' is undefined
File: <main>
Ln: 35, Col: 1
Код: Выделить всё
var buttons = new _buttons();

buttons.update = function () {
    ww = window.Width;
    wh = window.Height;   
   this.buttons.d = new _button(0, 0, 22, 23, {normal : 'd:\\foobar2000\\themes\\DarkOne\\images\\drop-menu.png', hover : 'd:\\foobar2000\\themes\\DarkOne\\images\\drop-menu_over.png'}, DropMenuPlaylist, '');   
}
Моя сборка: http://d9819506.bget.ru/foobar_my.html
imfam M
Автор темы
Откуда: Германия
Репутация: 25
С нами: 9 лет 8 месяцев

Сообщение #6 kutuzof » 18.01.2023, 21:29

imfam, вот пример меню из моей сборки:
Код: Выделить всё
function getTextToolsMenu(x, y) {
   x = Buttons.center1.left;
   y = Buttons.center1.top;

   var j2 = window.CreatePopupMenu();
   var o2;

   j2.AppendMenuItem(0, 1, "Copy: #. Artist - Title");
   j2.AppendMenuItem(0, 2, "Copy: #. Title");
   j2.AppendMenuItem(0, 3, "Copy: Album");
   j2.AppendMenuItem(0, 4, "Copy: Artist");
   j2.AppendMenuItem(0, 5, "Copy: Artist - Album");
   j2.AppendMenuItem(0, 6, "Copy: Artist - Title");
   j2.AppendMenuItem(0, 7, "Copy: Composer");
   j2.AppendMenuItem(0, 8, "Copy: File name");
   j2.AppendMenuItem(0, 9, "Copy: Genre");
   j2.AppendMenuItem(0, 10, "Copy: Title");
   j2.AppendMenuItem(0, 11, "Customize...");
   j2.AppendMenuSeparator();
   j2.AppendMenuItem(0, 12, "Advanced...");

   o2 = j2.TrackPopupMenu(x, y);

   switch (true) {
      case (o2 == 1):
         fb.RunContextCommandWithMetadb("Utilities/Text Tools/Copy: #. Artist - Title", plman.GetPlaylistSelectedItems(plman.ActivePlaylist));
         break;

      case (o2 == 2):
         fb.RunContextCommandWithMetadb("Utilities/Text Tools/Copy: #. Title", plman.GetPlaylistSelectedItems(plman.ActivePlaylist));
         break;

      case (o2 == 3):
         fb.RunContextCommandWithMetadb("Utilities/Text Tools/Copy: Album", plman.GetPlaylistSelectedItems(plman.ActivePlaylist));
         break;

      case (o2 == 4):
         fb.RunContextCommandWithMetadb("Utilities/Text Tools/Copy: Artist", plman.GetPlaylistSelectedItems(plman.ActivePlaylist));
         break;

      case (o2 == 5):
         fb.RunContextCommandWithMetadb("Utilities/Text Tools/Copy: Artist - Album", plman.GetPlaylistSelectedItems(plman.ActivePlaylist));
         break;

      case (o2 == 6):
         fb.RunContextCommandWithMetadb("Utilities/Text Tools/Copy: Artist - Title", plman.GetPlaylistSelectedItems(plman.ActivePlaylist));
         break;

      case (o2 == 7):
         fb.RunContextCommandWithMetadb("Utilities/Text Tools/Copy: Composer", plman.GetPlaylistSelectedItems(plman.ActivePlaylist));
         break;

      case (o2 == 8):
         fb.RunContextCommandWithMetadb("Utilities/Text Tools/Copy: File name", plman.GetPlaylistSelectedItems(plman.ActivePlaylist));
         break;

      case (o2 == 9):
         fb.RunContextCommandWithMetadb("Utilities/Text Tools/Copy: Genre", plman.GetPlaylistSelectedItems(plman.ActivePlaylist));
         break;

      case (o2 == 10):
         fb.RunContextCommandWithMetadb("Utilities/Text Tools/Copy: Title", plman.GetPlaylistSelectedItems(plman.ActivePlaylist));
         break;

      case (o2 == 11):
         fb.RunContextCommandWithMetadb("Utilities/Text Tools/Customize...", plman.GetPlaylistSelectedItems(plman.ActivePlaylist));
         break;

      case (o2 == 12):
         fb.RunContextCommandWithMetadb("Utilities/Text Tools/Advanced...", plman.GetPlaylistSelectedItems(plman.ActivePlaylist));
         break;
   }
}
kutuzof M
Аватара
Возраст: 35
Откуда: Орёл (Россия)
Репутация: 226
С нами: 6 лет 4 месяца

Сообщение #7 SergPuh.68 » 18.01.2023, 21:59

imfam,у тебя путь к изображению прописан не правильно, должно быть типа того:
Код: Выделить всё
var buttons = new _buttons();

buttons.update = function () {
    ww = window.Width;
    wh = window.Height;   
   this.buttons.d = new _button(0, 0, 22, 23, {normal : 'themes\\DarkOne\\images\\drop-menu.png', hover : 'themes\\DarkOne\\images\\drop-menu_over.png'}, DropMenuPlaylist, '');   
}
YouTube Music
SergPuh.68 M
Аватара
Откуда: Украина
Репутация: 140
С нами: 4 года

Сообщение #8 imfam » 21.01.2023, 15:51

kutuzof:пример меню из моей сборки
Код легко встроился в мою кнопочную панель. Результат:

text-menu.png
Текстовое меню


У меня не было текстовых меню, пользовался кнопочнвми. Но места для кнопок не стало хватать. Решил использовать плагин foo_flowin. Он создаёт внешние панели в отдельных окнах. Можно запускать любые скрипты, для тестирования или, например, плейлист крупно на весь экран для вывода на телевизор. Меню тоже сделал кнопочное (прячется при убирании курсора):

flowin-menu.png
Кнопочное меню


Текстовое мне больше нравится.
Спасибо за помощь!
Моя сборка: http://d9819506.bget.ru/foobar_my.html
imfam M
Автор темы
Откуда: Германия
Репутация: 25
С нами: 9 лет 8 месяцев


Вернуться в Интерфейс - CUI