1
0
mirror of https://github.com/upscayl/upscayl.git synced 2024-11-24 07:30:19 +01:00

Initial Fix

This commit is contained in:
Nayam Amarshe 2024-02-14 12:02:52 +05:30
parent df9ff7de27
commit 1755b26c4a
7 changed files with 56 additions and 179 deletions

View File

@ -4,6 +4,7 @@ import {
childProcesses, childProcesses,
customModelsFolderPath, customModelsFolderPath,
customWidth, customWidth,
folderPath,
noImageProcessing, noImageProcessing,
outputFolderPath, outputFolderPath,
saveOutputFolder, saveOutputFolder,

View File

@ -7,7 +7,10 @@ export const customModelsPathAtom = atomWithStorage<string | null>(
); );
export const scaleAtom = atomWithStorage<"2" | "3" | "4">("scale", "4"); export const scaleAtom = atomWithStorage<"2" | "3" | "4">("scale", "4");
export const batchModeAtom = atom<boolean>(false); export const batchModeAtom = atom<boolean>(false);
export const outputPathAtom = atom<string | null>(""); export const outputPathAtom = atomWithStorage<string | null>(
"lastOutputFolderPath",
null,
);
export const progressAtom = atom<string>(""); export const progressAtom = atom<string>("");
export const rememberOutputFolderAtom = atomWithStorage<boolean>( export const rememberOutputFolderAtom = atomWithStorage<boolean>(

View File

@ -1,20 +1,22 @@
import React from "react"; import {
outputPathAtom,
rememberOutputFolderAtom,
} from "@/atoms/userSettingsAtom";
import { useAtom } from "jotai";
type SaveOutputFolderToggleProps = { export function SaveOutputFolderToggle() {
rememberOutputFolder: boolean; const [outputPath, setOutputPath] = useAtom(outputPathAtom);
setRememberOutputFolder: (arg: any) => void; const [rememberOutputFolder, setRememberOutputFolder] = useAtom(
}; rememberOutputFolderAtom,
);
export function SaveOutputFolderToggle({
rememberOutputFolder,
setRememberOutputFolder,
}: SaveOutputFolderToggleProps) {
return ( return (
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<p className="text-sm font-medium">SAVE OUTPUT FOLDER</p> <p className="text-sm font-medium">SAVE OUTPUT FOLDER</p>
<p className="text-xs text-base-content/80"> <p className="text-xs text-base-content/80">
If enabled, the output folder will be remembered between sessions. If enabled, the output folder will be remembered between sessions.
</p> </p>
<p>{outputPath}</p>
<input <input
type="checkbox" type="checkbox"
className="toggle" className="toggle"
@ -22,13 +24,13 @@ export function SaveOutputFolderToggle({
onClick={() => { onClick={() => {
setRememberOutputFolder((oldValue) => { setRememberOutputFolder((oldValue) => {
if (oldValue === true) { if (oldValue === true) {
localStorage.removeItem("lastOutputFolderPath"); setOutputPath("");
} }
return !oldValue; return !oldValue;
}); });
localStorage.setItem( localStorage.setItem(
"rememberOutputFolder", "rememberOutputFolder",
JSON.stringify(!rememberOutputFolder) JSON.stringify(!rememberOutputFolder),
); );
}} }}
/> />

View File

@ -65,7 +65,6 @@ function SettingsTab({
label: null, label: null,
value: null, value: null,
}); });
const [rememberOutputFolder, setRememberOutputFolder] = useState(false);
const [isCopied, setIsCopied] = useState(false); const [isCopied, setIsCopied] = useState(false);
const [customModelsPath, setCustomModelsPath] = useAtom(customModelsPathAtom); const [customModelsPath, setCustomModelsPath] = useAtom(customModelsPathAtom);
@ -126,22 +125,6 @@ function SettingsTab({
setGpuId(currentlySavedGpuId); setGpuId(currentlySavedGpuId);
logit("⚙️ Getting gpuId from localStorage: ", currentlySavedGpuId); logit("⚙️ Getting gpuId from localStorage: ", currentlySavedGpuId);
} }
if (!localStorage.getItem("rememberOutputFolder")) {
logit("⚙️ Setting rememberOutputFolder to false");
localStorage.setItem("rememberOutputFolder", "false");
} else {
const currentlySavedRememberOutputFolder = localStorage.getItem(
"rememberOutputFolder",
);
logit(
"⚙️ Getting rememberOutputFolder from localStorage: ",
currentlySavedRememberOutputFolder,
);
setRememberOutputFolder(
currentlySavedRememberOutputFolder === "true" ? true : false,
);
}
}, []); }, []);
// HANDLERS // HANDLERS
@ -229,10 +212,7 @@ function SettingsTab({
</> </>
)} )}
<SaveOutputFolderToggle <SaveOutputFolderToggle />
rememberOutputFolder={rememberOutputFolder}
setRememberOutputFolder={setRememberOutputFolder}
/>
<OverwriteToggle /> <OverwriteToggle />
<TurnOffNotificationsToggle /> <TurnOffNotificationsToggle />

