Страницы: 1
Сохранять изображение без запроса в установленные папки, из контекстного меню (Firefox 24 +)
Автор: bunda1
Версия: от 01.09.2017.
Описание: добавляет в контекстное меню изображений на странице новый пункт "Сохранить в папку:" который открывает подменю с папками для загрузки по левому клику изображений без запроса, правый клик на подменю открывает контекстное меню которое даёт возможность добавить папку или разделитель, удалить элемент из подменю, переименовать папки в подменю, открыть или удалить реальную папку для загрузки. Ctrl + колёсиком мыши на элементах подменю можно перемещать элемент подменю верх-вниз в подменю.
// Сохранять изображение без запроса в установленные папки, из контекстного меню, от 01.09.2017. ................... ((contextMenu, saveimage) => { var s = "CB.allPathsToImageFolders"; var defaultDownFolder = Services.downloads.defaultDownloadsDirectory.path; // папка для сохранения изображений по умолчанию // Создать новое меню в контекстном меню изображений на странице .... var menu = contextMenu.insertBefore(document.createElement("menu"), saveimage); // contextMenu.children[41] menu.setAttribute("label", "Сохранить в папку:"); menu.setAttribute("class", "menu-iconic"); menu.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42pXTTUgUURwA8P+bD2fcmcVwY0v7IMIiUQyCDh7aN2AeUiu6SBApgUlfhw6dJOnarUsQRG2Qpd06xC7tIZtOfSiEJRmJurtIhoubM+7MrrM7b3ozQx+strJvDsN/5v//vff+bwZB2WgaeNwq8OwExzKcGxPieM9LhJQKln10Ido//W8+KgcODIzgHdsklSZ78e+7JLKwrJsKBd5UBA4OjuCdFLAsf+ZcoVgdcGjwCW6ol9Ri0QdWDesvoFHg0RZA86WnuLFeVontAxmtUB3QenkUN4Zk1SF+vJQ1qwParo7h3aGgirxXCFLLa2U96NsCuPYM7wvXqZx7igjB3HcdHHoFBAQ/Vg0lGT1fGWi/8Zz2IKgKvOABXxc1cBwHankCGbqC2ftnNwLhcw/6W/Zuf0gcxCJatCccAp4T3Hr4nKYAIcAxNhj5HMUI8IxTSmX00ytjF+Me0HJlNEAniSltTYoNLDB0+YhhwMU+Jn2AfohASiUQOZtuaylRw7GnktE+688WlKEX0s81M9ZxpBk7iKeICzAwOa/TYhtsCghMEWbTqVeyKJ6cudeb39CDjuG4lNWNWFf7YcywNcCxLHyYz4FlFYGDdfgy9208UBvombl7Jv/fJnbeSkiLmWz8QtexiCiIMLFggrVuwOT01GspEOz5dKfbrHgK7ogMxeSsnotd7z0emUoXYPzdW1WW67rf3+40y3M3Bbye3Hwpr2havED/if27Gk4khrGxWd4vPuUDIJB3TGUAAAAASUVORK5CYII="); menu.setAttribute("id", "context-cbDownloadImageToFolders"); addEventListener("popupshowing", e=> menu.hidden = saveimage.hidden, false, contextMenu); addDestructor(()=> menu.remove()); // Создать у меню подменю с папками загрузки .... var menuPopup = menu.appendChild(document.createElement("menupopup")); menuPopup.setAttribute('style', 'overflow: auto'); menuPopup.setAttribute("closemenu", "none"); menuPopup.addEventListener("popuphidden", setPaths); // записать в 'about:config' изменения в подменю // добавить в подменю папки и разделители function setItemsToMenuPopup() { menuPopup.textContent = ""; getPaths().forEach(str=> { if ( str == '' ) { var sep = menuPopup.appendChild(document.createElement("menuseparator")); sep.onwheel =e=> moveNode(e); return; }; var mItem = menuPopup.appendChild(document.createElement("menuitem")); mItem.value = str, mItem.path = str.split(">").shift(); mItem.setAttribute("tooltiptext", mItem.path); mItem.setAttribute("label", (/>/.test(str) ? str.split(">") : str.split("\\")).pop()); mItem.onwheel =e=> e.ctrlKey && moveNode(e); mItem.onclick =e=> e.button || downloadToFolder(mItem.path); }) }; setItemsToMenuPopup(); // Колёсиком мыши перемещать элемент верх-вниз в подменю .... function moveNode(e, el = e.target) menuPopup.insertBefore(el, e.deltaY > 0 ? el.nextSibling.nextSibling : (el.previousSibling || el)); // Сохранить изображение над которым открыто контекстное меню в указаную папку .... function downloadToFolder(path) { var run = cbu.getPrefs("browser.download.folderList"); var use = cbu.getPrefs("browser.download.useDownloadDir"); try { var dir = Services.prefs.getComplexValue("browser.download.dir", Ci.nsISupportsString).data } catch(e) { var dir = defaultDownFolder }; cbu.setPrefs("browser.download.folderList", 2); cbu.setPrefs("browser.download.useDownloadDir", true); cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", path)); save(); cbu.setPrefs("browser.download.folderList", run); cbu.setPrefs("browser.download.useDownloadDir", use); cbu.setPrefs("browser.download.dir", convertFromUnicode("UTF-8", dir)); }; function save() { var func = eval( gContextMenu.saveMedia.toSource() .replace(/(false,\s+)false,/, "$1true,") .replace(/^s/, "0,function s") ); (save = () => func.call(gContextMenu))(); }; // Создать контекстное меню для редактирования подменю .... var popup = gBrowser.appendChild(document.createElement("menupopup")); addDestructor(()=> popup.remove()); menuPopup.oncontextmenu =e=> { e.preventDefault(); popup.el = e.target; popup.openPopupAtScreen(e.screenX, e.screenY); // скрывать не нужные пункты контекстнов меню на разделителях [...popup.children].forEach((el,i)=> { el.hidden = (popup.el.localName == "menuseparator" && i > 3); }) }; // добавить в контекстном меню пункты и разделители [ ["Добавить папку", "addNode(true, popup.el)"], ["Добавить разделитель", "addNode(false, popup.el)"], ["separator"], ["Удалить элемент", "removeNode(popup.el)"], ["Переименовать папку", "changeMenuitemLabel(popup.el)"], ["separator"], ["Открыть реальную папку", "openOrRemoveFolder(true, popup.el)"], ["Удалить реальную папку", "openOrRemoveFolder(false, popup.el)"] ] .forEach(m=> { if ( m == "separator" ) { popup.appendChild(document.createElement("menuseparator")); return; } var mItem = popup.appendChild(document.createElement("menuitem")); mItem.setAttribute("label", m[0]); mItem.onclick =()=> eval(m[1]); }); // Изменить название папки в подменю .... function changeMenuitemLabel(el) { var val = custombuttons.promptBox('', 'Ведите другое название папки')[1]; if (val == '') return; el.setAttribute('label', val); el.value = el.path + ">" + val; }; // Удалить элемент из подменю .... function removeNode(el) menuPopup.children.length > 1 && el.remove(); // Добавить в 'about:config' новую папку или разделитель .... function addNode(addFolder, el) { if ( addFolder ) { var fp = window.makeFilePicker(); fp.init(window, "Укажите путь к папке для сохранения изображений", fp.modeGetFolder); if ( fp.show() == fp.returnCancel ) return; var newPath = fp.file.path; } var arr = getPaths(); var pos = [...menuPopup.children].indexOf(el) + 1; arr.splice(pos, 0, (addFolder ? newPath : "")); cbu.setPrefs(s, convertFromUnicode("UTF-8", arr)); setItemsToMenuPopup(); // пересоздать подменю }; // Открыть или удалить реальную папку .... function openOrRemoveFolder(launch, el) { var folder = Components.Constructor("@mozilla.org/file/local;1", "nsIFile", "initWithPath")(el.path); if ( launch ) { folder.launch(); return; } // сплывающая подсказка с запросом о удалении var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService); alertsService.showAlertNotification(menu.image || self.image, "Кликни чтобы удалить реальную папку!", folder.path, true, "", (s, t)=> { if ( t == 'alertclickcallback' && folder.parent !== null ) try { el.remove(); folder.remove(true); } catch(e) {}; }, ""); setTimeout(()=> alertsService.closeAlert(), 4000); }; // Получить из подменю пути + названия папок и расположение разделителей и записать в 'about:config' .... function setPaths() { var arr = [...menuPopup.children].map((el)=> el.value); cbu.setPrefs(s, convertFromUnicode("UTF-8", arr)); }; // Получить из 'about:config' массив с путями + названиями папок и расположением разделителей .... function getPaths() { try { var arr = Services.prefs.getComplexValue(s, Ci.nsISupportsString).data; } catch(e) { var arr = defaultDownFolder }; return arr.split(","); }; // Конвертировать текст в юникод .... function convertFromUnicode(charset, str) { var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); converter.charset = charset; str = converter.ConvertFromUnicode(str); return str + converter.Finish(); }; })(document.getElementById("contentAreaContextMenu"), document.getElementById("context-saveimage"));
Отсутствует
bunda1
Спасибо. Отличная замена Save Image in Folder.
Может стоит добавить опцию, переключающую сохранение без запроса/появление диалога о замене, при совпадении имени с имеющимся файлом?
Отсутствует
bunda1
Может стоит добавить опцию, переключающую сохранение без запроса/появление диалога о замене, при совпадении имени с имеющимся файлом?
Ну вроде как Firefox при совпадении имени изображения с имеющимся изображением добавляет к названию (2), (3) и т.п.
Отсутствует
voqabuhe
Это дефолтный пункт меню для картинок-превью, со ссылками. Для картинок без ссылки, СКМ по пункту "view image" - откроет картинку в новой вкладке.
Отсутствует
Кто-то сможет подтвердить, на 49.0 не работает? Или это мое личное?
bunda1
Сможете поправить?
Работает если выключен МногоПроцессный Режим. Пока не знаю как это исправить.
Отсутствует
Многопроцессорный не включал. Проблема с этой кнопкой. Поставил попробовать. Оказалось, не могут существовать две кнопки вместе.
Отсутствует
Страницы: 1