2019-01-31 17:06:48 +01:00
//META{"name":"MoveablePopups","website":"https://github.com/mwittrien/BetterDiscordAddons/tree/master/Plugins/MoveablePopups","source":"https://raw.githubusercontent.com/mwittrien/BetterDiscordAddons/master/Plugins/MoveablePopups/MoveablePopups.plugin.js"}*//
2018-10-11 10:21:26 +02:00
class MoveablePopups {
getName ( ) { return "MoveablePopups" ; }
2019-05-01 21:02:25 +02:00
getVersion ( ) { return "1.1.3" ; }
2018-10-11 10:21:26 +02:00
getAuthor ( ) { return "DevilBro" ; }
2019-01-16 14:57:02 +01:00
getDescription ( ) { return "Adds the feature to move all popups and modals around like on a normal desktop. Ctrl + drag with your left mousebutton to drag element." ; }
2019-09-04 12:34:02 +02:00
constructor ( ) {
2019-05-01 21:02:25 +02:00
this . changelog = {
"fixed" : [ [ "Moved Modal Container" , "Fixed selector for new modal container" ] ]
} ;
}
2018-10-11 10:21:26 +02:00
//legacy
load ( ) { }
start ( ) {
2019-02-04 09:13:15 +01:00
if ( ! global . BDFDB ) global . BDFDB = { myPlugins : { } } ;
if ( global . BDFDB && global . BDFDB . myPlugins && typeof global . BDFDB . myPlugins == "object" ) global . BDFDB . myPlugins [ this . getName ( ) ] = this ;
2019-05-26 13:55:26 +02:00
var libraryScript = document . querySelector ( 'head script#BDFDBLibraryScript' ) ;
if ( ! libraryScript || ( performance . now ( ) - libraryScript . getAttribute ( "date" ) ) > 600000 ) {
2018-10-11 10:21:26 +02:00
if ( libraryScript ) libraryScript . remove ( ) ;
libraryScript = document . createElement ( "script" ) ;
2019-05-26 13:55:26 +02:00
libraryScript . setAttribute ( "id" , "BDFDBLibraryScript" ) ;
2018-10-11 10:21:26 +02:00
libraryScript . setAttribute ( "type" , "text/javascript" ) ;
libraryScript . setAttribute ( "src" , "https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js" ) ;
2019-01-17 23:48:29 +01:00
libraryScript . setAttribute ( "date" , performance . now ( ) ) ;
2019-05-26 13:55:26 +02:00
libraryScript . addEventListener ( "load" , ( ) => { this . initialize ( ) ; } ) ;
2018-10-11 10:21:26 +02:00
document . head . appendChild ( libraryScript ) ;
2019-05-26 13:55:26 +02:00
this . libLoadTimeout = setTimeout ( ( ) => {
libraryScript . remove ( ) ;
require ( "request" ) ( "https://mwittrien.github.io/BetterDiscordAddons/Plugins/BDFDB.js" , ( error , response , body ) => {
if ( body ) {
libraryScript = document . createElement ( "script" ) ;
libraryScript . setAttribute ( "id" , "BDFDBLibraryScript" ) ;
libraryScript . setAttribute ( "type" , "text/javascript" ) ;
libraryScript . setAttribute ( "date" , performance . now ( ) ) ;
libraryScript . innerText = body ;
document . head . appendChild ( libraryScript ) ;
}
this . initialize ( ) ;
} ) ;
} , 15000 ) ;
}
else if ( global . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) this . initialize ( ) ;
2018-10-11 10:21:26 +02:00
this . startTimeout = setTimeout ( ( ) => { this . initialize ( ) ; } , 30000 ) ;
}
initialize ( ) {
2019-01-17 23:48:29 +01:00
if ( global . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) {
2019-01-22 11:05:54 +01:00
if ( this . started ) return ;
2018-10-11 10:21:26 +02:00
BDFDB . loadMessage ( this ) ;
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
var observer = null ;
observer = new MutationObserver ( ( changes , _ ) => {
changes . forEach (
( change , i ) => {
if ( change . addedNodes ) {
change . addedNodes . forEach ( ( node ) => {
2019-01-16 14:57:02 +01:00
if ( node && BDFDB . containsClass ( node , BDFDB . disCN . popout ) ) {
2018-10-11 10:21:26 +02:00
this . makeMoveable ( node ) ;
}
} ) ;
}
}
) ;
} ) ;
BDFDB . addObserver ( this , BDFDB . dotCN . popouts , { name : "popoutObserver" , instance : observer } , { childList : true } ) ;
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
observer = new MutationObserver ( ( changes , _ ) => {
changes . forEach (
( change , i ) => {
if ( change . addedNodes ) {
change . addedNodes . forEach ( ( node ) => {
2019-01-16 14:57:02 +01:00
if ( node && BDFDB . containsClass ( node , BDFDB . disCN . modal ) && ! node . querySelector ( BDFDB . dotCN . downloadlink ) ) {
2018-10-11 10:21:26 +02:00
this . makeMoveable ( node . querySelector ( BDFDB . dotCN . modalinner ) ) ;
}
2019-01-16 14:57:02 +01:00
else if ( node . tagName && node . querySelector ( BDFDB . dotCN . modal ) && ! node . querySelector ( BDFDB . dotCN . downloadlink ) ) {
2018-10-11 10:21:26 +02:00
this . makeMoveable ( node . querySelector ( BDFDB . dotCN . modalinner ) ) ;
}
} ) ;
}
}
) ;
} ) ;
2019-05-01 22:29:56 +02:00
BDFDB . addObserver ( this , BDFDB . React . findDOMNodeSafe ( BDFDB . getOwnerInstance ( { node : document . querySelector ( BDFDB . dotCN . app ) , name : "Modals" } ) ) , { name : "modalObserver" , instance : observer } , { childList : true } ) ;
2018-10-11 10:21:26 +02:00
}
else {
2019-02-12 21:56:34 +01:00
console . error ( ` %c[ ${ this . getName ( ) } ]%c ` , 'color: #3a71c1; font-weight: 700;' , '' , 'Fatal Error: Could not load BD functions!' ) ;
2018-10-11 10:21:26 +02:00
}
}
stop ( ) {
2019-01-17 23:48:29 +01:00
if ( global . BDFDB && typeof BDFDB === "object" && BDFDB . loaded ) {
2018-10-11 10:21:26 +02:00
BDFDB . unloadMessage ( this ) ;
}
}
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
// begin of own functions
2019-01-26 22:45:19 +01:00
2018-10-11 10:21:26 +02:00
makeMoveable ( div ) {
2019-01-16 14:57:02 +01:00
div . removeEventListener ( "click" , div . clickMovablePopups ) ;
div . removeEventListener ( "mousedown" , div . mousedownMovablePopups ) ;
2019-05-01 21:02:25 +02:00
div . clickMovablePopups = e => { if ( this . dragging ) BDFDB . stopEvent ( e ) ; } ;
2019-01-16 14:57:02 +01:00
div . mousedownMovablePopups = e => {
if ( ! e . ctrlKey ) return ;
div . style . setProperty ( "position" , "fixed" , "important" ) ;
this . dragging = true ;
2019-01-17 23:48:29 +01:00
var rects = BDFDB . getRects ( div ) ;
2019-01-16 14:57:02 +01:00
var transform = getComputedStyle ( div , null ) . getPropertyValue ( "transform" ) . replace ( /[^0-9,-]/g , "" ) . split ( "," ) ;
var left = rects . left - ( transform . length > 4 ? parseFloat ( transform [ 4 ] ) : 0 ) ;
var top = rects . top - ( transform . length > 4 ? parseFloat ( transform [ 5 ] ) : 0 ) ;
var oldX = e . pageX ;
var oldY = e . pageY ;
var mouseup = e2 => {
BDFDB . removeLocalStyle ( "disableTextSelection" ) ;
document . removeEventListener ( "mouseup" , mouseup ) ;
document . removeEventListener ( "mousemove" , mousemove ) ;
setTimeout ( ( ) => { this . dragging = false } , 1 ) ;
} ;
var mousemove = e2 => {
left = left - ( oldX - e2 . pageX ) ;
top = top - ( oldY - e2 . pageY ) ;
oldX = e2 . pageX ;
oldY = e2 . pageY ;
div . style . setProperty ( "left" , left + "px" , "important" ) ;
div . style . setProperty ( "top" , top + "px" , "important" ) ;
2019-01-26 22:45:19 +01:00
2019-01-16 14:57:02 +01:00
} ;
document . addEventListener ( "mouseup" , mouseup ) ;
document . addEventListener ( "mousemove" , mousemove ) ;
} ;
div . addEventListener ( "click" , div . clickMovablePopups ) ;
div . addEventListener ( "mousedown" , div . mousedownMovablePopups ) ;
2018-10-11 10:21:26 +02:00
}
}