rubel
Перед строкой 3.0.5.Spoiler вставить
3.0.5. More|Спойлер|more|More||data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMklEQVQ4jWNgGKzgP7EKmSi1iWIDGJHY+JzNiEcOKxhCYTDwgNjQxRaojAwMwyIMKAYA3esECwxQ4k8AAAAASUVORK5CYII=
Отредактировано harryk (01-03-2021 17:18:03)
Отсутствует
Есть замечательная кнопка для Custom Buttons - Перевод.
Переводит всю страницу, выделенный текст, может заменить выделенный текст переводом. А также переводит из буфера обмена.
Можно ли её адаптировать для UCF ?
Что значит «Можно ли»? Если работает в CB — значит можно. Только кто возьмётся?
Со своей стороны, могу только предложить попробовать обычную схему с подгрузчиком.
То есть, например, кладём приведённый код в папку custom_scripts и называем, допустим, google-translate.js
Затем добавляем подгрузчик прямо в custom_script_win.js
Или, создаём на диске файл с подгрузчиком, типа google-translate-loader.js
и подключаем его, ну так, как подключаются из custom_script_win.js другие остальные прочие,
которые грузятся в browser.xhtml, иначе говоря, на общих основаниях.
Но это довольно умозрительно, проверить не могу, в смысле сетевой части, я таким делам весьма посторонен.
({ async init() { await delayedStartupPromise; var code = Cu.readUTF8URI(Services.io.newURI( "chrome://user_chrome_files/content/custom_scripts/google-translate.js" )); var addEventListener = (...args) => { var trg = args[3]; if (!trg) trg = args[3] = window; trg.addEventListener(...args); this.handlers.push(args); } new Function( "_id,xhtmlns,addDestructor,addEventListener,gClipboard", code ).call( this, "ucf-cbinit-google-translate", "http://www.w3.org/1999/xhtml", () => {}, addEventListener, {read: () => readFromClipboard()} ); addEventListener("unload", this, {once: true}); }, handlers: [], handleEvent() { for(var args of this.handlers) args.pop().removeEventListener(...args); delete this.handlers; } }).init();
А такой # тег ниасилил [#]123[/#]. Со спецсимволами никак?
Двойной энкодинг на закрывающий тэг делать не стал,
подумал, ну что там такого может быть. Неее, найдут!
... //encodeURIComponent(`[${v1 + (v2 || "")}]`), `[/${v1}]`, v2 == "=%move%" encodeURIComponent(`[${v1 + (v2 || "")}]`), encodeURIComponent(`[/${v1}]`), v2 == "=%move%" ... //.replace(/%copy%|%move%/, mid) + (move ? "" : mid) + bb2; .replace(/%copy%|%move%/, mid) + (move ? "" : mid) + decodeURIComponent(bb2); ... //+ `'${encodeURIComponent(bb1)}', '${bb2}', ${move});` + `'${encodeURIComponent(bb1)}', '${encodeURIComponent(bb2)}', ${move});` ...
Отсутствует
Dumby
Например, у меня есть текст в буфере обмена и мне надо его вставить в тегах, вместо того что бы вставлять, выделять и только потом обрамлять в теги.
В общем, "...|тег||%clipboard%|data:image..." можете сделать рабочим? Или типа того.
Отсутствует
Dumby
Со своей стороны, могу только предложить попробовать обычную схему с подгрузчиком.....
А ведь прекрасно получилось! Все работает точно так как и в Custom Buttons.
Спасибо, а можно также подключить кнопку // Искать в ... ?
Или еще как.
Отсутствует
Отсутствует
Например, у меня есть текст в буфере обмена и мне надо его вставить в тегах
Тяп-ляп %dclipboard%
... async bbc(trg) { var v1 = trg.getAttribute("value1"); if (!v1) return; var win = trg.ownerGlobal; var v2 = trg.getAttribute("value2"); var dc = ""; if (v2) { if (v2.includes("%dclipboard%")) dc = v2.replace("%dclipboard%", await win.navigator.clipboard.readText()), v2 = false; else v2 = "=" + ( v2.includes("%clipboard%") ? v2.replace( "%clipboard%", await win.navigator.clipboard.readText() ) : v2 ); } win.gBrowser.selectedBrowser.messageManager.loadFrameScript(this.url( encodeURIComponent(`[${v1 + (v2 || "")}]${dc}`), encodeURIComponent(`[/${v1}]`), v2 == "=%move%", v2 === false ), false); }, url(...args) { var code = `((bb1, bb2, move, dc) => { var box = Cc["@mozilla.org/focus-manager;1"] .getService(Ci.nsIFocusManager) .getFocusedElementForWindow(content, true, {}); var ed = box?.editor; if (!(ed && ed instanceof Ci.nsIEditor)) return; var txt = box.value; var s = box.selectionStart; var e = box.selectionEnd; var bef = txt.substring(0, s); var mid = dc ? "" : txt.substring(s, e); var aft = txt.substring(e); var ins = decodeURIComponent(bb1) .replace(/%copy%|%move%/, mid) + (move ? "" : mid) + decodeURIComponent(bb2); var val = bef + ins + aft; box.value = val; box.selectionStart = s; box.selectionEnd = s + ins.length; //box.focus(); })(` var prfx = "data:charset=utf-8," + encodeURIComponent(code); return (this.url = (bb1, bb2, move, dc) => prfx + `'${encodeURIComponent(bb1)}', '${encodeURIComponent(bb2)}', ${move}, ${dc});` )(...args); }
3.0.5.Test|Работает?|tag|%dclipboard%||data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAizUHRos1B42LNQfHizUH8Is1B/CLNQfHizUHjYs1B0YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLNQcgizUHjKlaMP7IiWj/3a+W/+a/qv/jt6D/26qQ/8iJaP+pWjD+izUHjIs1ByAAAAAAAAAAAAAAAACLNQcgnz0J88F7Vv/ho4T/4H5P/9VFEP/ne0X/5XE1/9ZFEv/jflD/4aWF/8F7Vv+cPQrzizUHIAAAAAAAAAAAizUHjMN6Vf/ilm//zEoT/8g1Cf/INQn///////jUwf/dMwr/3TMK/9dKF//UknL/wXtW/4s1B4wAAAAAizUHRqxaL/7kpIP/0EwS/8I6Df/DNAb/wzQG///////41MH/1zAG/9cwBv/XOBD/00kV/+Glhf+pWjD+izUHRos1B43Nimf/5Ylc/8A9Df/AOw3/wDUG/8A1Bv/yqIL/7pNi/9AvBP/QLwT/zzYN/802Dv/kh1v/yIlo/4s1B42LNQfH4qmL/9ZTGP/BPg//wDoN/741Bv++NQb///////318P/ILwL/yC8C/8c1C//FNQr/0EcP/96sk/+LNQfHizUH8Oy0l//ZViH/ykYX/8E9Df+8NAX/vDQF//fJsf//////+t/R/8AvAP+/NQn/vjUJ/8M5CP/pv6n/izUH8Is1B/Dwv6X/3Vom/9BOHv/IRRf/wzwL/8M8C//DPAv/+t/R///////1vqH/vDUJ/7w1Cf/AOQj/7Max/4s1B/CLNQfH6bGR/+JfIv/eXy3/5FEE/+lyM//nZyP/z0oa/89KGv/86uD//////+dnI/+4OAn/1F4o/+Owlf+LNQfHizUHjdWKZP/tjl//6m06/+yIU///////+NTB/9xaKf/cWin/+t/R///////pcjP/y0we/+eNYP/Pimb/izUHjYs1B0ayWy3+8aeB/+tlKf/kUQT//Org///////639H/+t/R///////41MH/11sq/9NdJv/ssJD/rlou/os1B0YAAAAAizUHjNN+Uf/ym2//7Got/+lyM//3ybH///////318P/1vqH/4mIu/+FiJv/xr4z/zn1S/4s1B4wAAAAAAAAAAIs1ByCqQAfz035R//Kogf/ylWT/7XpD//KDUf/yhlb/63M9//CYbP/yspH/0HxR/6Y+B/OLNQcgAAAAAAAAAAAAAAAAizUHIIs1B4yyWy3+2Ixk/+2yk//2w6j/9b2f/+yvjv/XjGT/slst/os1B4yLNQcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAizUHRos1B42LNQfHizUH8Is1B/CLNQfHizUHjYs1B0YAAAAAAAAAAAAAAAAAAAAA8A+sQcADrEGAAaxBgAGsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBgAGsQYABrEHAA6xB8A+sQQ==
Отсутствует
Двойной энкодинг на закрывающий тэг делать не стал
Спасибо, так работает
Добавлено 01-03-2021 21:55:21
3.0.5.Test|Работает?|tag|%dclipboard%
Это тоже работает
Отредактировано harryk (01-03-2021 21:55:21)
Отсутствует
harryk
Еще что-нибудь надо менять для тэга #, кроме замены https://forum.mozilla-russia.org/viewto … 72#p788872. Сделал и не вижу изменений - ткни, плиз носом
Отсутствует
bezuma
Возьмите последние правки скрипта отсюда №9830
3.0.5. # |Скрытый текст|#|||data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAHpSURBVHjapJK9aipRFEbXOc6MM5EkiIX5KaYShJQ+gpVtIF1Kq4Av4RuIZao0AUkTiAi+gEUgSipjNQYcizRJBowDZ2Z2ConFLW5yb1a3i734PvZWIvIKuPwfMSIST6dTCYJAvgiCQCaTyXYOw1Du7+8lSRL5g1gDMhwOub29ZbFYAGCMIY5jAJbLJYPBgKurK9I0JYoiZrPZVwKxADzPo9frMR6Pqdfr+L7PYrEgDEP6/T5hGFKr1Xh+fqbT6WCMoVqtcnFxgQb4+Pjg9PSUdrvNaDQijmMeHx+5ubmh2+1yfn6O4zhcXl6SJAknJyfc3d0xn883Aq01+/v72LaNZVmICGmakqYpjuNQKBRIkoT393dc18X3fc7OziiVShtBPp/Htm2UUhQKBQB836fRaNBqtbi+vsayLJrNJqvVislkQhRFuK6LEpF1FEWu1hrP83h7e8PzPIwx7O3t8fDwgOd5HB0dUSwWeXp64uXlhUqlwuHhYaxEZP2bP7AAVqsVy+USpRRKqW+30jRld3eXg4MDLID1ek0QBIgIWutvBcYYjo+PKZfLG4HWGsdxfixQSpHL5QDQ/BIL2N49y7Kt+W8kSUKWZVuByuVy7Ozs/LiCbds4jrNpIyKvWZa5xph/iq61xrbt+HMA/wYFcDfOeqsAAAAASUVORK5CYII=
Отредактировано harryk (01-03-2021 22:38:48)
Отсутствует
Dumby
но неужели хороший WebExtensions для этого не написали
Вообще никакой не написали, ни хороший, ни плохой. Единственный есть и тот через контекстное меню.
3.0.5.Test|Работает?
Да. Спасибо.
Не хватает выравнивания контента кнопок в меню по левому краю, с заданным отступом.
Пришлось пробелами выравнивать, без этого выглядит неопрятно, но пробелами точно выровнять не получится.
Отредактировано _zt (01-03-2021 23:04:28)
Отсутствует
клянчил сам тэг
Думаю придётся почти все кнопки переделывать под %dclipboard%, т.к дублировать команды, которые итак есть на странице смысла не вижу.
_zt
Как вы увеличили количество цветов в выпадающем списке? У меня всего 11
Отсутствует
_zt
Спасибо, получилось
Dumby
У меня ещё одна хотелка нарисовалась. Сделал я кнопку Моношрифт
3.0.9.Font Mono|Моношрифт|font|monospace||
в результате получаю такое
Если заменить monospace на %dclipboard%, то получаю [font]Текст из буфера[/font]
Но мне же хочется чтобы было так
Тогда я сделал так
3.0.9.Font Mono|Моношрифт|font|monospace|%dclipboard%|
но получил всё равно
т.е. поле между последними вертикальными чертами игнорируется.
С этим можно что-то сделать?
Отредактировано harryk (02-03-2021 00:13:18)
Отсутствует
кнопку // Искать в ...
(async (searchSelect, popup) => (popup = searchSelect.closest("menupopup")).addEventListener("popupshowing", { topic: "browser-search-engine-modified", defaultImg: "chrome://browser/skin/search-engine-placeholder.png", handleEvent(e) { if (searchSelect.hidden) return; var menu = document.createXULElement("menu"); menu.className = "menu-iconic"; menu.ePopup = menu.appendChild(document.createXULElement("menupopup")); menu.onclick = this.search; searchSelect.collapsed = true; searchSelect.before(menu); addEventListener("unload", () => { popup.removeEventListener("popupshowing", this); this.handleEvent == this.handler && Services.obs.removeObserver(this, this.topic); }, {once: true}); this.handler = () => menu.hidden = searchSelect.hidden; this.handlerRebuild = () => this.handler() || this.rebuild(menu); this.rebuild(menu); }, async rebuild(menu) { var de = Services.search.defaultEngine; de = de.wrappedJSObject || de; this.setAttrs(menu, de, `Искать в ${de.name} или в ...`); menu.ePopup.textContent = ""; for(var engine of await Services.search.getVisibleEngines()) { if (engine == de) continue; var menuitem = document.createXULElement("menuitem"); menuitem.className = "menuitem-iconic"; this.setAttrs(menuitem, engine); menu.ePopup.append(menuitem); } this.handleEvent = this.handler; Services.obs.addObserver(this, this.topic, false); }, setAttrs(node, engine, label = engine.name) { node.engine = engine; node.setAttribute("label", label); node.setAttribute("image", engine.iconURI ? engine.iconURI.spec : this.defaultImg); }, observe() { this.handleEvent = this.handlerRebuild; Services.obs.removeObserver(this, this.topic); }, search(e) { var {engine} = e.target; if (!engine) return; var submission = engine.getSubmission( searchSelect.searchTerms, null, "contextmenu" ); submission && openLinkIn(submission.uri.spec, "tab", { postData: submission.postData, inBackground: e.button > 0, relatedToCurrent: true, triggeringPrincipal: searchSelect.principal }); e.button != 1 && popup.state == "open" && popup.hidePopup(); } }))(document.getElementById("context-searchselect"));
Не хватает выравнивания контента кнопок в меню по левому краю, с заданным отступом.
Если я правильно понял, тогда добавить перед строкой, содержащей
bbc.popup = this.lastChild.cloneNode(true);
... for(var hbox of this.lastChild.querySelectorAll( ":not(#ucf-cbbtn-BBCode-node7) > button > hbox" )) { hbox.removeAttribute("pack"); hbox.style.paddingLeft = "16px"; }
т.е. поле между последними вертикальными чертами игнорируется
Поле между последними вертикальными чертами — служебное.
Свободных полей только два (первое из них несёт имя тэга).
С этим можно что-то сделать?
Даже не знаю, кнопка изначально не расчитана на такие выкрутасы.
Могу попробовать ввести %+dclipboard%. Как бы чего-нибудь не испортить.
... async bbc(trg) { var v1 = trg.getAttribute("value1"); if (!v1) return; var win = trg.ownerGlobal; var v2 = trg.getAttribute("value2"); var dc = "", plus = false; if (v2) { var re = /%(\+)?(d)?clipboard%/; if (re.test(v2)) { var {$1, $2, leftContext} = RegExp; var cb = await win.navigator.clipboard.readText(); if ($2) { if ($1) { // +dclip plus = true; var r = v2.slice(leftContext.length); v2 = "=" + leftContext; dc = r.replace(re, cb); } else { // dclip dc = v2.replace(re, cb); v2 = false; } } // clip else if (!$1) v2 = "=" + v2.replace(re, cb); } else v2 = "=" + v2; } win.gBrowser.selectedBrowser.messageManager.loadFrameScript(this.url( encodeURIComponent(`[${v1 + (v2 || "")}]${dc}`), encodeURIComponent(`[/${v1}]`), v2 == "=%move%", v2 === false || plus ), false); },
3.0.9.Font Mono|Моношрифт|font|monospace%+dclipboard%||data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADXgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP///////////9eDAP/XgwD/14MA/9eDAP/XgwD/14MA////////////14MA/9eDAP/XgwD/14MA/9eDAP/XgwD////////////XgwD/14MA/9eDAP/XgwD/14MA/9eDAP///////////9eDAP/XgwD/14MA/9eDAP/XgwD/14MA////////////14MA/9eDAP///////////9eDAP/XgwD////////////XgwD/14MA/9eDAP/XgwD/14MA/9eDAP///////////9eDAP/XgwD////////////XgwD/14MA////////////14MA/9eDAP/XgwD/14MA/9eDAP/XgwD////////////XgwD/14MA////////////14MA/9eDAP///////////9eDAP/XgwD/14MA/9eDAP/XgwD/14MA////////////14MA///////////////////////XgwD////////////XgwD/14MA/9eDAP/XgwD/14MA/9eDAP//////////////////////////////////////////////////////14MA/9eDAP/XgwD/14MA/9eDAP/XgwD//////////////////////9eDAP/XgwD//////////////////////9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/////////////////9eDAP/XgwD/14MA/9eDAP/////////////////XgwD/14MA/9eDAP/XgwD/14MA/9eDAP///////////9eDAP/XgwD/14MA/9eDAP/XgwD/14MA////////////14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/14MA/9eDAP/XgwD/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ==
Отсутствует
Vitaliy V.
вот например для боковой панели
SidebarBookmarkSearchOpenFolder.uc.js
если надо то есть способ подключить его в user_chrome_files
А как это сделать?
И еще вопрос.
Я пользуюсь расширением Open side view. При выборк соответствующего пункта
контекстного меню ссылки или закладки автоматически открывалась боковушка
с этим сайтом. Начиная с Firefox 86 придится наводить указатель мыши на вертикальную
панель, чтобы боковушка открылась. Не подскажете в чем здесь дело?
Отредактировано Garalf (02-03-2021 13:09:44)
Отсутствует
rubel
Кнопка // Искать в ... уже была, Вы невнимательны. Зато теперь их целых две!
https://forum.mozilla-russia.org/viewtopic.php?pid=780283#p780283
Garalf
А как это сделать?
Код берём здесь и вставляем в custom_script_win.js. У меня так работает: раскомментарил
browser: win => { //>>>>>>>>>>| Этот блок требуется для боковой панели и др., очистите строку ниже если он нужен |>>>>>>>>>> /*
и вставил
//>>>>>>>>>>| Загрузка скриптов для др. документов |>>>>>>>>>> https://forum.mozilla-russia.org/viewtopic.php?pid=788301#p788301 "chrome://browser/content/places/bookmarksSidebar.xhtml": win => { // боковая панель закладок loadscript("cs_win/SidebarBookmarkSearchOpenFolder.uc.js", win); }, //<<<<<<<<<<<<<<<<<<<<
// ==UserScript== // @charset UTF-8 // @name SidebarBookmarkSearchOpenFolder.uc.js // @description ブックマークサイドバーで検索したブックマークのコンテキストメニューに[このブックマークがあるフォルダを開く]を追加します // @include chrome://browser/content/places/bookmarksSidebar.xhtml // @include chrome://browser/content/places/bookmarksSidebar.xul // @version 2019/12/11 fix for 73 Bug 1601094 - Rename remaining .xul files to .xhtml in browser // @version 2019/01/22 // ==/UserScript== (function() { "use strict"; const SidebarBookmarkSearchOpenFolder = { tree: null, searchbox: null, menuitem: null, separator: null, init: function() { this.tree = document.getElementById("bookmarks-view"); this.searchbox = document.getElementById("search-box"); const popup = document.getElementById("placesContext"); if (!this.tree || !this.searchbox || !popup) return; const insertPos = popup.firstChild; this.menuitem = this.$C("menuitem", { id: "ucjs_openFolderWithThisBookmark", label: "Открыть папку с закладкой", //このブックマークがあるフォルダを開く }, popup, insertPos); this.menuitem.addEventListener("command", this); this.separator = this.$C("menuseparator", null, popup, insertPos); this.tree.addEventListener("contextmenu", this); }, handleEvent: function(event) { switch (event.type) { case "contextmenu": this.onContextmenu(event); break; case "command": this.onCommand(event); break; } }, onContextmenu: function(event) { if (this.searchbox.value !== "") { this.menuitem.removeAttribute("hidden"); this.menuitem.removeAttribute("disabled"); this.separator.removeAttribute("hidden"); this.separator.removeAttribute("disabled"); } else { this.menuitem.setAttribute("hidden", true); this.separator.setAttribute("hidden", true); } }, onCommand: function(event) { const node = this.tree.selectedNode; if (node && node.itemId >= 0) { // 検索クリア /*this.tree.place = this.tree.place; this.searchbox.reset(); searchBookmarks("");*/ this.searchbox._clearSearch(); // ツリーから対象idのノードを探す const target = this.findNode(this.tree.view.result.root, node.itemId); if (target) { setTimeout(() => { const tree = this.tree; tree.selectNode(target); // スクロール位置調整 const box = tree.treeBoxObject || tree; // tree.treeBoxObjext: -65, tree: 66- const last = box.getLastVisibleRow(); if (last - 3 <= tree.currentIndex) { box.scrollByLines((last - box.getFirstVisibleRow()) / 4); } }, 0); } } }, findNode: function(node, id) { function _find_recursive(node) { if (node.itemId === id) return node; if (PlacesUtils.nodeIsContainer(node)) { const prevOpen = node.containerOpen; node.containerOpen = true; try { for (let i = 0; i < node.childCount; i++) { const childNode = node.getChild(i); if (!PlacesUtils.nodeIsQuery(childNode)) { const found = _find_recursive(childNode); if (found) return found; } } } finally { node.containerOpen = prevOpen; } } return null; } return _find_recursive(node); }, $C: function(tag, attr, parent, before) { const e = document.createXULElement(tag); if (attr) Object.keys(attr).forEach(k => e.setAttribute(k, attr[k])); if (parent) parent.insertBefore(e, before); return e; } }; SidebarBookmarkSearchOpenFolder.init(); })();
Отсутствует
harryk
Не понял - что куда ложить и как подключать?
С Кодом, который дал Dumby под первым спойлером нужно создать файл context-searchselect.js
и подключить его к custom_script_win.js.
Добавлено 02-03-2021 13:45:13
xrun1
Кнопка // Искать в ... уже была, Вы невнимательны. Зато теперь их целых две!
https://forum.mozilla-russia.org/viewtopic.php?pid=780283#p780283
Там все заморочено, а здесь сразу все получается.
Отредактировано rubel (02-03-2021 13:45:13)
Отсутствует
Dumby
Если я правильно понял
Да, все верно. Спасибо, работает, так намного лучше.
Подскажите, как добавить еще пару кнопок на панель?
Например, для операций с буфером и для редких тегов. Что бы без прокрутки в менюшках можно было обойтись.
Последовательное увеличение цифр, в секции кнопок панели, кнопку создает, но меню такая кнопка не вызывает.
Отредактировано _zt (02-03-2021 14:51:12)
Отсутствует