Преглед на файлове

app/menu: allow overscrolling menu with overscroll property

x преди 2 дни
родител
ревизия
1d0bf1bc29
променени са 3 файла, в които са добавени 12 реда и са изтрити 1 реда
  1. 6 0
      bin/app/src/app/node.rs
  2. 1 0
      bin/app/src/app/schema/mod.rs
  3. 5 1
      bin/app/src/ui/menu/mod.rs

+ 6 - 0
bin/app/src/app/node.rs

@@ -822,6 +822,12 @@ pub fn create_menu(name: &str) -> SceneNode {
     prop.set_range_f32(0., 1.);
     node.add_property(prop).unwrap();
 
+    let mut prop = Property::new("overscroll", PropertyType::Float32, PropertySubType::Pixel);
+    prop.set_ui_text("Overscroll", "Extra scroll distance past the content bottom");
+    prop.set_defaults_f32(vec![400.]).unwrap();
+    prop.set_range_f32(0., f32::MAX);
+    node.add_property(prop).unwrap();
+
     let mut prop = Property::new("fade_zone", PropertyType::Float32, PropertySubType::Pixel);
     prop.set_ui_text("Fade Zone", "Fade out items in the last X pixels");
     prop.set_range_f32(0., f32::MAX);

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

@@ -408,6 +408,7 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish, db
     prop.set_f32(atom, Role::App, 3, 1000.).unwrap();
     netlayer_node.set_property_bool(atom, Role::App, "is_visible", true).unwrap();
     netlayer_node.set_property_u32(atom, Role::App, "z_index", 2).unwrap();
+    netlayer_node.set_property_u32(atom, Role::App, "priority", 1).unwrap();
     let netlayer_node = netlayer_node
         .setup(|me| Layer::new(me, app.renderer.clone(), app.redraw_trigger.clone()))
         .await;

+ 5 - 1
bin/app/src/ui/menu/mod.rs

@@ -153,6 +153,7 @@ pub struct Menu {
     long_press_task: SyncMutex<Option<smol::Task<()>>>,
     scroll_start_accel: PropertyFloat32,
     scroll_resist: PropertyFloat32,
+    overscroll: PropertyFloat32,
     motion_cv: Arc<CondVar>,
     speed: AtomicF32,
     is_edit_mode: AtomicBool,
@@ -204,6 +205,7 @@ impl Menu {
             PropertyFloat32::wrap(node_ref, Role::Internal, "scroll_start_accel", 0).unwrap();
         let scroll_resist =
             PropertyFloat32::wrap(node_ref, Role::Internal, "scroll_resist", 0).unwrap();
+        let overscroll = PropertyFloat32::wrap(node_ref, Role::Internal, "overscroll", 0).unwrap();
 
         let motion_cv = Arc::new(CondVar::new());
 
@@ -243,6 +245,7 @@ impl Menu {
             long_press_task: SyncMutex::new(None),
             scroll_start_accel,
             scroll_resist,
+            overscroll,
             motion_cv,
             speed: AtomicF32::new(0.),
             is_edit_mode: AtomicBool::new(false),
@@ -578,7 +581,8 @@ impl Menu {
         let content_height = num_items * item_height;
 
         let rect = self.rect.get();
-        let max_scroll = (content_height - rect.h).max(0.);
+        let overscroll = self.overscroll.get();
+        let max_scroll = (overscroll + content_height - rect.h).max(0.);
         let scroll = scroll.clamp(0., max_scroll);
         self.scroll.store(scroll, Ordering::Relaxed);
     }