mod.rs 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. use ggez::graphics;
  2. use crate::config::{UI_SPRITE_SHEET_HEIGHT, UI_SPRITE_SHEET_WIDTH};
  3. use crate::scene::item::SceneItem;
  4. use crate::ui::scene_item_menu::SceneItemMenuItem;
  5. use crate::{Offset, ScenePoint, WindowPoint};
  6. pub mod scene_item_menu;
  7. const SCENE_ITEM_MENU_WIDTH: f32 = 71.0;
  8. const SCENE_ITEM_MENU_HEIGHT: f32 = 68.0;
  9. const SCENE_ITEM_MENU_ITEM_HEIGHT: f32 = 15.0;
  10. pub enum UiItem {
  11. SceneItemMenu,
  12. }
  13. // FIXME BS NOW: Transformer ça en VerticalMenu, où l'on donne les carac des item aussi
  14. // --> ce sera capable de manière generique d'eclairer le bon item et dire quel item affiché
  15. pub struct UiSpriteInfo {
  16. pub relative_start_x: f32,
  17. pub relative_start_y: f32,
  18. pub relative_width: f32,
  19. pub relative_height: f32,
  20. pub width: f32,
  21. pub height: f32,
  22. }
  23. impl UiSpriteInfo {
  24. pub fn from_type(type_: UiItem) -> Self {
  25. match type_ {
  26. UiItem::SceneItemMenu => Self {
  27. relative_start_x: 0.0,
  28. relative_start_y: 0.0,
  29. relative_width: SCENE_ITEM_MENU_WIDTH / UI_SPRITE_SHEET_WIDTH,
  30. relative_height: SCENE_ITEM_MENU_HEIGHT / UI_SPRITE_SHEET_HEIGHT,
  31. width: SCENE_ITEM_MENU_WIDTH,
  32. height: SCENE_ITEM_MENU_HEIGHT,
  33. },
  34. }
  35. }
  36. pub fn as_draw_params(
  37. &self,
  38. scene_point: &ScenePoint,
  39. scene_current_cursor_point: &ScenePoint,
  40. ) -> Vec<graphics::DrawParam> {
  41. // FIXME BS NOW: this is a generic struct ! not SceneItemMenu struct
  42. let mut draw_params = vec![graphics::DrawParam::new()
  43. .src(graphics::Rect::new(
  44. self.relative_start_x,
  45. self.relative_start_y,
  46. self.relative_width,
  47. self.relative_height,
  48. ))
  49. .dest(*scene_point)];
  50. let relative_cursor_position: Offset = Offset::new(
  51. scene_current_cursor_point.x - scene_point.x,
  52. scene_current_cursor_point.y - scene_point.y,
  53. );
  54. // Cursor inside menu
  55. if relative_cursor_position.x >= 0.0
  56. && relative_cursor_position.x <= SCENE_ITEM_MENU_WIDTH
  57. && relative_cursor_position.y >= 0.0
  58. && relative_cursor_position.y <= SCENE_ITEM_MENU_HEIGHT
  59. {
  60. let hover_item_i = (relative_cursor_position.y / SCENE_ITEM_MENU_ITEM_HEIGHT) as i32;
  61. let source = graphics::Rect::new(
  62. self.relative_width,
  63. (SCENE_ITEM_MENU_ITEM_HEIGHT / UI_SPRITE_SHEET_HEIGHT) * hover_item_i as f32,
  64. self.relative_width,
  65. SCENE_ITEM_MENU_ITEM_HEIGHT / UI_SPRITE_SHEET_HEIGHT,
  66. );
  67. let destination = ScenePoint::new(
  68. scene_point.x,
  69. scene_point.y + (SCENE_ITEM_MENU_ITEM_HEIGHT * hover_item_i as f32),
  70. );
  71. draw_params.push(graphics::DrawParam::new().src(source).dest(destination));
  72. }
  73. draw_params
  74. }
  75. // FIXME BS NOW: this is a generic struct ! not SceneItemMenu struct
  76. pub fn which_item_clicked(
  77. &self,
  78. _window_menu_point: WindowPoint,
  79. _window_click_point: WindowPoint,
  80. _scene_item: &SceneItem,
  81. ) -> Option<SceneItemMenuItem> {
  82. Some(SceneItemMenuItem::Move)
  83. }
  84. }
  85. #[derive(Debug)]
  86. pub enum UserEvent {
  87. Click(WindowPoint), // Window coordinates
  88. RightClick(WindowPoint), // Window coordinates
  89. AreaSelection(WindowPoint, WindowPoint), // Window coordinates
  90. }
  91. pub enum SceneItemPrepareOrder {
  92. Move(usize), // scene_item usize
  93. }