Greasy Fork 支持简体中文。

Makes Code Window be Floatable - PythonTutor

PythonTutor is sick, but its interface is sucks. What a shame!

// ==UserScript==
// @name         Makes Code Window be Floatable - PythonTutor
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  PythonTutor is sick, but its interface is sucks. What a shame!
// @author       You
// @match        https://pythontutor.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=pythontutor.com
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    var styleSheet =
    `
    #codAndNav{
        padding: 20px;
        padding-top: 0;
        right: 10px;
        background-color: white;
        z-index: 9999999;
        border: 1px grey solid;
    }

    #qtip-pyCodeOutputDiv, #footer, iframe{
        display: none;
    }

    #dragBar{
        background-color: #F5F5F5;
        text-align: center;
        padding: 10px 0;
        border-radius: 0 0 100px 100px;
        cursor: move;
    }

    `

    var sty = document.createElement("style")
    sty.innerHTML = styleSheet
    document.body.appendChild(sty)


    var intv = setInterval(()=>{
        var codePanel = document.getElementById("codAndNav")
        if(codePanel){
            clearInterval(intv)
            createDragBar(codePanel)
        }
    },1000)

    function createDragBar(panel){
        var drag = document.createElement("div")
        drag.innerHTML = "Draggable"
        drag.id = "dragBar"
        panel.prepend(drag)
        floatElement(panel, drag, true);
    }

    function floatElement(eleToBeFloat, dragArea, allowDragOutOfBorder){
        //PENDING(B2) 讀取LocalStorage,把top, left, width, height應用到邊框上
        allowDragOutOfBorder = allowDragOutOfBorder == void 0?false:allowDragOutOfBorder
        eleToBeFloat.style.position = "absolute"

        dragArea.onmousedown = function(e){
            e = e || window.event
            var MouseX = e.clientX, MouseY = e.clientY //瀏覽器左上到鼠標位置的坐標
            //鼠標相對於eleToBeFloat的偏移量
            var relativeMouseX = MouseX - eleToBeFloat.offsetLeft
            var relativeMouseY = MouseY - eleToBeFloat.offsetTop

            const mouseMoveFunc = function(){
                var e = e || window.event
                //窗口相對於瀏覽器左上的偏移量
                var offsetX = (e.clientX - relativeMouseX)
                var offsetY = (e.clientY - relativeMouseY)

                if(e.clientX < 0 || e.clientY < 0) return false
                if(!allowDragOutOfBorder&&isEdgeReached(offsetX, offsetY)) return false
                eleToBeFloat.style.left = offsetX + "px"
                eleToBeFloat.style.top = offsetY + "px"
            }
            const mouseUpFunc = function(){
                document.removeEventListener('mousemove', mouseMoveFunc)
                document.removeEventListener('mouseup', mouseUpFunc)
                // PENDING(B2) 用LocalStorage把top, left, width, height存起來,準備下次調用
            }

            document.addEventListener('mousemove', mouseMoveFunc)
            document.addEventListener('mouseup', mouseUpFunc)

            function isEdgeReached(offsetX, offsetY){
                var floatingWindowLeft = offsetX
                var floatingWindowTop = offsetY
                var floatingWindowRight = offsetX + eleToBeFloat.clientWidth
                var floatingWindowBottom = offsetY + eleToBeFloat.clientHeight

                if(floatingWindowTop <= 0 || floatingWindowLeft <= 0) return true
                else if(floatingWindowRight >= document.body.scrollWidth || floatingWindowBottom >= document.body.scrollHeight) return true
                else return false
                //PENDING(A1) 判斷是哪一條邊超過了邊界 找到它 然後把相應的Left/top設置成貼近那條邊的地方
            }

            return false
        }
    }

    // Your code here...
})();