Procházet zdrojové kódy

wallet: add navigation shortcuts: alt+left to go back, alt+1,2,3, ... to jump to channels

darkfi před 1 rokem
rodič
revize
6c19dc279b

+ 42 - 8
bin/darkwallet/src/app/schema/chat.rs

@@ -313,19 +313,34 @@ pub async fn make(
     prop.set_f32(Role::App, 2, EMOJI_BG_W).unwrap();
     prop.set_f32(Role::App, 3, CHATEDIT_HEIGHT).unwrap();
 
+    #[derive(Clone)]
+    struct GoBack {
+        sg_root: SceneNodePtr,
+        chatview_is_visible: PropertyBool,
+    }
+
+    impl GoBack {
+        fn go(&self) {
+            info!(target: "app::chat", "clicked back");
+
+            let menu_node = self.sg_root.clone().lookup_node("/window/menu_layer").unwrap();
+            menu_node.set_property_bool(Role::App, "is_visible", true).unwrap();
+
+            self.chatview_is_visible.set(false);
+        }
+    }
+    let goback = GoBack {
+        sg_root: app.sg_root.clone(),
+        chatview_is_visible: PropertyBool::wrap(&layer_node, Role::App, "is_visible", 0).unwrap(),
+    };
+
     let (slot, recvr) = Slot::new("back_clicked");
     node.register("click", slot).unwrap();
+    let goback2 = goback.clone();
     // Menu doesn't exist yet ;)
-    let sg_root = app.sg_root.clone();
-    let chatview_is_visible = PropertyBool::wrap(&layer_node, Role::App, "is_visible", 0).unwrap();
     let listen_click = app.ex.spawn(async move {
         while let Ok(_) = recvr.recv().await {
-            info!(target: "app::chat", "clicked back");
-
-            let menu_node = sg_root.clone().lookup_node("/window/menu_layer").unwrap();
-            menu_node.set_property_bool(Role::App, "is_visible", true).unwrap();
-
-            chatview_is_visible.set(false);
+            goback2.go();
         }
     });
     app.tasks.lock().unwrap().push(listen_click);
@@ -333,6 +348,25 @@ pub async fn make(
     let node = node.setup(|me| Button::new(me, app.ex.clone())).await;
     layer_node.clone().link(node);
 
+    // Create shortcut to go back as well
+    let node = create_shortcut("back_shortcut");
+    #[cfg(target_os = "android")]
+    node.set_property_str(Role::App, "key", "back").unwrap();
+    #[cfg(not(target_os = "android"))]
+    node.set_property_str(Role::App, "key", "alt+left").unwrap();
+
+    let (slot, recvr) = Slot::new("back_pressed");
+    node.register("shortcut", slot).unwrap();
+    let listen_enter = app.ex.spawn(async move {
+        while let Ok(_) = recvr.recv().await {
+            goback.go();
+        }
+    });
+    app.tasks.lock().unwrap().push(listen_enter);
+
+    let node = node.setup(|me| Shortcut::new(me)).await;
+    layer_node.clone().link(node);
+
     // Create some text
     let node = create_text("channel_label");
     let prop = node.get_property("rect").unwrap();

+ 28 - 5
bin/darkwallet/src/app/schema/menu.rs

@@ -22,7 +22,7 @@ use crate::{
     app::{
         node::{
             create_button, create_chatedit, create_chatview, create_editbox, create_image,
-            create_layer, create_text, create_vector_art,
+            create_layer, create_shortcut, create_text, create_vector_art,
         },
         populate_tree, App,
     },
@@ -37,7 +37,7 @@ use crate::{
     shape,
     text::TextShaperPtr,
     ui::{
-        Button, ChatEdit, ChatView, EditBox, Image, Layer, ShapeVertex, Text, VectorArt,
+        Button, ChatEdit, ChatView, EditBox, Image, Layer, ShapeVertex, Shortcut, Text, VectorArt,
         VectorShape, Window,
     },
     ExecutorPtr,
@@ -177,7 +177,7 @@ pub async fn make(app: &App, window: SceneNodePtr) {
 
     channel_y += CHANNEL_LABEL_LINESPACE;
 
-    for channel in CHANNELS {
+    for (i, channel) in CHANNELS.iter().enumerate() {
         let text = "#".to_string() + channel;
 
         let node = create_vector_art(&(channel.to_string() + "_channel_label_bg"));
@@ -273,11 +273,13 @@ pub async fn make(app: &App, window: SceneNodePtr) {
         let chatview_is_visible =
             PropertyBool::wrap(&chatview_node, Role::App, "is_visible", 0).unwrap();
         let menu_is_visible = PropertyBool::wrap(&layer_node, Role::App, "is_visible", 0).unwrap();
+        let chatview_is_visible2 = chatview_is_visible.clone();
+        let menu_is_visible2 = menu_is_visible.clone();
         let listen_click = app.ex.spawn(async move {
             while let Ok(_) = recvr.recv().await {
                 info!(target: "app::menu", "clicked: {channel}!");
-                chatview_is_visible.set(true);
-                menu_is_visible.set(false);
+                chatview_is_visible2.set(true);
+                menu_is_visible2.set(false);
             }
         });
         app.tasks.lock().unwrap().push(listen_click);
@@ -285,6 +287,27 @@ pub async fn make(app: &App, window: SceneNodePtr) {
         let node = node.setup(|me| Button::new(me, app.ex.clone())).await;
         layer_node.clone().link(node);
 
+        // Create shortcut
+        let channel_id = i + 1;
+        let node = create_shortcut("channel_shortcut_{channel_id}");
+        let key = format!("alt+{channel_id}");
+        node.set_property_str(Role::App, "key", key).unwrap();
+        node.set_property_u32(Role::App, "priority", 1).unwrap();
+
+        let (slot, recvr) = Slot::new("back_pressed");
+        node.register("shortcut", slot).unwrap();
+        let listen_enter = app.ex.spawn(async move {
+            while let Ok(_) = recvr.recv().await {
+                info!(target: "app::menu", "shortcut go to: {channel}!");
+                chatview_is_visible.set(true);
+                menu_is_visible.set(false);
+            }
+        });
+        app.tasks.lock().unwrap().push(listen_enter);
+
+        let node = node.setup(|me| Shortcut::new(me)).await;
+        layer_node.clone().link(node);
+
         channel_y += CHANNEL_LABEL_LINESPACE;
     }
 }

+ 1 - 1
bin/darkwallet/src/app/schema/mod.rs

@@ -47,7 +47,7 @@ mod chat;
 mod menu;
 //mod test;
 
-pub const COLOR_SCHEME: ColorScheme = ColorScheme::PaperLight;
+pub const COLOR_SCHEME: ColorScheme = ColorScheme::DarkMode;
 
 mod android_ui_consts {
     pub const EMOJI_PICKER_ICON_SIZE: f32 = 100.;

+ 15 - 6
bin/darkwallet/src/ui/chatedit.rs

@@ -1166,14 +1166,18 @@ impl ChatEdit {
         debug!(target: "ui::chatedit", "handle_key({:?}, {:?})", key, mods);
         match key {
             KeyCode::Left => {
-                self.adjust_cursor(mods.shift, |editable| editable.move_cursor(-1));
+                if !self.adjust_cursor(&mods, |editable| editable.move_cursor(-1)) {
+                    return false
+                }
                 self.pause_blinking();
                 //self.apply_cursor_scrolling();
                 self.redraw().await;
                 return true
             }
             KeyCode::Right => {
-                self.adjust_cursor(mods.shift, |editable| editable.move_cursor(1));
+                if !self.adjust_cursor(&mods, |editable| editable.move_cursor(1)) {
+                    return false
+                }
                 self.pause_blinking();
                 //self.apply_cursor_scrolling();
                 self.redraw().await;
@@ -1243,14 +1247,14 @@ impl ChatEdit {
                 return true
             }
             KeyCode::Home => {
-                self.adjust_cursor(mods.shift, |editable| editable.move_start());
+                self.adjust_cursor(&mods, |editable| editable.move_start());
                 self.pause_blinking();
                 //self.apply_cursor_scrolling();
                 self.redraw().await;
                 return true
             }
             KeyCode::End => {
-                self.adjust_cursor(mods.shift, |editable| editable.move_end());
+                self.adjust_cursor(&mods, |editable| editable.move_end());
                 self.pause_blinking();
                 //self.apply_cursor_scrolling();
                 self.redraw().await;
@@ -1279,7 +1283,11 @@ impl ChatEdit {
         self.text.set(text);
     }
 
-    fn adjust_cursor(&self, has_shift: bool, move_cursor: impl Fn(&mut Editable)) {
+    fn adjust_cursor(&self, mods: &KeyMods, move_cursor: impl Fn(&mut Editable)) -> bool {
+        if mods.ctrl || mods.alt || mods.logo {
+            return false
+        }
+
         let mut text_wrap = &mut self.text_wrap.lock();
         let rendered = text_wrap.get_render().clone();
         let prev_cursor_pos = text_wrap.editable.get_cursor_pos(&rendered);
@@ -1290,7 +1298,7 @@ impl ChatEdit {
         let select = &mut text_wrap.select;
 
         // Start selection if shift is held
-        if has_shift {
+        if mods.shift {
             // Create a new selection
             if select.is_empty() {
                 select.push(Selection::new(prev_cursor_pos, cursor_pos));
@@ -1303,6 +1311,7 @@ impl ChatEdit {
         }
 
         self.update_select_text(&mut text_wrap);
+        true
     }
 
     /// This will select the entire word rather than move the cursor to that location