Просмотр исходного кода

wallet: fix issue with chatview swallowing input events

darkfi 1 год назад
Родитель
Сommit
177e390262

+ 2 - 2
bin/darkwallet/src/app/mod.rs

@@ -168,8 +168,8 @@ impl App {
                 Window::new(me, self.render_api.clone(), self.event_pub.clone(), self.ex.clone())
                 Window::new(me, self.render_api.clone(), self.event_pub.clone(), self.ex.clone())
             })
             })
             .await;
             .await;
-        self.sg_root.link(window.clone());
-        schema::make_test(&self, window).await;
+        self.sg_root.clone().link(window.clone());
+        schema::make(&self, window).await;
 
 
         debug!(target: "app", "Schema loaded");
         debug!(target: "app", "Schema loaded");
 
 

+ 18 - 17
bin/darkwallet/src/app/schema.rs

@@ -125,7 +125,7 @@ pub(super) async fn make_test(app: &App, window: SceneNodePtr) {
     );
     );
     let node =
     let node =
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // Create button bg
     // Create button bg
     let node = create_vector_art("btnbg");
     let node = create_vector_art("btnbg");
@@ -157,7 +157,7 @@ pub(super) async fn make_test(app: &App, window: SceneNodePtr) {
     let shape = VectorShape { verts, indices };
     let shape = VectorShape { verts, indices };
     let node =
     let node =
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // Create the button
     // Create the button
     let node = create_button("btn");
     let node = create_button("btn");
@@ -174,7 +174,7 @@ pub(super) async fn make_test(app: &App, window: SceneNodePtr) {
     //node.register("click", slot_click).unwrap();
     //node.register("click", slot_click).unwrap();
 
 
     let node = node.setup(|me| Button::new(me, app.ex.clone())).await;
     let node = node.setup(|me| Button::new(me, app.ex.clone())).await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // Create another mesh
     // Create another mesh
     let node = create_vector_art("box");
     let node = create_vector_art("box");
@@ -205,7 +205,7 @@ pub(super) async fn make_test(app: &App, window: SceneNodePtr) {
     let shape = VectorShape { verts, indices };
     let shape = VectorShape { verts, indices };
     let node =
     let node =
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // Debugging tool
     // Debugging tool
     let node = create_vector_art("debugtool");
     let node = create_vector_art("debugtool");
@@ -235,7 +235,7 @@ pub(super) async fn make_test(app: &App, window: SceneNodePtr) {
     );
     );
     let node =
     let node =
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // Create KING GNU!
     // Create KING GNU!
     let node = create_image("king");
     let node = create_image("king");
@@ -247,7 +247,7 @@ pub(super) async fn make_test(app: &App, window: SceneNodePtr) {
     node.set_property_str(Role::App, "path", KING_PATH).unwrap();
     node.set_property_str(Role::App, "path", KING_PATH).unwrap();
     node.set_property_u32(Role::App, "z_index", 1).unwrap();
     node.set_property_u32(Role::App, "z_index", 1).unwrap();
     let node = node.setup(|me| Image::new(me, app.render_api.clone(), app.ex.clone())).await;
     let node = node.setup(|me| Image::new(me, app.render_api.clone(), app.ex.clone())).await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // Create some text
     // Create some text
     let node = create_text("label");
     let node = create_text("label");
@@ -278,11 +278,12 @@ pub(super) async fn make_test(app: &App, window: SceneNodePtr) {
             )
             )
         })
         })
         .await;
         .await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // Text edit
     // Text edit
     let node = create_editbox("editz");
     let node = create_editbox("editz");
     node.set_property_bool(Role::App, "is_active", true).unwrap();
     node.set_property_bool(Role::App, "is_active", true).unwrap();
+    node.set_property_bool(Role::App, "is_focused", true).unwrap();
     let prop = node.get_property("rect").unwrap();
     let prop = node.get_property("rect").unwrap();
     prop.set_f32(Role::App, 0, 150.).unwrap();
     prop.set_f32(Role::App, 0, 150.).unwrap();
     prop.set_f32(Role::App, 1, 150.).unwrap();
     prop.set_f32(Role::App, 1, 150.).unwrap();
