Как я могу отобразить текст поверх кнопки на панели инструментов для аддона Firefox? - PullRequest
7 голосов
/ 09 июня 2011

Я пытаюсь отобразить небольшой текст (количество новых сообщений) над значком на кнопке панели инструментов, что-то вроде расширений Chrome и Opera со значком над значками панели инструментов. Текст не должен охватывать всю иконку, он должен быть внизу, чтобы пользователь мог видеть основную часть иконки и узнавать, какое это расширение. Как я могу это сделать?

Вы можете видеть, что я хочу на этом примере изображения из Chrome:

toolbar button text overlay on chrome


Я попытался с описанием, span и div внутри элемента стека, но я не смог заставить ни одного из них расположиться внизу. Описание и div всегда отображают текст в центре, в то время как span показывает его справа от значка, делая всю кнопку шире.

<toolbarpalette id="BrowserToolbarPalette">
    <toolbarbutton class="toolbarbutton-1">
        <stack>
            <image></image>
            <description right="0" bottom="0" value="4"></description>
            <!-- <html:div right="0" bottom="0">5</html:div> -->
        </stack>
    </toolbarbutton>
</toolbarpalette>

Ответы [ 3 ]

4 голосов
/ 13 июня 2011

У меня было время, чтобы тратить время на ожидание прекращения дождя в Формуле 1, поэтому я сделал эту работу с холстом:

ОБНОВЛЕНО : предыдущий метод был ошибочным, когда пользователь удалялзначок на панели инструментов, обновленный метод стал более надежным и с меньшим количеством кода.

XUL

<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml">
    <hbox hidden="true">
        <html:canvas id="toolbar_button_canvas" width="24" height="24"></html:canvas>
    </hbox>
    <toolbarpalette id="BrowserToolbarPalette">
        <toolbarbutton id="toolbar_button" class="toolbarbutton-1" />
    </toolbarpalette>
</overlay>

CSS

#toolbar_button {
    list-style-image:url("chrome://your_extension/skin/icon_024.png");
}

toolbar[iconsize="small"] #toolbar_button {
    list-style-image:url("chrome://your_extension/skin/icon_016.png");
}

JavaScript

show_status: function(display_text)
{
    var btn = document.getElementById("toolbar_button");
    var canvas = document.getElementById("toolbar_button_canvas");
    var img_src = window.getComputedStyle(btn).listStyleImage.replace(/^url\("(chrome:\/\/your_extension\/skin\/icon_0\d{2}.png)"\)$/, "$1");   // get image path
    var csize = img_src.replace(/^chrome:\/\/your_extension\/skin\/icon_0(\d{2})\.png$/, "$1"); // get image size

    canvas.setAttribute("width", csize);
    canvas.setAttribute("height", csize);
    var ctx = canvas.getContext("2d");

    var img = new Image();
    img.onload = function()
    {
        ctx.textBaseline = "top";
        ctx.font = "bold 9px sans-serif";       // has to go before measureText

        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.drawImage(img, 0, 0);

        if (display_text !== "")
        {
            var w = ctx.measureText(display_text).width;
            var h = 7;                  // 9 = font height

            var rp = ((canvas.width - 4) > w) ? 2 : 1;  // right padding = 2, or 1 if text is wider
            var x = canvas.width - w - rp;
            var y = canvas.height - h - 1;          // 1 = bottom padding

            ctx.fillStyle = "#f00";             // background color
            ctx.fillRect(x-rp, y-1, w+rp+rp, h+2);
            ctx.fillStyle = "#fff";             // text color
            ctx.fillText(display_text, x, y);
            //ctx.strokeText(display_text, x, y);
        }
        btn.image = canvas.toDataURL("image/png", "");  // set new toolbar image
    };
    img.src = img_src;
}
2 голосов
/ 15 января 2015

Я только что использовал библиотеки из browser-action-jplib

И он отлично работал на моих простых аддонах

Если вы используете библиотеку, у вас могут возникнуть проблемы с AMO-обзором

Может быть решена с помощью проблемы

2 голосов
/ 14 апреля 2012

мой вариант с html: div

PS Вы также можете попробовать поиграть с z-index

Как это выглядит http://f3.s.qip.ru/fTUvr2Cj.jpg

XUL

<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml">
    <toolbar id="nav-bar">
    <hbox>
    <html:div style="color: #000000;
        font-size: 10px;
        font-weight: bold;
        margin-right: 10px;
        margin-top: 16px;
        position: fixed;
        right: 0;">5</html:div>
    <toolbarbutton  insertafter="search-container" type="menu">
    <menupopup>
    <menuitem   class="menuitem-iconic" label="&count;"></menuitem>

    <menuitem   class="menuitem-iconic" label="&size;"></menuitem>

    <menuitem  class="menuitem-iconic" label="&time;"></menuitem>
    <menuseparator></menuseparator>
    <menuitem  class="menuitem-iconic" label="&settings;"></menuitem>
    </menupopup>
    </toolbarbutton>
    </hbox>
    </toolbar>
</overlay>
...