Skip to content

Commit b3f5ffe

Browse files
committed
Merge branch 'dev'
2 parents 5b7b26c + 547fd5a commit b3f5ffe

File tree

8 files changed

+141
-66
lines changed

8 files changed

+141
-66
lines changed

src-tauri/src/editor.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ pub fn find_editor_installs(app_state: &tauri::State<AppState>) -> anyhow::Resul
141141
Ok(editors)
142142
}
143143

144-
pub fn open(editor_version: String, arguments: Vec<String>, app_state: &tauri::State<AppState>) -> anyhow::Result<(), errors::AnyError> {
144+
pub fn open(editor_version: String, arguments: Vec<String>, app_state: &tauri::State<AppState>, wait: bool) -> anyhow::Result<(), errors::AnyError> {
145145
let editor = app_state.editors.lock()
146146
.map_err(|_| errors::str_error("Failed to get editors. Is it locked?"))?
147147
.iter()
@@ -151,9 +151,15 @@ pub fn open(editor_version: String, arguments: Vec<String>, app_state: &tauri::S
151151

152152
let exe_path = editor.exe_path;
153153

154-
std::process::Command::new(&exe_path)
155-
.args(arguments)
156-
.spawn()?;
154+
if wait {
155+
std::process::Command::new(&exe_path)
156+
.args(arguments)
157+
.output()?;
158+
} else {
159+
std::process::Command::new(&exe_path)
160+
.args(arguments)
161+
.spawn()?;
162+
}
157163

158164
Ok(())
159165
}

src-tauri/src/generate.rs

Lines changed: 80 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ use std::{collections::HashMap, path::PathBuf};
22

33
use flate2::{read::GzDecoder, write::GzEncoder};
44

5-
use crate::{app::{self, AppState}, editor::UnityEditorInstall, errors, io_utils, package::{self, MinimalPackage}, template::SurfaceTemplate};
5+
use crate::{app::{self, AppState}, editor::{self, UnityEditorInstall}, errors, io_utils, package::{self, MinimalPackage}, template::SurfaceTemplate};
66

77
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
88
#[serde(rename_all = "camelCase")]
99
pub struct TemplateInfoForGeneration {
1010
template: Option<SurfaceTemplate>,
1111
editor_version: UnityEditorInstall,
1212
packages: Vec<MinimalPackage>,
13-
selected_files: Vec<PathBuf>
13+
selected_files: Vec<PathBuf>,
14+
is_empty: bool
1415
}
1516

1617
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
@@ -31,39 +32,74 @@ pub struct NewTemplateInfo {
3132
}
3233

3334
// generate a new project from a template + info
34-
pub fn generate_project(app: &tauri::AppHandle, project_info: &ProjectInfoForGeneration, template_info: &TemplateInfoForGeneration) -> Result<PathBuf, errors::AnyError> {
35+
pub fn generate_project(app: &tauri::AppHandle, app_state: &tauri::State<'_, AppState>, project_info: &ProjectInfoForGeneration, template_info: &TemplateInfoForGeneration) -> Result<PathBuf, errors::AnyError> {
3536
let package_cache_dir_out = &project_info.path.join(project_info.name.clone());
3637
if package_cache_dir_out.exists() {
3738
return Err(errors::str_error(format!("Project already exists at {}", package_cache_dir_out.display()).as_str()));
3839
}
39-
40+
4041
let package_cache_dir = io_utils::get_cache_appended_dir(app, "new_project_package");
41-
unpack_package_into_cache(&package_cache_dir, &template_info)?;
42-
modify_package_json(&package_cache_dir, &template_info.packages, &package_cache_dir_out)?;
42+
if template_info.is_empty {
43+
// make a new project
44+
// copy entire project over
45+
// modify manifest
46+
47+
let editor_version = &template_info.editor_version.version;
48+
let package_cache_dir_out_str = package_cache_dir_out
49+
.to_str()
50+
.ok_or(errors::str_error("Failed to convert path to string"))?
51+
.to_string();
52+
// let tmp_path = package_cache_dir
53+
// .join("project")
54+
// .join("ProjectData~")
55+
// .to_str()
56+
// .ok_or(errors::str_error("Failed to convert path to string"))?
57+
// .to_string();
58+
let args = vec!["-createProject".to_string(), package_cache_dir_out_str, "-quit".to_string()];
59+
editor::open(editor_version.clone(), args, &app_state, true)?;
60+
61+
let packages_dir = package_cache_dir_out
62+
.join("Packages");
63+
modify_package_json(&packages_dir, &template_info.packages, &package_cache_dir_out)?;
64+
} else {
65+
let packages_dir = package_cache_dir
66+
.join("package")
67+
.join("ProjectData~")
68+
.join("Packages");
69+
70+
unpack_package_into_cache(&package_cache_dir, &template_info)?;
71+
modify_package_json(&packages_dir, &template_info.packages, &package_cache_dir_out)?;
72+
}
4373

4474
// create project directory
45-
std::fs::create_dir(&package_cache_dir_out)?;
46-
std::fs::create_dir(&package_cache_dir_out.join("Assets"))?;
75+
std::fs::create_dir_all(&package_cache_dir_out.join("Assets"))?;
76+
std::fs::create_dir_all(&package_cache_dir_out.join("ProjectSettings"))?;
77+
std::fs::create_dir_all(&package_cache_dir_out.join("Packages"))?;
4778

4879
// copy contents from ProjectData~ to output
4980
let project_data_root = PathBuf::from("package").join("ProjectData~");
50-
for file in template_info.selected_files.iter().filter(|x| x.starts_with(&project_data_root)) {
51-
let trimmed_file = file.strip_prefix(&project_data_root)
52-
.map_err(|_| errors::str_error("Failed to strip prefix"))?;
53-
let from = package_cache_dir.join(file);
54-
let dest = package_cache_dir_out.join(trimmed_file);
55-
println!("Copying {} to {}", from.display(), dest.display());
56-
57-
if dest.extension().is_none() {
58-
println!("Creating directory dest: {}", dest.display());
81+
82+
if !template_info.is_empty {
83+
for file in template_info.selected_files.iter().filter(|x| x.starts_with(&project_data_root)) {
84+
let trimmed_file = file.strip_prefix(&project_data_root)
85+
.map_err(|_| errors::str_error("Failed to strip prefix"))?;
86+
let from = package_cache_dir.join(file);
87+
let dest = package_cache_dir_out.join(trimmed_file);
88+
println!("Copying {} to {}", from.display(), dest.display());
89+
5990
std::fs::create_dir_all(&dest)?;
60-
} else {
61-
println!("Creating directory parent: {} for {}", dest.parent().unwrap().display(), dest.display());
62-
std::fs::create_dir_all(dest.parent().unwrap())?;
63-
if let Err(err) = std::fs::copy(&from, &dest) {
64-
println!("Failed to copy from {} to {}: {}", from.display(), dest.display(), err);
91+
92+
if dest.extension().is_none() {
93+
println!("Creating directory dest: {}", dest.display());
94+
// std::fs::create_dir_all(&dest)?;
95+
} else {
96+
println!("Creating directory parent: {} for {}", dest.parent().unwrap().display(), dest.display());
97+
// std::fs::create_dir_all(dest.parent().unwrap())?;
98+
if let Err(err) = std::fs::copy(&from, &dest) {
99+
println!("Failed to copy from {} to {}: {}", from.display(), dest.display(), err);
100+
}
65101
}
66-
}
102+
}
67103
}
68104

69105
// remove cache
@@ -201,6 +237,13 @@ pub fn generate_template(app: &tauri::AppHandle, app_state: &tauri::State<AppSta
201237
}
202238

203239
fn unpack_package_into_cache(output: &PathBuf, template_info: &TemplateInfoForGeneration) -> Result<(), errors::AnyError> {
240+
if template_info.template.is_none() {
241+
let package_path = output.join("package");
242+
std::fs::create_dir_all(&package_path)?;
243+
244+
return Ok(());
245+
}
246+
204247
let template = template_info.template
205248
.as_ref()
206249
.ok_or(errors::str_error("Template not found"))?
@@ -217,17 +260,15 @@ fn unpack_package_into_cache(output: &PathBuf, template_info: &TemplateInfoForGe
217260
Ok(())
218261
}
219262

220-
fn modify_package_json(package_cache_dir: &PathBuf, packages: &Vec<MinimalPackage>, output_path: &PathBuf) -> Result<(), errors::AnyError> {
263+
fn modify_package_json(json_root: &PathBuf, packages: &Vec<MinimalPackage>, output_path: &PathBuf) -> Result<(), errors::AnyError> {
221264
// modify package.json for dependencies
222-
let packages_dir = package_cache_dir
223-
.join("package")
224-
.join("ProjectData~")
225-
.join("Packages");
226-
let manifest_json = packages_dir
265+
std::fs::create_dir_all(&json_root)?;
266+
267+
let manifest_json = json_root
227268
.join("manifest")
228269
.with_extension("json");
229270

230-
let packages_lock_json = packages_dir
271+
let packages_lock_json = json_root
231272
.join("packages-lock")
232273
.with_extension("json");
233274

@@ -249,7 +290,13 @@ fn modify_package_json(package_cache_dir: &PathBuf, packages: &Vec<MinimalPackag
249290
println!("Local packages: {:?}", local_packages);
250291
println!("Rest packages: {:?}", rest_packages);
251292

252-
let manifest_json_contents = std::fs::read_to_string(&manifest_json)?;
293+
let manifest_json_contents = {
294+
if !manifest_json.exists() {
295+
"{}".to_string()
296+
} else {
297+
std::fs::read_to_string(&manifest_json)?
298+
}
299+
};
253300
let mut manifest_json_contents: HashMap<String, serde_json::Value>
254301
= serde_json::from_str(&manifest_json_contents)?;
255302

@@ -309,8 +356,8 @@ fn modify_package_json(package_cache_dir: &PathBuf, packages: &Vec<MinimalPackag
309356
// commands
310357

311358
#[tauri::command]
312-
pub async fn cmd_generate_project(app: tauri::AppHandle, project_info: ProjectInfoForGeneration, template_info: TemplateInfoForGeneration) -> Result<PathBuf, errors::AnyError> {
313-
let output = generate_project(&app, &project_info, &template_info)?;
359+
pub async fn cmd_generate_project(app: tauri::AppHandle, app_state: tauri::State<'_, AppState>, project_info: ProjectInfoForGeneration, template_info: TemplateInfoForGeneration) -> Result<PathBuf, errors::AnyError> {
360+
let output = generate_project(&app, &app_state, &project_info, &template_info)?;
314361
Ok(output)
315362
}
316363

src-tauri/src/project.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ pub fn cmd_open_project_in_editor(app_state: tauri::State<AppState>, project_pat
175175
.to_string();
176176

177177
let args = vec!["-projectPath".to_string(), project_path_str];
178-
crate::editor::open(editor_version, args, &app_state)?;
178+
crate::editor::open(editor_version, args, &app_state, false)?;
179179

180180
Ok(())
181181
}

src/context/new-project-context.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,9 @@ export namespace NewProjectContext {
163163
| { type: "add_git_package"; package: { id: string; url: string } }
164164
| { type: "add_local_package"; package: { path: string } }
165165
| { type: "remove_git_package"; package: TauriTypes.MinimalPackage }
166-
| { type: "remove_local_package"; package: TauriTypes.MinimalPackage };
166+
| { type: "remove_local_package"; package: TauriTypes.MinimalPackage }
167+
| { type: "set_git_packages"; packages: TauriTypes.MinimalPackage[] }
168+
| { type: "set_local_packages"; packages: TauriTypes.MinimalPackage[] };
167169

168170
const reducer = (state: State, action: Action): State => {
169171
switch (action.type) {
@@ -298,6 +300,22 @@ export namespace NewProjectContext {
298300
description: action.description,
299301
},
300302
};
303+
case "set_git_packages":
304+
return {
305+
...state,
306+
packageInfo: {
307+
...state.packageInfo,
308+
gitPackages: action.packages,
309+
},
310+
};
311+
case "set_local_packages":
312+
return {
313+
...state,
314+
packageInfo: {
315+
...state.packageInfo,
316+
localPackages: action.packages,
317+
},
318+
};
301319
case "add_git_package":
302320
return {
303321
...state,

src/utils/tauri-types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ export namespace TauriTypes {
155155
editorVersion: UnityEditorInstall;
156156
packages: MinimalPackage[];
157157
selectedFiles: string[]; // PathBuf is usually represented as a string in TS
158+
isEmpty: boolean;
158159
}
159160

160161
export interface ProjectInfoForGeneration {

src/views/new-project/basic-info-view.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,8 @@ export function NewProjectOverview(props: {
193193
<span className="ml-auto">{packageInfo.selectedPackages.length}</span>
194194
</div>
195195
{packageInfo.selectedPackages.map((p) => (
196-
<p key={p} className="text-stone-400 w-full pl-4">
197-
- {p}
196+
<p key={p.name + p.version} className="text-stone-400 w-full pl-4">
197+
- {p.name} @ {p.version}
198198
</p>
199199
))}
200200

src/views/new-project/new-project-body.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ export default function NewProjectBody() {
7878
"package/package.json.meta",
7979
...trimmedPaths,
8080
],
81+
isEmpty: false,
8182
};
8283
const template: TauriTypes.NewTemplateInfo = {
8384
template: templateInfo,
@@ -141,6 +142,7 @@ export default function NewProjectBody() {
141142
)
142143
),
143144
selectedFiles: trimmedPaths,
145+
isEmpty: template.selectedTemplate === undefined,
144146
};
145147
const projectInfo: TauriTypes.ProjectInfoForGeneration = {
146148
name: basicInfo.name,

src/views/new-project/package-view.tsx

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -40,28 +40,35 @@ export default function PackageView() {
4040
}))
4141
)
4242
.then(async (x) => {
43-
const p = await TauriRouter.get_user_cache();
44-
const gitPackages = p.gitPackages.map((x) => ({
45-
package_: x,
46-
category: "Git",
47-
}));
48-
49-
const localPackages = p.localPackages.map((x) => ({
50-
package_: x,
51-
category: "Local",
52-
}));
53-
return [...x, ...gitPackages, ...localPackages];
43+
return [...x];
5444
});
5545

5646
minimalPackages.set({
5747
status: "success",
58-
// value: newMinimalPackages.filter((x) => x.isFile),
59-
// value: newMinimalPackages.map((x) => ({
60-
// package_: x,
61-
// category: "Internal",
62-
// })),
6348
value: newMinimalPackages,
6449
});
50+
51+
const p = await TauriRouter.get_user_cache();
52+
53+
const gitPackages = p.gitPackages.map((x) => ({
54+
package_: x,
55+
category: "Git",
56+
}));
57+
58+
const localPackages = p.localPackages.map((x) => ({
59+
package_: x,
60+
category: "Local",
61+
}));
62+
63+
newProjectContext.dispatch({
64+
type: "set_git_packages",
65+
packages: gitPackages.map((x) => x.package_),
66+
});
67+
68+
newProjectContext.dispatch({
69+
type: "set_local_packages",
70+
packages: localPackages.map((x) => x.package_),
71+
});
6572
};
6673
load();
6774
}, []);
@@ -96,12 +103,6 @@ export default function PackageView() {
96103
} else {
97104
selectPackage(name, version);
98105
}
99-
100-
// if (packages.includes(x)) {
101-
// removePackage(x);
102-
// } else {
103-
// selectPackage(x);
104-
// }
105106
}
106107

107108
const queriedPackages = useMemo(() => {
@@ -335,12 +336,12 @@ function GitAdd(props: {
335336
});
336337

337338
props.selectPackage(name, version);
339+
340+
gitPackageJson.set("");
338341
} catch (e) {
339342
console.error(e);
340343
return;
341344
}
342-
343-
gitPackageJson.set("");
344345
}
345346
}
346347

@@ -587,7 +588,7 @@ function Package({
587588
<p className="flex basis-full text-stone-50 select-none">
588589
{package_.package_.name}{" "}
589590
<span
590-
className={`ml-auto ${
591+
className={`ml-auto text-right ${
591592
selected ? "text-stone-50" : "text-stone-400"
592593
}`}
593594
>

0 commit comments

Comments
 (0)