mirror of
https://github.com/LinoSchmidt/StickExporterTX.git
synced 2026-03-21 01:51:15 +01:00
Improved Design, new render Side
This commit is contained in:
@@ -2,10 +2,11 @@ import { blenderPath, blenderScriptPath, dataPath, templatePath } from "./paths"
|
|||||||
import {spawn} from "child_process";
|
import {spawn} from "child_process";
|
||||||
import logger from "./logger";
|
import logger from "./logger";
|
||||||
import { setBlenderLoading, setBlenderStatus } from "./ui/menu";
|
import { setBlenderLoading, setBlenderStatus } from "./ui/menu";
|
||||||
import { setLogNumber, setStatus } from "./ui/mainSide";
|
import { setLogNumber, setStatus } from "./ui/renderingSide";
|
||||||
import {imageLoading, imageLoaded} from "./ui/settingsSide";
|
import {imageLoading, imageLoaded} from "./ui/settingsSide";
|
||||||
import { settingList } from "./settings";
|
import { settingList } from "./settings";
|
||||||
import isValid from "is-valid-path";
|
import isValid from "is-valid-path";
|
||||||
|
import { sideSetRendering } from "../renderer";
|
||||||
|
|
||||||
const blenderStartString = [
|
const blenderStartString = [
|
||||||
templatePath,
|
templatePath,
|
||||||
@@ -63,6 +64,7 @@ function startBlender() {
|
|||||||
setStatus("Rendering Frame " + lastFrame + "/" + frames);
|
setStatus("Rendering Frame " + lastFrame + "/" + frames);
|
||||||
}
|
}
|
||||||
if(dataStr.includes("Finished") && renderingVideo) {
|
if(dataStr.includes("Finished") && renderingVideo) {
|
||||||
|
sideSetRendering(false);
|
||||||
if(lastFrame == frames) {
|
if(lastFrame == frames) {
|
||||||
setStatus("Finished Render Successfully!");
|
setStatus("Finished Render Successfully!");
|
||||||
} else {
|
} else {
|
||||||
@@ -77,6 +79,8 @@ function startBlender() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(dataStr.includes("Waiting for command")) {
|
if(dataStr.includes("Waiting for command")) {
|
||||||
|
sideSetRendering(false);
|
||||||
|
|
||||||
if(renderingPicture) {
|
if(renderingPicture) {
|
||||||
imageLoaded();
|
imageLoaded();
|
||||||
}
|
}
|
||||||
@@ -104,6 +108,7 @@ function startBlender() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function restartBlender() {
|
function restartBlender() {
|
||||||
|
sideSetRendering(false);
|
||||||
blenderConsole.kill();
|
blenderConsole.kill();
|
||||||
blenderConsole = spawn(blenderPath, blenderStartString);
|
blenderConsole = spawn(blenderPath, blenderStartString);
|
||||||
startBlender();
|
startBlender();
|
||||||
@@ -134,14 +139,15 @@ function blender(command:blenderCmd) {
|
|||||||
} else {
|
} else {
|
||||||
readyToAcceptCommand = false;
|
readyToAcceptCommand = false;
|
||||||
renderingVideo = true;
|
renderingVideo = true;
|
||||||
|
sideSetRendering(true);
|
||||||
blenderConsole.stdin.write("startRendering\n");
|
blenderConsole.stdin.write("startRendering\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if(command === blenderCmd.stopRendering) {
|
} else if(command === blenderCmd.stopRendering) {
|
||||||
restartBlender();
|
|
||||||
readyToAcceptCommand = false;
|
readyToAcceptCommand = false;
|
||||||
renderingPicture = false;
|
renderingPicture = false;
|
||||||
renderingVideo = false;
|
renderingVideo = false;
|
||||||
|
restartBlender();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,14 +5,7 @@ import logger from "../logger";
|
|||||||
import {exec} from "child_process";
|
import {exec} from "child_process";
|
||||||
import {blender, blenderCmd} from "../blender-controller";
|
import {blender, blenderCmd} from "../blender-controller";
|
||||||
|
|
||||||
let setStatus:React.Dispatch<React.SetStateAction<string>>;
|
|
||||||
let setLogNumber:React.Dispatch<React.SetStateAction<string>>;
|
|
||||||
|
|
||||||
function MainSide() {
|
function MainSide() {
|
||||||
const [status, setStatusInner] = useState("Idle");
|
|
||||||
setStatus = setStatusInner;
|
|
||||||
const [logNumber, setLogNumberInner] = useState("0");
|
|
||||||
setLogNumber = setLogNumberInner;
|
|
||||||
const [logs, setLogs] = useState(settingList.log);
|
const [logs, setLogs] = useState(settingList.log);
|
||||||
const [output, setOutput] = useState(settingList.output);
|
const [output, setOutput] = useState(settingList.output);
|
||||||
const [logTable, setLogTable] = useState(logs.substring(1).slice(0, -1).split('""').map((log, index) => {
|
const [logTable, setLogTable] = useState(logs.substring(1).slice(0, -1).split('""').map((log, index) => {
|
||||||
@@ -35,7 +28,7 @@ function MainSide() {
|
|||||||
setLogTable(logListName.map((log, index) => {
|
setLogTable(logListName.map((log, index) => {
|
||||||
return <tr key={index}>
|
return <tr key={index}>
|
||||||
<td title={logList[index]}>{index+1}. {log}</td>
|
<td title={logList[index]}>{index+1}. {log}</td>
|
||||||
<td><button onClick={() => {
|
<td><button className="listButton" onClick={() => {
|
||||||
const newLogs = settingList.log.replace('"'+logList[index]+'"', "");
|
const newLogs = settingList.log.replace('"'+logList[index]+'"', "");
|
||||||
updateSettings({log:newLogs});
|
updateSettings({log:newLogs});
|
||||||
setLogs(newLogs);
|
setLogs(newLogs);
|
||||||
@@ -53,12 +46,7 @@ function MainSide() {
|
|||||||
<path d="M361 215C375.3 223.8 384 239.3 384 256C384 272.7 375.3 288.2 361 296.1L73.03 472.1C58.21 482 39.66 482.4 24.52 473.9C9.377 465.4 0 449.4 0 432V80C0 62.64 9.377 46.63 24.52 38.13C39.66 29.64 58.21 29.99 73.03 39.04L361 215z"/>
|
<path d="M361 215C375.3 223.8 384 239.3 384 256C384 272.7 375.3 288.2 361 296.1L73.03 472.1C58.21 482 39.66 482.4 24.52 473.9C9.377 465.4 0 449.4 0 432V80C0 62.64 9.377 46.63 24.52 38.13C39.66 29.64 58.21 29.99 73.03 39.04L361 215z"/>
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
<p>{"Log " + logNumber + "/" + String(settingList.log.split("\"\"").length)}</p>
|
<button id="openOutputMain" onClick={() => openOutputFolder()}>Open Output Folder</button>
|
||||||
<div className="dataDiv">
|
|
||||||
<p>{status}</p>
|
|
||||||
<button onClick={() => openOutputFolder()}>Open Output Folder</button>
|
|
||||||
</div>
|
|
||||||
<hr/>
|
|
||||||
<h4 className="noMarginBottom">Logs:</h4>
|
<h4 className="noMarginBottom">Logs:</h4>
|
||||||
<table>
|
<table>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -99,7 +87,7 @@ function addLog(updateHook:React.Dispatch<React.SetStateAction<string>>) {
|
|||||||
result.filePaths.forEach(value => {
|
result.filePaths.forEach(value => {
|
||||||
const logToAdd = "\"" + value + "\"";
|
const logToAdd = "\"" + value + "\"";
|
||||||
if(settingList.log.includes(logToAdd)) {
|
if(settingList.log.includes(logToAdd)) {
|
||||||
logger.warningMSG("Log already added!");
|
logger.warningMSG("Log already added: " + logToAdd);
|
||||||
} else {
|
} else {
|
||||||
logStr += "\"" + String(value) + "\"";
|
logStr += "\"" + String(value) + "\"";
|
||||||
}
|
}
|
||||||
@@ -135,6 +123,5 @@ function openOutputFolder() {
|
|||||||
|
|
||||||
export default MainSide;
|
export default MainSide;
|
||||||
export {
|
export {
|
||||||
setStatus,
|
openOutputFolder
|
||||||
setLogNumber
|
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import React, {useState} from "react";
|
import React, {useState} from "react";
|
||||||
import { openSide, Side } from "../../renderer";
|
import { openSide, Side } from "../../renderer";
|
||||||
|
import {blender, blenderCmd} from "../blender-controller";
|
||||||
|
|
||||||
const UpdateButton = () => (
|
const UpdateButton = () => (
|
||||||
<div id="update-available">
|
<div id="update-available">
|
||||||
@@ -21,8 +22,11 @@ const MainSideButtons = () => (
|
|||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|
||||||
const OtherSideButtons = () => (
|
const SettingsSideButtons = () => (
|
||||||
<button id="settings-back" onClick={() => openSide(Side.Main)}>Back</button>
|
<button className="back-button" onClick={() => openSide(Side.Main)}>Back</button>
|
||||||
|
)
|
||||||
|
const RenderingSideButton = () => (
|
||||||
|
<button className="back-button" id="stopRender" onClick={() => blender(blenderCmd.stopRendering)}>Stop</button>
|
||||||
)
|
)
|
||||||
|
|
||||||
const BlenderLoadingSVG = () => (
|
const BlenderLoadingSVG = () => (
|
||||||
@@ -58,7 +62,9 @@ function Menu({updateAvailable, side}:{updateAvailable:boolean, side:Side}) {
|
|||||||
<p>{blenderStatus}</p>
|
<p>{blenderStatus}</p>
|
||||||
</div>
|
</div>
|
||||||
{updateAvailable? <UpdateButton/> : null}
|
{updateAvailable? <UpdateButton/> : null}
|
||||||
{(side == Side.Main)? <MainSideButtons/> : <OtherSideButtons/>}
|
{(side == Side.Main)? <MainSideButtons/> : null}
|
||||||
|
{(side == Side.Settings)? <SettingsSideButtons/> : null}
|
||||||
|
{(side == Side.Rendering)? <RenderingSideButton/> : null}
|
||||||
</header>
|
</header>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
27
src/components/ui/renderingSide.tsx
Normal file
27
src/components/ui/renderingSide.tsx
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import React, {useState} from "react";
|
||||||
|
import { settingList } from "../settings";
|
||||||
|
import {openOutputFolder} from "./mainSide";
|
||||||
|
|
||||||
|
let setLogNumber:React.Dispatch<React.SetStateAction<string>>;
|
||||||
|
let setStatus:React.Dispatch<React.SetStateAction<string>>;
|
||||||
|
|
||||||
|
function RenderingSide() {
|
||||||
|
const [logNumber, setLogNumberInner] = useState("0");
|
||||||
|
setLogNumber = setLogNumberInner;
|
||||||
|
const [status, setStatusInner] = useState("Idle");
|
||||||
|
setStatus = setStatusInner;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div id="content">
|
||||||
|
<p>{"Log " + logNumber + "/" + String(settingList.log.split("\"\"").length)}</p>
|
||||||
|
<p>{status}</p>
|
||||||
|
<button onClick={() => openOutputFolder()}>Open Output Folder</button>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default RenderingSide;
|
||||||
|
export {
|
||||||
|
setLogNumber,
|
||||||
|
setStatus
|
||||||
|
};
|
||||||
@@ -40,7 +40,7 @@ header h1 {
|
|||||||
width: auto;
|
width: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
#settings-back {
|
.back-button {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
background-color: #2196F3;
|
background-color: #2196F3;
|
||||||
@@ -51,11 +51,15 @@ header h1 {
|
|||||||
font-size: large;
|
font-size: large;
|
||||||
}
|
}
|
||||||
|
|
||||||
#settings-back:hover {
|
.back-button:hover {
|
||||||
transform: scale(1.05);
|
transform: scale(1.05);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#stopRender {
|
||||||
|
background-color: #e1334e;
|
||||||
|
}
|
||||||
|
|
||||||
#content {
|
#content {
|
||||||
padding-left: 25px;
|
padding-left: 25px;
|
||||||
padding-right: 25px;
|
padding-right: 25px;
|
||||||
@@ -207,6 +211,31 @@ header h1 {
|
|||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
}
|
}
|
||||||
#deleteLogsButton {
|
#deleteLogsButton {
|
||||||
|
background-color: #e1334e;
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#openOutputMain {
|
||||||
|
margin-top: 15px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.listButton {
|
||||||
|
background-color: #e1334e;
|
||||||
|
padding: 5px;
|
||||||
|
border-radius: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 10px;
|
||||||
|
background-color: #2196F3;
|
||||||
|
color: white;
|
||||||
|
border: none;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-weight: bolder;
|
||||||
|
}
|
||||||
|
button:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
}
|
}
|
||||||
@@ -3,30 +3,56 @@ import ReactDOM from "react-dom/client";
|
|||||||
import Menu from "./components/ui/menu";
|
import Menu from "./components/ui/menu";
|
||||||
import MainSide from "./components/ui/mainSide";
|
import MainSide from "./components/ui/mainSide";
|
||||||
import SettingsSite from "./components/ui/settingsSide";
|
import SettingsSite from "./components/ui/settingsSide";
|
||||||
|
import RenderingSide from "./components/ui/renderingSide";
|
||||||
import "./index.css";
|
import "./index.css";
|
||||||
import "./toggle-switchy.css";
|
import "./toggle-switchy.css";
|
||||||
import { startBlender } from "./components/blender-controller";
|
import { startBlender } from "./components/blender-controller";
|
||||||
|
|
||||||
enum Side {
|
enum Side {
|
||||||
Main,
|
Main,
|
||||||
|
Rendering,
|
||||||
Settings
|
Settings
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let rendering = false;
|
||||||
|
let currentSide = Side.Main;
|
||||||
|
|
||||||
const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement);
|
const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement);
|
||||||
function openSide(side:Side) {
|
function openSide(side:Side) {
|
||||||
|
if(side == Side.Main && rendering) {
|
||||||
|
side = Side.Rendering;
|
||||||
|
}
|
||||||
|
currentSide = side;
|
||||||
|
|
||||||
root.render(
|
root.render(
|
||||||
<React.StrictMode>
|
<React.StrictMode>
|
||||||
<Menu updateAvailable={false} side={side}/>
|
<Menu updateAvailable={false} side={side}/>
|
||||||
{(side == Side.Main)? <MainSide/> : <SettingsSite/>}
|
{(side === Side.Main)? <MainSide/> : null}
|
||||||
|
{(side === Side.Settings)? <SettingsSite/> : null}
|
||||||
|
{(side === Side.Rendering)? <RenderingSide/> : null}
|
||||||
</React.StrictMode>
|
</React.StrictMode>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
openSide(Side.Main);
|
openSide(currentSide);
|
||||||
|
|
||||||
startBlender();
|
startBlender();
|
||||||
|
|
||||||
|
function sideSetRendering(value:boolean) {
|
||||||
|
rendering = value;
|
||||||
|
if(value) {
|
||||||
|
if(currentSide === Side.Main) {
|
||||||
|
openSide(Side.Rendering);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(currentSide === Side.Rendering) {
|
||||||
|
openSide(Side.Main);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export {
|
export {
|
||||||
openSide,
|
openSide,
|
||||||
Side
|
Side,
|
||||||
|
sideSetRendering
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user