From 3126966e9cc0ca10378946e62950f6d38c8ce180 Mon Sep 17 00:00:00 2001
From: databasedav <31483365+databasedav@users.noreply.github.com>
Date: Fri, 13 Sep 2024 01:12:48 -0700
Subject: [PATCH] add component hook for unfocusing widget on despawn (#159)

* cosmic buffer on remove unfocus hook

* fmt

---------

Co-authored-by: Dimchikkk <111751109+Dimchikkk@users.noreply.github.com>
---
 src/buffer.rs | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/buffer.rs b/src/buffer.rs
index 69f90f8..6ef7451 100644
--- a/src/buffer.rs
+++ b/src/buffer.rs
@@ -1,5 +1,9 @@
 use crate::*;
-use bevy::{prelude::*, window::PrimaryWindow};
+use bevy::{
+    ecs::component::{ComponentHooks, StorageType},
+    prelude::*,
+    window::PrimaryWindow,
+};
 use cosmic_text::{Attrs, AttrsOwned, Buffer, Edit, FontSystem, Metrics, Shaping};
 
 /// Set of all buffer setup functions. Runs in [`First`]
@@ -55,9 +59,25 @@ impl BufferExtras for Buffer {
 }
 
 /// Component wrapper for [`Buffer`]
-#[derive(Component, Deref, DerefMut)]
+#[derive(Deref, DerefMut)]
 pub struct CosmicBuffer(pub Buffer);
 
+impl Component for CosmicBuffer {
+    const STORAGE_TYPE: StorageType = StorageType::Table;
+
+    fn register_component_hooks(hooks: &mut ComponentHooks) {
+        hooks.on_remove(|mut world, entity, _| {
+            if let Some(mut focused_widget) = world.get_resource_mut::<FocusedWidget>() {
+                if let Some(focused) = focused_widget.0 {
+                    if focused == entity {
+                        focused_widget.0 = None;
+                    }
+                }
+            }
+        });
+    }
+}
+
 impl Default for CosmicBuffer {
     fn default() -> Self {
         CosmicBuffer(Buffer::new_empty(Metrics::new(20., 20.)))
-- 
GitLab