Skip to content

Commit

Permalink
async commands & quilt creation status updates
Browse files Browse the repository at this point in the history
  • Loading branch information
transcental committed Dec 8, 2024
1 parent 90d1235 commit 66ce50c
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 27 deletions.
56 changes: 43 additions & 13 deletions src-tauri/src/commands.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
use image::{GenericImageView, ImageBuffer};
use serde::Serialize;
use std::{fs, path::Path};
use tauri::{AppHandle, Emitter};

#[derive(Serialize)]
pub struct FilesMap {
files: Vec<String>,
folder: String,
}
use crate::{FilesMap, QuiltStatus, QuiltStatusState};

#[tauri::command]
#[tauri::command(async)]
pub fn check_folder(path: String) -> FilesMap {
let files = fs::read_dir(path.clone()).unwrap();
let mut unwanted_files: Vec<String> = vec![];
Expand All @@ -29,14 +25,14 @@ pub fn check_folder(path: String) -> FilesMap {
files_map.into()
}

#[tauri::command]
#[tauri::command(async)]
pub fn delete_file(folder: &str, filename: String) {
let path = std::path::Path::new(folder).join(&filename);
let path = path.to_str().unwrap();
fs::remove_file(path).unwrap();
}

#[tauri::command]
#[tauri::command(async)]
pub fn move_file(folder: &str, filename: String, destination: &str) {
let path = std::path::Path::new(folder).join(&filename);
let path = path.to_str().unwrap();
Expand All @@ -45,7 +41,7 @@ pub fn move_file(folder: &str, filename: String, destination: &str) {
fs::rename(path, destination).unwrap();
}

#[tauri::command]
#[tauri::command(async)]
pub fn delete_move_files_in_folder(folder: String, files: Vec<String>, delete: bool) {
if !delete {
let parent_folder = std::path::Path::new(&folder).parent().unwrap();
Expand All @@ -62,7 +58,7 @@ pub fn delete_move_files_in_folder(folder: String, files: Vec<String>, delete: b
}
}

#[tauri::command]
#[tauri::command(async)]
pub fn sort_files(frame_folders: Vec<String>, final_folder: String, views: usize) {
println!("Folders: {:?}", frame_folders);
let no_of_folders: usize = frame_folders.len();
Expand Down Expand Up @@ -97,8 +93,14 @@ pub fn sort_files(frame_folders: Vec<String>, final_folder: String, views: usize
}
}

#[tauri::command]
pub fn make_quilt(sorted_folder: String, output_folder: String, columns: usize, rows: usize) {
#[tauri::command(async)]
pub fn make_quilt(
app: AppHandle,
sorted_folder: String,
output_folder: String,
columns: usize,
rows: usize,
) {
let quilt_size = columns * rows;

let mut quilt_layout: Vec<Vec<String>> = vec![vec!['-'.to_string(); columns]; rows];
Expand All @@ -112,6 +114,16 @@ pub fn make_quilt(sorted_folder: String, output_folder: String, columns: usize,
dir.sort_by(|a, b| a.file_name().unwrap().cmp(b.file_name().unwrap()));
let no_of_quilts = dir.len() / quilt_size;

app.emit(
"quilt_status",
QuiltStatus {
amount: no_of_quilts,
index: 0,
status: QuiltStatusState::InProgress,
},
)
.unwrap();

for quilt_i in 0..no_of_quilts {
for i in 0..quilt_size {
let filename = dir[i + quilt_size * quilt_i].to_str().unwrap().to_string();
Expand Down Expand Up @@ -165,5 +177,23 @@ pub fn make_quilt(sorted_folder: String, output_folder: String, columns: usize,
// flip the quilt vertically
let quilt = image::imageops::flip_vertical(&quilt);
quilt.save(&output_path).unwrap();
app.emit(
"quilt_status",
QuiltStatus {
amount: no_of_quilts,
index: quilt_i + 1,
status: QuiltStatusState::InProgress,
},
)
.unwrap();
}
app.emit(
"quilt_status",
QuiltStatus {
amount: no_of_quilts,
index: no_of_quilts,
status: QuiltStatusState::Finished,
},
)
.unwrap();
}
21 changes: 21 additions & 0 deletions src-tauri/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,26 @@
// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
mod commands;
use serde::Serialize;

#[derive(Serialize)]
pub struct FilesMap {
files: Vec<String>,
folder: String,
}

#[derive(Clone, Serialize)]
enum QuiltStatusState {
InProgress,
Finished,
}

#[derive(Clone, Serialize)]
#[serde(rename_all = "camelCase")]
struct QuiltStatus {
amount: usize,
index: usize,
status: QuiltStatusState,
}

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
Expand Down
49 changes: 35 additions & 14 deletions src/routes/create-quilt/+page.svelte
Original file line number Diff line number Diff line change
@@ -1,25 +1,43 @@
<script lang="ts">
import { invoke } from "@tauri-apps/api/core";
import { listen } from "@tauri-apps/api/event";
import { DISPLAYS, type DisplayInfo } from "../../utils";
import Dropdown from "../../components/dropdown.svelte";
import FolderInput from "../../components/folderInput.svelte";
import Button from "../../components/button.svelte";
type Folder =
| { path: string; status: "checking" | "ok"; unwantedFiles?: never }
| {
path: string;
status: "empty" | "checking" | "ok";
unwantedFiles?: never;
}
| { path: string; status: "error"; unwantedFiles: string[] };
type FilesMap = {
files: string[];
folder: string;
};
let quiltStatus: "unstarted" | "making" | "made" = $state("unstarted");
type QuiltStatusState = "NotStarted" | "InProgress" | "Finished";
type QuiltStatus = {
status: QuiltStatusState;
amount: number;
index: number;
};
let quiltStatus: QuiltStatus = $state({
status: "NotStarted",
amount: 0,
index: 0,
});
let sortedFolder: Folder = $state({
path: "",
status: "checking",
status: "empty",
});
let quiltFolder: string = $state("");
let views: DisplayInfo = $state(DISPLAYS[0]);
Expand Down Expand Up @@ -78,16 +96,17 @@
};
const makeQuilt = () => {
quiltStatus = "making";
invoke("make_quilt", {
sortedFolder: sortedFolder.path,
outputFolder: quiltFolder,
columns: views.layout[0],
rows: views.layout[1],
}).then((res: unknown) => {
quiltStatus = "made";
});
};
listen<QuiltStatus>("quilt_status", (event) => {
quiltStatus = event.payload;
});
</script>

<a href="/" class="home" aria-label="Home">
Expand Down Expand Up @@ -186,17 +205,19 @@
disabled={sortedFolder.status !== "ok" ||
!quiltFolder ||
!views ||
quiltStatus !== "unstarted"}
quiltStatus.status !== "NotStarted"}
onClick={makeQuilt}
ariaLabel="Sort Files"
ariaLabel="Create Quilts"
>
{#if quiltStatus === "unstarted"}
<strong>Sort Files</strong>
{:else if quiltStatus === "making"}
{#if quiltStatus.status === "NotStarted"}
<strong>Create Quilts</strong>
{:else if quiltStatus.status === "InProgress"}
<div class="loader"></div>
<strong>Sorting Files</strong>
{:else if quiltStatus === "made"}
<strong>Files Sorted</strong>
<strong
>Creating Quilts ({quiltStatus.index}/{quiltStatus.amount})</strong
>
{:else if quiltStatus.status === "Finished"}
<strong>Quilts Created</strong>
{/if}
</Button>
</div>
Expand Down

0 comments on commit 66ce50c

Please sign in to comment.