module.exports = (Plugin, Api, Vendor) => { if (typeof BDFDB !== "object") global.BDFDB = {$: Vendor.$, BDv2Api: Api}; const {$} = Vendor; return class extends Plugin { initConstructor () { this.css = ` body.titlebar-hidden-by-OTB .bd-settings-button, body.titlebar-hidden-by-OTB .bd-settings { top: 0 !important; } ${BDFDB.dotCN.titlebar}.hidden-by-OTB { display: none; } ${BDFDB.dotCN.channelheadertopic}, ${BDFDB.dotCN.contextmenu} * { -webkit-app-region: no-drag; } .settings-titlebar-OTB { position: relative; z-index: 1000; text-align: right; padding: 10px; -webkit-app-region: drag; }`; this.dividerMarkup = `
`; this.reloadButtonMarkup = ` `; this.minButtonMarkup = ` `; this.maxButtonIsMaxMarkup = ` `; this.maxButtonIsMinMarkup = ` `; this.closeButtonMarkup = ` `; this.defaults = { settings: { addToSettings: {value:true, description:"Add a Title Bar to Settings Windows."}, reloadButton: {value:false, description:"Add a Reload Button to the Title Bar."} } }; } onStart () { var libraryScript = null; if (typeof BDFDB !== "object" || typeof BDFDB.isLibraryOutdated !== "function" || BDFDB.isLibraryOutdated()) { libraryScript = document.querySelector('head script[src="https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js"]'); if (libraryScript) libraryScript.remove(); libraryScript = document.createElement("script"); libraryScript.setAttribute("type", "text/javascript"); libraryScript.setAttribute("src", "https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js"); document.head.appendChild(libraryScript); } this.startTimeout = setTimeout(() => {this.initialize();}, 30000); if (typeof BDFDB === "object" && typeof BDFDB.isLibraryOutdated === "function") this.initialize(); else libraryScript.addEventListener("load", () => {this.initialize();}); return true; } initialize () { if (typeof BDFDB === "object") { BDFDB.loadMessage(this); var observer = null; observer = new MutationObserver((changes, _) => { changes.forEach( (change, i) => { if (change.addedNodes) { change.addedNodes.forEach((node) => { setImmediate(() => { if (node && node.tagName && node.getAttribute("layer-id") || node.querySelector(".ui-standard-sidebar-view")) { $(BDFDB.dotCN.channelheaderdivider).parent().has(BDFDB.dotCN.channelheadericoninactive).parent().css("-webkit-app-region", "initial"); if (BDFDB.getData("addToSettings", this, "settings")) this.addSettingsTitleBar(node); } }); }); } if (change.removedNodes) { change.removedNodes.forEach((node) => { if (node && node.tagName && (node.getAttribute("layer-id") || node.querySelector(".ui-standard-sidebar-view"))) { this.removeTitleBar(); this.addTitleBar(); } }); } } ); }); BDFDB.addObserver(this, BDFDB.dotCN.layers, {name:"settingsWindowObserver",instance:observer}, {childList:true}); $(window).on("resize." + this.name, (e) => { this.changeMaximizeButton(); }); this.addTitleBar(); document.body.classList.add("titlebar-hidden-by-OTB"); $(BDFDB.dotCN.titlebar).addClass("hidden-by-OTB"); var settingswindow = document.querySelector(BDFDB.dotCN.layers + "[layer-id]"); if (settingswindow && BDFDB.getData("addToSettings", this, "settings")) { this.addSettingsTitleBar(settingswindow); } return true; } else { console.error(this.name + ": Fatal Error: Could not load BD functions!"); return false; } } onStop () { if (typeof BDFDB === "object") { this.removeTitleBar(); $(".titlebar-hidden-by-OTB, .hidden-by-OTB").removeClass("hidden-by-OTB"); BDFDB.unloadMessage(this); return true; } else { return false; } } onSwitch () { if (typeof BDFDB === "object") { setImmediate(() => {this.addTitleBar();}); } } // begin of own functions updateSettings (settingspanel) { var settings = {}; for (var input of settingspanel.querySelectorAll(BDFDB.dotCN.switchinner)) { settings[input.value] = input.checked; } BDFDB.saveAllData(settings, this, "settings"); } addTitleBar () { this.removeTitleBar(); var settings = BDFDB.getAllData(this, "settings"); let activityfeed = document.querySelector(BDFDB.dotCN.activityfeed), container; if (activityfeed) { container = $(`
`); container.insertBefore(activityfeed.firstElementChild); container = container.children().first(); } container = container ? container : $(BDFDB.dotCN.channelheaderdivider).parent().has(BDFDB.dotCN.channelheadericoninactive); if (settings.reloadButton) { container .append(this.dividerMarkup) .append(this.reloadButtonMarkup) .on("click." + this.name, ".reloadButtonOTB", () => { this.doReload(); }) .on("mouseenter." + this.name, ".reloadButtonOTB", (e) => { this.createReloadToolTip(e); }); } container .append(this.dividerMarkup) .append(this.minButtonMarkup) .append(require("electron").remote.getCurrentWindow().isMaximized() ? this.maxButtonIsMaxMarkup : this.maxButtonIsMinMarkup) .append(this.closeButtonMarkup) .on("click." + this.name, ".minButtonOTB", () => { this.doMinimize(); }) .on("click." + this.name, ".maxButtonOTB", () => { this.doMaximize(); }) .on("click." + this.name, ".closeButtonOTB", () => { this.doClose(); }) .parent().css("-webkit-app-region", "drag"); } addSettingsTitleBar (settingspane) { if (!settingspane.querySelector(".dividerOTB, .reloadButtonOTB, .minButtonOTB, .maxButtonOTB, .closeButtonOTB")) { var settingsbar = $(`
`); var settings = BDFDB.getAllData(this, "settings"); if (settings.reloadButton) { settingsbar .append(this.reloadButtonMarkup) .on("click." + this.name, ".reloadButtonOTB", () => { this.doReload(); }) .on("mouseenter." + this.name, ".reloadButtonOTB", (e) => { this.createReloadToolTip(e); }); } settingsbar .append(this.minButtonMarkup) .append(require("electron").remote.getCurrentWindow().isMaximized() ? this.maxButtonIsMaxMarkup : this.maxButtonIsMinMarkup) .append(this.closeButtonMarkup) .on("click." + this.name, ".minButtonOTB", () => { this.doMinimize(); }) .on("click." + this.name, ".maxButtonOTB", () => { this.doMaximize(); }) .on("click." + this.name, ".closeButtonOTB", () => { this.doClose(); }); $(settingspane).append(settingsbar); } } doReload () { require("electron").remote.getCurrentWindow().reload(); } doMinimize () { require("electron").remote.getCurrentWindow().minimize(); } doMaximize () { if (require("electron").remote.getCurrentWindow().isMaximized()) { var newWidth = this.oldWidth ? this.oldWidth : Math.round(screen.availWidth - Math.round(screen.availWidth/10)); var newHeight = this.oldHeight ? this.oldHeight : Math.round(screen.availHeight - Math.round(screen.availHeight/10)); var newLeft = this.oldLeft ? this.oldLeft : Math.round((screen.availWidth - newWidth)/2); var newTop = this.oldTop ? this.oldTop : Math.round((screen.availHeight - newHeight)/2); require("electron").remote.getCurrentWindow().setPosition(newLeft, newTop); require("electron").remote.getCurrentWindow().setSize(newWidth, newHeight); } else { this.oldLeft = window.screenX; this.oldTop = window.screenY; this.oldWidth = window.outerWidth; this.oldHeight = window.outerHeight; require("electron").remote.getCurrentWindow().maximize(); } } doClose () { require("electron").remote.getCurrentWindow().close(); } changeMaximizeButton () { var maxButtonHTML = require("electron").remote.getCurrentWindow().isMaximized() ? this.maxButtonIsMaxMarkup : this.maxButtonIsMinMarkup; document.querySelectorAll(".maxButtonOTB").forEach(maxButton => { maxButton.outerHTML = maxButtonHTML; }); } removeTitleBar () { $(".headerbarOTB").remove(); $(BDFDB.dotCN.channelheaderdivider).parent().has(BDFDB.dotCN.channelheadericoninactive) .off("click." + this.name) .off("mouseenter." + this.name) .find(".dividerOTB, .reloadButtonOTB, .minButtonOTB, .maxButtonOTB, .closeButtonOTB").remove(); $(BDFDB.dotCN.channelheaderdivider).parent().has(BDFDB.dotCN.channelheadericoninactive).parent().css("-webkit-app-region", "initial"); } createReloadToolTip (e) { BDFDB.createTooltip("Reload", e.currentTarget, {type:"bottom",selector:"reload-button-tooltip"}); } getSettingsPanel () { var settings = BDFDB.getAllData(this, "settings"); var settingshtml = `
`; for (let key in settings) { settingshtml += `

${this.defaults.settings[key].description}

`; } settingshtml += `
`; var settingspanel = $(settingshtml)[0]; $(settingspanel) .on("click", BDFDB.dotCN.switchinner, () => {this.updateSettings(settingspanel);}); return settingspanel; } } };