From beacc28acea15ea1201e60820f86e4ba2665e0af Mon Sep 17 00:00:00 2001 From: 2ndbeam <2ndbeam@disroot.org> Date: Thu, 12 Mar 2026 13:08:08 +0300 Subject: [PATCH] ui: Inventory item rotation - Fixed rotated item position --- src/inventory/ui.rs | 68 +++++++++++++++++++++++++++------------------ src/lib.rs | 9 ++++-- 2 files changed, 48 insertions(+), 29 deletions(-) diff --git a/src/inventory/ui.rs b/src/inventory/ui.rs index a17c9b2..18e8f13 100644 --- a/src/inventory/ui.rs +++ b/src/inventory/ui.rs @@ -20,7 +20,26 @@ pub struct UiInventorySlot(UVec2); pub struct UiItem(Entity); #[derive(Component)] -pub struct HoveredItem(Entity); +pub struct HoveredItem; + +fn ui_item_node_data(item: &Item) -> (Val, Val, Val, Val, UiTransform) { + match item.rotated { + true => ( + percent(50. * (item.size.x as f32 - item.size.y as f32)), + percent(50. * (item.size.y as f32 - item.size.x as f32)), + percent(100. * item.size.y as f32), + percent(100. * item.size.x as f32), + UiTransform::from_rotation(Rot2::radians(-FRAC_PI_2)), + ), + false => ( + auto(), + auto(), + percent(100. * item.size.x as f32), + percent(100. * item.size.y as f32), + UiTransform::default(), + ), + } +} fn on_slot_over(e: On>, mut query: Query<&mut ImageNode, With>) { if let Ok(mut image) = query.get_mut(e.event_target()) { @@ -36,7 +55,7 @@ fn on_slot_out(e: On>, mut query: Query<&mut ImageNode, With>, mut commands: Commands, query: Query>) { if let Ok(_) = query.get(e.event_target()) { - commands.entity(e.event_target()).insert(HoveredItem(e.event_target())); + commands.entity(e.event_target()).insert(HoveredItem); } } @@ -95,15 +114,15 @@ fn on_item_drag_drop( } } -fn on_ui_rotate( - event: On, - item_query: Query<&Item>, - mut mut_item_query: Query<(&ChildOf, &mut Item)>, +pub fn on_ui_rotate( + _: On, + mut item_query: Query<&mut Item>, + parent_query: Query<&ChildOf>, inventory_query: Query<(&Inventory, Option<&Children>)>, - ui_item_query: Query<(&mut UiItem, &mut Node), With>, + ui_item_query: Query<(&UiItem, &mut UiTransform, &mut Node), With>, ) { - for (mut ui_item, mut node) in ui_item_query { - let Ok((item_parent, mut mut_item)) = mut_item_query.get_mut(ui_item.0) else { + for (ui_item, mut ui_transform, mut node) in ui_item_query { + let Ok(item_parent) = parent_query.get(ui_item.0) else { continue; }; let Ok((inventory, children)) = inventory_query.get(item_parent.0) else { @@ -115,7 +134,18 @@ fn on_ui_rotate( None => &[], }; - // TODO + if inventory.can_rotate(item_query.as_readonly(), children, ui_item.0) { + let Ok(mut item) = item_query.get_mut(ui_item.0) else { + continue; + }; + item.rotate(); + let (left, top, min_width, min_height, new_ui_transform) = ui_item_node_data(&item); + node.left = left; + node.top = top; + node.min_width = min_width; + node.min_height = min_height; + ui_transform.rotation = new_ui_transform.rotation; + } } } @@ -165,7 +195,6 @@ fn inventory_slot_bundle(x: u32, y: u32, image: Handle) -> impl Bundle { height: percent(100.), grid_column: GridPlacement::start(x as i16 + 1), grid_row: GridPlacement::start(y as i16 + 1), - align_items: AlignItems::Start, ..default() }, Pickable { @@ -178,22 +207,7 @@ fn inventory_slot_bundle(x: u32, y: u32, image: Handle) -> impl Bundle { } fn ui_item_bundle(item: &Item, item_entity: Entity, image: Handle) -> impl Bundle { - let (left, top, min_width, min_height, ui_transform) = match item.rotated { - true => ( - percent(100.), - percent(-100.), - percent(100. * item.size.y as f32), - percent(100. * item.size.x as f32), - UiTransform::from_rotation(Rot2::radians(-FRAC_PI_2)), - ), - false => ( - auto(), - auto(), - percent(100. * item.size.x as f32), - percent(100. * item.size.y as f32), - UiTransform::default(), - ), - }; + let (left, top, min_width, min_height, ui_transform) = ui_item_node_data(item); ( UiItem(item_entity), ImageNode { diff --git a/src/lib.rs b/src/lib.rs index a3ad871..83dd097 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -83,13 +83,17 @@ fn setup_global(mut commands: Commands) { impl Plugin for ExpeditionPlugin { fn build(&self, app: &mut App) { - app.add_plugins(input::InputAssetPlugin::::default()) + app.add_plugins(( + input::InputAssetPlugin::::default(), + input::InputAssetPlugin::::default(), + )) .init_state::() .insert_resource(ui::WindowSize::default()) .add_systems(Startup, (player::setup_player, setup_global)) .add_systems(Update, ( player::handle_input, ui::update_window_size, + ui::handle_input, insert_entity_name, )) .add_systems(OnEnter(GameState::Inventory), inventory::ui::setup_ui_inventory) @@ -99,6 +103,7 @@ impl Plugin for ExpeditionPlugin { .register_type::() .register_type::() .register_type::() - .register_type::(); + .register_type::() + .add_observer(inventory::ui::on_ui_rotate); } }