Beiträge von BrokenHeart
-
-
-
Sieht jetzt deutlich anders aus


Wenn man jetzt noch das + für einen neuen Tab noch ein wenig anpassen könnte größenmäßig, wäre ich endgültig zufrieden

Folgenden Code noch an die CSS-Anpassungen anhängen. Sollte die Default-Größe sein. Kannst du dir dann individuell einstellen.
-
Ich bin mir allerdings nicht sicher, ob das so passt, denn irgendwie merke ich keinen Unterschied ob das .css File vorhanden ist oder nicht.
Es scheint nicht so, dass bei dir die Einträge in der 'userChrome.css' ausgewertet werden, da die Tabs noch einen zusätzlichen Rahmen und Schatten besitzen.
Steht bei dir unter 'about:config' toolkit.legacyUserProfileCustomizations.stylesheets auf true?
Befindet sich die Datei im richtigen Profilordner? Falsche Schreibweise bzw. falsches Suffix (
.txt)->(.css)? -
-
Ich weiß genau, was du meinst. Aber der Grund, warum es hier anders gelöst wurde, ist folgender: Bei der einzeiligen (eindimensionalen) Anzeige der Tableiste müssen nur die sichtbaren Tabs auf einer Linie verschoben werden. Je nachdem, von wo ich den Tab nehme, entweder nach rechts oder nach links, um diese Lücke zu erzeugen. Bei der mehrzeiligen (2-dimensionalen) Anzeige muss ich auch die sichtbaren Tabs berücksichtigen, die oberhalb und unterhalb des 'Drop-Ziels' liegen. Auch mit dem ständigen Refresh und dem Scrollen könnte es dann Probleme geben. So hab ich nur einen Indikator und einen Thumb mit dem Screenshot für den selektierten Tab und muss mich darum nicht kümmern.
Das heißt natürlich absolut nicht, dass es nicht so funktionieren kann, wie es dir vorschwebt, aber ich werde mir sicherlich nicht die Mühe machen, so etwas in das Skript einzubauen oder Hilfestellungen dazu geben. Einmal, weil ich den Code für das Drag&Drop von 'alice0775' übernommen habe und bis auf ein paar Anpassungen, bisher noch nichts daran geändert habe, weil er ja auch bis jetzt wunderbar funktioniert hat. Außerdem hatte ich ja schon öfters gesagt, dass ich an diesem Skript nur noch Fehlerbehebung betreiben möchte und keine neuen Features mehr einbaue. Und dein Anliegen hat ja offensichtlich - wenn überhaupt - nur einen rein optischen Nutzen. Ich frage mich sowieso, was dich an der jetzigen Lösung stört...?

Ansonsten musst du ab Zeile ~1157 selber tätig werden. Aber du solltest dich dafür nicht nur gut mit JavaScript auskennen, sondern dich auch mit den Interna des Firefox beschäftigt haben...
-
Und das sagst Du jetzt nicht, wie Du das da hin gezaubert hast.
Doch, natürlich, aber da ist nix mit Zauberei oder Voodoo. Das ist so trivial, dass ihr euch mit der flachen Hand gegen die Stirn schlagen werdet!
Hier die "Wunder"-Zeile
:let strCountOut = "📁" + String(menuCount).padEnd(2, '\xa0') + "⭐" + String(menuitemCount).padEnd(3, '\xa0');
Die Emojis/Icons können z.B. direkt in den Editor (NP++) über [Windows-Taste]+[.] in den Code kopiert werden.
Damit alle Abstände gleich bleiben, muss im CSS Teil natürlich ein 'monospace'-Font verwendet werden z.B. 'Consolas' etc.:
CSS.countClass::after { content: attr(data-value); font-family: Consolas, "Lucida Console", "Courier New", monospace; font-size: 11px; font-weight: 900; color: rgb(100,200,255); }Das ist alles...

-
Sollte sich das auf mich beziehen,
Nein! Damit meinte ich den Header den Dharkness gepostet hat. Deswegen hatte ich ihn auch vorher zitiert....
Bei deinem Skript ist alles in Ordnung...

