mod.rs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. use crate::{
  2. errors::*,
  3. modules::input::{InputLoader, InputMapper},
  4. utils::ui::AppInternalInfomation,
  5. };
  6. use app_dirs2::AppInfo;
  7. use crossterm::{
  8. event::{Event, KeyCode, KeyEvent, ModifierKeyCode},
  9. terminal::{disable_raw_mode, enable_raw_mode},
  10. };
  11. use mode::{error::ErrorRenderer, ModeData, ModeKey, ModeRenderer, ModeRouter};
  12. use smallvec::SmallVec;
  13. use std::{
  14. cell::RefCell,
  15. collections::HashMap,
  16. io::{self, Read},
  17. mem,
  18. path::{Path, PathBuf},
  19. rc::Rc,
  20. sync::Arc,
  21. };
  22. use crate::{
  23. config::appconfig::AppSetting,
  24. modules::perferences::{Perferences, PerferencesManager},
  25. plugin::system::PluginSystem,
  26. utils::{file::FileManager, ui::uicore::Ui},
  27. view::monitor::Monitor,
  28. workspace::Workspace,
  29. };
  30. mod handler;
  31. pub mod mode;
  32. pub struct Application {
  33. file_manager: FileManager,
  34. bak: bool,
  35. ui: Arc<Ui>,
  36. pub workspace: Workspace,
  37. pub monitor: Monitor,
  38. pub perferences: Rc<RefCell<dyn Perferences>>,
  39. pub mode: ModeData,
  40. mode_key: ModeKey,
  41. mode_history: HashMap<ModeKey, ModeData>,
  42. input_map: HashMap<
  43. String,
  44. HashMap<
  45. String,
  46. SmallVec<[fn(&mut crate::Application) -> std::result::Result<(), Error>; 4]>,
  47. >,
  48. >,
  49. }
  50. impl Application {
  51. pub fn new(file_path: Option<String>, setting: AppSetting, args: &[String]) -> Result<Self> {
  52. let bak;
  53. let mut file = if file_path.is_some() {
  54. bak = true;
  55. FileManager::new(file_path.unwrap())?
  56. } else {
  57. bak = false;
  58. FileManager::new("held.tmp".to_string())?
  59. };
  60. // 将文件数据读入buf
  61. let buf = file.init(bak)?;
  62. let perferences = PerferencesManager::load()?;
  63. let input_map = InputLoader::load(perferences.borrow().input_config_path()?)?;
  64. let mut monitor = Monitor::new(perferences.clone())?;
  65. let workspace = Workspace::create_workspace(&mut monitor, perferences.borrow(), args)?;
  66. Ok(Self {
  67. file_manager: file,
  68. bak,
  69. ui: Ui::new(Arc::new(buf), setting),
  70. workspace,
  71. monitor,
  72. perferences,
  73. mode: ModeData::Normal,
  74. mode_key: ModeKey::Normal,
  75. mode_history: HashMap::new(),
  76. input_map,
  77. })
  78. }
  79. fn init(&mut self) -> io::Result<()> {
  80. // Ui::init_ui()?;
  81. // PluginSystem::init_system();
  82. // self.monitor.terminal.clear().unwrap();
  83. self.init_modes();
  84. // if !self.bak {
  85. // self.ui.start_page_ui()?;
  86. // }
  87. Ok(())
  88. }
  89. fn init_modes(&mut self) {
  90. self.mode_history.insert(ModeKey::Normal, ModeData::Normal);
  91. self.mode_history.insert(ModeKey::Insert, ModeData::Insert);
  92. self.mode_history
  93. .insert(ModeKey::Error, ModeData::Error(Error::default()));
  94. self.mode_history.insert(ModeKey::Exit, ModeData::Exit);
  95. }
  96. pub fn run(&mut self) -> Result<()> {
  97. self.init()?;
  98. loop {
  99. self.render()?;
  100. self.listen_event()?;
  101. if let ModeKey::Exit = &self.mode_key {
  102. return Ok(());
  103. }
  104. }
  105. // 主线程
  106. match self.ui.ui_loop() {
  107. Ok(store) => {
  108. if store {
  109. let buffer = &self.ui.core.lock().unwrap().buffer;
  110. self.file_manager.store(buffer)?
  111. } else if self.file_manager.is_first_open() {
  112. self.file_manager.delete_files()?;
  113. }
  114. }
  115. Err(_) => {
  116. // 补救措施:恢复备份文件
  117. todo!()
  118. }
  119. }
  120. disable_raw_mode()?;
  121. Ok(())
  122. }
  123. fn listen_event(&mut self) -> Result<()> {
  124. let event = self.monitor.terminal.listen()?;
  125. self.handle_input(event)?;
  126. Ok(())
  127. }
  128. fn render(&mut self) -> Result<()> {
  129. if let Err(err) = ModeRouter::render(&mut self.workspace, &mut self.monitor, &mut self.mode)
  130. {
  131. ErrorRenderer::render(
  132. &mut self.workspace,
  133. &mut self.monitor,
  134. &mut ModeData::Error(err),
  135. )?;
  136. }
  137. Ok(())
  138. }
  139. pub fn switch_mode(&mut self, mode_key: ModeKey) {
  140. if self.mode_key == mode_key {
  141. return;
  142. }
  143. let mut mode = self.mode_history.remove(&mode_key).unwrap();
  144. mem::swap(&mut self.mode, &mut mode);
  145. self.mode_history.insert(self.mode_key, mode);
  146. self.mode_key = mode_key;
  147. }
  148. fn handle_input(&mut self, event: Event) -> Result<()> {
  149. if let Event::Key(key_event) = event {
  150. self.monitor.last_key = Some(key_event);
  151. }
  152. let key = InputMapper::event_map_str(event);
  153. if key.is_none() {
  154. return Ok(());
  155. }
  156. let key = key.unwrap();
  157. if let Some(mode_key) = self.mode_key.to_string() {
  158. if let Some(mapper) = self.input_map.get(&mode_key) {
  159. if let Some(commands) = mapper.get(&key).cloned() {
  160. for command in commands {
  161. command(self)?;
  162. }
  163. } else {
  164. if let Some(commands) = mapper.get("_").cloned() {
  165. for command in commands {
  166. command(self)?;
  167. }
  168. }
  169. }
  170. }
  171. }
  172. Ok(())
  173. }
  174. }