@@ -368,7 +369,7 @@ pub(super) async fn make_test(app: &App, window: SceneNodePtr) {
             )
             )
         })
         })
         .await;
         .await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // ChatView
     // ChatView
     let node = create_chatview("chatty");
     let node = create_chatview("chatty");
@@ -452,7 +453,7 @@ pub(super) async fn make_test(app: &App, window: SceneNodePtr) {
             )
             )
         })
         })
         .await;
         .await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 }
 }
 
 
 pub(super) async fn make(app: &App, window: SceneNodePtr) {
 pub(super) async fn make(app: &App, window: SceneNodePtr) {
@@ -498,7 +499,7 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
     );
     );
     let node =
     let node =
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // Create the toolbar bg
     // Create the toolbar bg
     let node = create_vector_art("toolbar_bg");
     let node = create_vector_art("toolbar_bg");
@@ -520,7 +521,7 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
 
 
     let node =
     let node =
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // Create some text
     // Create some text
     let node = create_text("channel_label");
     let node = create_text("channel_label");
@@ -552,7 +553,7 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
             )
             )
         })
         })
         .await;
         .await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // ChatView
     // ChatView
     let node = create_chatview("chatty");
     let node = create_chatview("chatty");
@@ -642,7 +643,7 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
             )
             )
         })
         })
         .await;
         .await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // Create the editbox bg
     // Create the editbox bg
     let node = create_vector_art("editbox_bg");
     let node = create_vector_art("editbox_bg");
@@ -678,7 +679,7 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
     );
     );
     let node =
     let node =
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
         node.setup(|me| VectorArt::new(me, shape, app.render_api.clone(), app.ex.clone())).await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // Create some text
     // Create some text
     let node = create_text("send_label");
     let node = create_text("send_label");
@@ -711,7 +712,7 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
             )
             )
         })
         })
         .await;
         .await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // Text edit
     // Text edit
     let node = create_editbox("editz");
     let node = create_editbox("editz");
@@ -795,7 +796,7 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
             )
             )
         })
         })
         .await;
         .await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 
 
     // Create the send button
     // Create the send button
     let node = create_button("send_btn");
     let node = create_button("send_btn");
@@ -809,5 +810,5 @@ pub(super) async fn make(app: &App, window: SceneNodePtr) {
     prop.set_f32(Role::App, 3, EDITCHAT_HEIGHT).unwrap();
     prop.set_f32(Role::App, 3, EDITCHAT_HEIGHT).unwrap();
 
 
     let node = node.setup(|me| Button::new(me, app.ex.clone())).await;
     let node = node.setup(|me| Button::new(me, app.ex.clone())).await;
-    layer_node.link(node);
+    layer_node.clone().link(node);
 }
 }

+ 0 - 2
bin/darkwallet/src/main.rs

