>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Всплывающие подсказки для всех закладок - нельзя ли проще? http://forum.mozilla-russia.org/viewtopic.php?id=17576 |
Infocatcher > 17-06-2007 02:13:03 |
Меня давно раздражало отсутствие в Firefox всплывающих подсказок (tooltip) на панели закладок... Но искать решение (расширение, еще что-нибудь...) руки не доходили. Вот, что из этого вышло: Решение же просто до безобразия: Выделить код Код:function fixBookmarksTooltipBug() { var menuitemsArray = document.getElementsByTagName("menuitem"); for (var i = 0; i < menuitemsArray.length; i++) if( menuitemsArray[i].getAttribute("class").match(/bookmark-item/) ) menuitemsArray[i].setAttribute("tooltip", "btTooltip"); var toolbarbuttonsArray = document.getElementsByTagName("toolbarbutton"); for (var i = 0; i < toolbarbuttonsArray.length; i++) if( toolbarbuttonsArray[i].getAttribute("class").match(/bookmark-item/) ) toolbarbuttonsArray[i].setAttribute("tooltip", "btTooltip"); } window.addEventListener('load', fixBookmarksTooltipBug, false); Я зря заново изобретаю велосипед? P. S. Никто не знает, почему для тулбаров (и их подъэлементов) не работает атрибут statustext (думаю, разъяснять не надо – ясно из названия) – только для закладок из главного меню? P. P. S. Надеюсь, сия фича более востребована, чем мое предыдущее расширение |
Anton > 17-06-2007 08:56:20 |
Это которые вот эти: http://forum.mozilla-russia.org/uploaded/bkmkstt.png ? У меня они вроде по умолчанию присутствуют... %-| А вот в меню закладок нет, так что было бы неплохо.
организовать обработчик mouseover, в зависимости от элемента под курсором [не]показывать подсказку, или приклеить подсказку к панели, по onpopupshowing определять, стоит ли её показывать, в первом приближении так. да, ещё можно попробовать сделать привязку на class="bookmark-item" с встроенным tooltip'ом. |
Infocatcher > 17-06-2007 13:27:36 |
Прошу прощения... Время было позднее (по Москве)... Итак, на новом профиле (все скрины пережаты): После приведенного выше скрипта: Фокус в том, что подсказки будут даже у свежесозданных папок-закладок – видимо, что-то с наследованием...
А вот это я что-то не понял... Класс "bookmark-item" есть у всех элементов, относящихся к закладкам, тогда как "tooltip" – нет – посему и подсказки не везде присутствуют (в этом нетрудно убедиться с помощью инспектора DOM). И если учесть, что я впервые начал развлекаться с XUL, JavaScropt и иже с ними меньше года назад (методом разбирания расширений), то таки подробностей хотелось бы... ... Выделить код Код:document.getElementById("bookmarks-stack").setAttribute("tooltip", "btTooltip"); // Bookmarks panel document.getElementById("menu_BookmarksPopup").setAttribute("tooltip", "btTooltip"); // Bookmarks menu И все! Наследование – это здорово. Просьба потестить: |
Infocatcher > 17-06-2007 18:48:37 |
Прикрутил изменение текста в строке состояния – для всех закладок. Выделить код Код:function fixBookmarksTooltipBug() { var menuitemsArray = document.getElementsByTagName("menuitem"); for (var i = 0; i < menuitemsArray.length; i++) if( menuitemsArray[i].getAttribute("class").match(/bookmark-item/) ) { menuitemsArray[i].setAttribute( "onmouseover", "setURItoStatusbarLabel(this, true)" ); menuitemsArray[i].setAttribute( "onmouseout", "setURItoStatusbarLabel(this, false)" ); } var toolbarbuttonsArray = document.getElementsByTagName("toolbarbutton"); for (var i = 0; i < toolbarbuttonsArray.length; i++) if( toolbarbuttonsArray[i].getAttribute("class").match(/bookmark-item/) ) { toolbarbuttonsArray[i].setAttribute( "onmouseover", "setURItoStatusbarLabel(this, true)" ); toolbarbuttonsArray[i].setAttribute( "onmouseout", "setURItoStatusbarLabel(this, false)" ); } document.getElementById("bookmarks-stack").setAttribute("tooltip", "btTooltip"); // Bookmarks panel document.getElementById("menu_BookmarksPopup").setAttribute("tooltip", "btTooltip"); // Bookmarks menu } function setURItoStatusbarLabel(bookmarkItem, remove) { if(remove) { var currentStatusText = document.getElementById("statusbar-display").getAttribute("label"); if( !currentStatusText.match(/[a-z]+:(\/\/)?/i) ) document.getElementById("statusbar-display").setAttribute("oldstatustext", currentStatusText); // backup var bookmarkItemURI = bookmarkItem.getAttribute("statustext"); // folder and subbookmarks - same id... >:( if( !bookmarkItemURI.match(/[a-z]+:/i) ) return; // else - bugs... document.getElementById("statusbar-display").setAttribute("label", bookmarkItemURI); // set new } else { var oldStatusText = document.getElementById("statusbar-display").getAttribute("oldstatustext"); document.getElementById("statusbar-display").setAttribute("label", oldStatusText); // restore backup } } Bookmarks Tooltips 0.0.3 [2,1 кб] (Внимание! Возможна потеря текущего текста статусной строки!) P. S. Простите за привычку писать комменты на английском, который у меня очень кривой... |
stoneflash > 17-06-2007 19:10:38 |
Infocatcher
При установке это выдает |
Anton > 17-06-2007 21:11:02 |
а зачем им каждому mouseover/mouseout атрибуты ? Выделить код Код:function setURItoStatusbarLabel(event) { if (event. target. hasAttribute ("class") && (event. target. getAttribute ("class") == "bookmark-item")) { if(event. type == "mouseover") { var currentStatusText = doc... |
Infocatcher > 17-06-2007 23:16:50 |
Anton Да, поправка: class="menuitem-iconic bookmark-item". Так что: Лучше придумайте, как закладку в папке на панели закладок нормально отловить (без return, то есть). Почему-то, если создать через контекстное меню папку на панели закладок, а потом перетащить в нее закладки, получаются одинаковые идентификаторы (id). Возможно, и в других случаях, но что могут получиться – это точно. stoneflash Если и после этого ничего не пойдет, можете поискать через DOM Inspector (по идентификатору) "bookmarks-stack" и "menu_BookmarksPopup" – для 0.0.2. P. S. Антон, а Вы устанавливать не пробовали? В смысле, у кого-нибудь, кроме меня, работает? P. P. S. Продолжение только завтра вечером... ибо дела... |
Anton > 18-06-2007 00:27:39 |
Никакой: Выделить код Код:window.addEventListener('mouseover', setURItoStatusbarLabel, true); window.addEventListener('mouseout', setURItoStatusbarLabel, true); У закладки nodeName=="menuitem", у папки "toolbarbutton" или "menu". Да, и идентификаторы у них вряд ли одинаковые, что-то я сильно в этом сомневаюсь. Скорее всего совпадающие id относятся к одному и тому же элементу.
Пробовали, работает. |
Infocatcher > 18-06-2007 02:12:40 |
Тьху, галлюцинации, кажись – только окончание и начало id похожи... Однако странные глюки я при этом ловил... Так, с event'ами понял – завтра попробую.
Это хорошо. |
Anton > 18-06-2007 08:34:02 |
Чем не устраивает существующий вариант ? Как вариант, можно в глобальной переменной. |
Infocatcher > 18-06-2007 11:10:45 |
Bookmarks Tooltips 0.0.3.2 [2,1 кб] Что-то вроде этого... Выделить код Код:var bookmarkstooltips = { addTooltips: function() { document.getElementById("bookmarks-stack").setAttribute("tooltip", "btTooltip"); // Bookmarks panel document.getElementById("menu_BookmarksPopup").setAttribute("tooltip", "btTooltip"); // Bookmarks menu }, setURItoStatusbarLabel: function(event) { if ( event.target.hasAttribute("class") && event.target.getAttribute("class").match(/bookmark-item/) && event.target.getAttribute("type") != "menu" ) { var currentStatusText = document.getElementById("statusbar-display").getAttribute("label"); var bookmarkItemURI = event.target.getAttribute("statustext"); if(event.type == "mouseover") { document.getElementById("statusbar-display").setAttribute("oldstatustext", currentStatusText); // backup document.getElementById("statusbar-display").setAttribute("label", bookmarkItemURI); // set new } if(event.type == "mouseout") if(currentStatusText == bookmarkItemURI) { // else => status change => not backup restore var oldStatusText = document.getElementById("statusbar-display").getAttribute("oldstatustext"); document.getElementById("statusbar-display").setAttribute("label", oldStatusText); // restore backup } } }, }; window.addEventListener('load', bookmarkstooltips.addTooltips, false); window.addEventListener('mouseover', bookmarkstooltips.setURItoStatusbarLabel, true); window.addEventListener('mouseout', bookmarkstooltips.setURItoStatusbarLabel, true);
Ну, вдруг какие противопоказания имеются... Так и запишем: одобрено. P. S. (и оффтопик) Замечательно я готовлюсь к экзамену по экономике |
Anton > 18-06-2007 13:29:11 |
Ещё не установил, а уже сомневаюсь. Запятая, что ли, лишняя ? |
Infocatcher > 18-06-2007 21:57:28 |
Anton Выделить код Код://... }, // <-- }; window.addEventListener('load', bookmarkstooltips.addTooltips, false); Так ведь, например, и ";" можно не всегда ставить: И ничего – не ругается... Насколько это корректно – не в курсе, но работать будет. Единственное, что можно поменять, так это сделать так: Выделить код Код:if(event.type == "mouseover") { // ... } else if(event.type == "mouseout") { // ... } По идее, должно быстрее работать – "mouseout" будет проверяться только если не "mouseover", тогда как в предыдущим варианте всегда будет две проверки (здесь же – 1,5 – или одна, или две). И еще. Что делает проверка |
Anton > 19-06-2007 15:53:56 |
Странно, раньше вроде запятые без последующего объявления давали ошибку %/ |
Infocatcher > 19-06-2007 19:27:12 |
Bookmarks Tooltips 0.0.3.3 [2,1 кб] На Firefox 1.5.0.12 работает – изменил minVersion на "1.5". Иначе конфликтует со списком открытых вкладок от Tab Mix Plus (строка состояния не восстанавливает исходный текст). Вот: Выделить код Код:var bookmarkstooltips = { addTooltips: function() { document.getElementById("bookmarks-stack").setAttribute("tooltip", "btTooltip"); // Bookmarks panel document.getElementById("menu_BookmarksPopup").setAttribute("tooltip", "btTooltip"); // Bookmarks menu }, setURItoStatusbarLabel: function(event) { if ( event.target.hasAttribute("class") && event.target.getAttribute("class").match(/^(menuitem-iconic )?bookmark-item$/) && event.target.getAttribute("type") != "menu" ) { var currentStatusText = document.getElementById("statusbar-display").getAttribute("label"); var bookmarkItemURI = event.target.getAttribute("statustext"); if(event.type == "mouseover") { document.getElementById("statusbar-display").setAttribute("oldstatustext", currentStatusText); // backup document.getElementById("statusbar-display").setAttribute("label", bookmarkItemURI); // set new } else if(event.type == "mouseout") if(currentStatusText == bookmarkItemURI) { // else => status change => not backup restore var oldStatusText = document.getElementById("statusbar-display").getAttribute("oldstatustext"); document.getElementById("statusbar-display").setAttribute("label", oldStatusText); // restore backup } } } }; window.addEventListener('load', bookmarkstooltips.addTooltips, false); window.addEventListener('mouseover', bookmarkstooltips.setURItoStatusbarLabel, true); window.addEventListener('mouseout', bookmarkstooltips.setURItoStatusbarLabel, true); |
Anton > 19-06-2007 20:43:48 |
Мне кажется, код займёт меньше места, если на btTooltip "повесить" обработчик popupshowing, в котором в зависимости от значения value элемента btUrlText выполнять необходимые действия. Тогда можно будет обойтись без mouseover/mouseout обработчиков. |
Infocatcher > 19-06-2007 23:27:42 |
Вот так: Выделить код Код:var bookmarkstooltips = { init: function() { var btTooltip = document.getElementById("btTooltip"); btTooltip.addEventListener("popupshowing", bookmarkstooltips.setURItoStatusbarLabel, false); }, // ... }; window.addEventListener('load', bookmarkstooltips.init, false); ? Что-то у меня не работает... Или не "popupshowing"? И разве "popupshowing" не выполняется только после загрузки собственно popup-элемента (tooltip, popup, ...). Т. е. пока tooltip (в данном случае <vbox> ... </vbox>) не появится – ничего не будет? А то у меня подсказка всплывает только через секунду после прекращения перемещения курсора... И, самое главное, как сделать восстановление состояния статусбара? И еще. Например, наводим курсор на закладку в панели закладок и, не останавливаясь, начинаем «наворачивать круги», не сходя при этом с закладки, – чтоб tooltip не показывался. При этом value btUrlText не изменяется (что говорит о том, что onpopupshowing btTooltip'а не сработал)! Добавлено Втр 19 Июн 2007 23:51:06 : Bookmarks Tooltips 0.0.3.4 [2,1 кб] |
Anton > 20-06-2007 13:50:17 |
это событие срабатывает непосредственно перед тем, как подсказка будет показана
popuphiding ?
Ок, значит, другое свойство меняется, что-нибудь вроде hidden. |
Infocatcher > 20-06-2007 17:32:04 |
Для btTooltip, как я понял, задается hidden только label'ов (btTitleText и btUrlText). И применяется hidden (setAttribute / removeAttribute) одновременно с value – т. е., похоже, сразу после наведения курсора btTooltip не меняется. Мне пока видится только вот такой вариант: Я что-то упускаю? |
Anton > 20-06-2007 21:41:13 |
Если у элемента есть атрибут statustext, значит, у btUrlText атрибут hidden=false. Значит, можно взять value из btUrlText и поместить в строку состояния.
В случае popupshowing текст в строке состояния будет появляться как раз перед отображением всплывающей подсказки, то есть, с задержкой. Так что, может быть, лучше оставить всё как есть. Хотя, может быть, стоит рассмотреть ещё вариант с "подцеплением" mouseover/mouseout обработчиков не на document, а на саму панель закладок с целью упрощения setURItoStatusbarLabel путём исключения части проверок. |
Infocatcher > 20-06-2007 23:20:49 |
А вот задержка мне совсем не нравится – неудобно...
Поправка: атрибута не будет вообще (я не просто так писал про setAttribute / removeAttribute). Но не суть.
Вот это, пожалуй, уже лучше. Т. е. убирается только проверка id. С упрощением проверок не особо, но один плюс точно есть – никаких конфликтов навроде глюков с TMP точно не будет. Хотя, по идее, проверка id должна это исключать – зачем идентификаторы для создаваемых через JavaScript элементов, которые удаляются при закрытии менюшки (в случае с TMP). А если они и есть (id, то есть), то более осмысленные. Хм, что за ерунда. Смотрю на свойства toolbarbutton-папки (в DOM-инспекторе) и вижу два type – "menu" и "http://home.netscape.com/NC-rdf#Folder"... Причем, судя по тому, что ...getAttribute("type") != "menu" ее (папку) исключает, второй type какой-то неуловимый... |
Infocatcher > 21-06-2007 12:46:12 |
Обнаружил ошибку. Проверял так: Выделить код Код:var bookmarkstooltips = { // ... dumpEvent: function(msg) { // Внаглую позаимствовано из Cache Fixer’а const console = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService); msg = "[event.type]: " + msg + "\n"; console.logStringMessage(msg); dump(msg); }, // ... setURItoStatusbarLabel: function(event) { if( /* ... */ ) { bookmarkstooltips.dumpEvent(event.type); // ... } }, // ... Bookmarks Tooltips 0.0.3.5 [2,4 кб] Код теперь такой: Выделить код Код:var bookmarksTooltipsPreviewEvent = ""; var bookmarksTooltipsOldStatusLabel = ""; var bookmarksTooltipsOldURI = ""; var bookmarkstooltips = { addTooltips: function() { document.getElementById("bookmarks-stack").setAttribute("tooltip", "btTooltip"); // Bookmarks panel document.getElementById("menu_BookmarksPopup").setAttribute("tooltip", "btTooltip"); // Bookmarks menu }, /* dumpMsg: function(msg) { // Внаглую позаимствовано из Cache Fixer’а const console = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService); msg = "[BookmarksTooltips]: " + msg + "\n"; console.logStringMessage(msg); dump(msg); }, */ setURItoStatusbarLabel: function(event) { if ( event.target.hasAttribute("class") && event.target.getAttribute("class").match(/^(menuitem-iconic )?bookmark-item$/) && event.target.getAttribute("type") != "menu" && event.target.getAttribute("id").match(/^rdf:#\$/) ) { var currentStatusText = document.getElementById("statusbar-display").getAttribute("label"); var bookmarkItemURI = event.target.getAttribute("statustext"); if(event.type == "mouseover") { if(bookmarksTooltipsPreviewEvent == "mouseover") { // drag-and-drop // bookmarkstooltips.dumpMsg("drag-and-drop\ncurrentStatusText = " + currentStatusText + // "\nbookmarkItemURI = " + bookmarkItemURI + "\nOldStatus = " + // bookmarksTooltipsOldStatusLabel + "\nOldURI = " + bookmarksTooltipsOldURI); if(currentStatusText == bookmarksTooltipsOldURI) restoreOldStatus(); } else { bookmarksTooltipsOldStatusLabel = currentStatusText; // backup document.getElementById("statusbar-display").setAttribute("label", bookmarkItemURI); // set new bookmarksTooltipsOldURI = bookmarkItemURI; } } else if(event.type == "mouseout") if(currentStatusText == bookmarkItemURI) // else => status change => not backup restore restoreOldStatus(); bookmarksTooltipsPreviewEvent = event.type; } function restoreOldStatus() { document.getElementById("statusbar-display").setAttribute("label", bookmarksTooltipsOldStatusLabel); // restore backup } } }; window.addEventListener('load', bookmarkstooltips.addTooltips, false); window.addEventListener('mouseover', bookmarkstooltips.setURItoStatusbarLabel, true); window.addEventListener('mouseout', bookmarkstooltips.setURItoStatusbarLabel, true); Так вот, как можно проще отловить drag-and-drop? Bookmarks Tooltips 0.0.3.6 [2,4 кб] Выделить код Код:var bookmarkstooltips = { init: function() { var bookmarksPanel = document.getElementById("bookmarks-stack"); bookmarksPanel.addEventListener('mouseover', bookmarkstooltips.setURItoStatusbarLabel, true); bookmarksPanel.addEventListener('mouseout', bookmarkstooltips.setURItoStatusbarLabel, true); }, // ... }; window.addEventListener('load', bookmarkstooltips.init, false); И без проверки id. |
Anton > 21-06-2007 19:49:29 |
По событию dragover снимать обработчики mouseover/mouseout, по dragexit ставить обратно, так наверное. Или стёк организовать на сохраняемый текст, наверняка даже лучше, а то будут потом два dragexit-а... |
Infocatcher > 22-06-2007 21:05:30 |
C этим все ясно (примерный вид): Выделить код Код:var bookmarksPanel = document.getElementById("bookmarks-stack"); bookmarksPanel.addEventListener('dragover', f, true); bookmarksPanel.addEventListener('dragexit', f, true); function f(event) { if(event.type == "dragover") { bookmarksPanel.removeEventListener('mouseover', bookmarkstooltips.setURItoStatusbarLabel, false); // mouseout } else if(event.type == "dragexit") { // init } } Однако мы меняем две глобальные переменные на еще два обработчика...
А с этого момента поподробней, если не трудно... Что-то я маневр не понимаю. Вариант: попробовать добавить dragover и dragexit обработчики, повесить на них функцию setURItoStatusbarLabel и |
Anton > 22-06-2007 22:06:20 |
То что уже есть, без dragover/dragexit обработчиков, сохранение текста из строки состояния не в переменную, а в массив, на случай N подряд "прилетевших" mouseover'ов ) |
Infocatcher > 25-06-2007 23:47:35 |
Bookmarks Tooltips 0.0.3.7 [4,0 кб] Код не менял – только добавил пару плюшек Выделить код Код:if( nsPreferences.getBoolPref("bookmarkstooltips.showUrlInStatusbar", true) ) window.addEventListener('load', bookmarkstooltips.init, false); Удалять атрибут tooltiptext у закладок на панели закладок: Выделить код Код:if(event.type == "mouseover") { if( nsPreferences.getBoolPref("bookmarkstooltips.removeTooltiptext", false) ) // fix conflict with Bookmarks Menu Button event.target.removeAttribute("tooltiptext"); // ... А править код, наверное, не буду до тех пор, пока не обнаружатся какие-нибудь баги... P. S. К слову, расширение Bookmarks Menu Button, из-за которого, собственно, и был весь сыр-бор с удалением tooltiptext'а (поставил, чтобы потестить, а нарвался на жестокие глюки), ну очень криво работает со строкой состояния... P. P. S. Пожалуй, надо будет выложить в обсуждение расширений... |
Infocatcher > 26-06-2007 23:09:38 |
Так, одну багу уже нашел... Может, добавить-таки обработчик popupshowing'а на на btTooltip и при наличии tooltiptext'а пихать его значение заместо URL'а (вариант: URL => присваиваем это значение второй строке, нет – первой)?.. |
Anton > 27-06-2007 10:16:21 |
можно добавить в init что-нибудь вроде Выделить код Код:document.getElementById("subscribeToPageSubmenuMenupopup").addEventListener ( "popupshown", function (event) { var mi = event. target. getElementsByTagName ("menuitem"); var tt, cmi; for (var i = 0; i < mi. length; i++) { cmi = mi [i]; if (cmi. hasAttribute ("tooltiptext")) { tt = cmi. getAttribute ("tooltiptext"); cmi. removeAttribute ("tooltiptext"); cmi. setAttribute ("statustext", tt); } } }, true ); |
Infocatcher > 28-06-2007 02:11:04 |
И что бы я без Вас делал?.. Bookmarks Tooltips 0.0.3.8 [4,2 кб] А заодно и текст в строке состояния теперь меняется P. S. Только сейчас заметил, что если URL и label закладки совпадают, то показывается только одна строка P. P. S. Какие-нибудь предложения по оптимизации будут? В частности – касательно наглых расширений, панели закладок и tooltiptext'а. |
Anton > 29-06-2007 05:17:19 |
У меня нет никаких идей и соображений, хотя, я уверен (как и всегда, кроме простых случаев), что можно сделать проще. |
Infocatcher > 29-06-2007 16:06:36 |
Так, одно изменение точно нужно. Выделить код Код:window.addEventListener('load', bookmarkstooltips.addTooltips, false); if( nsPreferences.getBoolPref("bookmarkstooltips.showUrlInStatusbar", true) ) // sic! window.addEventListener('load', bookmarkstooltips.init, false); Т. е. init выполняется не всегда – надо перенести document.getElementById("subscribeToPageSubmenuMenupopup").addEventListener... в addTooltips. А хочется сделать что-то вроде Выделить код Код:// в addTooltips: var bmttDebug = nsPreferences.getBoolPref("bookmarkstooltips.debug", false); if(!bmttDebug) document.getElementById("subscribeToPageSubmenuMenupopup").addEventListener("popupshown", ... // устраняем глюки с лентами новостей else { // удаляем все tooltiptext'ы document.getElementById("btTooltip").addEventListener ("popupshown", ... // если у элемента есть tooltiptext, копируем его значение в переменную tt и .removeAttribute("tooltiptext"); // if( tt.match(/^[a-z]+:/i) ) ...setAttribute("statustext", tt); } Так вот, пройдет ли вообще такой фокус (что произойдет раньше – покажется tooltiptext или он же удалится)? И как обратиться к самому элементу с tooltip'ом? К тому же, сейчас «левый» tooltiptext удаляется только при bookmarkstooltips.showUrlInStatusbar == true, что не есть хорошо (можно, конечно, всегда статус менять...). |
Infocatcher > 18-07-2007 21:14:11 |
Почти ничего не менял... Создал тему для обсуждения. Думается, баги так будут ловиться куда эффективнее. Bookmarks Tooltips 0.0.3.9 [4,0 кб] |
rubel > 19-07-2007 19:54:30 |
Попробовал это расширение-ерунда против boox-1.0.1.0,имхо. |
Infocatcher > 19-07-2007 22:48:15 |
rubel Хм, изменил type bookmarks-view с "single-column" на "double-column". Наблюдаю интересный эффект – можно выбрать имя, адрес и кучу всего по выбору для отображения в боковой панели. [Позже] Так, type можно просто удалить – результат будет тот же. |
Sergeys > 20-07-2007 13:16:17 |
Infocatcher |
Infocatcher > 20-07-2007 17:44:03 |
Sergeys пишет
Стоп. Расширение и работает только с меню и с панелью закладок. В общем, что из обещанного здесь не работает? А дистрибутива 3.0 у меня просто нету (если только следующую версию достану)... А с большими списками можно сделать что-то вроде вот этого: Выделить код Код:/* Полоса прокрутки для слишком длинных списков закладок */ menupopup[contextmenu="bookmarks-context-menu"] autorepeatbutton { display: none !important; } menupopup[contextmenu="bookmarks-context-menu"] scrollbox { overflow-y: auto !important; width: 250px !important; /* а иначе слишком узко будет... хоть решение и не идеально... */ } menupopup[contextmenu="bookmarks-context-menu"] { max-height: 250px !important; /* высота – какая требуется */ } |
Sergeys > 20-07-2007 18:15:33 |
Infocatcher
Уточню, чтобы было понятно - работает только с меню Закладки (не работает с панелью закладок - в 3.0) и полоса прокрутки есть, но это не помогает. |
Infocatcher > 20-07-2007 20:29:09 |
Пожалуйста.
Ага, теперь понял. Будет у меня 3.0 – посмотрю. Исправить, я думаю, нетрудно – надо просто посмотреть, какие там идентификаторы стали.
Я не знаю, как динамически менять стили (может, конечно, Антон в курсе). Стиль-то я подключу, но навязывать пользователям удобные лично мне настройки (max-height, например, да и сам скроллбар) нехорошо. И, самое главное, не вижу особого смысла делать лишний код для того, что можно сделать без всяких расширений. (разве что можно Stylish разобрать и посмотреть.) Мне, например, ничего дополнительно прописывать не надо – пользуюсь в основном только панелью закладок, а там у меня все по отдельным папкам, плюс стиль для обрезания длинных названий. |
Anton > 20-07-2007 22:52:15 |
А если url закладки в статусбаре перекрывается меню "Закладки", то можно показать этот url в заголовке окна. |
Infocatcher > 20-07-2007 23:02:44 |
Anton пишет
Да хоть в панели адреса – не в этом же дело. Как определить факт перекрытия статусбара? Маленькое дополнение.
Если еще добавить Выделить код Код:#menu_BookmarksPopup { max-height: 350px !important; /* Или любая другая высота */ } , то можно задать собственную максимальную высоту основного меню закладок (там, где «Добавить страницу в закладки» и т.д.). Вот только на скроллинг как-то неадекватно порой реагирует – прокручиваешь содержимое подпапки, а смещается и родительская папка, но это уже в багзиллу, я думаю. |
Anton > 20-07-2007 23:19:47 |
Показывать, по-моему надо в одном месте, чтобы не путаться.
Посмотрел. О чём речь, о настройках tree из менеджера закладок ? |
Infocatcher > 20-07-2007 23:36:48 |
Anton пишет
Речь шла о боковой панели. Если открыть сайдбар и у элемента bookmarks-view удалить атрибут type, то получатся столбцы как в менеджере закладок (если сначала удалить, а потом открыть боковую панель, то type заново пропишется). А вопрос – есть ли встроенная настройка для вида боковой панели. P. S. Ага, понял. Родительская папка начинает прокручиваться при overflow – когда дочерней пролистываться больше некуда. |
Anton > 21-07-2007 00:47:19 |
Вид боковой панели настраивается через column picker и хранится, скорее всего, в localstore.rdf. |
Infocatcher > 21-07-2007 01:17:04 |
В заголовке, так в заголовке... Bookmarks Tooltips 0.0.4a1 [4,2 кб] bookmarkstooltips.showUriIn Недостатки Пришлось добавить
Показ в панели адреса я не осилил... И в дальнейшее я вникать не стал. Вопросы |
Anton > 21-07-2007 02:19:09 |
window.title
document. getElementById ("urlbar"). value ? |
Sergeys > 21-07-2007 02:35:31 |
Infocatcher
Не навязывать, а предлагать настройку для тех кому такая настройка будет необходима (без лишних танцев с бубном). Расширения делаются в основном для того, чтобы не добавлять всё ручками (что и делают те, кто может), а чтобы после установки расширения получить простой доступ к дополнительной функциональности браузера, которая скрыта или недоступна обычными средствами. |
Infocatcher > 21-07-2007 03:19:49 |
Sergeys Anton пишет
Дабы не плодить дополнительный код (а также из лени) оставил старый способ восстановления (во всех случаях метод один и тот же – для заголовка, строки состояния, urlbar'а). bookmarkstooltips.showUriIn Да, еще раз уточню вопрос про боковую панель. Надо сделать так, чтобы всегда показывалось несколько столбцов. |
Anton > 21-07-2007 14:27:37 |
Ты уже выяснил, как это можно сделать - надо удалить атрибут type. Как это сделать ? - с помощью javascript или оверлеем на xul боковушки закладок. Только зачем это нужно ? |
Infocatcher > 21-07-2007 15:25:37 |
Если показывать два столбца – название и адрес, то столбец со ссылкой можно сделать очень узким, и при наведении курсора (и если текст урезан) будет показываться tooltiptext с URL. Довольно удобно, ИМХО. Выделить код Код:var bookmarkstooltips = { // ... addTooltips: function() { if( nsPreferences.getBoolPref("bookmarkstooltips.sidebarMultiColumn"), true ) { document.getElementById("bookmarks-view").addEventListener ( "load", function() { document.getElementById("bookmarks-view").removeAttribute("type"); }, true ); } // ... window.addEventListener("load", bookmarkstooltips.addTooltips, false); Возвращает Выделить код Код:Ошибка: document.getElementById("bookmarks-view") has no properties Источник: chrome://bookmarkstooltips/content/bookmarkstooltips.js Строка: 20 P. S. Если бы мне нравилось, когда ничего не настраивается и ручками не поработаешь – сидел бы на IE |
Anton > 21-07-2007 15:41:14 |
Сделать оверлей на тот *.xul, который показывает в боковой панели закладки. Я правильно понимаю - расширенное отображение закладок в сайдбаре задумано только для того, чтобы получить url закладки ? |
Infocatcher > 21-07-2007 16:44:37 |
Смотря что понимать под «получить url закладки». Для начала – просто добавить выбор: без столбцов / со столбцами (когда можно увидеть URL). |
Infocatcher > 21-07-2007 17:22:06 |
О, заработало! Спасибо! Bookmarks Tooltips 0.0.4a4 [4,8 кб] |
Anton > 21-07-2007 19:21:16 |
Мои исследования в области боковой панели закладок: http://pastebin.mozilla-russia.org/89760, http://pastebin.mozilla-russia.org/89761 |
Infocatcher > 21-07-2007 19:28:55 |
Anton Код Выделить код Код:if(et == "mouseout") if(currentStatus == bmURI) // else => status change => not backup restore setStatus(bookmarksTooltips_oldStatus); // restore old в случае, когда URL отображается в urlbar'е, сбрасывает состояние после клика по закладке: Есть идея сделать так: Выделить код Код:var showIn = nsPreferences.getIntPref("bookmarkstooltips.showUriIn", 1); // ... if(currentStatus == bmURI) { // else => status change => not backup restore (not urlbar) var s = showIn == 4 ? «получение текущего адреса» : bookmarksTooltips_oldStatus; setStatus(s); // restore old } Но все, что у меня заработало (window.location и document.location), возвращает chrome://browser/content/browser.xul |
Infocatcher > 21-07-2007 20:12:08 |
Замечательно! Можно ли сделать выделение закладки под курсором? (Не, я понимаю, что можно, вот только как...) |
Infocatcher > 21-07-2007 22:13:19 |
Нда... В случае с сайдбаром, похоже, сплошной mouseover... Bookmarks Tooltips 0.0.4a5 [5,5 кб] |
Anton > 22-07-2007 00:35:24 |
http://pastebin.mozilla-russia.org/89765 Кстати. Функция getBookmarkURLById должна работать и для пунктов меню "Закладки". Может быть, это пригодится в плане упрощения кода. |
Infocatcher > 22-07-2007 03:23:17 |
Anton пишет Нда, искал-искал – чего только не нашел, кроме нужного. А в результате ответ был найден на моем собственном винчестере (в коде практически моего собственного расширения): Bookmarks Tooltips 0.0.4a6 [5,7 кб]
Раз уж речь зашла о упрощениях... P. S. Спасибо за код подсветки текущей закладки. P. P. S. А теперь – спать |
Anton > 22-07-2007 10:39:04 |
У меня идея примерно такая: http://pastebin.mozilla-russia.org/89768 |
Infocatcher > 22-07-2007 20:39:14 |
Anton пишет
Так, оптимизация пока откладывается до лучших времен (когда всё нормально заработает – вот тогда )... В общем, проблема с сайдбаром. Пытался восстанавливать только если «то, что мы сами установили» == «то, что сейчас в статусе», но что-то не выходит... Уфф, я уж думал, AiOS обиделся... Короче говоря, если добавить столбцы в боковую панель с закладками, то они (ссылки) будут открываться только даблкликом (только СКМ не меняет действия). Кстати, после этого решил проверить, так вот, из менеджера закладок открывается также (даблкликом). Bookmarks Tooltips 0.0.4a7 [5,8 кб] |
Infocatcher > 22-07-2007 21:52:23 |
Еще один момент. Выделить код Код:mousemovehandler: function (event) { var tree = event.target; bookmarkstooltipsSB.dumpMsg("tree.tagName = " + tree.tagName); нужного результата не дает... |
Anton > 25-07-2007 22:33:43 |
По-моему, самое время оптимизировать архитектуру.
Выделить код Код:... var bookmarksTooltips_setStatus = "?"; // copy of last established status var bookmarksTooltipsPrevURL = null; ... setStatus: function(val) { switch( nsPreferences.getIntPref("bookmarkstooltips.showUriIn", 1) ) { case 1: var st = this. getStatus (); if ((st != bookmarksTooltips_oldStatus) && (st != bookmarksTooltipsPrevURL)) bookmarksTooltips_oldStatus = st; parent.document.getElementById("statusbar-display").setAttribute("label", val); ... } bookmarksTooltips_setStatus = val; bookmarksTooltipsPrevURL = val; }, ... Добавлено Срд 25 Июл 2007 22:37:02 : Выделить код Код:bookmarkstooltipsSB.oldFocus = parent.document.commandDispatcher.focusedElement || parent.document.commandDispatcher.focusedWindow; |
Infocatcher > 26-07-2007 16:04:03 |
Ну... Выделить код Код:Ошибка: this.doc has no properties Источник: chrome://bookmarkstooltips/content/common.js Строка: 75 Выделить код Код:case 1: if(noEsc) this.doc.getElementById("statusbar-display").setAttribute("label", bookmarksTooltips_oldStatus); Или я в чем-то нехило промахнулся?.. Bookmarks Tooltips 0.0.4a10 [5,7 кб] (Внимание! Глюкует не по-детски!) P. S. Чуть не забыл.
? |
Anton > 26-07-2007 17:46:27 |
this в обработчике указывает не на bookmarksTooltips. Можно сделать _this = bookmarksTooltips; или вызывать bookmarksTooltips. restoreStatus (); из функции-обработчика.
Ставишь обработчики popupshown или popushowing и popuphiding на id="bookmarks-view", при обработке соответственно снимаешь/ставишь все mouse* обработчики. |
М. Порешаев > 26-07-2007 21:48:05 |
Полезное расширение, только вот у меня стоит еще "2 Pane Bookmarks", очень удобно, но подсказки "не всплывают" (точнее нет адреса УРЛ ни в подсказке, ни в строке состояния), как задумано в Bookmarks Tooltips... |
Infocatcher > 26-07-2007 23:35:11 |
М. Порешаев Выделить код Код:/* Многострочная панель закладок */ #bookmarks-ptf { display: block !important; } #bookmarks-ptf toolbarseparator { display: inline !important; } И будет Вам счастье прямо здесь и прямо сейчас С дрегендропом опять траблы (корректно работает только в сайдбаре) – как мне кажется, из-за Выделить код Код:backup: function() { var st = this.getStatus(); if((st != bookmarksTooltips_oldStatus) && (st != bookmarksTooltips_PrevURL)) bookmarksTooltips_oldStatus = st; },
P. S. Давно хотел спросить (но все забывал). Как влияет true / false в конце addEventListener (опытным путем я понял только что при true функция может выполняться несколько раз)? |
Infocatcher > 27-07-2007 00:24:02 |
М. Порешаев Прикручено вот так: Выделить код Код:var bmcvw; // 2 Pane Bookmarks if(bmcvw = document.getElementById("bookmarks-content-view")) { bmcvw.addEventListener("mouseover", bookmarkstooltipsSB.backupStatus, true); bmcvw.addEventListener("dragover", bookmarkstooltipsSB.backupStatus, true); bmcvw.addEventListener("mousemove", bookmarkstooltipsSB.mousemovehandler, true); bmcvw.addEventListener("mouseout", bookmarkstooltipsSB.restoreStatus, true); } |
Anton > 27-07-2007 00:24:33 |
Если true, обработчик поймает событие в capture phase, если false - в bubble phase. |
Infocatcher > 27-07-2007 00:48:09 |
Anton пишет
Ммм? Мой английский не столь хорош, как хотелось бы, посему (если не трудно) или суть кратко, или что-нибудь по-русски на тему (если есть). P. S. Нда, Гугл выдал:
|
Anton > 27-07-2007 01:13:57 |
Смотри картинку по ссылке, которую я дал. Там видно где capture phase, где bubble phase. Вкратце - если хочешь поймать клик по кнопке и ставишь "click" обработчик на эту кнопку, значение параметра useCapture можешь задавать каким захочешь, параметр имеет значение только для обработчиков на родительских элементах этой кнопки. В продолжение моих исследований: http://forum.mozilla-russia.org/uploade … -0.1.0.xpi |
Infocatcher > 27-07-2007 01:28:15 |
О, нашел-таки |
Infocatcher > 27-07-2007 02:11:26 |
Ну, что я могу сказать... Ты крут! |
М. Порешаев > 27-07-2007 10:00:06 |
Infocatcher |
Anton > 27-07-2007 18:45:49 |
http://forum.mozilla-russia.org/uploade … -0.2.0.xpi Одна из причин крылась в вызове showPopup. |
Infocatcher > 27-07-2007 23:30:24 |
Новые замечания (тестировался только режим с отображением в строке состояния). 1. «Стандартный» режим боковой панели. 2. Столбцы в боковой панели. 3. Панель закладок. |
Anton > 28-07-2007 01:11:46 |
Infocatcher пишет
Есть такое, исправил.
Это не совсем верное утверждение.
Это - к статусу. Тоже исправил.
По-моему - лишнее.
Это тоже не совсем верное утверждение - в первой части. По-моему, статус в multicolumn - лишнее, но сделал на всякий случай.
Не смог воспроизвести. |
Infocatcher > 28-07-2007 02:58:37 |
Ну, в крайнем случае, можно сделать настройку для выбора.
Если учесть, что мне не нравится даблклик, то мне, честно говоря, все равно. Но, по-моему, можно использовать multicolumn только для добавления даблклика (и оставить только один столбец) – вот тут URL в подсказке и окажется очень кстати (можно сделать опционально). (Кстати, надо про двойной клик в настройках написать – чтоб у пользователей неожиданностей не возникало – см. последнюю версию, которую я выкладывал.)
Уже не важно – теперь и я не могу воспроизвести (на новой версии). P. S. Пока все работает. Завтра посмотрю еще – попробую всевозможные варианты издевательств над закладками P. P. S. Пара отвлеченных вопросов на тему закладок. Выделить код Код:/* Полоса прокрутки для слишком длинных списков закладок */ menupopup[contextmenu="bookmarks-context-menu"] autorepeatbutton { display: none !important; } menupopup[contextmenu="bookmarks-context-menu"] scrollbox { overflow-y: auto !important; } menupopup[contextmenu="bookmarks-context-menu"] { max-height: 300px !important; width: 295px !important; } #menu_BookmarksPopup { max-height: 350px !important; } /* Показываем панель закладок только при наведении курсора на панели инструментов */ /* При дрегендропе событие hover не срабатывает... */ #PersonalToolbar { display: none; } #navigator-toolbox:hover > #PersonalToolbar { display: -moz-box; } То, что в главном меню "Закладки" не работает скроллбар (пытается что-то перетащить – как при дрегендропе закладок) – баг, или это только у меня так? |
Anton > 28-07-2007 17:43:02 |
Infocatcher пишет
Делай.
На то он и multicolumn, что можно выбрать содержание отображаемых полей. Нужен url - выбери его отображение. Если какое-то поле не вмещается в сайдбар - будет отображено в всплывающей подсказке.
Я, наверное, чего-то не понимаю. По-моему - чушь. Чтобы сделать открытие закладок по двойному клику надо сделать bookmarks-tree многостолбцовым и убрать все столбцы ? Не проще скопировать ondblclick в onclick ?
Делай. У меня в планах нет поддержки/развития bookmarkstooltips-0.[1/2/3].0, делал исключительно в иллюстративных целях.
Меню "Закладки" отлавливает drag*-события от скроллбара. Если запретить "всплытие" события draggesture от скроллбара к меню "Закладки" - будет работать. Например, "пришить" к #menu_BookmarksPopup http://pastebin.mozilla-russia.org/89791
То же самое, только другие события, наверняка. |
Infocatcher > 28-07-2007 21:40:35 |
Хм... Почему-то наблюдаю [on/dbl]click (сами атрибуты) только при открытии chrome://browser/content/bookmarks/bookmarksPanel.xul во вкладке... А в сайдбаре – нет.
Тогда у тебя весьма интересное представления о иллюстрациях (на дальнейшее и предшествующее просьба не обижаться). [Особенно когда иллюстрация подозрительно сильно смахивает на вполне готовое расширение.] Что-то навроде: я так могу, а ты – нет (А теперь я умываю руки)
Ага, ясно. Спасибо! P. S. Если можно, то еще один вопрос (после черты). |
Infocatcher > 29-07-2007 00:50:26 |
Конфликтует с AiOS. Добавлено Вск 29 Июл 2007 01:12:07 : |
Anton > 29-07-2007 02:38:28 |
Infocatcher пишет
Я не знаю, почему ты их у себя не видишь. Даже если не видишь, проверь копи-паст из того что видишь, в программу.
Именно в иллюстративных. Именно, это касалось вопроса об архитектурной оптимизации. Оптимизации там чуть больше нуля, исключительно для иллюстрации. Именно - "оболочка" для единообразия в работе с элементами, использующимися для отображения URL закладок. Заодним подкинул несколько готовых технических решений: "вдруг, человек заинтересуется".
А ещё читать, искать, экспериментировать, стараться держаться в рамках темы и правил форума.
Не знал, что есть стандарт на иллюстрации. Хорошо, изложи как по-твоему должно выглядеть общение в этой теме, я попробую двигаться в этом русле, хотя и не обещаю.
Сложность не в этом. Как там у Горького, "Когда много спрашивают..."
Конструкция вида Задаёт шаблон для создания однотипных объектов. Объекты затем можно создавать с помощью оператора new: При создании объекта будет выполнятся функция x.
Ставит observer на изменение preferences. При изменении в соответствующей ветви preferences будет вызываться метод observe.
Ставит обработчик на выгрузку элемента <window>. В обработчике снимается observer и обнуляется ссылка на indicator для исключения утечек памяти.
Ну, это и без пояснений давно понятно.
Верно. Но и применяются они в разных терапевтических целях.
Нельзя. Во-первых - оффтопик. Создай новую тему и во-вторых опиши подробней. Из текста вопроса не совсем понятно, что там за проблема, ставить эксперименты для выяснения лень.
Не подтверждаю. (
|
Infocatcher > 29-07-2007 14:55:39 |
Скажем так, если бы человек не заинтересовался, он навряд ли появился бы в этом разделе этого форума.
Еще раз повторюсь: если обидел – извини.
Не надо язвить и придираться к словам (все равно мы их понимаем несколько по-разному).
Вот, это я и хотел понять (что делается я еще понимал, зачем – нет). Тогда еще вопрос – для полного понимания картины. Утечки памяти – следствие каких-то
Не просветите пациента касательно диагноза?
Тема уже есть – изменение ширины закладок. Дано: закладка на панели закладок с атрибутом crop="right" (определяется через binding). Цель: поставить ограничение на ширину закладок, но убрать многоточия, появляющиеся, если не весь текст влезает.
Странно... Попробую на новом профиле.
И еще раз огромное спасибо за помощь. P. S. Обобщая. P. P. S. Пошел |
Anton > 29-07-2007 17:07:22 |
"Точнее: бесполезно."
Это архитектурный недостаток расширения. |
Infocatcher > 29-07-2007 21:27:04 |
Anton пишет
На новый профиль ставим Bookmarks Tooltips и AiOS 0.7.1. |
Infocatcher > 09-08-2007 15:29:54 |
Ковыряюсь в 3.0a7... Выделить код Код:fillInBTTooltip: function(aTipElement) { // Fx2XP: Don't show tooltips for bookmarks under sub-folders if (aTipElement.localName != "toolbarbutton") return false; /* и зачем они это сделали? */ // Fx2XP: Only show tooltips for URL items if (!PlacesUtils.nodeIsURI(aTipElement.node)) return false; var url = aTipElement.node.uri; if (!url) return false; var tooltipUrl = document.getElementById("btUrlText"); tooltipUrl.value = url; var title = aTipElement.label; var tooltipTitle = document.getElementById("btTitleText"); if (title && title != url) { tooltipTitle.hidden = false; tooltipTitle.value = title; } else tooltipTitle.hidden = true; // show tooltip return true; } Полагаю, единственный способ это обойти (для подсказок не только на toolbarbutton'ах) – «повесить» на btTooltip обработчик onpopupshowing (атрибутом)...
В общем, будет ли от этого польза?.. |
Anton > 09-08-2007 16:45:44 |
Не единственный
Поставь эксперимент. Но, имхо, лучше так не делать.
|
Infocatcher > 09-08-2007 17:10:19 |
Я и спросил потому, что сомневался в единственности способа. Эксперимент – это само собой. Но если у тебя есть мысль, как добиться нужного результата по-другому, может, все-таки ее изложишь? P. S. Спасибо за код для определения версии! P. P. S. В крайнем случае, конечно, можно полностью переписывать оригинальный атрибут onpopupshowing у btTooltip (и заменять fillInBTTooltip на измененную функцию)... |
Anton > 10-08-2007 18:47:24 |
Так: http://pastebin.mozilla-russia.org/90003 например. |
Infocatcher > 10-08-2007 20:30:13 |
А разве не проще тогда вот так: |
Anton > 10-08-2007 20:51:46 |
Проще, проще ; ) |
topmo3 > 07-12-2007 00:59:32 |
а в боковой панели закладок firefox 2.0.0.11 это расширение должно работать? |
Infocatcher > 07-12-2007 02:49:20 |
topmo3
Не должно. К сожалению... С боковой панелью работают только версии от Anton'а: |