Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.
  • Форумы
  •  » Сustom Buttons
  •  » [CB]Сохранять изображение без запроса в установленные папки

№124-05-2016 20:23:37

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

[CB]Сохранять изображение без запроса в установленные папки

Сохранять изображение без запроса в установленные папки, из контекстного меню (Firefox 24 +)
Автор: bunda1
Версия: от 01.09.2017.
Описание: добавляет в контекстное меню изображений на странице новый пункт "Сохранить в папку:" который открывает подменю с папками для загрузки по левому клику изображений без запроса, правый клик на подменю открывает контекстное меню которое даёт возможность добавить папку или разделитель, удалить элемент из подменю, переименовать папки в подменю, открыть или удалить реальную папку для загрузки. Ctrl + колёсиком мыши на элементах подменю можно перемещать элемент подменю верх-вниз в подменю.

Скриншот
c54afdd0a8d2b1cdca919fc17eff58c0.png

Использование: положите код в любую Custom Buttons кнопку, в инициализацию. Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Выделить код

Код:

// Сохранять изображение без запроса в установленные папки, из контекстного меню, от 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"));

Отсутствует

 

№224-05-2016 21:09:55

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 49.0

Re: [CB]Сохранять изображение без запроса в установленные папки

bunda1
Спасибо. Отличная замена Save Image in Folder. :beer:

Может стоит добавить опцию, переключающую сохранение без запроса/появление диалога о замене, при совпадении имени с имеющимся файлом?

Отсутствует

 

№324-05-2016 21:16:59

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: [CB]Сохранять изображение без запроса в установленные папки

turbot пишет

bunda1
Может стоит добавить опцию, переключающую сохранение без запроса/появление диалога о замене, при совпадении имени с имеющимся файлом?

Ну вроде как Firefox при совпадении имени изображения с имеющимся изображением добавляет к названию (2), (3) и т.п.

Отсутствует

 

№424-05-2016 21:28:04

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 49.0

Re: [CB]Сохранять изображение без запроса в установленные папки

bunda1
Это да, но может мне не нужен дупликат. :)

Отсутствует

 

№524-05-2016 21:31:04

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: [CB]Сохранять изображение без запроса в установленные папки

turbot пишет

bunda1
Это да, но может мне не нужен дупликат. :)

Попробую сделать :/

Отсутствует

 

№624-05-2016 21:34:39

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 49.0

Re: [CB]Сохранять изображение без запроса в установленные папки

bunda1
А на скрине Открыть ссылку в новой вкладке и ниже это для изображения?

Отредактировано voqabuhe (24-05-2016 21:37:00)

Отсутствует

 

№724-05-2016 21:39:19

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: [CB]Сохранять изображение без запроса в установленные папки

voqabuhe пишет

bunda1
А на скрине Открыть ссылку в новой вкладке и ниже это для изображения?

Да, для изображений.

Отсутствует

 

№824-05-2016 23:38:57

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 49.0

Re: [CB]Сохранять изображение без запроса в установленные папки

bunda1 пишет

Да, для изображений.

А как такое сделать?

Отсутствует

 

№924-05-2016 23:48:03

turbot
Участник
 
Группа: Members
Зарегистрирован: 09-10-2011
Сообщений: 2529
UA: Firefox 49.0

Re: [CB]Сохранять изображение без запроса в установленные папки

voqabuhe
Это дефолтный пункт меню для картинок-превью, со ссылками. Для картинок без ссылки, СКМ по пункту "view image" - откроет картинку в новой вкладке.

Отсутствует

 

№1025-05-2016 00:23:45

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 49.0

Re: [CB]Сохранять изображение без запроса в установленные папки

turbot
:D Спасибо.

Отсутствует

 

№1105-10-2016 12:19:57

toltec
Участник
 
Группа: Members
Зарегистрирован: 03-12-2013
Сообщений: 20
UA: Firefox 49.0

Re: [CB]Сохранять изображение без запроса в установленные папки

Кто-то сможет подтвердить, на 49.0 не работает? Или  это мое личное?

bunda1
Сможете поправить?

Отсутствует

 

№1205-10-2016 13:20:23

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 24.0

Re: [CB]Сохранять изображение без запроса в установленные папки

toltec пишет

Кто-то сможет подтвердить, на 49.0 не работает? Или  это мое личное?
bunda1
Сможете поправить?

Работает если выключен МногоПроцессный Режим. Пока не знаю как это исправить.

Отсутствует

 

№1305-10-2016 13:58:45

toltec
Участник
 
Группа: Members
Зарегистрирован: 03-12-2013
Сообщений: 20
UA: Firefox 49.0

Re: [CB]Сохранять изображение без запроса в установленные папки

Многопроцессорный не включал. Проблема с этой кнопкой. Поставил попробовать. Оказалось, не могут существовать две кнопки вместе.

Отсутствует

 

№1408-08-2017 19:33:39

tom911
Участник
 
Группа: Members
Зарегистрирован: 20-05-2011
Сообщений: 170
UA: Firefox 55.0

Re: [CB]Сохранять изображение без запроса в установленные папки

bunda1
Firefox 55, кнопка перестала работать. И подскажите, что по поводу реализации появления диалогового окна о дубликате изображение?

Отсутствует

 
  • Форумы
  •  » Сustom Buttons
  •  » [CB]Сохранять изображение без запроса в установленные папки

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]