villa7
// Запретить дублирование вкладок ................................ addEventListener("TabOpen", function (e) { var newTab = e.target; if ( newTab.label == 'Новая вкладка') newTab.label = Application.prefs.getValue("browser.newtab.url", 0); for ( var i = 0; i < gBrowser.tabs.length; i++ ) { var mTab = gBrowser.mTabs[i]; if ( newTab.label == mTab.linkedBrowser.currentURI.spec ) { gBrowser.selectedTab = mTab; setTimeout(function() { gBrowser.removeTab( newTab ) }, 20); break; } } }, true, gBrowser.tabContainer );
Отсутствует
№113 Find
Не айс. Образец поиска мне нужно куда-то вводить. А эта либо выделенное ищет, либо из буфера берет.
bunda1
За "Автовыделение" спасибо.
А с кнопкой "Highlight" поделать вообще ничего нельзя? Она для меня поудобнее была... и ведь, зараза, уже второй раз отваливается... первый раз после какой-то 8-й или 10-й версии, что ли, был...
Firefox ESR
Отсутствует
Не айс. Образец поиска мне нужно куда-то вводить. А эта либо выделенное ищет, либо из буфера берет.
а, ну мне удобно потому что набираю искомое слово на странице →оно выделяет дефолтным поиском(искать текст по мере его набора) →потом выделяю мышью и (благодаря AutoCopy) жму именно на эту Find
-----------------
или скажем набираю искомое слово на странице →оно выделяет дефолтным поиском → потом открываю(жестом) дефолтный поиск по странице, там набранное уже отражается(благодаря AutoCopy) → и нажимаю выделить все
Отредактировано Pony_Smile_Pack (21-07-2013 17:27:16)
Отсутствует
А с кнопкой "Highlight" поделать вообще ничего нельзя? Она для меня поудобнее была... и ведь, зараза, уже второй раз отваливается... первый раз после какой-то 8-й или 10-й версии, что ли, был...
Позже попробую, сейчас нет времени.
Отсутствует
bunda1
запретить дублирование вкладок, если вкладка уже есть то чтобы не открывалась новая а переключалась на уже открытую,
Сейчас открытие дублей блокируется, но не переключается на уже открытую. Чувствую что такое уже не выполнимо. Мне для чего нужно было, давно удалил кнопку открытия новой вкладки потому как не нравится как открывается домашняя страница с диалами, долго открывается , белая страница моргает, неприятно. и жестом из за этого тоже не пользуюсь, потому держу постоянно открытой домашнюю страницу с диалами и открываю наведением мыши, а захотелось жестом с любой страницы на неё переключаться, чтобы в угол каждый раз не лазить наводить мышкой. Не судьба видать
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
villa7
Нормальные герои всегда идут в обход
Попрубуй жест:
for ( var i = 0; i < gBrowser.tabs.length; i++ ) { var mTab = gBrowser.mTabs[i]; if ( mTab.linkedBrowser.currentURI.spec == 'chrome://desktop/content/desktop.html') { gBrowser.selectedTab = mTab; break; } }
Добавлено 21-07-2013 19:35:06
P.S. у меня кстати Запретить дублирование вкладок работает и переключает.
Отредактировано bunda1 (21-07-2013 19:35:51)
Отсутствует
Сейчас открытие дублей блокируется, но не переключается на уже открытую. Чувствую что такое уже не выполнимо. Мне для чего нужно было, давно удалил кнопку открытия новой вкладки потому как не нравится как открывается домашняя страница с диалами, долго открывается , белая страница моргает, неприятно. и жестом из за этого тоже не пользуюсь, потому держу постоянно открытой домашнюю страницу с диалами и открываю наведением мыши, а захотелось жестом с любой страницы на неё переключаться, чтобы в угол каждый раз не лазить наводить мышкой. Не судьба видать
P.S. у меня кстати Запретить дублирование вкладок работает и переключает.
У меня тоже работает, приберег ее себе, полезная
Отсутствует
bunda1
Ура!!! Если честно не надеялся что такая благодать получится, в очередной раз снимаю шляпу, это надо знать что для меня было открывать страницу с диалами, а тут мгновенно, раз и вот она, спасибо. Сейчас отойду от радости попробую разобраться почему у меня наполовину код блокировки дубликатов работал. Можно тебя еще попросить глянуть Рабочий стол - https://addons.mozilla.org/ru/firefox/addon/desktop/ чтобы простым ЛКМ открывал в новой вкладке, а то иногда забываю диал дернуть и домашнюю по новой открывать приходиться, на страницу расширения писал, ни слуху ни духу. Может какой код дополнительный , это же вроде как закладки, если не трудно.
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
Можно тебя еще попросить глянуть Рабочий стол - https://addons.mozilla.org/ru/firefox/addon/desktop/ чтобы простым ЛКМ открывал в новой вкладке.....
function desktopClick(e) { if ( e.button == 0 && content.location.href == 'chrome://desktop/content/desktop.html' ) { e.preventDefault(); gBrowser.selectedTab = gBrowser.addTab( e.target.parentNode.href ); } }; addEventListener('click', desktopClick, true, gBrowser );
Добавлено 22-07-2013 20:41:28
И вот подправил жест мыши, что бы открывал desktop если он не открыт:
var desktopTab = true; for ( var i = 0; i < gBrowser.tabs.length; i++ ) { var mTab = gBrowser.mTabs[i]; if ( mTab.linkedBrowser.currentURI.spec == 'chrome://desktop/content/desktop.html') { gBrowser.selectedTab = mTab; var desktopTab = false; break; } } if ( desktopTab ) gBrowser.selectedTab = gBrowser.addTab('chrome://desktop/content/desktop.html');
Отредактировано bunda1 (22-07-2013 20:51:45)
Отсутствует
bunda1
Спасибо, разобрался и с блокировкой дублей, всё работает, и блокирует и переключает, теперь всё стало как хотелось.Спасибо ещё раз за всё.
П.С. Я кстати таки остановился именно на жесте, мне показалось он шустрее переключат что ли. Спасибо.
Отредактировано villa7 (22-07-2013 20:48:34)
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
В этом сообщении Infocatcher написал рабочий код для проверки обновлений при определенном нажатии.
Никак не могу переделать код, чтобы он работал при нажатии на обычную CB кнопку
Вот что должно получиться в итоге: открывается вкладка с about:addons, жмется проверка обновлений и всё.
Подскажите.
Отсутствует
открывается вкладка с about:addons, жмется проверка обновлений и всё.
Check for Addons Updates
Или простой вариант:
var tab = gBrowser.selectedTab = gBrowser.addTab("about:addons"); var browser = tab.linkedBrowser; browser.addEventListener("load", function load(e) { var doc = e.target; if(doc.documentURI == "about:blank") return; browser.removeEventListener(e.type, load, true); doc.getElementById("utils-updateNow").doCommand(); }, true);
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Попробовал вставить в твой код проверку пустой текущей вкладки (взял из темы со сниппетами): если пустая вкладка, то запустить в ней; если нет, то запустить в новой активной.
Так почему-то код перестал запускать проверку обновлений, если текущая вкладка была пустой. Если не пустая, то все ок. Вот код:
function addcheck(e){ if ( e.button !== 1 ) return; if( getBrowser().currentURI.spec == "about:blank") { var tab = loadURI ("about:addons"); } else { var tab = gBrowser.selectedTab = gBrowser.addTab("about:addons"); }; var browser = tab.linkedBrowser; browser.addEventListener("load", function load(e) { var doc = e.target; if(doc.documentURI == "about:blank") return; browser.removeEventListener(e.type, load, true); doc.getElementById("utils-updateNow").doCommand(); }, true); };
Что тут не так?
Отредактировано Inko7 (26-07-2013 16:44:11)
Отсутствует
Inko7
Вот здесь не возвращает текущую вкладку:
Должно быть
И лучше вот так:
var url = "about:addons"; var tab; if( !gBrowser.webProgress.isLoadingDocument && ( "isBlankPageURL" in window ? isBlankPageURL(content.location.href) : content.location.href == "about:blank" ) ) { tab = gBrowser.selectedTab; loadURI(url); } else { tab = gBrowser.selectedTab = gBrowser.addTab(url); } var browser = tab.linkedBrowser; browser.addEventListener("load", function load(e) { var doc = e.target; if(doc.documentURI == "about:blank") return; browser.removeEventListener(e.type, load, true); doc.getElementById("utils-updateNow").doCommand(); }, true);
Потому как загружающиеся вкладки тоже сначала имеют адрес "about:blank".
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
toxa
Попробуй запустить с таймером:
setTimeout(function() { // Bookmarks/History/Homepage/URL/Search открывать в новой вкладке ...................................... eval("whereToOpenLink = " + whereToOpenLink.toString() .replace(/return "current";/g, "{"+(function() { var node = e && e.originalTarget; while (node) { switch (node.id) { case "bookmarksMenuPopup": case "goPopup": case "appmenu_bookmarksPopup": case "appmenu_historyMenupopup": case "personal-bookmarks": case "bookmarks-menu-button": case "historymenu_history": case "home-button": case "page-proxy-stack": case "go-button": case "urlbar-go-button": case "PopupAutoCompleteRichResult": case "searchbar": case "PopupAutoComplete": return "tab"; } node = node.parentNode; } return "current"; }).toString().replace(/^.*{|}$/g, "")+"}") ); //Bookmarklet eval("openLinkIn = " + openLinkIn.toString() .replace(/(?=if \(where == "save"\))/, 'if (url.substr(0, 11) == "javascript:") where = "current";') .replace(/(?=var loadInBackground)/, 'if (w.gBrowser.currentURI.spec == "about:blank" && !w.gBrowser.mCurrentTab.hasAttribute("busy")) where = "current";') ); // document.getElementById("sidebar-box").addEventListener("load", function(event) { var document = event.target; if (document.location == "chrome://browser/content/bookmarks/bookmarksPanel.xul" || document.location == "chrome://browser/content/history/history-panel.xul") { eval("document.defaultView.whereToOpenLink = " + document.defaultView.whereToOpenLink.toString() .replace(/return "current";/g, 'return "tab";') ); eval("document.defaultView.openLinkIn = " + document.defaultView.openLinkIn.toString() .replace(/(?=if \(where == "save"\))/, 'if (url.substr(0, 11) == "javascript:") where = "current";') .replace(/(?=var loadInBackground)/, 'if (w.gBrowser.currentURI.spec == "about:blank" && !w.gBrowser.mCurrentTab.hasAttribute("busy")) where = "current";') ); } }, true); // eval("gURLBar.handleCommand = " + gURLBar.handleCommand.toString() .replace(/aTriggeringEvent\s*&&\s*aTriggeringEvent.altKey/, "!($&)") .replace("aTriggeringEvent.preventDefault();", "") .replace("aTriggeringEvent.stopPropagation();", "") ); }, 1500);
Отсутствует
toxa
Попробуй запустить с таймером:
И с таймером то же самое - букмарклет, вызванный через ключевое слово, открывает пустую вкладку.
Я пробовал увеличить задержку до 2500, это не помогает.
Отсутствует
bunda1 пишетА если месте ПКМ и ЛКМ или наоборот, или нажать ЛКМ на закладку и подержать 300ms. Мне с горячей клавишей не нравится.
Да и мне с горячей не нравиться, просто я про другие варианты не подумал. Тогда попробуй сделать ЛКМ с задержкой, меньше движений, удобней. ИМХО. А там смотри, как считаешь лучше, в принципе все предложенные тобой варианты нормальные.
ЛКМ с задержкой на закладке или разделителе + двойным правым можно удалять разделители:
/* Открывать левым кликом закладку в новой вкладке или средним кликом в текущей вкладке, добавлять страницу в закладки в текущей папке удержанием левой кнопки на закладке или разделителе, двойным правым кликом удалять закладки или разделители не закрывая меню закладок */ function manageBookmarks(e) { var target = e.originalTarget; // эсли это закладка из папки закладок .... if ( !!target._placesNode && ( target.localName == "menuseparator" || target.localName == "menuitem") ) { var type = e.type; var bookMenu = target.parentNode; // левый клик открывает закладку в новой или добавляет текущую вкладку в закладки удержанием левой кнопки .... if ( e.button == 0 && ( type == 'mousedown' || type == 'mouseup' ) ) { if ( type == 'mouseup' ) e.preventDefault(); if ( type == 'mousedown' ) { this.addBook = false; addEventListener("drag", function(e) { // сбросить таймер при перетаскивание закладки window.clearTimeout( this.addBookTimer ); removeEventListener( e.type, arguments.callee, true ); }, true ); this.addBookTimer = setTimeout(function(_this) { // таймер запускает добавление закладки _this.addBook = true; addBookmark(); }, 400, this ); } if ( type == 'mouseup' && !this.addBook ) { window.clearTimeout( this.addBookTimer ); // открыть закладку в новой или в текущей вкладке если это указанная вкладка var itemUri = target._placesNode.uri; var bookmarklet = ( itemUri.substr(0, 11) == "javascript:" ); var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"]; ( bookmarklet || current.indexOf( content.location.href ) !== -1 || e.ctrlKey ) ? gBrowser.loadURI( itemUri ) : gBrowser.addTab( itemUri ); } // добавить страницу в закладки в текущей папке function addBookmark() { var index = PlacesUtils.bookmarks.getItemIndex( target._placesNode.itemId ) + 1; var docTitle = ( content.document.title || gBrowser.mCurrentTab.label ).substr(0, 50); var folderId = PlacesUtils.getConcreteItemId( target.parentNode.parentNode._placesNode ); var currentUri = Services.io.newURI( content.location, null, null ); PlacesUtils.bookmarks.insertBookmark( folderId, currentUri, index, docTitle ); } }; // средний клик открвыяет закладку в текущей вкладке .... if ( e.button == 1 && type == 'mouseup' && target.localName !== "menuseparator" ) { addEventListener("TabOpen", function(e) { // удалить новую вкладку которую открывает средний клик if ( e.target.label == target._placesNode.uri ) { e.target.style.display = 'none'; removeEventListener( e.type, arguments.callee, true ); setTimeout(function() { gBrowser.removeTab( e.target ) }, 1000); } }, true ); gBrowser.loadURI( target._placesNode.uri ); // открыть закладку }; // двойной правый клик удаляет закладку или разделитель .... if ( e.button == 2 && type == 'mouseup' ) { if ( bookMenu.open == true ) { e.preventDefault(); setTimeout(function() { document.getElementById("placesContext").hidePopup() }, 0); try { PlacesUtils.bookmarks.removeItem( target._placesNode.itemId ) } catch(e) {}; } bookMenu.open = true; setTimeout(function() { bookMenu.open = false }, 400 ); // сбросить флаг по таймеру document.getElementById("identity-box").setAttribute("style", "background: transparent"); }; // автоматически закрыть все меню закладок при уходе курсора .... if ( bookMenu.stopListener ) return; // блокировать повторный запуск обработчика для текущего меню закладок bookMenu.stopListener = true; // обработчик закрывает меню при ухода мыши с меню и удаляет себя addEventListener("mouseover", function close(e) { if ( !/menu/.test( e.originalTarget.nodeName ) ) { clearTimeout( bookMenu.timer ); bookMenu.timer = setTimeout(function() { removeEventListener("mouseover", close, false, window ); bookMenu.stopListener = false; // отключить блокировку запуска for ( var node = bookMenu; node; node = node.parentNode ) { // закрыть все родственные меню закладок if ( node.nodeName == 'menupopup' ) node.hidePopup(); } }, 450 ); // закрыть меню через ms } else clearTimeout( bookMenu.timer ); }, false ); } }; addEventListener("mouseup", manageBookmarks, true ); addEventListener("mousedown", manageBookmarks, true );
Отредактировано bunda1 (28-07-2013 01:30:15)
Отсутствует
И с таймером то же самое - букмарклет, вызванный через ключевое слово, открывает пустую вкладку.
Я пробовал увеличить задержку до 2500, это не помогает.
bunda1
Может ещё какие-то идеи по этому вопросу?
Мне кажется не работает этот кусок кода:
//Bookmarklet eval("openLinkIn = " + openLinkIn.toString() .replace(/(?=if \(where == "save"\))/, 'if (url.substr(0, 11) == "javascript:") where = "current";') .replace(/(?=var loadInBackground)/, 'if (w.gBrowser.currentURI.spec == "about:blank" && !w.gBrowser.mCurrentTab.hasAttribute("busy")) where = "current";') );
Потому что в целом кнопка работает, всё открывается в новой вкладке. Только вот букмарклеты...
Почему именно в 9 версии это происходит, может в about:config надо что-то подкрутить?
Отредактировано toxa (28-07-2013 12:11:51)
Отсутствует
ЛКМ с задержкой на закладке или разделителе + двойным правым можно удалять разделители:
О, спасибо большое. Ещё удобнее стало. А как сделать чтобы при открытие закладки по СКМ меню тоже бы не закрывалось?
Отсутствует
Может ещё какие-то идеи по этому вопросу?
Мне кажется не работает этот кусок кода:Выделить кодКод:
//Bookmarklet eval("openLinkIn = " + openLinkIn.toString() .replace(/(?=if \(where == "save"\))/, 'if (url.substr(0, 11) == "javascript:") where = "current";') .replace(/(?=var loadInBackground)/, 'if (w.gBrowser.currentURI.spec == "about:blank" && !w.gBrowser.mCurrentTab.hasAttribute("busy")) where = "current";') );Потому что в целом кнопка работает, всё открывается в новой вкладке. Только вот букмарклеты...
Почему именно в 9 версии это происходит, может в about:config надо что-то подкрутить?
Не думаю что это кусок виноват, мне кажется он отвечает за ссылки на странице. Код не мой и я плохо знаю как работает eval
Если я правильно понял ты открываешь букмарклеты из меню адресной строки, может поэкспериментируй с:
eval("whereToOpenLink = " + whereToOpenLink.toString() .replace(/return "current";/g, "{"+(function() { var node = e && e.originalTarget; while (node) { switch (node.id) { case "bookmarksMenuPopup": case "goPopup": case "appmenu_bookmarksPopup": case "appmenu_historyMenupopup": case "personal-bookmarks": case "bookmarks-menu-button": case "historymenu_history": //case "home-button": case "page-proxy-stack": case "go-button": case "urlbar-go-button": case "PopupAutoCompleteRichResult": case "searchbar": case "PopupAutoComplete": return "tab"; } node = node.parentNode; } return "current"; }).toString().replace(/^.*{|}$/g, "")+"}") );
попробуй закоментировать case "goPopup": или case "PopupAutoCompleteRichResult": или case "PopupAutoComplete":
Добавлено 28-07-2013 13:43:05
P.S. можно сделать кнопки которые запускают букмарклеты или даже кнопку которая открывает меню с букмарклеками.
Отредактировано bunda1 (28-07-2013 14:00:40)
Отсутствует
bunda1 пишетЛКМ с задержкой на закладке или разделителе + двойным правым можно удалять разделители:
О, спасибо большое. Ещё удобнее стало. А как сделать чтобы при открытие закладки по СКМ меню тоже бы не закрывалось?
а я про средний клик и забыл, теперь код стал еще лучше:
/* Открывать левым кликом закладку в новой вкладке или средним кликом в текущей вкладке, добавлять страницу в закладки в текущей папке удержанием левой кнопки на закладке или разделителе, двойным правым кликом удалять закладки или разделители не закрывая меню закладок */ function manageBookmarks(e) { var target = e.originalTarget; // эсли это закладка из папки закладок .... if ( !!target._placesNode && ( target.localName == "menuseparator" || target.localName == "menuitem") ) { var type = e.type; var bookMenu = target.parentNode; // левый клик открывает закладку в новой или добавляет текущую вкладку в закладки удержанием левой кнопки .... if ( e.button == 0 && ( type == 'mousedown' || type == 'mouseup' ) ) { if ( type == 'mouseup' ) e.preventDefault(); if ( type == 'mousedown' ) { this.addBook = false; addEventListener("drag", function(e) { // сбросить таймер при перетаскивание закладки window.clearTimeout( this.addBookTimer ); removeEventListener( e.type, arguments.callee, true ); }, true ); this.addBookTimer = setTimeout(function(_this) { // таймер запускает добавление закладки _this.addBook = true; addBookmark(); }, 400, this ); } if ( type == 'mouseup' && !this.addBook ) { window.clearTimeout( this.addBookTimer ); // открыть закладку в новой или в текущей вкладке если это указанная вкладка var itemUri = target._placesNode.uri; var bookmarklet = ( itemUri.substr(0, 11) == "javascript:" ); var current = ["about:newtab", "about:blank", "chrome://browser/content/bookmarks/bookmarksPanel.xul"]; ( bookmarklet || current.indexOf( content.location.href ) !== -1 || e.ctrlKey ) ? gBrowser.loadURI( itemUri ) : gBrowser.addTab( itemUri ); } // добавить страницу в закладки в текущей папке function addBookmark() { var index = PlacesUtils.bookmarks.getItemIndex( target._placesNode.itemId ) + 1; var docTitle = ( content.document.title || gBrowser.mCurrentTab.label ).substr(0, 50); var folderId = PlacesUtils.getConcreteItemId( target.parentNode.parentNode._placesNode ); var currentUri = Services.io.newURI( content.location, null, null ); PlacesUtils.bookmarks.insertBookmark( folderId, currentUri, index, docTitle ); } }; // средний клик открвыяет закладку в текущей вкладке .... if ( e.button == 1 && type == 'mouseup' && target.localName !== "menuseparator" ) { addEventListener("click", function(e) { // обработчик блокирует действие по умолчанию для клика e.stopPropagation(); gBrowser.loadURI( target._placesNode.uri ); // открыть закладку removeEventListener( e.type, arguments.callee, true ); }, true ); }; // двойной правый клик удаляет закладку или разделитель .... if ( e.button == 2 && type == 'mouseup' ) { if ( bookMenu.open == true ) { e.preventDefault(); setTimeout(function() { document.getElementById("placesContext").hidePopup() }, 0); try { PlacesUtils.bookmarks.removeItem( target._placesNode.itemId ) } catch(e) {}; } bookMenu.open = true; setTimeout(function() { bookMenu.open = false }, 400 ); // сбросить флаг по таймеру }; // автоматически закрыть все меню закладок при уходе курсора .... if ( bookMenu.stopListener ) return; // блокировать повторный запуск обработчика для текущего меню закладок bookMenu.stopListener = true; // обработчик закрывает меню при ухода мыши с меню и удаляет себя addEventListener("mouseover", function close(e) { if ( !/menu/.test( e.originalTarget.nodeName ) ) { clearTimeout( bookMenu.timer ); bookMenu.timer = setTimeout(function() { removeEventListener("mouseover", close, false, window ); bookMenu.stopListener = false; // отключить блокировку запуска for ( var node = bookMenu; node; node = node.parentNode ) { // закрыть все родственные меню закладок if ( node.nodeName == 'menupopup' ) node.hidePopup(); } }, 450 ); // закрыть меню через ms } else clearTimeout( bookMenu.timer ); }, false ); } }; addEventListener("mouseup", manageBookmarks, true ); addEventListener("mousedown", manageBookmarks, true );
Добавлено 28-07-2013 14:54:19
Теперь осталось обеденить этот код с Двойным левым кликом на папке закладок добавлять закладку в папку закладок и еще кое что добавить, например удаление папок по двойному ПКМ и т.п.
Отредактировано bunda1 (28-07-2013 15:09:08)
Отсутствует
а я про средний клик и забыл, теперь код стал еще лучше:
Спасибо, просто замечательно. Похоже кнопочка становится такой же незаменимой, как и Toggle Find+3
Теперь осталось обеденить этот код с Двойным левым кликом на папке закладок добавлять закладку в папку закладок и еще кое что добавить, например удаление папок по двойному ПКМ и т.п.
Вот бы ещё её действие распространить на боковую панель закладок и тогда вообще цены бы ей не было. Это возможно сделать, или сильно сложно?
Отсутствует
Вот бы ещё её действие распространить на боковую панель закладок и тогда вообще цены бы ей не было. Это возможно сделать, или сильно сложно?
Вроде не сложно, попробую.
Отсутствует