View File

@ -9,16 +9,17 @@ import {
noImageProcessingAtom, noImageProcessingAtom,
outputPathAtom, outputPathAtom,
progressAtom, progressAtom,
rememberOutputFolderAtom,
scaleAtom, scaleAtom,
} from "../../../atoms/userSettingsAtom"; } from "../../../atoms/userSettingsAtom";
import { featureFlags } from "@common/feature-flags"; import { featureFlags } from "@common/feature-flags";
import getModelScale from "@common/check-model-scale"; import getModelScale from "@common/check-model-scale";
import COMMAND from "@common/commands";
interface IProps { interface IProps {
selectImageHandler: () => Promise<void>; selectImageHandler: () => Promise<void>;
selectFolderHandler: () => Promise<void>; selectFolderHandler: () => Promise<void>;
handleModelChange: (e: any) => void; handleModelChange: (e: any) => void;
outputHandler: () => Promise<void>;
upscaylHandler: () => Promise<void>; upscaylHandler: () => Promise<void>;
batchMode: boolean; batchMode: boolean;
setBatchMode: React.Dispatch<React.SetStateAction<boolean>>; setBatchMode: React.Dispatch<React.SetStateAction<boolean>>;
@ -39,7 +40,6 @@ function LeftPaneImageSteps({
selectImageHandler, selectImageHandler,
selectFolderHandler, selectFolderHandler,
handleModelChange, handleModelChange,
outputHandler,
upscaylHandler, upscaylHandler,
batchMode, batchMode,
setBatchMode, setBatchMode,
@ -65,12 +65,23 @@ function LeftPaneImageSteps({
const noImageProcessing = useAtomValue(noImageProcessingAtom); const noImageProcessing = useAtomValue(noImageProcessingAtom);
const [outputPath, setOutputPath] = useAtom(outputPathAtom); const [outputPath, setOutputPath] = useAtom(outputPathAtom);
const [progress, setProgress] = useAtom(progressAtom); const [progress, setProgress] = useAtom(progressAtom);
const rememberOutputFolder = useAtomValue(rememberOutputFolderAtom);
const [targetWidth, setTargetWidth] = useState<number>(null); const [targetWidth, setTargetWidth] = useState<number>(null);
const [targetHeight, setTargetHeight] = useState<number>(null); const [targetHeight, setTargetHeight] = useState<number>(null);
const { logit } = useLog(); const { logit } = useLog();
const outputHandler = async () => {
var path = await window.electron.invoke(COMMAND.SELECT_FOLDER);
if (path !== null) {
logit("🗂 Setting Output Path: ", path);
setOutputPath(path);
} else {
setOutputPath(null);
}
};
useEffect(() => { useEffect(() => {
themeChange(false); themeChange(false);
@ -166,7 +177,9 @@ function LeftPaneImageSteps({
className="toggle" className="toggle"
defaultChecked={batchMode} defaultChecked={batchMode}
onClick={() => { onClick={() => {
if (!rememberOutputFolder) {
setOutputPath(""); setOutputPath("");
}
setProgress(""); setProgress("");
setBatchMode((oldValue) => !oldValue); setBatchMode((oldValue) => !oldValue);
}} }}

View File

@ -1,107 +0,0 @@
import React from "react";
import Select from "react-select";
interface IProps {
progress: string;
selectVideoHandler: () => Promise<void>;
handleModelChange: (e: any) => void;
handleDrop: (e: any) => void;
outputHandler: () => Promise<void>;
upscaylHandler: () => Promise<void>;
videoPath: string;
outputPath: string;
model: string;
isVideo: boolean;
setIsVideo: (arg: boolean) => void;
}
function LeftPaneVideoSteps({
progress,
selectVideoHandler,
handleModelChange,
handleDrop,
outputHandler,
upscaylHandler,
videoPath,
outputPath,
model,
isVideo,
setIsVideo,
}: IProps) {
const customStyles = {
option: (provided, state) => ({
...provided,
borderBottom: "1px dotted pink",
color: state.isSelected ? "red" : "blue",
padding: 20,
}),
control: () => ({
// none of react-select's styles are passed to <Control />
width: 200,
}),
singleValue: (provided, state) => {
const opacity = state.isDisabled ? 0.5 : 1;
const transition = "opacity 300ms";
return { ...provided, opacity, transition };
},
};
const modelOptions = [
{ label: "2x Digital Art", value: "realesr-animevideov3-x2" },
{ label: "3x Digital Art", value: "realesr-animevideov3-x3" },
{ label: "4x Digital Art", value: "realesr-animevideov3-x4" },
];
return (
<div className="animate-step-in animate flex h-screen flex-col gap-7 overflow-y-auto p-5 overflow-x-hidden">
{/* STEP 1 */}
<div data-tip={videoPath}>
<p className="step-heading">Step 1</p>
<button className="btn-primary btn" onClick={selectVideoHandler}>
Select Video
</button>
</div>
{/* STEP 2 */}
<div className="animate-step-in">
<p className="step-heading">Step 2</p>
<p className="mb-2 text-sm">Select Scaling</p>
<Select
options={modelOptions}
components={{
IndicatorSeparator: () => null,
DropdownIndicator: () => null,
}}
onChange={handleModelChange}
className="react-select-container"
classNamePrefix="react-select"
defaultValue={modelOptions[0]}
/>
</div>
{/* STEP 3 */}
<div className="animate-step-in" data-tip={outputPath}>
<p className="step-heading">Step 3</p>
<p className="mb-2 text-sm">Defaults to Video's path</p>
<button className="btn-primary btn" onClick={outputHandler}>
Set Output Folder
</button>
</div>
{/* STEP 4 */}
<div className="animate-step-in">
<p className="step-heading">Step 4</p>
<button
className="btn-accent btn"
onClick={upscaylHandler}
disabled={progress.length > 0}>
{progress.length > 0 ? "Upscayling⏳" : "Upscayl"}
</button>
</div>
</div>
);
}
export default LeftPaneVideoSteps;

View File

@ -24,6 +24,7 @@ import {
progressAtom, progressAtom,
scaleAtom, scaleAtom,
viewTypeAtom, viewTypeAtom,
rememberOutputFolderAtom,
} from "../atoms/userSettingsAtom"; } from "../atoms/userSettingsAtom";
import useLog from "../components/hooks/useLog"; import useLog from "../components/hooks/useLog";
import { UpscaylCloudModal } from "../components/UpscaylCloudModal"; import { UpscaylCloudModal } from "../components/UpscaylCloudModal";
@ -81,6 +82,7 @@ const Home = () => {
const [showNewsModal, setShowNewsModal] = useAtom(showNewsModalAtom); const [showNewsModal, setShowNewsModal] = useAtom(showNewsModalAtom);
const viewType = useAtomValue(viewTypeAtom); const viewType = useAtomValue(viewTypeAtom);
const lensSize = useAtomValue(lensSizeAtom); const lensSize = useAtomValue(lensSizeAtom);
const rememberOutputFolder = useAtomValue(rememberOutputFolderAtom);
const { logit } = useLog(); const { logit } = useLog();
@ -275,19 +277,6 @@ const Home = () => {
} }
}, [news]); }, [news]);
// CONFIGURE SAVED OUTPUT PATH
useEffect(() => {
const rememberOutputFolder = localStorage.getItem("rememberOutputFolder");
const lastOutputFolderPath = localStorage.getItem("lastOutputFolderPath");
if (rememberOutputFolder === "true") {
logit("🧠 Recalling Output Folder: ", lastOutputFolderPath);
setOutputPath(lastOutputFolderPath);
} else {
setOutputPath("");
localStorage.removeItem("lastOutputFolderPath");
}
}, []);
// LOADING STATE // LOADING STATE
useEffect(() => { useEffect(() => {
setIsLoading(false); setIsLoading(false);
@ -340,8 +329,10 @@ const Home = () => {
var dirname = path.match(/(.*)[\/\\]/)[1] || ""; var dirname = path.match(/(.*)[\/\\]/)[1] || "";
logit("📁 Selected Image Directory: ", dirname); logit("📁 Selected Image Directory: ", dirname);
if (!featureFlags.APP_STORE_BUILD) { if (!featureFlags.APP_STORE_BUILD) {
if (!rememberOutputFolder) {
setOutputPath(dirname); setOutputPath(dirname);
} }
}
validateImagePath(path); validateImagePath(path);
}; };
@ -351,12 +342,16 @@ const Home = () => {
if (path !== null) { if (path !== null) {
logit("🖼 Selected Folder Path: ", path); logit("🖼 Selected Folder Path: ", path);
setBatchFolderPath(path); setBatchFolderPath(path);
if (!rememberOutputFolder) {
setOutputPath(path); setOutputPath(path);
}
} else { } else {
logit("🚫 Folder selection cancelled"); logit("🚫 Folder selection cancelled");
setBatchFolderPath(""); setBatchFolderPath("");
if (!rememberOutputFolder) {
setOutputPath(""); setOutputPath("");
} }
}
}; };
const handleModelChange = (e: any) => { const handleModelChange = (e: any) => {
@ -412,7 +407,11 @@ const Home = () => {
setImagePath(filePath); setImagePath(filePath);
var dirname = filePath.match(/(.*)[\/\\]/)[1] || ""; var dirname = filePath.match(/(.*)[\/\\]/)[1] || "";
logit("🗂 Setting output path: ", dirname); logit("🗂 Setting output path: ", dirname);
if (!featureFlags.APP_STORE_BUILD) setOutputPath(dirname); if (!featureFlags.APP_STORE_BUILD) {
if (!rememberOutputFolder) {
setOutputPath(dirname);
}
}
validateImagePath(filePath); validateImagePath(filePath);
} }
}; };
@ -433,22 +432,9 @@ const Home = () => {
setImagePath(filePath); setImagePath(filePath);
var dirname = filePath.match(/(.*)[\/\\]/)[1] || ""; var dirname = filePath.match(/(.*)[\/\\]/)[1] || "";
logit("🗂 Setting output path: ", dirname); logit("🗂 Setting output path: ", dirname);
if (!rememberOutputFolder) {
setOutputPath(dirname); setOutputPath(dirname);
} }
};
const outputHandler = async () => {
var path = await window.electron.invoke(COMMAND.SELECT_FOLDER);
if (path !== null) {
logit("🗂 Setting Output Path: ", path);
setOutputPath(path);
const rememberOutputFolder = localStorage.getItem("rememberOutputFolder");
if (rememberOutputFolder) {
logit("🧠 Remembering Output Folder: ", path);
localStorage.setItem("lastOutputFolderPath", path);
}
} else {
setOutputPath("");
} }
}; };
@ -564,7 +550,6 @@ const Home = () => {
selectImageHandler={selectImageHandler} selectImageHandler={selectImageHandler}
selectFolderHandler={selectFolderHandler} selectFolderHandler={selectFolderHandler}
handleModelChange={handleModelChange} handleModelChange={handleModelChange}
outputHandler={outputHandler}
upscaylHandler={upscaylHandler} upscaylHandler={upscaylHandler}
batchMode={batchMode} batchMode={batchMode}
setBatchMode={setBatchMode} setBatchMode={setBatchMode}
@ -674,7 +659,7 @@ const Home = () => {
)} )}
{/* BATCH UPSCALE DONE INFO */} {/* BATCH UPSCALE DONE INFO */}
{batchMode && upscaledBatchFolderPath.length > 0 && ( {batchMode && upscaledBatchFolderPath.length > 0 && (
<> <div className="z-50 flex flex-col items-center">
<p className="select-none py-4 font-bold text-base-content"> <p className="select-none py-4 font-bold text-base-content">
All done! All done!
</p> </p>
@ -684,7 +669,7 @@ const Home = () => {
> >
Open Upscayled Folder Open Upscayled Folder
</button> </button>
</> </div>
)} )}
<ImageOptions <ImageOptions
zoomAmount={zoomAmount} zoomAmount={zoomAmount}