New Design
This commit is contained in:
		
							
								
								
									
										637
									
								
								html/index.html
									
									
									
									
									
								
							
							
						
						
									
										637
									
								
								html/index.html
									
									
									
									
									
								
							@@ -4,263 +4,442 @@
 | 
				
			|||||||
    <meta charset="utf-8">
 | 
					    <meta charset="utf-8">
 | 
				
			||||||
    <title>Pixelserver Interface</title>
 | 
					    <title>Pixelserver Interface</title>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=1, viewport-fit=auto"/>
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no, viewport-fit=cover"/>
 | 
				
			||||||
    <link rel="apple-touch-icon" sizes="180x180" href="/icons/apple-touch-icon.png">
 | 
					    <link rel="apple-touch-icon" sizes="180x180" href="/icons/apple-touch-icon.png">
 | 
				
			||||||
    <link rel="icon" type="image/png" sizes="32x32" href="/icons/favicon-32x32.png">
 | 
					    <link rel="icon" type="image/png" sizes="32x32" href="/icons/favicon-32x32.png">
 | 
				
			||||||
    <link rel="icon" type="image/png" sizes="16x16" href="/icons/favicon-16x16.png">
 | 
					    <link rel="icon" type="image/png" sizes="16x16" href="/icons/favicon-16x16.png">
 | 
				
			||||||
    <link rel="manifest" href="/site.webmanifest">
 | 
					    <link rel="manifest" href="/site.webmanifest">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <style>
 | 
					    <style>
 | 
				
			||||||
 | 
					        /* --- Base Styles & CSS Variables --- */
 | 
				
			||||||
 | 
					        :root {
 | 
				
			||||||
 | 
					            --bg-color: #f7fafc;
 | 
				
			||||||
 | 
					            --card-bg-color: #ffffff;
 | 
				
			||||||
 | 
					            --text-color: #2d3748;
 | 
				
			||||||
 | 
					            --header-color: #1a202c;
 | 
				
			||||||
 | 
					            --muted-text-color: #718096;
 | 
				
			||||||
 | 
					            --border-color: #e2e8f0;
 | 
				
			||||||
 | 
					            --input-bg-color: #f7fafc;
 | 
				
			||||||
 | 
					            --button-primary-bg: #3b82f6;
 | 
				
			||||||
 | 
					            --button-primary-hover-bg: #2563eb;
 | 
				
			||||||
 | 
					            --button-secondary-bg: #6b7280;
 | 
				
			||||||
 | 
					            --button-secondary-hover-bg: #4b5563;
 | 
				
			||||||
 | 
					            --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @media (prefers-color-scheme: dark) {
 | 
				
			||||||
 | 
					            :root {
 | 
				
			||||||
 | 
					                --bg-color: #111827;
 | 
				
			||||||
 | 
					                --card-bg-color: #1f2937;
 | 
				
			||||||
 | 
					                --text-color: #d1d5db;
 | 
				
			||||||
 | 
					                --header-color: #ffffff;
 | 
				
			||||||
 | 
					                --muted-text-color: #9ca3af;
 | 
				
			||||||
 | 
					                --border-color: #374151;
 | 
				
			||||||
 | 
					                --input-bg-color: #374151;
 | 
				
			||||||
 | 
					                --button-secondary-bg: #4b5563;
 | 
				
			||||||
 | 
					                --button-secondary-hover-bg: #374151;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        body {
 | 
				
			||||||
 | 
					            margin: 0;
 | 
				
			||||||
 | 
					            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
 | 
				
			||||||
 | 
					            background-color: var(--bg-color);
 | 
				
			||||||
 | 
					            color: var(--text-color);
 | 
				
			||||||
 | 
					            padding: 1rem;
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* --- Layout --- */
 | 
				
			||||||
 | 
					        .main-container {
 | 
				
			||||||
 | 
					            max-width: 1400px;
 | 
				
			||||||
 | 
					            margin: 0 auto;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        .main {
 | 
					        .main {
 | 
				
			||||||
            display: grid;
 | 
					            display: flex;
 | 
				
			||||||
            grid-gap: 1rem;
 | 
					            flex-wrap: wrap;
 | 
				
			||||||
            align-items: stretch;
 | 
					            gap: 1.5rem;
 | 
				
			||||||
 | 
					            justify-content: center;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @media only screen {
 | 
					 | 
				
			||||||
            .main {
 | 
					 | 
				
			||||||
                grid-template-columns: repeat(1, 1fr);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        @media only screen and (min-width: 800px) {
 | 
					 | 
				
			||||||
            .main {
 | 
					 | 
				
			||||||
                grid-template-columns: repeat(2, 1fr);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        @media only screen and (min-width: 1111px) {
 | 
					 | 
				
			||||||
            .main {
 | 
					 | 
				
			||||||
                grid-template-columns: repeat(3, 1fr);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        .col {
 | 
					        .col {
 | 
				
			||||||
 | 
					            background-color: var(--card-bg-color);
 | 
				
			||||||
 | 
					            border-radius: 0.75rem;
 | 
				
			||||||
 | 
					            padding: 1.5rem;
 | 
				
			||||||
 | 
					            box-shadow: var(--shadow-md);
 | 
				
			||||||
 | 
					            border: 1px solid var(--border-color);
 | 
				
			||||||
 | 
					            flex: 1 1 320px; /* Flex-grow, flex-shrink, basis */
 | 
				
			||||||
            min-width: 300px;
 | 
					            min-width: 300px;
 | 
				
			||||||
            /*max-width: 350px;*/
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        .just, .just-col {
 | 
					 | 
				
			||||||
            display: flex;
 | 
					            display: flex;
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        .just > * {
 | 
					 | 
				
			||||||
            flex: 1;
 | 
					 | 
				
			||||||
            margin: 0 1rem;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        .just-col {
 | 
					 | 
				
			||||||
            flex-direction: column;
 | 
					            flex-direction: column;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        .just-col > * {
 | 
					        /* --- Typography --- */
 | 
				
			||||||
            flex: 1;
 | 
					        h1 {
 | 
				
			||||||
            margin: 2px 1rem;
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					            color: var(--header-color);
 | 
				
			||||||
 | 
					            margin-bottom: 2rem;
 | 
				
			||||||
 | 
					            font-size: 2.25rem;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        h1 i {
 | 
				
			||||||
 | 
					            font-style: normal;
 | 
				
			||||||
 | 
					            color: var(--button-primary-bg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        h2 {
 | 
				
			||||||
 | 
					            font-size: 1.25rem;
 | 
				
			||||||
 | 
					            color: var(--header-color);
 | 
				
			||||||
 | 
					            border-bottom: 1px solid var(--border-color);
 | 
				
			||||||
 | 
					            padding-bottom: 0.5rem;
 | 
				
			||||||
 | 
					            margin-top: 0;
 | 
				
			||||||
 | 
					            margin-bottom: 1rem;
 | 
				
			||||||
 | 
					            display: flex;
 | 
				
			||||||
 | 
					            justify-content: space-between;
 | 
				
			||||||
 | 
					            align-items: center;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        h3 {
 | 
				
			||||||
 | 
					            color: var(--header-color);
 | 
				
			||||||
 | 
					            margin-top: 0.5rem;
 | 
				
			||||||
 | 
					            margin-bottom: 0;
 | 
				
			||||||
 | 
					            font-size: 1rem;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        label {
 | 
				
			||||||
 | 
					            display: block;
 | 
				
			||||||
 | 
					            /*margin-top: 0.5rem;*/
 | 
				
			||||||
 | 
					            font-weight: 500;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* --- Forms & Inputs --- */
 | 
				
			||||||
 | 
					        form {
 | 
				
			||||||
 | 
					            display: flex;
 | 
				
			||||||
 | 
					            flex-direction: column;
 | 
				
			||||||
 | 
					            gap: 1rem;
 | 
				
			||||||
 | 
					            flex-grow: 1; /* Allow form to grow */
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        input[type="text"],
 | 
				
			||||||
 | 
					        input[type="number"],
 | 
				
			||||||
 | 
					        select {
 | 
				
			||||||
 | 
					            width: 100%;
 | 
				
			||||||
 | 
					            padding: 0.75rem;
 | 
				
			||||||
 | 
					            border-radius: 0.375rem;
 | 
				
			||||||
 | 
					            border: 1px solid var(--border-color);
 | 
				
			||||||
 | 
					            background-color: var(--input-bg-color);
 | 
				
			||||||
 | 
					            color: var(--text-color);
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            font-size: 1rem;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        input[type="checkbox"] {
 | 
				
			||||||
 | 
					            /* Hide original checkbox */
 | 
				
			||||||
 | 
					            display: none;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        button {
 | 
				
			||||||
 | 
					            padding: 0.75rem 1.5rem;
 | 
				
			||||||
 | 
					            border: none;
 | 
				
			||||||
 | 
					            border-radius: 0.375rem;
 | 
				
			||||||
 | 
					            background-color: var(--button-primary-bg);
 | 
				
			||||||
 | 
					            color: white;
 | 
				
			||||||
 | 
					            font-weight: 600;
 | 
				
			||||||
 | 
					            font-size: 1rem;
 | 
				
			||||||
 | 
					            cursor: pointer;
 | 
				
			||||||
 | 
					            transition: background-color 0.2s ease;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        button:hover {
 | 
				
			||||||
 | 
					            background-color: var(--button-primary-hover-bg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        button.startstop {
 | 
				
			||||||
 | 
					            padding: 0.25rem 0.75rem;
 | 
				
			||||||
 | 
					            font-size: 0.875rem;
 | 
				
			||||||
 | 
					            font-weight: 500;
 | 
				
			||||||
 | 
					            background-color: var(--button-secondary-bg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        button.startstop:hover {
 | 
				
			||||||
 | 
					            background-color: var(--button-secondary-hover-bg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        textarea {
 | 
				
			||||||
 | 
					            width: 100%;
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            height: 300px;
 | 
				
			||||||
 | 
					            background-color: var(--input-bg-color);
 | 
				
			||||||
 | 
					            color: var(--text-color);
 | 
				
			||||||
 | 
					            border: 1px solid var(--border-color);
 | 
				
			||||||
 | 
					            border-radius: 0.375rem;
 | 
				
			||||||
 | 
					            padding: 0.5rem;
 | 
				
			||||||
 | 
					            font-family: monospace;
 | 
				
			||||||
 | 
					            flex-grow: 1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* --- Helper classes --- */
 | 
				
			||||||
 | 
					        .just-col {
 | 
				
			||||||
 | 
					            display: flex;
 | 
				
			||||||
 | 
					            flex-direction: column;
 | 
				
			||||||
 | 
					            gap: 1rem;
 | 
				
			||||||
 | 
					            align-items: stretch;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .just-col label {
 | 
				
			||||||
 | 
					            display: flex;
 | 
				
			||||||
 | 
					            align-items: center;
 | 
				
			||||||
 | 
					            justify-content: space-between;
 | 
				
			||||||
 | 
					            gap: 1rem;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #gammaform span {
 | 
					        #gammaform span {
 | 
				
			||||||
            display: inline-block;
 | 
					            flex-basis: 4rem;
 | 
				
			||||||
            width: 4rem;
 | 
					            flex-shrink: 0;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        .logging {
 | 
					        /* --- Button Checkbox Styles --- */
 | 
				
			||||||
            max-width: 500px;
 | 
					        .checkbox-button {
 | 
				
			||||||
 | 
					            display: block;
 | 
				
			||||||
 | 
					            padding: 0.75rem 1rem;
 | 
				
			||||||
 | 
					            border: 5px solid var(--border-color);
 | 
				
			||||||
 | 
					            border-radius: 0.375rem;
 | 
				
			||||||
 | 
					            text-align: center;
 | 
				
			||||||
 | 
					            cursor: pointer;
 | 
				
			||||||
 | 
					            background-color: var(--card-bg-color);
 | 
				
			||||||
 | 
					            color: var(--text-color);
 | 
				
			||||||
 | 
					            transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
 | 
				
			||||||
 | 
					            font-weight: 500;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        .options {
 | 
					        #flipform input[type="checkbox"]:checked + .checkbox-button {
 | 
				
			||||||
            max-width: 350px;
 | 
					            /*background-color: var(--button-primary-bg);*/
 | 
				
			||||||
 | 
					            /*color: white;*/
 | 
				
			||||||
 | 
					            border-color: var(--button-primary-bg);
 | 
				
			||||||
 | 
					            border-width: 5px;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    </style>
 | 
					    </style>
 | 
				
			||||||
</head>
 | 
					</head>
 | 
				
			||||||
<body>
 | 
					<body>
 | 
				
			||||||
<h1 style="text-align: center;">Andreas <i>production-ready</i> Interface</h1>
 | 
					<div class="main-container">
 | 
				
			||||||
<div class="main">
 | 
					    <h1>Andreas <i>production-ready</i> Interface</h1>
 | 
				
			||||||
    <div class="col">
 | 
					    <div class="main">
 | 
				
			||||||
        <h2><label for="list">Kommando:</label></h2>
 | 
					        <div class="col">
 | 
				
			||||||
        <form id="in" class="" onSubmit="return request()">
 | 
					            <h2>Kommando</h2>
 | 
				
			||||||
            <select id="list"></select>
 | 
					            <form id="in" onSubmit="return request()">
 | 
				
			||||||
            <input id="args"/>
 | 
					                <select id="list"></select>
 | 
				
			||||||
            <button id="execute">Ausführen</button>
 | 
					                <input id="args" type="text" placeholder="Argumente..."/>
 | 
				
			||||||
        </form>
 | 
					                <button>Ausführen</button>
 | 
				
			||||||
 | 
					            </form>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <h2><label for="brightness">Intensität:</label></h2>
 | 
					        <div class="col">
 | 
				
			||||||
        <form id="brightnessform" class="just" onSubmit="return setbrightness()">
 | 
					            <h2>Intensität</h2>
 | 
				
			||||||
            <input id="brightness" value="1.0"><br/>
 | 
					            <form onSubmit="return setbrightness()">
 | 
				
			||||||
            <button id="sendbrightness">Setzen</button>
 | 
					                <input id="brightness" value="1.0" type="number" step="0.1"><br/>
 | 
				
			||||||
        </form>
 | 
					                <button>Setzen</button>
 | 
				
			||||||
 | 
					            </form>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <div class="col">
 | 
				
			||||||
 | 
					            <h2>Gamma</h2>
 | 
				
			||||||
 | 
					            <form id="gammaform" class="just-col" onSubmit="return setgamma()">
 | 
				
			||||||
 | 
					                <label><span>Rot: </span><input id="gammar" value="2.8" type="number" step="0.05"/></label>
 | 
				
			||||||
 | 
					                <label><span>Grün: </span><input id="gammag" value="2.65" type="number" step="0.05"/></label>
 | 
				
			||||||
 | 
					                <label><span>Blau: </span><input id="gammab" value="2.65" type="number" step="0.05"/></label>
 | 
				
			||||||
 | 
					                <label><span>Weiß: </span><input id="gammaw" value="2.65" type="number" step="0.05"/></label>
 | 
				
			||||||
 | 
					                <button>Setzen</button>
 | 
				
			||||||
 | 
					            </form>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <div class="col">
 | 
				
			||||||
 | 
					            <h2>Flip</h2>
 | 
				
			||||||
 | 
					            <form id="flipform" onSubmit="return setFlip()">
 | 
				
			||||||
 | 
					                <label>
 | 
				
			||||||
 | 
					                    <input id="flipx" type="checkbox"/>
 | 
				
			||||||
 | 
					                    <span class="checkbox-button">Flip X</span>
 | 
				
			||||||
 | 
					                </label>
 | 
				
			||||||
 | 
					                <label>
 | 
				
			||||||
 | 
					                    <input id="flipy" type="checkbox"/>
 | 
				
			||||||
 | 
					                    <span class="checkbox-button">Flip Y</span>
 | 
				
			||||||
 | 
					                </label>
 | 
				
			||||||
 | 
					                <button>Setzen</button>
 | 
				
			||||||
 | 
					            </form>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <div class="col">
 | 
				
			||||||
 | 
					            <h2>Filter</h2>
 | 
				
			||||||
 | 
					            <form onSubmit="return setFilter()">
 | 
				
			||||||
 | 
					                <h3><label for="filtername">Filterimage:</label></h3>
 | 
				
			||||||
 | 
					                <input id="filtername" value="test" type="text">
 | 
				
			||||||
 | 
					                <button>Setzen</button>
 | 
				
			||||||
 | 
					            </form>
 | 
				
			||||||
 | 
					            <form onSubmit="return setFilterExpr()">
 | 
				
			||||||
 | 
					                <h3><label for="filterexpr">Filter expression:</label></h3>
 | 
				
			||||||
 | 
					                <input id="filterexpr" value="0.5+0.25*sin(x/3+t)" type="text">
 | 
				
			||||||
 | 
					                <button>Setzen</button>
 | 
				
			||||||
 | 
					            </form>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <div class="col">
 | 
				
			||||||
 | 
					            <h2>Crash Log
 | 
				
			||||||
 | 
					                <button id="crashlogbtn" class="startstop" type="button" onclick="return enableCrashLog()">start</button>
 | 
				
			||||||
 | 
					            </h2>
 | 
				
			||||||
 | 
					            <textarea readonly id="crashlogs" style="display: none;"></textarea>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <div class="col">
 | 
				
			||||||
 | 
					            <h2>Log
 | 
				
			||||||
 | 
					                <button id="logbtn" class="startstop" type="button" onclick="return enableLog()">start</button>
 | 
				
			||||||
 | 
					            </h2>
 | 
				
			||||||
 | 
					            <textarea readonly id="logs" style="display: none;"></textarea>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <div class="options col">
 | 
					 | 
				
			||||||
        <h2>Gamma:</h2>
 | 
					 | 
				
			||||||
        <form id="gammaform" class="just-col" onSubmit="return setgamma()">
 | 
					 | 
				
			||||||
            <label><span>Rot: </span><input id="gammar" value="2.8"/></label><br/>
 | 
					 | 
				
			||||||
            <label><span>Grün: </span><input id="gammag" value="2.65"/></label><br/>
 | 
					 | 
				
			||||||
            <label><span>Blau: </span><input id="gammab" value="2.65"/></label><br/>
 | 
					 | 
				
			||||||
            <label><span>Weiß: </span><input id="gammaw" value="2.65"/></label><br/>
 | 
					 | 
				
			||||||
            <button id="sendgamma">Setzen</button>
 | 
					 | 
				
			||||||
        </form>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        <h2>Flip:</h2>
 | 
					 | 
				
			||||||
        <form id="flipform" class="just" onSubmit="return setFlip()">
 | 
					 | 
				
			||||||
            <label><input id="flipx" type="checkbox"/> Flip X</label>
 | 
					 | 
				
			||||||
            <label><input id="flipy" type="checkbox"/> Flip Y</label>
 | 
					 | 
				
			||||||
            <button id="sendflip">Setzen</button>
 | 
					 | 
				
			||||||
        </form>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        <h2><label for="filtername">Filterimage:</label></h2>
 | 
					 | 
				
			||||||
        <form id="filterform" class="just" onSubmit="return setFilter()">
 | 
					 | 
				
			||||||
            <input id="filtername" value="test">
 | 
					 | 
				
			||||||
            <button id="filterflip">Setzen</button>
 | 
					 | 
				
			||||||
        </form>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        <h2><label for="filterexpr">Filter expression:</label></h2>
 | 
					 | 
				
			||||||
        <form id="filterexprform" class="just" onSubmit="return setFilterExpr()">
 | 
					 | 
				
			||||||
            <input id="filterexpr" value="0.5+0.25*sin(x/3+t)">
 | 
					 | 
				
			||||||
            <button>Setzen</button>
 | 
					 | 
				
			||||||
        </form>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
    <div class="logging col">
 | 
					 | 
				
			||||||
        <h2>Crash Log:
 | 
					 | 
				
			||||||
            <button id="crashlogbtn" type="button" onclick="return enableCrashLog()">start</button>
 | 
					 | 
				
			||||||
        </h2>
 | 
					 | 
				
			||||||
        <textarea readonly id="crashlogs" style="width: 500px; height: 300px; display: none;"></textarea>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        <h2>Log:
 | 
					 | 
				
			||||||
            <button id="logbtn" type="button" onclick="return enableLog()">start</button>
 | 
					 | 
				
			||||||
        </h2>
 | 
					 | 
				
			||||||
        <textarea readonly id="logs" style="width: 500px; height: 300px; display: none;"></textarea>
 | 
					 | 
				
			||||||
    </div>
 | 
					 | 
				
			||||||
    <script>
 | 
					 | 
				
			||||||
        function getRaw(url, callback) {
 | 
					 | 
				
			||||||
            const xhttp = new XMLHttpRequest();
 | 
					 | 
				
			||||||
            xhttp.onreadystatechange = function () {
 | 
					 | 
				
			||||||
                if (this.readyState === 4 && this.status === 200)
 | 
					 | 
				
			||||||
                    if (callback) callback(xhttp.responseText);
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
            xhttp.open("GET", url, true);
 | 
					 | 
				
			||||||
            xhttp.send();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        function getJSON(url, callback) {
 | 
					 | 
				
			||||||
            getRaw(url, function (text) {
 | 
					 | 
				
			||||||
                callback(JSON.parse(text));
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        function post(url, data) {
 | 
					 | 
				
			||||||
            const formdata = new FormData();
 | 
					 | 
				
			||||||
            for (const key in data)
 | 
					 | 
				
			||||||
                formdata.append(key, data[key]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            const xhttp = new XMLHttpRequest();
 | 
					 | 
				
			||||||
            // xhttp.onreadystatechange = function () {
 | 
					 | 
				
			||||||
            //     if (this.readyState === 4 && this.status === 200) {}
 | 
					 | 
				
			||||||
            // };
 | 
					 | 
				
			||||||
            xhttp.open("POST", url, true);
 | 
					 | 
				
			||||||
            xhttp.send(formdata);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        function populateForm(parameters) {
 | 
					 | 
				
			||||||
            const list = document.getElementById("list");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            for (const i in parameters) {
 | 
					 | 
				
			||||||
                const app = parameters[i];
 | 
					 | 
				
			||||||
                const name = app["name"];
 | 
					 | 
				
			||||||
                const guiname = app["guiname"];
 | 
					 | 
				
			||||||
                const persistent = app["persistent"];
 | 
					 | 
				
			||||||
                const element = document.createElement("option");
 | 
					 | 
				
			||||||
                element.value = name;
 | 
					 | 
				
			||||||
                element.innerHTML = guiname;
 | 
					 | 
				
			||||||
                element.dataset.persistent = persistent;
 | 
					 | 
				
			||||||
                list.appendChild(element);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            list.onchange = function () {
 | 
					 | 
				
			||||||
                const app = document.getElementById('list');
 | 
					 | 
				
			||||||
                const persistent = app.options[app.selectedIndex].dataset.persistent;
 | 
					 | 
				
			||||||
                if (persistent == "true") {
 | 
					 | 
				
			||||||
                    document.getElementById("args").style.display = "none";
 | 
					 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    document.getElementById("args").style.display = "inline";
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            };
 | 
					 | 
				
			||||||
            list.onchange();
 | 
					 | 
				
			||||||
            document.getElementById("container").style.display = "block";
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        function request() {
 | 
					 | 
				
			||||||
            let app = document.getElementById('list');
 | 
					 | 
				
			||||||
            let val = app.options[app.selectedIndex].value;
 | 
					 | 
				
			||||||
            let parameter = document.getElementById('args').value;
 | 
					 | 
				
			||||||
            post("/apps/start/" + val, {"param": parameter});
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        function setgamma() {
 | 
					 | 
				
			||||||
            const r = document.getElementById('gammar').value;
 | 
					 | 
				
			||||||
            const g = document.getElementById('gammag').value;
 | 
					 | 
				
			||||||
            const b = document.getElementById('gammab').value;
 | 
					 | 
				
			||||||
            const w = document.getElementById('gammaw').value;
 | 
					 | 
				
			||||||
            getRaw(`/setgamma/${r}/${g}/${b}/${w}`);
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        function setbrightness() {
 | 
					 | 
				
			||||||
            const i = document.getElementById('brightness').value;
 | 
					 | 
				
			||||||
            getRaw("/setbrightness/" + i);
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        function setFlip() {
 | 
					 | 
				
			||||||
            const x = document.getElementById('flipx').checked;
 | 
					 | 
				
			||||||
            const y = document.getElementById('flipy').checked;
 | 
					 | 
				
			||||||
            getRaw("/filter/flipx/" + x);
 | 
					 | 
				
			||||||
            getRaw("/filter/flipy/" + y);
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        function setFilter() {
 | 
					 | 
				
			||||||
            const i = document.getElementById('filtername').value;
 | 
					 | 
				
			||||||
            getRaw("/filter/img/" + i);
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        function setFilterExpr() {
 | 
					 | 
				
			||||||
            const expr = document.getElementById('filterexpr').value;
 | 
					 | 
				
			||||||
            post("/filter/expr/", {"expr": expr});
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        function updateLog() {
 | 
					 | 
				
			||||||
            getRaw("/apps/log", function (text) {
 | 
					 | 
				
			||||||
                document.getElementById('logs').value = text;
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        function updateCrashLog() {
 | 
					 | 
				
			||||||
            getRaw("/apps/crashlog", function (text) {
 | 
					 | 
				
			||||||
                document.getElementById('crashlogs').value = text;
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        function enableCrashLog() {
 | 
					 | 
				
			||||||
            document.getElementById("crashlogbtn").remove();
 | 
					 | 
				
			||||||
            document.getElementById("crashlogs").style.display = "block";
 | 
					 | 
				
			||||||
            updateCrashLog();
 | 
					 | 
				
			||||||
            setInterval(updateCrashLog, 1000);
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        function enableLog() {
 | 
					 | 
				
			||||||
            document.getElementById("logbtn").remove();
 | 
					 | 
				
			||||||
            document.getElementById("logs").style.display = "block";
 | 
					 | 
				
			||||||
            updateLog();
 | 
					 | 
				
			||||||
            setInterval(updateLog, 1000);
 | 
					 | 
				
			||||||
            return false;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        getJSON("/apps/list", populateForm);
 | 
					 | 
				
			||||||
    </script>
 | 
					 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					    function getRaw(url, callback) {
 | 
				
			||||||
 | 
					        const xhttp = new XMLHttpRequest();
 | 
				
			||||||
 | 
					        xhttp.onreadystatechange = function () {
 | 
				
			||||||
 | 
					            if (this.readyState === 4 && this.status === 200)
 | 
				
			||||||
 | 
					                if (callback) callback(xhttp.responseText);
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        xhttp.open("GET", url, true);
 | 
				
			||||||
 | 
					        xhttp.send();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function getJSON(url, callback) {
 | 
				
			||||||
 | 
					        getRaw(url, function (text) {
 | 
				
			||||||
 | 
					            callback(JSON.parse(text));
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function post(url, data) {
 | 
				
			||||||
 | 
					        const formdata = new FormData();
 | 
				
			||||||
 | 
					        for (const key in data)
 | 
				
			||||||
 | 
					            formdata.append(key, data[key]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const xhttp = new XMLHttpRequest();
 | 
				
			||||||
 | 
					        // xhttp.onreadystatechange = function () {
 | 
				
			||||||
 | 
					        //     if (this.readyState === 4 && this.status === 200) {}
 | 
				
			||||||
 | 
					        // };
 | 
				
			||||||
 | 
					        xhttp.open("POST", url, true);
 | 
				
			||||||
 | 
					        xhttp.send(formdata);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function populateForm(parameters) {
 | 
				
			||||||
 | 
					        const list = document.getElementById("list");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (const i in parameters) {
 | 
				
			||||||
 | 
					            const app = parameters[i];
 | 
				
			||||||
 | 
					            const name = app["name"];
 | 
				
			||||||
 | 
					            const guiname = app["guiname"];
 | 
				
			||||||
 | 
					            const persistent = app["persistent"];
 | 
				
			||||||
 | 
					            const element = document.createElement("option");
 | 
				
			||||||
 | 
					            element.value = name;
 | 
				
			||||||
 | 
					            element.innerHTML = guiname;
 | 
				
			||||||
 | 
					            element.dataset.persistent = persistent;
 | 
				
			||||||
 | 
					            list.appendChild(element);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        list.onchange = function () {
 | 
				
			||||||
 | 
					            const app = document.getElementById('list');
 | 
				
			||||||
 | 
					            const persistent = app.options[app.selectedIndex].dataset.persistent;
 | 
				
			||||||
 | 
					            if (persistent == "true") {
 | 
				
			||||||
 | 
					                document.getElementById("args").style.display = "none";
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                document.getElementById("args").style.display = "inline";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        list.onchange();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function request() {
 | 
				
			||||||
 | 
					        let app = document.getElementById('list');
 | 
				
			||||||
 | 
					        let val = app.options[app.selectedIndex].value;
 | 
				
			||||||
 | 
					        let parameter = document.getElementById('args').value;
 | 
				
			||||||
 | 
					        post("/apps/start/" + val, {"param": parameter});
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function setgamma() {
 | 
				
			||||||
 | 
					        const r = document.getElementById('gammar').value;
 | 
				
			||||||
 | 
					        const g = document.getElementById('gammag').value;
 | 
				
			||||||
 | 
					        const b = document.getElementById('gammab').value;
 | 
				
			||||||
 | 
					        const w = document.getElementById('gammaw').value;
 | 
				
			||||||
 | 
					        getRaw(`/setgamma/${r}/${g}/${b}/${w}`);
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function setbrightness() {
 | 
				
			||||||
 | 
					        const i = document.getElementById('brightness').value;
 | 
				
			||||||
 | 
					        getRaw("/setbrightness/" + i);
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function setFlip() {
 | 
				
			||||||
 | 
					        const x = document.getElementById('flipx').checked;
 | 
				
			||||||
 | 
					        const y = document.getElementById('flipy').checked;
 | 
				
			||||||
 | 
					        getRaw("/filter/flipx/" + x);
 | 
				
			||||||
 | 
					        getRaw("/filter/flipy/" + y);
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function setFilter() {
 | 
				
			||||||
 | 
					        const i = document.getElementById('filtername').value;
 | 
				
			||||||
 | 
					        getRaw("/filter/img/" + i);
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function setFilterExpr() {
 | 
				
			||||||
 | 
					        const expr = document.getElementById('filterexpr').value;
 | 
				
			||||||
 | 
					        post("/filter/expr/", {"expr": expr});
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function updateLog() {
 | 
				
			||||||
 | 
					        getRaw("/apps/log", function (text) {
 | 
				
			||||||
 | 
					            document.getElementById('logs').value = text;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function updateCrashLog() {
 | 
				
			||||||
 | 
					        getRaw("/apps/crashlog", function (text) {
 | 
				
			||||||
 | 
					            document.getElementById('crashlogs').value = text;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function enableCrashLog() {
 | 
				
			||||||
 | 
					        const logArea = document.getElementById('crashlogs');
 | 
				
			||||||
 | 
					        const btn = document.getElementById('crashlogbtn');
 | 
				
			||||||
 | 
					        const isHidden = logArea.style.display === 'none';
 | 
				
			||||||
 | 
					        logArea.style.display = isHidden ? 'block' : 'none';
 | 
				
			||||||
 | 
					        btn.textContent = isHidden ? 'stop' : 'start';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        clearInterval(window.crash_interval);
 | 
				
			||||||
 | 
					        if (isHidden) {
 | 
				
			||||||
 | 
					            updateCrashLog();
 | 
				
			||||||
 | 
					            window.crash_interval = setInterval(updateCrashLog, 1000);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function enableLog() {
 | 
				
			||||||
 | 
					        const logArea = document.getElementById('logs');
 | 
				
			||||||
 | 
					        const btn = document.getElementById('logbtn');
 | 
				
			||||||
 | 
					        const isHidden = logArea.style.display === 'none';
 | 
				
			||||||
 | 
					        logArea.style.display = isHidden ? 'block' : 'none';
 | 
				
			||||||
 | 
					        btn.textContent = isHidden ? 'stop' : 'start';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        clearInterval(window.log_interval);
 | 
				
			||||||
 | 
					        if (isHidden) {
 | 
				
			||||||
 | 
					            updateLog();
 | 
				
			||||||
 | 
					            window.log_interval = setInterval(updateLog, 1000);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getJSON("/apps/list", populateForm);
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
</body>
 | 
					</body>
 | 
				
			||||||
</html>
 | 
					</html>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user