diff --git a/src/components/plates/destination_plate.rs b/src/components/plates/destination_plate.rs index e7082a7..28e428a 100644 --- a/src/components/plates/destination_plate.rs +++ b/src/components/plates/destination_plate.rs @@ -1,5 +1,10 @@ #![allow(non_snake_case)] use yew::prelude::*; +use yewdux::prelude::*; +use std::rc::Rc; + +use super::super::states::NewTransferState; +use super::super::transfer_menu::RegionDisplay; #[derive(Properties, PartialEq)] pub struct DestinationPlateProps { @@ -9,10 +14,80 @@ pub struct DestinationPlateProps { #[function_component] pub fn DestinationPlate(props: &DestinationPlateProps) -> Html { + let m_start_handle: UseStateHandle> = use_state_eq(|| None); + let m_end_handle: UseStateHandle> = use_state_eq(|| None); + let m_stat_handle: UseStateHandle = use_state_eq(|| false); + let m_start = m_start_handle.clone(); + let m_end = m_end_handle.clone(); + + let menu_sync_callback = { + let m_start_handle = m_start_handle.clone(); + let m_end_handle = m_end_handle.clone(); + let m_stat_handle = m_stat_handle.clone(); + + move |nts: Rc| { + if !(*m_stat_handle) { + let pt1 = (nts.destination_region.col_start, nts.destination_region.row_start); + let pt2 = (nts.destination_region.col_end, nts.destination_region.row_end); + m_start_handle.set(Some(pt1)); + m_end_handle.set(Some(pt2)); + } + } + }; + let dispatch = Dispatch::::subscribe(menu_sync_callback); + + + let mouse_callback = { + let m_start_handle = m_start_handle.clone(); + let m_end_handle = m_end_handle.clone(); + let m_stat_handle = m_stat_handle.clone(); + + Callback::from(move |(i,j,t)| { + match t { + MouseEventType::MOUSEDOWN => { + m_start_handle.set(Some((i,j))); + m_end_handle.set(Some((i,j))); + m_stat_handle.set(true); + }, + MouseEventType::MOUSEENTER => { + if *m_stat_handle { + m_end_handle.set(Some((i,j))); + } + } + } + }) + }; + + let mouseup_callback = { + let m_start_handle = m_start_handle.clone(); + let m_end_handle = m_end_handle.clone(); + let m_stat_handle = m_stat_handle.clone(); + + Callback::from(move |_: MouseEvent| { + let current = dispatch.get(); + m_stat_handle.set(false); + if let Some(ul) = *m_start_handle { + if let Some(br) = *m_end_handle { + if let Ok(rd) = RegionDisplay::try_from((ul.0, ul.1, br.0, br.1)) { + dispatch.set(NewTransferState { + source_region: current.source_region.clone(), + destination_region: rd, + interleave_x: current.interleave_x, + interleave_y: current.interleave_y }) + } + } + } + }) + }; + + let mouseleave_callback = Callback::clone(&mouseup_callback); + let rows = (1..=props.height).map(|i| { let row = (1..=props.width).map(|j| { html! { - + } }).collect::(); html! { @@ -24,29 +99,56 @@ pub fn DestinationPlate(props: &DestinationPlateProps) -> Html { html! {
- +
{ rows }
} } +#[derive(Debug)] +pub enum MouseEventType { + MOUSEDOWN, + MOUSEENTER +} + #[derive(Properties, PartialEq)] pub struct DestPlateCellProps { pub i: u8, pub j: u8, + pub selected: bool, + pub mouse: Callback<(u8,u8, MouseEventType)>, pub color: Option } #[function_component] fn DestPlateCell(props: &DestPlateCellProps) -> Html { + let selected_class = match props.selected { + true => Some("current_select"), + false => None, + }; let _color_string = match &props.color { Some(c) => c.clone(), None => "None".to_string(), }; + let mouse = Callback::clone(&props.mouse); + let mouse2 = Callback::clone(&props.mouse); + let (i,j) = (props.i.clone(), props.j.clone()); html! { - +
} diff --git a/src/components/transfer_menu.rs b/src/components/transfer_menu.rs index 256babd..dbee904 100644 --- a/src/components/transfer_menu.rs +++ b/src/components/transfer_menu.rs @@ -34,6 +34,27 @@ pub fn TransferMenu() -> Html { } }) }; + let on_dest_region_change = { + let state = state.clone(); + let dispatch = dispatch.clone(); + + Callback::from(move |e: Event| { + log::debug!("Input changed."); + let target: Option = e.target(); + let input = target.and_then(|t| t.dyn_into::().ok()); + if let Some(input) = input { + if let Ok(rd) = RegionDisplay::try_from(input.value()) { + dispatch.set( NewTransferState { + source_region: state.source_region.clone(), + destination_region: rd, + interleave_x: state.interleave_x, + interleave_y: state.interleave_y + }); + log::debug!("{:?}", dispatch.get()); + } + } + }) + }; html! {
@@ -42,7 +63,8 @@ pub fn TransferMenu() -> Html { - +
}