-
Habe ich jetzt hoch geladen:
Danke...
.Den Namen finde ich gut, da er mit 'Bookmark' beginnt und das wäre bei einer Sortierung und beim Suchen eben das primäre Kriterium.
Btw: Bei mir ist der Name für das Skript immer noch 'neu 1.js'. Das ist das, was der NP++ bei einer neuen Datei vorgibt: 'neu 1.txt' . Einfach '.txt' durch '.js' ersetzt und gut ist's. Erst wenn ich weiß, ob ich das weiter nutzen möchte, bekommt es einen vernünftigen Namen.
Bei sieht es jetzt so ↓ aus.
Nur zur Info: der Link stimmt nicht ganz. Ich würde schon auf die letzte, fehlerbereinigte Version verlinken, nämlich auf den Code in #170:
BeitragRE: Nur die Anzeige der Ordner/Lesezeichenanzahl in einer anderen Farbe darstellen
[…]
Ich glaube eine Lösung für das Scrollproblem bei überlangen Menüs gefunden zu haben
... bitte mal testen:
(Quelltext, 72 Zeilen)
BrokenHeart9. Juli 2023 um 21:38 Hier noch meine Version
: -
Im Lesezeichen-Menü bzw. in der Lesezeichensymbolleiste werden über lange Untermenüs leider automatisch ans Ende des Untermenüs gescrollt.
Ich glaube eine Lösung für das Scrollproblem bei überlangen Menüs gefunden zu haben
... bitte mal testen:JavaScript
Alles anzeigen(function() { if (!window.gBrowser) return; setTimeout(function() { setFunction(); },50); function setFunction() { const css =` .countClass::after { content: attr(data-value); color: red; } `; const sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService); const uri = Services.io.newURI('data:text/css,' + encodeURIComponent(css)); sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET); let bmbMenu = document.getElementById('bookmarks-menu-button'); let bookMenu = document.getElementById('bookmarksMenu'); let persToolBar = document.getElementById('PersonalToolbar'); if(bmbMenu) bmbMenu.addEventListener('popupshowing', onPopupShowing ); if(bookMenu) bookMenu.addEventListener('popupshowing', onPopupShowing ); if(persToolBar) persToolBar.addEventListener('popupshowing', onPopupShowing ); } function onPopupShowing(aEvent) { let popup = aEvent.originalTarget; for (let item of popup.children) { if (item.localName != 'menu' || item.id?.startsWith('history')) continue; setTimeout(() => { let itemPopup = item.menupopup; itemPopup.hidden = true; itemPopup.collapsed = true; itemPopup.openPopup(); itemPopup.hidePopup(); let menuitemCount = 0; let menuCount = 0; for (let subitem of itemPopup.children) { if (subitem.classList.contains('bookmark-item') && !subitem.disabled && !subitem.hidden) { if (subitem.localName == 'menuitem') { menuitemCount++; } else if (subitem.localName == 'menu') { menuCount++; } } } itemPopup.hidden = false; itemPopup.collapsed = false; let label = item.childNodes[3]; //label.menu-iconic-text label.classList.add('countClass'); let strCountOut = " (" + menuCount + "/" + menuitemCount + ")" label.setAttribute('data-value', strCountOut); }, 100); } } })(); -
..als Verursacher konnte ich dieses zusätzliche Script verantwortlich machen:
Das war ja das alte Skript, was dann noch parallel dazu lief. Da verwundert es nicht, dass dann die Zahlenangaben auch doppelt im Popup stehen...

Darf ich diese Version bei Github hoch laden?
Hallo Endor,
natürlich, sehr gerne...

Im Lesezeichen-Menü bzw. in der Lesezeichensymbolleiste werden über lange Untermenüs leider automatisch ans Ende des Untermenüs gescrollt.
Da muss ich jetzt auch leider sagen, dass das wirklich ein 'Showstopper' ist
. Ich habe auch ein paar sehr große Verzeichnisse und dieses Verhalten würde mich auf die Dauer schon nerven. Der Grund ist, dass alle Child-Popups (also die Unterverzeichnisse)kurz geöffnet werden um die jeweiligen Eigenschaften (Menu/Menuitem) auszulesen und anzuzeigen.
Eine Lösung dafür habe ich momentan auch nicht. Aber die gesamte Lesezeichen-Struktur, mit allen Informationen, ist ja bekannt und entweder schon direkt im Speicher oder über ein SQL-Select über die 'places.sql' zu erreichen. Vielleicht gibt es da noch eine bessere Lösung, als alle Popups einmal zu öffnen und damit das Scrollproblem zu verursachen?

-
Ich habe noch den 'unload' Event aus dem Code entfernt, da er eh nicht aufgerufen wird:
JavaScript
Alles anzeigen//Author @aborix (function() { if (window.__SSi != 'window0') return; Downloads.getList(Downloads.ALL) .then(list => list.addView( { onDownloadAdded: () => Services.wm.getMostRecentBrowserWindow().document.getElementById('downloads-button').click() } )); })(); //Author @BrokenHeart (function() { const closePanelAfter = 5000; //Zeit in ms bis Downloadpanel sich wieder schließt if (!window.gBrowser){ return; } var DownloadStopped = { _summary: null, init: function() { if (!this._summary) { Downloads.getSummary(Downloads.ALL).then(summary => { this._summary = summary; return this._summary.addView(this); }).then(null, console.error); } }, onSummaryChanged: function () { ChromeUtils.import("resource://gre/modules/Services.jsm"); if (!this._summary) return; if (this._summary.allHaveStopped) { let downloadspanel = document.getElementById('downloadsPanel'); setTimeout(function() { downloadspanel.hidePopup(); }, closePanelAfter ); } }, } DownloadStopped.init(); })(); -
Alle Achtung, das funktioniert einwandfrei

Ja, sieht erst mal so ganz "funktionstüchtig" aus...

Ich habe beide Skripte in eine Datei dazu gepackt:

Wieviele kann ich davon spenden.
"Spendier" dir doch einfach selbst so ein kühles 🍺 oder 🍻 - Prost!

-
Evtl. fällt ja BrokenHeart etwas dazu ein, wenn er sich vom gestriegen Stress mit dem anderen Skript, etwas erholt hat

Auch ich hoffe, dass er sich erholt davon, aber er hat nicht aufgegeben. Prima!

Ja, danke der Nachfrage! Eine Hopfenkaltschale hat dann noch für einen erholsamen Schlaf gesorgt...

Aber bei einem Download muss der ja erst beendet sein, und sich dann das Popup schließen.
Richtig und vor allem muss auch solange gewartet werden, bis ALLE Downloads abgeschlossen/beendet sind.
Die ganze Materie ist wirklich kompliziert (für mich!), da man es hier mit "verketteten Versprechungen bei asynchronen Callbacks" zu tun hat
. Da das wirklich harter Stoff ist (für mich!), habe ich mir die Teile, welche ich für notwendig erachtet habe, aus anderen Quellen "zusammengesucht". Aber es funktioniert (hoffe ich!)...Das Skript wird zusätzlich ausgeführt, ersetzt also nicht das DownloadFenster-Skript.
Bitte wirklich gut testen, bevor man es dauerhaft einsetzt...
JavaScript: CloseDownloadPanel.uc.js
Alles anzeigen(function() { const closePanelAfter = 5000; //Zeit in ms bis Downloadpanel sich wieder schließt if (!window.gBrowser){ return; } var DownloadStopped = { _summary: null, init: function() { if (!this._summary) { Downloads.getSummary(Downloads.ALL).then(summary => { this._summary = summary; return this._summary.addView(this); }).then(null, console.error); } window.addEventListener("unload", this, false); }, uninit: function() { window.removeEventListener("unload", this, false); if (this._summary) { this._summary.removeView(this); } }, handleEvent: function(event) { switch (event.type) { case "unload": this.uninit(); break; } }, onSummaryChanged: function () { ChromeUtils.import("resource://gre/modules/Services.jsm"); if (!this._summary) return; if (this._summary.allHaveStopped) { let downloadspanel = document.getElementById('downloadsPanel'); setTimeout(function() { downloadspanel.hidePopup(); }, closePanelAfter ); } }, } DownloadStopped.init(); })(); -
ist es eigentlich möglich, wenn man zwar 3 Tabreihen habe, dann aber nur immer zwei Reihen zu scrollen?
Nein, das ist so nicht möglich. Was du aber über die UserSettings einstellen kannst ist, von seitenweises auf zeilenweises Scrollen umzustellen: var bPageScroll = false;.
Neue Features werde ich in diese Version nicht mehr einbauen...
-
Dieser Script im Beitrag: #116 funkt mit diesem Button nur, wenn ich den Button im Menu-Leiste ganz oben oder auf dem Lesezeichen-Symbolleiste habe. Sonst funkts nirgends.
Keine Ahnung wie du das genau meinst. Aber das Skript mit dem Lesezeichen-Button funktioniert sogar in der Statusleiste vom Firefox...

-
Vielen Dank für den ganzen Aufwand, and sorry dass ich die Konfusion angeregt habe...

Nein, warum denn? Ganz im Gegenteil: Es wäre ohne diesen Button, der ja Standard ist, einfach nicht komplett gewesen. Daher von mir nochmal "Danke".
Und an die Überprüfung auf NULL sollte man sich ja grundsätzlich und immer gewöhnen... 
-
Ich glaube doch ein Fehler meinerseits. Wenn der Lesezeichen-Button überhaupt nicht vorhanden ist bzw. eingefügt wurde, dann ist das entsprechende Objekt natürlich auch NULL und es wird eine Exception geschmissen.
Hier der geänderte Code:
JavaScript
Alles anzeigen(function() { if (!window.gBrowser) return; setTimeout(function() { setFunction(); },50); function setFunction() { const css =` .countClass::after { content: attr(data-value); color: red; } `; const sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService); const uri = Services.io.newURI('data:text/css,' + encodeURIComponent(css)); sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET); let bmbMenu = document.getElementById('bookmarks-menu-button'); let bookMenu = document.getElementById('bookmarksMenu'); let persToolBar = document.getElementById('PersonalToolbar'); if(bmbMenu) bmbMenu.addEventListener('popupshowing', onPopupShowing ); if(bookMenu) bookMenu.addEventListener('popupshowing', onPopupShowing ); if(persToolBar) persToolBar.addEventListener('popupshowing', onPopupShowing ); } function onPopupShowing(aEvent) { let popup = aEvent.originalTarget; for (let item of popup.children) { if (item.localName != 'menu' || item.id?.startsWith('history')) continue; setTimeout(() => { let itemPopup = item.menupopup; itemPopup.openPopup(); itemPopup.hidePopup(); let menuitemCount = 0; let menuCount = 0; for (let subitem of itemPopup.children) { if (subitem.classList.contains('bookmark-item') && !subitem.disabled && !subitem.hidden) { if (subitem.localName == 'menuitem') { menuitemCount++; } else if (subitem.localName == 'menu') { menuCount++; } } } let label = item.childNodes[3]; //label.menu-iconic-text label.classList.add('countClass'); let strCountOut = " (" + menuCount + "/" + menuitemCount + ")" label.setAttribute('data-value', strCountOut); }, 100); } } })(); -
-
Nochmal als Test direkt von der bei mir funktionierenden Version aus NP++ kopiert:
JavaScript
Alles anzeigen(function() { if (!window.gBrowser) return; setTimeout(function() { setFunction(); },50); function setFunction() { const css =` .countClass::after { content: attr(data-value); color: red; } `; const sss = Cc['@mozilla.org/content/style-sheet-service;1'].getService(Ci.nsIStyleSheetService); const uri = Services.io.newURI('data:text/css,' + encodeURIComponent(css)); sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET); let bmbMenu = document.getElementById('bookmarks-menu-button'); let bookMenu = document.getElementById('bookmarksMenu'); let persToolBar = document.getElementById('PersonalToolbar'); bmbMenu.addEventListener('popupshowing', onPopupShowing ); bookMenu.addEventListener('popupshowing', onPopupShowing ); persToolBar.addEventListener('popupshowing', onPopupShowing ); } function onPopupShowing(aEvent) { let popup = aEvent.originalTarget; for (let item of popup.children) { if (item.localName != 'menu' || item.id?.startsWith('history')) continue; setTimeout(() => { let itemPopup = item.menupopup; itemPopup.openPopup(); itemPopup.hidePopup(); let menuitemCount = 0; let menuCount = 0; for (let subitem of itemPopup.children) { if (subitem.classList.contains('bookmark-item') && !subitem.disabled && !subitem.hidden) { if (subitem.localName == 'menuitem') { menuitemCount++; } else if (subitem.localName == 'menu') { menuCount++; } } } let label = item.childNodes[3]; //label.menu-iconic-text label.classList.add('countClass'); let strCountOut = " (" + menuCount + "/" + menuitemCount + ")" label.setAttribute('data-value', strCountOut); }, 100); } } })();