Add clear scene button to web app

This commit is contained in:
Matthew Gordon 2025-06-10 12:41:38 -03:00
parent 4d1a333414
commit 37a8ca5440
5 changed files with 37 additions and 5 deletions

View File

@ -152,6 +152,7 @@ impl MvuApp<Model> for App {
match event { match event {
Event::MouseButtonPressed => model, Event::MouseButtonPressed => model,
Event::OpenTestFile(file_path) => open_test_file(file_path, model.clone()), Event::OpenTestFile(file_path) => open_test_file(file_path, model.clone()),
Event::ClearScene => clear_scene(model.clone()),
} }
} }
@ -171,6 +172,8 @@ impl MvuApp<Model> for App {
&context.queue, &context.queue,
)) ))
} }
} else {
context.scene_data = None;
} }
let frame = context let frame = context
@ -222,3 +225,10 @@ fn open_test_file(file: Box<dyn File>, model: Rc<Model>) -> Rc<Model> {
let dem = Some(Rc::new(raster::Dem::load_from_image(file))); let dem = Some(Rc::new(raster::Dem::load_from_image(file)));
Rc::new(Model { dem, ..*model }) Rc::new(Model { dem, ..*model })
} }
fn clear_scene(model: Rc<Model>) -> Rc<Model> {
Rc::new(Model {
dem: None,
..*model
})
}

View File

@ -15,6 +15,7 @@ impl File for std::io::Cursor<Vec<u8>> {}
pub enum Event { pub enum Event {
MouseButtonPressed, MouseButtonPressed,
OpenTestFile(Box<dyn File>), OpenTestFile(Box<dyn File>),
ClearScene,
} }
#[derive(Debug, Clone, Copy)] #[derive(Debug, Clone, Copy)]

View File

@ -112,6 +112,16 @@ impl PteropusCanvas {
.await; .await;
} }
#[wasm_bindgen]
pub async fn clear_scene(&mut self) {
self.model = self
.app
.lock()
.expect("get app mutex")
.update(Rc::clone(&self.model), Event::ClearScene)
.await;
}
pub fn get_canvas(&self) -> HtmlCanvasElement { pub fn get_canvas(&self) -> HtmlCanvasElement {
let window = web_sys::window().expect("get window"); let window = web_sys::window().expect("get window");
let document = window.document().expect("get HTML document"); let document = window.document().expect("get HTML document");

View File

@ -10,7 +10,8 @@
<script type="module" src="pteropus-frame.js"></script> <script type="module" src="pteropus-frame.js"></script>
<canvas id="pteropus-canvas"></canvas> <canvas id="pteropus-canvas"></canvas>
<div id="bottom-panel"> <div id="bottom-panel">
<input type="file" id="file-upload-file-input" name="filename" accept="image/tiff, .tif, .tiff"> <input type="file" id="file-upload-file-input" accept="image/tiff, .tif, .tiff">
<button id="clear-scene-button">Clear Scene</button>
</div> </div>
</div> </div>
</body> </body>

View File

@ -11,6 +11,7 @@ async function run() {
let test_file_data = null; let test_file_data = null;
let needs_resize = true; let needs_resize = true;
let clear_scene = false;
let mainCanvas = document.getElementById("pteropus-canvas"); let mainCanvas = document.getElementById("pteropus-canvas");
mainCanvas.addEventListener("drop", async (event) => { mainCanvas.addEventListener("drop", async (event) => {
@ -31,9 +32,22 @@ async function run() {
} }
}); });
let clearSceneButton = document.getElementById("clear-scene-button");
clearSceneButton.addEventListener("click", () => {
clear_scene = true;
});
while(true) while(true)
{ {
await pteropus.render(); await pteropus.render();
if(needs_resize) {
await pteropus.on_resize();
needs_resize = false;
}
if(clear_scene) {
await pteropus.clear_scene();
clear_scene = false;
}
// TODO: I really want to do this asynchronously, with the drop // TODO: I really want to do this asynchronously, with the drop
// event listener calling pteropus_load_file directly, but I need // event listener calling pteropus_load_file directly, but I need
// to figure out how to get that to work. // to figure out how to get that to work.
@ -41,10 +55,6 @@ async function run() {
await pteropus.load_file(test_file_data); await pteropus.load_file(test_file_data);
test_file_data = null test_file_data = null
} }
if(needs_resize) {
await pteropus.on_resize();
needs_resize = false;
}
await new Promise(requestAnimationFrame); await new Promise(requestAnimationFrame);
} }
} }