Advertisement
Guest User

Azul fixed dragging example

a guest
Nov 3rd, 2018
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.45 KB | None | 0 0
  1. extern crate azul;
  2.  
  3. use azul::prelude::*;
  4.  
  5. #[derive(Default)]
  6. struct DragMeApp {
  7.     width: Option<f32>,
  8.     is_dragging: bool,
  9. }
  10.  
  11. type Event<'a> = WindowEvent<'a, DragMeApp>;
  12. type State = AppState<DragMeApp>;
  13.  
  14. impl Layout for DragMeApp {
  15.     fn layout(&self, _: WindowInfo<DragMeApp>) -> Dom<Self> {
  16.  
  17.         let mut left = Dom::new(NodeType::Div).with_id("blue");
  18.  
  19.         // Set the width of the dragger on the red element
  20.         if let Some(w) = self.width {
  21.             left.add_css_override("drag_width", ParsedCssProperty::Width(LayoutWidth::px(w)));
  22.         }
  23.  
  24.         let right = Dom::new(NodeType::Div).with_id("orange");
  25.  
  26.         // The dragger is 0px wide, but has an absolutely positioned rectangle
  27.         // inside of it, which can be dragged
  28.         let dragger = Dom::new(NodeType::Div).with_id("dragger").with_child(
  29.             Dom::new(NodeType::Div).with_id("dragger_handle")
  30.             .with_callback(On::MouseDown, Callback(start_drag)));
  31.  
  32.         Dom::new(NodeType::Div).with_id("container")
  33.             .with_callback(On::MouseOver, Callback(update_drag))
  34.             .with_callback(On::MouseUp, Callback(stop_drag))
  35.             .with_child(left)
  36.             .with_child(dragger)
  37.             .with_child(right)
  38.     }
  39. }
  40.  
  41. fn start_drag(state: &mut State, _event: Event) -> UpdateScreen {
  42.     state.data.modify(|data| data.is_dragging = true);
  43.     UpdateScreen::DontRedraw
  44. }
  45.  
  46. fn stop_drag(state: &mut State, _event: Event) -> UpdateScreen {
  47.     state.data.modify(|data| data.is_dragging = false);
  48.     UpdateScreen::Redraw
  49. }
  50.  
  51. fn update_drag(state: &mut State, event: Event) -> UpdateScreen {
  52.     let mouse_state = state.windows[event.window].state.get_mouse_state();
  53.     if state.data.lock().unwrap().is_dragging {
  54.         let cursor_pos = mouse_state.cursor_pos.unwrap_or(LogicalPosition::new(0.0, 0.0));
  55.         state.data.modify(|data| data.width = Some(cursor_pos.x as f32));
  56.         UpdateScreen::Redraw
  57.     } else {
  58.         UpdateScreen::DontRedraw
  59.     }
  60. }
  61.  
  62. fn main() {
  63.     macro_rules! CSS_PATH { () => (concat!(env!("CARGO_MANIFEST_DIR"), "/examples/dragger.css")) }
  64.  
  65.     #[cfg(debug_assertions)]
  66.     let css = Css::hot_reload(CSS_PATH!()).unwrap();
  67.     #[cfg(not(debug_assertions))]
  68.     let css = Css::new_from_str(include_str!(CSS_PATH!())).unwrap();
  69.  
  70.     let app = App::new(DragMeApp::default(), AppConfig::default());
  71.     app.run(Window::new(WindowCreateOptions::default(), css).unwrap()).unwrap();
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement