Skip to content

Commit be8fcc1

Browse files
authored
Merge pull request #60 from ardura/1.4.1
Update to 1.4.1
2 parents 5078333 + 5f71d76 commit be8fcc1

File tree

11 files changed

+369
-380
lines changed

11 files changed

+369
-380
lines changed

Cargo.lock

Lines changed: 1 addition & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "Actuate"
3-
version = "1.4.0"
3+
version = "1.4.1"
44
edition = "2021"
55
authors = ["Ardura <azviscarra@gmail.com>"]
66
license = "GPL-3.0-or-later"
@@ -21,9 +21,6 @@ lazy_static = "1.4.0"
2121
nih_plug = { git = "https://github.com/Ardura/nih-plug.git", rev = "ce77d8c6daeebcdcc15e84a178ddce617ee6a3d3", features = ["assert_process_allocs"] }
2222
nih_plug_egui = { git = "https://github.com/Ardura/nih-plug.git", rev = "ce77d8c6daeebcdcc15e84a178ddce617ee6a3d3" }
2323

24-
# egui_file fork for nih-plug/Actuate
25-
egui_file = { git = "https://github.com/Barugon/egui_file.git", rev = "28a242a7e921144e9ac442cc00fad6eca01b59e6" }
26-
2724
num-complex = "0.4.4"
2825
num-traits = "0.2.17"
2926
once_cell = "1.18.0"

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
# Actuate (Latest is v1.4.0)
1+
# Actuate (Latest is v1.4.1)
2+
23
A Subtractive and Additive Synthesizer, Sampler, and Granulizer built in Rust + Nih-Plug
34
Written by Ardura
45

src/actuate_gui.rs

Lines changed: 114 additions & 190 deletions
Large diffs are not rendered by default.

src/actuate_load_save_dialog.rs

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
use std::fs;
2+
use std::path::{Path, PathBuf};
3+
4+
use nih_plug::nih_log;
5+
use nih_plug_egui::egui::{self, Id, Ui, Vec2};
6+
7+
pub struct FileDialog {
8+
current_dir: PathBuf,
9+
selected: Option<PathBuf>,
10+
input_filename: String,
11+
pub open: bool,
12+
save_mode: bool,
13+
result: Option<PathBuf>,
14+
id: Id,
15+
}
16+
17+
impl FileDialog {
18+
pub fn new(start_path: PathBuf, save_mode: bool) -> Self {
19+
let dir = if start_path.is_dir() {
20+
start_path
21+
} else {
22+
start_path.parent().unwrap_or(Path::new(".")).to_path_buf()
23+
};
24+
25+
FileDialog {
26+
current_dir: dir,
27+
selected: None,
28+
input_filename: String::new(),
29+
open: true,
30+
save_mode,
31+
result: None,
32+
id: egui::Id::new(format!("file_dialog_{}", rand::random::<u64>()))
33+
}
34+
}
35+
36+
pub fn show(&mut self, ctx: &egui::Context) -> Option<PathBuf> {
37+
let mut result = None;
38+
39+
if self.open {
40+
egui::Window::new(if self.save_mode { "Save File" } else { "Open File" })
41+
.collapsible(false)
42+
.resizable(true)
43+
.id(self.id)
44+
.max_size(Vec2::new(800.0,480.0))
45+
.show(ctx, |ui| {
46+
self.ui_contents(ui);
47+
48+
ui.separator();
49+
50+
ui.horizontal(|ui| {
51+
if ui.button("Cancel").clicked() {
52+
self.open = false;
53+
self.selected = None;
54+
// Kind of jank, but it works with the structure outside this
55+
Some(PathBuf::new());
56+
}
57+
58+
if self.save_mode {
59+
if ui.button("Save").clicked() {
60+
if !self.input_filename.is_empty() {
61+
let path = self.current_dir.join(&self.input_filename);
62+
nih_log!("Path: {:?}", path.clone());
63+
self.result = Some(path.clone());
64+
result = Some(path);
65+
self.selected = None;
66+
nih_log!("Filename: {:?}", self.input_filename);
67+
}
68+
}
69+
} else {
70+
if ui.button("Open").clicked() {
71+
if let Some(sel) = &self.selected {
72+
self.result = Some(sel.clone());
73+
result = Some(sel.clone());
74+
self.selected = None;
75+
}
76+
}
77+
}
78+
});
79+
});
80+
}
81+
82+
if self.result.is_some() {
83+
let r = self.result.clone();
84+
self.result = None;
85+
return r;
86+
}
87+
88+
result
89+
}
90+
91+
fn ui_contents(&mut self, ui: &mut Ui) {
92+
ui.label(format!("Current directory: {}", self.current_dir.display()));
93+
94+
// List directory contents
95+
let mut entries: Vec<PathBuf> = Vec::new();
96+
let mut cloned_back_dir = self.current_dir.clone();
97+
cloned_back_dir.pop();
98+
entries.push(cloned_back_dir);
99+
100+
let main_entries = fs::read_dir(&self.current_dir)
101+
.map(|rd| {
102+
rd.filter_map(|e| e.ok())
103+
.map(|e| e.path())
104+
.collect::<Vec<_>>()
105+
})
106+
.unwrap_or_default();
107+
108+
for entry in main_entries {
109+
entries.push(entry);
110+
}
111+
112+
egui::ScrollArea::vertical()
113+
.max_height(480.0)
114+
.show(ui, |ui| {
115+
for entry in entries {
116+
let is_dir = entry.is_dir();
117+
let name = entry.file_name().unwrap_or_default().to_string_lossy();
118+
119+
if is_dir {
120+
if ui.button(format!("[{}]", name)).clicked() {
121+
self.current_dir = entry;
122+
self.selected = None;
123+
}
124+
} else {
125+
let selected = self.selected.as_ref() == Some(&entry);
126+
if ui.selectable_label(selected, name).clicked() {
127+
self.selected = Some(entry.clone());
128+
self.input_filename =
129+
entry.file_name().unwrap_or_default().to_string_lossy().into();
130+
}
131+
}
132+
}
133+
});
134+
135+
if self.save_mode {
136+
ui.separator();
137+
ui.label("File name:");
138+
ui.scope(|ui| {
139+
ui.push_id("file_name_input", |ui| {
140+
ui.text_edit_singleline(&mut self.input_filename);
141+
});
142+
});
143+
//ui.text_edit_singleline(&mut self.input_filename);
144+
}
145+
}
146+
}

0 commit comments

Comments
 (0)