diff --git a/assets/web/app.js b/assets/web/app.js index f3a7c77..539c63c 100644 --- a/assets/web/app.js +++ b/assets/web/app.js @@ -230,9 +230,21 @@ tavern.onscenelist = (list) => { if (tavern.admin) { row.innerHTML += ``; row.innerHTML += ``; + // TODO: Add a confirmation dialog + row.innerHTML += ``; } div.appendChild(row); } + // Add create scene button at the end + if (tavern.admin) { + let b = document.createElement('button'); + b.innerText = 'Create scene'; + b.onclick = () => { + document.getElementById('create-scene-title').value = ''; + document.getElementById('create-scene-popup').style.display = 'flex'; + } + div.appendChild(b); + } } tavern.onconnectedplayers = (connected) => { console.log(connected); @@ -380,4 +392,9 @@ function onMoveableDivMouseUp(e, id) { function showHideDiv(id) { let div = document.getElementById(id); div.style.display = div.style.display == 'none' ? 'flex' : 'none'; +} +function createSceneAndHidePopup() { + document.getElementById('create-scene-popup').style.display = 'none' + let title = document.getElementById('create-scene-title').value; + tavern.create_scene(title.value); } \ No newline at end of file diff --git a/assets/web/index.html b/assets/web/index.html index 51c0474..c2f9e67 100644 --- a/assets/web/index.html +++ b/assets/web/index.html @@ -69,6 +69,24 @@ +
diff --git a/assets/web/tavern.js b/assets/web/tavern.js index 84cd3d1..8e5132f 100644 --- a/assets/web/tavern.js +++ b/assets/web/tavern.js @@ -136,6 +136,10 @@ class Tavern { if (!this.connected || this.loggedIn) { return; } this.socket.send(JSON.stringify({ create_scene: { title: title } })); } + delete_scene = (scene) => { + if (!this.connected || this.loggedIn) { return; } + this.socket.send(JSON.stringify({ delete_scene: { scene: scene } })); + } shutdown = () => { if (!this.connected || this.loggedIn || !this.admin) { return; } this.socket.send(JSON.stringify('shutdown')); diff --git a/src/api/mod.rs b/src/api/mod.rs index 92cd4b6..e8e541c 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -53,6 +53,9 @@ pub enum Request { CreateScene { title: String, }, + DeleteScene { + scene: usize, + }, SetSceneGrid { scene: usize, grid_cell_size: f32, diff --git a/src/game/mod.rs b/src/game/mod.rs index 7860a2c..301a677 100644 --- a/src/game/mod.rs +++ b/src/game/mod.rs @@ -189,6 +189,10 @@ impl<'a, C: Character + Serialize + Deserialize<'a>, A: entry::GameEntry + Se }, ); } + /// Deletes a scene and returns true if the scene existed + pub fn delete_scene(&mut self, scene: usize) -> Option { + self.scenes.remove(&scene) + } pub fn scene_visible(&mut self, scene: usize, visible: bool) { if let Some(scene) = self.scenes.get_mut(&scene) { diff --git a/src/lib.rs b/src/lib.rs index 8ab90dd..ed41961 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -193,6 +193,18 @@ impl GameServer { _ = broadcast.send((SendTo::User(id), scenes)); } } + api::Request::DeleteScene { scene } => { + if self.is_admin(&id) { + if let Some(scene) = self.game.delete_scene(scene) { + if scene.visible_to_users { + // Only update the players if they knew the scene existed + _ = broadcast.send((SendTo::AllBut(id.clone()), self.get_scene_list(false))); + } + // but always update the admin + _ = broadcast.send((SendTo::User(id), self.get_scene_list(true))); + } + } + } api::Request::SetSceneGrid { grid_cell_size, grid_offset,