From e18c34f68409c336572bbb017e7ff701fb977592 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Tue, 6 Apr 2021 20:40:41 +0100 Subject: [PATCH] deck: implement organise and sort function Signed-off-by: Ian Jackson --- src/organise.rs | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/organise.rs b/src/organise.rs index f7979546..643ef27a 100644 --- a/src/organise.rs +++ b/src/organise.rs @@ -29,6 +29,13 @@ pub fn add_ui_operations(upd: &mut Vec, desc: Html::lit("Organise").into(), wrc: WRC::Predictable, }); + upd.push(UoDescription { + kind: UoKind::Piece, + def_key: 'O', + opname: "organise-sort".to_string(), + desc: Html::lit("Organise and Sort").into(), + wrc: WRC::Predictable, + }); } define_index_type!{ struct InHand = usize; } @@ -82,13 +89,14 @@ impl Attempt { } } -struct PrimaryEnt { +struct PrimaryEnt<'pe> { + sortkey: Option<&'pe str>, piece: PieceId, pos: Pos, bbox: Rect, } -type Primary = IndexVec; +type Primary<'pe> = IndexVec>; type ZLevels = IndexVec; type OrderTable = IndexVec; @@ -131,12 +139,15 @@ fn recover_order(region: &Rect, pieces: &Primary, zlevels: &ZLevels) while let Some((inremain, &ih)) = remain.iter().enumerate() .min_by_key(|(_inremain, &ih)| { - let pos = &pieces[ih].pos; + let p = &pieces[ih]; + let sortkey = &p.sortkey; + let pos = &p.pos; let zlevel = &zlevels[ih]; let in_rect = pos.x() >= last.x() && pos.y() <= last.y() + INTUIT_SORT_Y_THRESH; - ( ! in_rect, + ( sortkey, + ! in_rect, pos.x(), pos.y(), zlevel ) @@ -213,8 +224,9 @@ fn try_layout(region: &Rect, pub fn ui_operation(a: &mut ApiPieceOpArgs<'_>, opname: &str, _wrc: WhatResponseToClientOp, region: &Rect) -> Option { - let _do_sort = match opname { - "organise" => (), + let do_sort = match opname { + "organise" => false, + "organise-sort" => true, _ => return None, }; let ApiPieceOpArgs { ref mut gs, player,ipieces,ioccults,.. } = *a; @@ -234,10 +246,16 @@ pub fn ui_operation(a: &mut ApiPieceOpArgs<'_>, opname: &str, if let PieceMoveable::Yes = gpc.moveable(); if let Some(ipc) = wants!( ipieces.get(piece), ?piece ); if let Some(vis) = gpc.fully_visible_to(&gs.occults, player); - if let Some(bbox) = want!( Ok = ipc.show(vis).bbox_approx(), ?piece ); + let ipc = ipc.show(vis); + if let Some(bbox) = want!( Ok = ipc.bbox_approx(), ?piece ); + let sortkey = if do_sort { + Some(ipc.sortkey().unwrap_or(ipc.itemname())) + } else { + None + }; then { Some(( - PrimaryEnt { piece, bbox, pos: gpc.pos }, + PrimaryEnt { piece, bbox, sortkey, pos: gpc.pos }, gpc.zlevel.clone()) ) } -- 2.30.2