Skip to content

Commit 8c64a8e

Browse files
committed
app/ui/tokentable: trigger "row_click" on mouse_btn_up and add handle_touch()
1 parent 8531783 commit 8c64a8e

1 file changed

Lines changed: 65 additions & 9 deletions

File tree

  • bin/app/src/ui/tokentable

bin/app/src/ui/tokentable/mod.rs

Lines changed: 65 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
use async_trait::async_trait;
2020
use darkfi_money_contract::model::{DARK_TOKEN_ID, TokenId};
2121
use darkfi_serial::{Decodable, Encodable, SerialEncodable};
22-
use miniquad::MouseButton;
22+
use miniquad::{MouseButton, TouchPhase};
2323
use parking_lot::Mutex as SyncMutex;
2424
use rand::{rngs::OsRng, Rng};
2525
use std::sync::{Arc, Weak};
@@ -64,6 +64,7 @@ pub struct TokenTable {
6464
node: SceneNodeWeak,
6565
renderer: Renderer,
6666
sg_root: SceneNodePtr,
67+
mouse_btn_token: SyncMutex<Option<TokenId>>,
6768

6869
rows: SyncMutex<Vec<TokenRow>>,
6970
dc_key: u64,
@@ -104,6 +105,7 @@ impl TokenTable {
104105
node: node.clone(),
105106
renderer: renderer.clone(),
106107
sg_root,
108+
mouse_btn_token: SyncMutex::new(None),
107109
rows: SyncMutex::new(vec![]),
108110
dc_key: OsRng.gen(),
109111
rect,
@@ -370,19 +372,73 @@ impl UIObject for TokenTable {
370372
}
371373

372374
if let Some(row) = self.get_row_at_y(mouse_pos.y) {
373-
let mut data = vec![];
374-
if let Err(e) = row.encode(&mut data) {
375-
error!(target: "ui::tokentable", "Failed to encode row: {e}");
376-
return false
377-
}
378-
379-
let node_ref = self.node.upgrade().unwrap();
380-
let _ = node_ref.trigger("row_click", data).await;
375+
*self.mouse_btn_token.lock() = Some(row.id);
381376
return true
382377
}
383378

384379
false
385380
}
381+
382+
async fn handle_mouse_btn_up(&self, btn: MouseButton, mouse_pos: Point) -> bool {
383+
if btn != MouseButton::Left {
384+
return false
385+
}
386+
387+
let token_held = {
388+
let mut mouse_lock = self.mouse_btn_token.lock();
389+
let token_held = *mouse_lock;
390+
*mouse_lock = None;
391+
token_held
392+
};
393+
394+
let Some(token_held) = token_held else {
395+
return false
396+
};
397+
398+
let rect = self.rect.get();
399+
if !rect.contains(mouse_pos) {
400+
return false
401+
}
402+
403+
let Some(row) = self.get_row_at_y(mouse_pos.y) else {
404+
return false
405+
};
406+
407+
if row.id != token_held {
408+
return false
409+
}
410+
411+
let mut data = vec![];
412+
if let Err(e) = row.encode(&mut data) {
413+
error!(target: "ui::tokentable", "Failed to encode row: {e}");
414+
return false
415+
}
416+
417+
let node_ref = self.node.upgrade().unwrap();
418+
let _ = node_ref.trigger("row_click", data).await;
419+
420+
true
421+
}
422+
423+
async fn handle_touch(&self, phase: TouchPhase, id: u64, touch_pos: Point) -> bool {
424+
// Ignore multi-touch
425+
if id != 0 {
426+
return false
427+
}
428+
429+
let rect = self.rect.get();
430+
if !rect.contains(touch_pos) {
431+
return false
432+
}
433+
434+
// Simulate mouse events
435+
match phase {
436+
TouchPhase::Started => self.handle_mouse_btn_down(MouseButton::Left, touch_pos).await,
437+
TouchPhase::Moved => false,
438+
TouchPhase::Ended => self.handle_mouse_btn_up(MouseButton::Left, touch_pos).await,
439+
TouchPhase::Cancelled => false,
440+
}
441+
}
386442
}
387443

388444
impl Drop for TokenTable {

0 commit comments

Comments
 (0)