XUL: Как создать вложенное меню в статусбарпане (с иконкой статусного меню?) - PullRequest
2 голосов
/ 13 августа 2010

В XUL вы можете создать иконку панели состояния, похожую на ту, что используется в Firebug и Greasemonkey, с тегом <statusbarpanel>. Если вы установите правильный класс, вы можете бросить <menupop> внутрь, а затем иметь всплывающее меню, когда пользователь нажимает на значок, например, так ...

<statusbarpanel class="statusbarpanel-menu-iconic"
        src="chrome://YourExtension/content/icon.png">
    <menupopup>
        <menuitem label="whatever" oncommand="doSomething();">
        <menuitem label="whatever else" oncommand="doSomethingElse();">
    </menupopup>
</statusbarpanel>

Теперь, с другими всплывающими меню, вы можете вкладывать серии меню, используя тег меню:

<statusbarpanel class="statusbarpanel-menu-iconic"
        src="chrome://YourExtension/content/icon.png">
    <menu value="Old">
        <menupopup>
            <menuitem label="whatever" oncommand="doSomething();">
            <menuitem label="whatever else" oncommand="doSomethingElse();">
        </menupopup>
    </menu>
    <menu value="New>
        <menupopup>
            <menuitem label="yet another" oncommand="doYetAnotherSomething();">
        </menupopup>
    </menu>
</statusbarpanel>

, но приведенный выше код на самом деле не работает, потому что <statusbarpanel> не позволит <menu> дочернему элементу (ну, это разрешит, но не создаст желаемый эффект).

Итак, что меня интересовало, так это ... можно ли как-нибудь создать меню, вызываемое иконкой панели состояния, с несколькими слоями пунктов меню?

* РЕДАКТИРОВАТЬ * Поскольку я не могу опубликовать это в комментарии к ответу (и получить синтаксическую раскраску и тому подобное), вот что в итоге сработало для меня (спасибо, Сатиш!):

<statusbarpanel class="statusbarpanel-menu-iconic"
        src="chrome://YourExtension/content/icon.png" popup="stausBarPanelMenu">
</statusbarpanel>
<popup id="statusBarPanelMenu" position="start_before">
    <menu value="Old">
        <menupopup>
            <menuitem label="whatever" oncommand="doSomething();">
            <menuitem label="whatever else" oncommand="doSomethingElse();">
        </menupopup>
    </menu>
    <menu value="New>
        <menupopup>
            <menuitem label="yet another" oncommand="doYetAnotherSomething();">
        </menupopup>
    </menu>
</popop>

Да, и как примечание для всех разработчиков XUL, которые могли бы прочитать это: вам действительно следует исключить всплывающее окно в стиле «menupopup in statusbarpanel». Стиль, который ответил на этот вопрос, так же прост в изучении / использовании, значительно более мощный и основан на тех же механизмах всплывающих окон, которые можно использовать с другими элементами XUL. Весь этот «менупопуп внутри статусбарпана» - это просто запутанная, ненужная аномалия.

1 Ответ

0 голосов
/ 14 августа 2010

Попробуйте:

  1. создайте всплывающий элемент, подобный этому: <popup ... > <menu ... > <menupopup ... > <menuitem ... > </menupopup ... > </menu> </popup>

  2. присвоить элемент id из popup атрибуту oncontextmenu или показать его динамически, используя событие onclick элемента statusbarpanel.

...