mod.rs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. use self::asset_item::AssetItem;
  2. use crate::starry_toolkit::traits::focus::Focus;
  3. use starry_client::base::color::Color;
  4. use starry_server::base::image::Image as ImageResource;
  5. use starry_server::core::{SCREEN_HEIGHT, SCREEN_WIDTH};
  6. use starry_toolkit::{
  7. base::{panel::Panel, rect::Rect},
  8. layout::grid::{Grid, GridArrangeType},
  9. traits::enter::Enter,
  10. widgets::{image::Image, widget_add_child},
  11. };
  12. use std::{collections::BTreeMap, fs, sync::Arc};
  13. pub mod asset_item;
  14. const DESKTOP_BG_PATH: &[u8] = include_bytes!("../resource/desktop_bg.png");
  15. pub struct AssetManager {
  16. cur_path: String,
  17. asset_grid: Arc<Grid>,
  18. items: BTreeMap<(usize, usize), Arc<AssetItem>>,
  19. panel: Panel,
  20. }
  21. impl AssetManager {
  22. pub fn new() -> Self {
  23. AssetManager {
  24. cur_path: String::from("/"),
  25. asset_grid: Grid::new(),
  26. items: BTreeMap::new(),
  27. panel: Panel::new(
  28. Rect::new(0, 0, SCREEN_WIDTH as u32, SCREEN_HEIGHT as u32),
  29. "Title",
  30. Color::rgb(0, 0, 0),
  31. ),
  32. }
  33. }
  34. pub fn init(&mut self) {
  35. let grid = self.asset_grid.clone();
  36. grid.set_upper_limit(5);
  37. grid.set_space(20, 20);
  38. grid.set_arrange_type(GridArrangeType::Horizontal);
  39. let self_ptr = self as *mut AssetManager;
  40. grid.set_enter_callback(move |grid, char, redraw| {
  41. if char == ' ' {
  42. let asset_manager: &mut AssetManager = unsafe { &mut *self_ptr };
  43. if let Some(item) = asset_manager.items.get(&grid.focused_id.get().unwrap()) {
  44. asset_manager.cur_path.push_str(&item.file_path.borrow());
  45. asset_manager.cur_path.push_str(&"/");
  46. asset_manager.refresh();
  47. }
  48. return;
  49. }
  50. let row_offset: i32 = match char {
  51. 'a' => 0,
  52. 'A' => 0,
  53. 'd' => 0,
  54. 'D' => 0,
  55. 'w' => -1,
  56. 'W' => -1,
  57. 's' => 1,
  58. 'S' => 1,
  59. _ => 0,
  60. };
  61. let col_offset: i32 = match char {
  62. 'a' => -1,
  63. 'A' => -1,
  64. 'd' => 1,
  65. 'D' => 1,
  66. 'w' => 0,
  67. 'W' => 0,
  68. 's' => 0,
  69. 'S' => 0,
  70. _ => 0,
  71. };
  72. if row_offset == 0 && col_offset == 0 {
  73. return;
  74. }
  75. let mut nxt_row = grid.focused_id.get().unwrap().0 as i32 + row_offset;
  76. let mut nxt_col = grid.focused_id.get().unwrap().1 as i32 + col_offset;
  77. loop {
  78. if nxt_row < 0
  79. || nxt_row >= grid.max_row.get() as i32
  80. || nxt_col < 0
  81. || nxt_col >= grid.max_column.get() as i32
  82. {
  83. return;
  84. }
  85. if grid
  86. .elements
  87. .borrow()
  88. .contains_key(&(nxt_row as usize, nxt_col as usize))
  89. {
  90. break;
  91. }
  92. nxt_row += row_offset;
  93. nxt_col += col_offset;
  94. }
  95. grid.focus(
  96. grid.elements
  97. .borrow()
  98. .get(&(nxt_row as usize, nxt_col as usize))
  99. .unwrap(),
  100. );
  101. grid.focused_id
  102. .set(Some((nxt_row as usize, nxt_col as usize)));
  103. *redraw = true;
  104. });
  105. self.panel.add_child(&Image::from_image(
  106. ImageResource::from_path(DESKTOP_BG_PATH).unwrap(),
  107. ));
  108. self.panel.add_child(&(self.asset_grid));
  109. }
  110. pub fn refresh(&mut self) {
  111. self.items.clear();
  112. self.asset_grid.clear();
  113. // 读取目录中的文件列表
  114. if let Ok(entries) = fs::read_dir(&self.cur_path) {
  115. for entry in entries {
  116. if let Ok(item) = entry {
  117. let asset_item = AssetItem::new(
  118. item.file_name().to_str().unwrap(),
  119. item.metadata().unwrap().is_dir(),
  120. );
  121. let (row, col) = self.asset_grid.add(&asset_item);
  122. self.items.insert((row, col), asset_item.clone());
  123. widget_add_child(self.asset_grid.clone(), asset_item);
  124. }
  125. }
  126. } else {
  127. println!(
  128. "[Error] AssetManager failed to read dir {:?}",
  129. self.cur_path
  130. );
  131. }
  132. let grid = self.asset_grid.clone();
  133. if let Some(widget) = grid.elements.borrow().get(&(0, 0)) {
  134. grid.focused_id.set(Some((0, 0)));
  135. grid.focus(widget);
  136. }
  137. self.panel.draw();
  138. }
  139. pub fn exec(&mut self) {
  140. self.panel.exec();
  141. }
  142. }