From 55b807ee078be36d8e4bd9155b4e4b42f55a1835 Mon Sep 17 00:00:00 2001 From: Maxim Stewart Date: Sat, 4 Jul 2020 05:35:06 -0500 Subject: [PATCH] Tab duplicate behavior change --- README.md | 5 +- src/icons/tabsGroups_48.png | Bin 420 -> 0 bytes src/icons/tabsGroups_96.png | Bin 446 -> 0 bytes src/manifest.json | 2 +- src/scripts/eventListeners.js | 21 +++--- src/scripts/generateView.js | 117 +++++++++++++--------------------- 6 files changed, 61 insertions(+), 84 deletions(-) delete mode 100644 src/icons/tabsGroups_48.png delete mode 100644 src/icons/tabsGroups_96.png diff --git a/README.md b/README.md index 84305d2..78be8da 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,8 @@ Search Firefox tabs and get a list or automatic direct to the searched tab. # Download https://addons.mozilla.org/en-US/firefox/addon/tab-search-and-manage/ -# Version: 1.3.9 -* Added tab duplicate button -* Added secondary control menu +# Version: 1.3.10 +* Improved tab duplicate behavior ***Note: diff --git a/src/icons/tabsGroups_48.png b/src/icons/tabsGroups_48.png deleted file mode 100644 index 80477b9d3d68799ea89b378ce63c68755ecfa476..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7Y1Jt)Z}Ne1d4DLctjR6 zFz6|RFk{71`!b*)dx@v7EBhl>9!^2_>r89!GB7Y2db&7`V&@0 zpV*$VSssu(plZo_-NV=2Q~W7kLHCk{pK}F__&ZO`W>U=f7`*sQNM4!g{5{t5Him?X zy0Y{NCLihKsGRqBZ}`-j$Y~<3jm#hJO-`M8YP*3`rNjXSHiHI6o&*MF6OQt?Z?+sY zO}}W*Z*rT_C1G!y%1iU#0uuxZIu0Dy?osd0Ex2>=`nOMeq8#skK9a+x81s(dG3OHf zuvUi(Pa z73#JzG6YR`$_hQf&~-ZF`_o77E@iWLTz6mbGC;n4A9H)IaSIQx#LmRc8;n*Nx>zgR z5;St?j(_y{-N&h=*GiZ=K7O0L?VO3)p)a|o9@SoaZ}YjD=>dQKdhZ!0f<+a8;mP3X L>gTe~DWM4fAOWXm diff --git a/src/icons/tabsGroups_96.png b/src/icons/tabsGroups_96.png deleted file mode 100644 index 7723eb38d002b142863c32ac16e17078f15276fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)2dPsL9V_2^8Th@Q5sC zV9-+rVaAH3_GLgp_7YEDSN2D&Je>SSp&!B&85kJ7JzX3_DsH{KvoV*+P^97EbB>Ek zPBZZw&(Zy=pJguw`DNLL$NSzZ^`*zxy94!X!)6E@Q^jr9np(Fjvttbz8Lq7SYBOz9MaW^6j02n< z9iIY=#4jioBxWt>2p7(8A5T-G@yGywo` CwUVd+ diff --git a/src/manifest.json b/src/manifest.json index d8398e9..fa96c47 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 2, "name": "Tab Search and Manage", - "version": "1.3.9", + "version": "1.3.10", "description": "This plugin can search, drag-n-drop ordering, and (un)hide all or some tabs.", "applications": { diff --git a/src/scripts/eventListeners.js b/src/scripts/eventListeners.js index 2bf6567..0ddb317 100644 --- a/src/scripts/eventListeners.js +++ b/src/scripts/eventListeners.js @@ -88,21 +88,26 @@ function setNewTabAction(target, targetID, parentElm, id) { } function popoutSelectedTabAction(target, targetID) { - parentElm = target.parentElement; - id = parseInt(target.getAttribute("tabID")); + let parentElm = target.parentElement; + let id = parseInt(target.getAttribute("tabID")); popoutSelectedTab(id); } function duplicateTabAction(target, targetID) { - parentElm = target.parentElement; - id = parseInt(target.getAttribute("tabID")); - duplicateTab(id); + let parentElm = target.parentElement; + let id = parseInt(target.getAttribute("tabID")); + let kids = parentElm.children; + let toIndex = 0; + + while (kids[toIndex] !== target) { toIndex++; } + + duplicateTab(id, (toIndex += 1)); } function hideSelectedTabAction(target, targetID) { - parentElm = target.parentElement; - id = parseInt(target.getAttribute("tabID")); - control = document.getElementById("tabControls").querySelector("#hideTgglBttn"); + let parentElm = target.parentElement; + let id = parseInt(target.getAttribute("tabID")); + let control = document.getElementById("tabControls").querySelector("#hideTgglBttn"); if (id != oldElm.getAttribute("tabID")) { if (control.src.includes("eyeClosed.png")) { diff --git a/src/scripts/generateView.js b/src/scripts/generateView.js index 1ded04b..72529f6 100644 --- a/src/scripts/generateView.js +++ b/src/scripts/generateView.js @@ -21,36 +21,24 @@ function popoutSelectedTab(id) { windowsAction.create({tabId: id}); } - -async function duplicateTab(id) { - tab = await tabsAction.duplicate(id); - createContainer(tab); +async function duplicateTab(id, pos) { + tab = await tabsAction.duplicate(id, {index: pos, active: true}); + createContainer(tab, pos); } -function unhideSelectedTab(id) { - tabsAction.show(id).then(successMsg, errMsg); +function unhideSelectedTab(id) { tabsAction.show(id).then(successMsg, errMsg); } +function hideSelectedTab(id) { tabsAction.hide(id).then(successMsg, errMsg); } +function muteSelectedTab(id) { tabsAction.update(id, {muted: true}) } +function unmuteSelectedTab(id) { tabsAction.update(id, {muted: false}) } + +function resetWinIndex() { windowIndex = 0; } +function createWin() { windowsAction.create({}); } +function onError(error) { console.log(`Error: ${error}`); } + +function createTab() { + tabsAction.create({}).then(function (tab) { createContainer(tab); }); } -function hideSelectedTab(id) { - tabsAction.hide(id).then(successMsg, errMsg); -} - -function muteSelectedTab(id) { - tabsAction.update( - id, - {muted: true} - ) -} - -function unmuteSelectedTab(id) { - tabsAction.update( - id, - {muted: false} - ) -} - - - function logTabs(tabs) { windowIndex = 0; @@ -60,13 +48,14 @@ function logTabs(tabs) { }, focusedWinID).then(() => { for (let tab of tabs) { currentWinId = tab.windowId; + if (currentWinId == newWinId) { createContainer(tab); } else { if (windowIndex != 0) { var pTag = document.createElement("P"); var msg = (focusedWinID == tab.windowId) - ? "[ Current Window ] " : "Window: " + tab.windowId; + ? "[ Current Window ] " : "Window: " + tab.windowId; var pText = document.createTextNode(msg); pTag.className = "windowIdHeaders"; pTag.appendChild(pText); @@ -86,7 +75,7 @@ function logTabs(tabs) { scrollToView(); } -function createContainer(tab) { +function createContainer(tab, pos = null) { var template = document.querySelector('#tabContainerTemplate'); var clone = document.importNode(template.content, true); var spanTag = clone.querySelector("#iconElm"); @@ -111,71 +100,59 @@ function createContainer(tab) { } spanTag.setAttribute("tabID", tab.id); - spanTag.title = tab.title; + spanTag.title = tab.title; - if (!tab.hidden) + if (!tab.hidden) { spanTag.className = "block"; - else + } else { spanTag.className = "block hiddenBGColor"; + } - - spanTag.style.backgroundImage = "url(" + tab.favIconUrl + ")"; - icoImgTag.src = tab.favIconUrl; - icoImgTag.onerror = function() { spanTag.style.backgroundImage = "url(" + tabImg + ")"; } - + spanTag.style.backgroundImage = "url(" + tab.favIconUrl + ")"; + icoImgTag.src = tab.favIconUrl; + icoImgTag.onerror = function() { spanTag.style.backgroundImage = "url(" + tabImg + ")"; } spanTag.addEventListener("mouseenter", function (eve) { moveTabControlTo(eve.target); }); pTag.appendChild(iconText); - listZone.appendChild(clone); -} - -function createTab() { - tabsAction.create({}) - .then(function (tab) { - createContainer(tab); - }); -} - -function createWin() { - windowsAction.create({}); + if (pos == null) { + listZone.appendChild(clone); + } else { + listZone.insertBefore(clone, listZone.children[pos]); + } } async function moveTabControlTo(elm) { - let tabControls = document.getElementById("tabControls"); - let tabControls2 = document.getElementById("tabControls2"); - let hideTgglBttn = tabControls.querySelector("#hideTgglBttn") - let muteTgglBttn = tabControls.querySelector("#muteTgglBttn") - - let rect = elm.getBoundingClientRect(); - - tabControls.style.left = (rect.left) + "px"; - tabControls.style.top = (rect.top) + "px"; - + let tabControls = document.getElementById("tabControls"); + let tabControls2 = document.getElementById("tabControls2"); + let hideTgglBttn = tabControls.querySelector("#hideTgglBttn") + let muteTgglBttn = tabControls.querySelector("#muteTgglBttn") + let rect = elm.getBoundingClientRect(); + tabControls.style.left = (rect.left) + "px"; + tabControls.style.top = (rect.top) + "px"; tabControls2.style.left = (rect.left - 46) + "px"; tabControls2.style.top = rect.top + "px"; - hoverTarget = elm; + hoverTarget = elm; - if (elm.className == "block hiddenBGColor") + if (elm.className == "block hiddenBGColor") { hideTgglBttn.src = "../icons/eyeClosed.png"; - else + } else { hideTgglBttn.src = "../icons/eyeOpen.png"; - + } id = parseInt(hoverTarget.getAttribute("tabID")); tab = await tabsAction.get(id); - if (tab.mutedInfo.muted == false) + if (tab.mutedInfo.muted == false) { muteTgglBttn.src = "../icons/isNotMuted.png"; - else + } else { muteTgglBttn.src = "../icons/isMuted.png"; + } tabControls.style.display = ""; tabControls2.style.display = ""; } -function onError(error) { console.log(`Error: ${error}`); } - function getTabs() { clearNodes(listZone); @@ -209,8 +186,8 @@ function getTabs() { } async function setSearchMode(target, text, img, state) { - target.title = "Searching " + text + "..."; - target.src = "../icons/" + img + ".png"; + target.title = "Searching " + text + "..."; + target.src = "../icons/" + img + ".png"; target.setAttribute("searchwindowsmode", state); await storageArea.set({"searchMode": state }); @@ -222,7 +199,3 @@ function clearNodes(targetNode) { targetNode.removeChild(targetNode.firstChild); } } - -function resetWinIndex() { - windowIndex = 0; -}