@@ -142,7 +142,6 @@ fn main() {
     let cv_started = app.is_started.clone();
     let cv_started = app.is_started.clone();
     let sg_root = app.sg_root.clone();
     let sg_root = app.sg_root.clone();
     let ex2 = ex.clone();
     let ex2 = ex.clone();
-    /*
     let darkirc_task = ex.spawn(async move {
     let darkirc_task = ex.spawn(async move {
         cv_started.wait().await;
         cv_started.wait().await;
         let darkirc_evgr = LocalDarkIRC::new(sg_root.clone(), ex2.clone()).await.unwrap();
         let darkirc_evgr = LocalDarkIRC::new(sg_root.clone(), ex2.clone()).await.unwrap();
@@ -152,7 +151,6 @@ fn main() {
         }
         }
     });
     });
     async_runtime.push_task(darkirc_task);
     async_runtime.push_task(darkirc_task);
-    */
 
 
     /*
     /*
     // Nice to see which events exist
     // Nice to see which events exist

+ 24 - 3
bin/darkwallet/src/scene.rs

@@ -160,10 +160,10 @@ impl SceneNode {
         self_
         self_
     }
     }
 
 
-    pub fn link(&self, child: SceneNodePtr) {
+    pub fn link(self: Arc<Self>, child: SceneNodePtr) {
         let mut childs_parent = child.parent.write().unwrap();
         let mut childs_parent = child.parent.write().unwrap();
         assert!(childs_parent.is_none());
         assert!(childs_parent.is_none());
-        *childs_parent = Some(Arc::downgrade(&child));
+        *childs_parent = Some(Arc::downgrade(&self));
         drop(childs_parent);
         drop(childs_parent);
 
 
         let mut children = self.children.write().unwrap();
         let mut children = self.children.write().unwrap();
@@ -349,11 +349,32 @@ impl SceneNode {
         let method_sub = method.pubsub.clone().subscribe();
         let method_sub = method.pubsub.clone().subscribe();
         Ok(method_sub)
         Ok(method_sub)
     }
     }
+
+    pub fn get_full_path(&self) -> Option<String> {
+        if self.typ == SceneNodeType::Root {
+            return Some("/".to_string())
+        }
+
+        let mut self_name = self.name.clone();
+
+        let parent = self.parent.read().unwrap().clone()?;
+        let Some(parent) = parent.upgrade() else { return None };
+
+        let parent_path = parent.get_full_path()?;
+        if parent_path == "/" {
+            return Some(format!("/{self_name}"))
+        }
+        Some(format!("{parent_path}/{self_name}"))
+    }
 }
 }
 
 
 impl std::fmt::Debug for SceneNode {
 impl std::fmt::Debug for SceneNode {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        write!(f, "'{}':{}", self.name, self.id)
+        if let Some(path) = self.get_full_path() {
+            write!(f, "{path}")
+        } else {
+            write!(f, "{}:{}", self.name, self.id)
+        }
     }
     }
 }
 }
 
 

+ 3 - 1
bin/darkwallet/src/ui/chatview/mod.rs

@@ -741,15 +741,17 @@ impl UIObject for ChatView {
             KeyCode::PageUp => {
             KeyCode::PageUp => {
                 let scroll = self.scroll.get() + 200.;
                 let scroll = self.scroll.get() + 200.;
                 self.scrollview(scroll).await;
                 self.scrollview(scroll).await;
+                return true
             }
             }
             KeyCode::PageDown => {
             KeyCode::PageDown => {
                 let scroll = self.scroll.get() - 200.;
                 let scroll = self.scroll.get() - 200.;
                 self.scrollview(scroll).await;
                 self.scrollview(scroll).await;
+                return true
             }
             }
             _ => {}
             _ => {}
         }
         }
 
 
-        true
+        false
     }
     }
 
 
     async fn handle_mouse_btn_down(&self, btn: MouseButton, mouse_pos: Point) -> bool {
     async fn handle_mouse_btn_down(&self, btn: MouseButton, mouse_pos: Point) -> bool {

+ 0 - 1
bin/darkwallet/src/ui/editbox.rs

@@ -110,7 +110,6 @@ impl PressedKeysSmoothRepeat {
     /*
     /*
     fn key_up(&mut self, key: &PressedKey) {
     fn key_up(&mut self, key: &PressedKey) {
         //debug!(target: "PressedKeysSmoothRepeat", "key_up({:?})", key);
         //debug!(target: "PressedKeysSmoothRepeat", "key_up({:?})", key);
-        println!("{:?}", self.pressed_keys.keys());
         assert!(self.pressed_keys.contains_key(key));
         assert!(self.pressed_keys.contains_key(key));
         self.pressed_keys.remove(key).expect("key was pressed");
         self.pressed_keys.remove(key).expect("key was pressed");
     }
     }

+ 1 - 0
bin/darkwallet/src/ui/layer.rs

@@ -184,6 +184,7 @@ impl UIObject for Layer {
         for child in self.get_children() {
         for child in self.get_children() {
             let obj = get_ui_object3(&child);
             let obj = get_ui_object3(&child);
             if obj.handle_key_down(key, mods, repeat).await {
             if obj.handle_key_down(key, mods, repeat).await {
+                //debug!(target: "layer", "handle_key_down({key:?}, {mods:?}, {repeat}) swallowed by {child:?}");
                 return true
                 return true
             }
             }
         }
         }