4
0

mod.rs 6.4 KB

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