merge main

This commit is contained in:
end-4
2026-04-05 23:20:10 +02:00
5 changed files with 107 additions and 54 deletions
@@ -0,0 +1,52 @@
pragma ComponentBehavior: Bound
import QtQuick
import Quickshell
import qs.modules.common.functions
import qs.modules.common.utils
import qs.services
import qs.modules.common
import ".."
NestableObject {
id: root
enum State {
Done, Preparing, Processing, Error
}
signal finished()
signal error(message: string)
property int errorCode
property string errorMessage: ""
property var outputData
property var state: GCloudApi.State.Done
function resetState() {
root.state = GCloudApi.State.Done;
root.errorMessage = "";
root.outputData = undefined;
}
function handleApiOutput(out: string): bool {
try {
root.outputData = JSON.parse(out);
if (outputData.error) {
print("API error: " + JSON.stringify(outputData.error, null, 2))
root.state = GCloudApi.State.Error;
root.errorCode = outputData.error.code;
root.errorMessage = outputData.error.message;
root.error(outputData.error.message);
return false;
}
root.finished();
root.state = GCloudApi.State.Done;
return true
} catch (e) {
print("Failed to parse API response: " + e + "\n" + out)
root.state = GCloudApi.State.Error;
root.errorMessage = "Failed to parse API response";
root.error(root.errorMessage);
return false;
}
}
}
@@ -5,17 +5,9 @@ import qs.modules.common.utils
import qs.services
import ".."
NestableObject {
GCloudApi {
id: root
enum State {
Done, Preparing, Processing
}
signal finished()
property var outputData
property var state: GCloudTranslate.State.Done
property list<string> pendingStrings
property bool setupReady: false
readonly property bool preparationReady: GoogleCloud.tokenReady && setupReady
@@ -24,13 +16,13 @@ NestableObject {
GoogleCloud.load();
root.setupReady = false;
root.pendingStrings = strings;
root.state = GCloudTranslate.State.Preparing;
root.state = GCloudApi.State.Preparing;
root.setupReady = true;
}
onPreparationReadyChanged: {
if (!preparationReady) return;
root.state = GCloudTranslate.State.Processing;
root.state = GCloudApi.State.Processing;
const targetLang = Translation.languageCode;
const payload = {
@@ -53,11 +45,7 @@ NestableObject {
]);
seq.push(((out) => {
// print(out)
root.outputData = JSON.parse(out);
root.pendingStrings = [];
root.finished();
root.state = GCloudTranslate.State.Done;
root.handleApiOutput(out);
}));
multiproc.runSequence(seq);
@@ -7,18 +7,9 @@ import qs.services
import qs.modules.common
import ".."
NestableObject {
GCloudApi {
id: root
enum State {
Done, Uploading, Processing, Error
}
signal finished()
signal error()
property var outputData
property var state: GCloudVision.State.Done
readonly property string imageBase64FilePath: `${Directories.screenshotTemp}/vision_base64.txt`
readonly property string payloadFilePath: `${Directories.screenshotTemp}/vision_payload.json`
property string uploadEndpoint: "https://uguu.se/upload"
@@ -28,7 +19,8 @@ NestableObject {
readonly property bool preparationReady: tokenReady && onlineImageReady
function annotateImage(imageUri: string) {
root.state = GCloudVision.State.Uploading;
resetState();
root.state = GCloudApi.State.Preparing;
root.onlineImageReady = false
GoogleCloud.load();
@@ -49,11 +41,11 @@ NestableObject {
onPreparationReadyChanged: {
if (!preparationReady) return;
if (GoogleCloud.tokenError || GoogleCloud.keyError) {
root.state = GCloudVision.State.Error;
root.error();
root.state = GCloudApi.State.Error;
root.error(Translation.tr("Set your Google Cloud service account key"));
return;
}
root.state = GCloudVision.State.Processing;
root.state = GCloudApi.State.Processing;
var seq = []; // command sequence
// Construct the JSON payload using jq to read from the base64 file
@@ -75,9 +67,7 @@ https://vision.googleapis.com/v1/images:annotate \
]);
seq.push((out) => {
root.outputData = JSON.parse(out);
root.finished();
root.state = GCloudVision.State.Done;
root.handleApiOutput(out);
});
lookMultiproc.runSequence(seq);