Guest User

Untitled

a guest
Sep 5th, 2024
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.23 KB | None | 0 0
  1. use std::path::PathBuf;
  2.  
  3. use iced::{
  4. executor,
  5. widget::{button, text, text_input, Button, Column, Row},
  6. Application, Command, Length, Theme,
  7. };
  8.  
  9. use crate::{
  10. general::app_directory,
  11. git_handling::{save, Repository, UpdateError},
  12. };
  13.  
  14. #[derive(Debug, Clone)]
  15. pub enum Message {
  16. NewRepoFormRequested,
  17. NewRepoFormChanged(RepoRequest),
  18. UpdateRepository(usize),
  19. DeleteRepo(usize),
  20. RepoUpdated(Result<(), UpdateError>),
  21. FilesLoaded(Vec<Repository>),
  22. SaveRequested,
  23. SaveFinished,
  24. NewRepoFormSubmitted,
  25. }
  26.  
  27. #[derive(Clone, Debug)]
  28. pub struct RepoRequest {
  29. name: String,
  30. branch: String,
  31. clone_path: String,
  32. install_script: String,
  33. remote_name: String,
  34. extra_info: String,
  35. }
  36.  
  37. impl Default for RepoRequest {
  38. fn default() -> Self {
  39. RepoRequest {
  40. name: String::from(""),
  41. branch: String::from("master"),
  42. clone_path: String::from(""),
  43. install_script: String::from(""),
  44. remote_name: String::from(""),
  45. extra_info: String::from(""),
  46. }
  47. }
  48. }
  49.  
  50. #[derive(Clone, Debug)]
  51. pub struct GitPullD {
  52. pub repositories: Vec<Repository>,
  53. pub app_directory: PathBuf,
  54. new_repo_request: Option<RepoRequest>,
  55. }
  56.  
  57. impl Application for GitPullD {
  58. type Message = Message;
  59. type Theme = Theme;
  60. type Flags = ();
  61. type Executor = executor::Default;
  62.  
  63. fn new(_flags: Self::Flags) -> (Self, iced::Command<Self::Message>) {
  64. (
  65. Self {
  66. app_directory: app_directory(),
  67. repositories: crate::git_handling::load(app_directory()),
  68. new_repo_request: None,
  69. },
  70. Command::none(),
  71. )
  72. }
  73. fn title(&self) -> String {
  74. String::from("GitPullD")
  75. }
  76. fn update(&mut self, message: Self::Message) -> iced::Command<Self::Message> {
  77. match message {
  78. Message::UpdateRepository(index) => {
  79. let curr_repo = self.repositories[index].clone();
  80. Command::perform(crate::git_handling::update(curr_repo), Message::RepoUpdated)
  81. }
  82. Message::FilesLoaded(mut vector) => {
  83. self.repositories.append(&mut vector);
  84. Command::none()
  85. }
  86. Message::SaveRequested => Command::perform(save(self.clone()), |_| Message::SaveFinished),
  87. Message::NewRepoFormRequested => {
  88. self.new_repo_request = Some(RepoRequest::default());
  89. Command::none()
  90. }
  91. Message::NewRepoFormChanged(request) => {
  92. self.new_repo_request = Some(request);
  93. Command::none()
  94. }
  95. Message::NewRepoFormSubmitted => {
  96. todo!()
  97. }
  98. _ => Command::none(),
  99. }
  100. }
  101. fn view(&self) -> iced::Element<'_, Self::Message, Self::Theme, iced::Renderer> {
  102. let repos = &self.repositories;
  103. let mut column = vec![];
  104.  
  105. if let Some(repo_request) = &self.new_repo_request {
  106. column.extend([
  107. text_input("Name of Repository", &repo_request.name)
  108. .on_input(|name| {
  109. Message::NewRepoFormChanged(RepoRequest {
  110. name,
  111. ..repo_request.clone()
  112. })
  113. })
  114. .width(Length::Fill)
  115. .into(),
  116. text_input("Path to cloned repo", &repo_request.clone_path)
  117. .on_input(|clone_path| {
  118. Message::NewRepoFormChanged(RepoRequest {
  119. clone_path,
  120. ..repo_request.clone()
  121. })
  122. })
  123. .width(Length::Fill)
  124. .into(),
  125. text_input("Path to install script", &repo_request.install_script)
  126. .on_input(|install_script| {
  127. Message::NewRepoFormChanged(RepoRequest {
  128. install_script,
  129. ..repo_request.clone()
  130. })
  131. })
  132. .width(Length::Fill)
  133. .into(),
  134. text_input("Name of Remote", &repo_request.remote_name)
  135. .on_input(|remote_name| {
  136. Message::NewRepoFormChanged(RepoRequest {
  137. remote_name,
  138. ..repo_request.clone()
  139. })
  140. })
  141. .width(Length::Fill)
  142. .into(),
  143. text_input("Name of Branch", &repo_request.branch)
  144. .on_input(|branch| {
  145. Message::NewRepoFormChanged(RepoRequest {
  146. branch,
  147. ..repo_request.clone()
  148. })
  149. })
  150. .width(Length::Fill)
  151. .into(),
  152. text_input("Extra info", &repo_request.extra_info)
  153. .on_input(|extra_info| {
  154. Message::NewRepoFormChanged(RepoRequest {
  155. extra_info,
  156. ..repo_request.clone()
  157. })
  158. })
  159. .width(Length::Fill)
  160. .into(),
  161. Button::new("submit").on_press(Message::NewRepoFormSubmitted).into(),
  162. ]);
  163. } else {
  164. column.push(button("new repo").on_press(Message::NewRepoFormRequested).into());
  165. }
  166.  
  167. for (i, repo) in repos.iter().enumerate() {
  168. let name = text(repo.repo_name()).into();
  169. let update_button = button("update").on_press(Message::UpdateRepository(i));
  170.  
  171. column.push(Row::from_vec(vec![name, update_button.into()]).into());
  172. }
  173.  
  174. column.push(button("save").on_press(Message::SaveRequested).into());
  175.  
  176. Into::<iced::Element<'_, Self::Message, Self::Theme, iced::Renderer>>::into(Column::from_vec(column))
  177. }
  178. fn theme(&self) -> Self::Theme {
  179. Theme::GruvboxDark
  180. }
  181. }
  182.  
Advertisement
Add Comment
Please, Sign In to add comment