Merge pull request #2455 from Kingtous/master
feat: add skipping info in file transfer page
This commit is contained in:
		
						commit
						1145ea50c9
					
				| @ -458,7 +458,7 @@ class _FileManagerPageState extends State<FileManagerPage> | ||||
|                               Wrap( | ||||
|                                 children: [ | ||||
|                                   Text( | ||||
|                                       '${item.state.display()} ${max(0, item.fileNum)}/${item.fileCount} '), | ||||
|                                       '${item.display()} ${max(0, item.fileNum)}/${item.fileCount} '), | ||||
|                                   Text( | ||||
|                                       '${translate("files")} ${readableFileSize(item.totalSize.toDouble())} '), | ||||
|                                   Offstage( | ||||
|  | ||||
| @ -268,6 +268,7 @@ class FileModel extends ChangeNotifier { | ||||
|   } | ||||
| 
 | ||||
|   jobError(Map<String, dynamic> evt) { | ||||
|     final err = evt['err'].toString(); | ||||
|     if (!isDesktop) { | ||||
|       if (_jobResultListener.isListening) { | ||||
|         _jobResultListener.complete(evt); | ||||
| @ -275,12 +276,24 @@ class FileModel extends ChangeNotifier { | ||||
|       } | ||||
|       _selectMode = false; | ||||
|       _jobProgress.clear(); | ||||
|       _jobProgress.err = err; | ||||
|       _jobProgress.state = JobState.error; | ||||
|       _jobProgress.fileNum = int.parse(evt['file_num']); | ||||
|       if (err == "skipped") { | ||||
|         _jobProgress.state = JobState.done; | ||||
|         _jobProgress.finishedSize = _jobProgress.totalSize; | ||||
|       } | ||||
|     } else { | ||||
|       int jobIndex = getJob(int.parse(evt['id'])); | ||||
|       if (jobIndex != -1) { | ||||
|         final job = jobTable[jobIndex]; | ||||
|         job.state = JobState.error; | ||||
|         job.err = err; | ||||
|         job.fileNum = int.parse(evt['file_num']); | ||||
|         if (err == "skipped") { | ||||
|           job.state = JobState.done; | ||||
|           job.finishedSize = job.totalSize; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     debugPrint("jobError $evt"); | ||||
| @ -1089,6 +1102,7 @@ class JobProgress { | ||||
|   var remote = ""; | ||||
|   var to = ""; | ||||
|   var showHidden = false; | ||||
|   var err = ""; | ||||
| 
 | ||||
|   clear() { | ||||
|     state = JobState.none; | ||||
| @ -1100,6 +1114,14 @@ class JobProgress { | ||||
|     fileCount = 0; | ||||
|     remote = ""; | ||||
|     to = ""; | ||||
|     err = ""; | ||||
|   } | ||||
| 
 | ||||
|   String display() { | ||||
|     if (state == JobState.done && err == "skipped") { | ||||
|       return translate("Skipped"); | ||||
|     } | ||||
|     return state.display(); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -215,6 +215,8 @@ pub struct TransferJob { | ||||
|     transferred: u64, | ||||
|     enable_overwrite_detection: bool, | ||||
|     file_confirmed: bool, | ||||
|     // indicating the last file is skipped
 | ||||
|     file_skipped: bool, | ||||
|     file_is_waiting: bool, | ||||
|     default_overwrite_strategy: Option<bool>, | ||||
| } | ||||
| @ -541,25 +543,50 @@ impl TransferJob { | ||||
|     pub fn set_file_confirmed(&mut self, file_confirmed: bool) { | ||||
|         log::info!("id: {}, file_confirmed: {}", self.id, file_confirmed); | ||||
|         self.file_confirmed = file_confirmed; | ||||
|         self.file_skipped = false; | ||||
|     } | ||||
| 
 | ||||
|     pub fn set_file_is_waiting(&mut self, file_is_waiting: bool) { | ||||
|         self.file_is_waiting = file_is_waiting; | ||||
|     } | ||||
| 
 | ||||
|     #[inline] | ||||
|     pub fn file_is_waiting(&self) -> bool { | ||||
|         self.file_is_waiting | ||||
|     } | ||||
| 
 | ||||
|     #[inline] | ||||
|     pub fn file_confirmed(&self) -> bool { | ||||
|         self.file_confirmed | ||||
|     } | ||||
| 
 | ||||
|     pub fn skip_current_file(&mut self) -> bool { | ||||
|     /// Indicating whether the last file is skipped
 | ||||
|     #[inline] | ||||
|     pub fn file_skipped(&self) -> bool { | ||||
|         self.file_skipped | ||||
|     } | ||||
| 
 | ||||
|     /// Indicating whether the whole task is skipped
 | ||||
|     #[inline] | ||||
|     pub fn job_skipped(&self) -> bool { | ||||
|         self.file_skipped() && self.files.len() == 1 | ||||
|     } | ||||
| 
 | ||||
|     /// Get job error message, useful for getting status when job had finished
 | ||||
|     pub fn job_error(&self) -> Option<String> { | ||||
|         if self.job_skipped() { | ||||
|             return Some("skipped".to_string()); | ||||
|         } | ||||
|         None | ||||
|     } | ||||
| 
 | ||||
|     pub fn set_file_skipped(&mut self) -> bool { | ||||
|         log::debug!("skip file {} in job {}", self.file_num, self.id); | ||||
|         self.file.take(); | ||||
|         self.set_file_confirmed(false); | ||||
|         self.set_file_is_waiting(false); | ||||
|         self.file_num += 1; | ||||
|         self.file_skipped = true; | ||||
|         true | ||||
|     } | ||||
| 
 | ||||
| @ -571,7 +598,7 @@ impl TransferJob { | ||||
|                 Some(file_transfer_send_confirm_request::Union::Skip(s)) => { | ||||
|                     if s { | ||||
|                         log::debug!("skip file id:{}, file_num:{}", r.id, r.file_num); | ||||
|                         self.skip_current_file(); | ||||
|                         self.set_file_skipped(); | ||||
|                     } else { | ||||
|                         self.set_file_confirmed(true); | ||||
|                     } | ||||
| @ -719,7 +746,10 @@ pub async fn handle_read_jobs( | ||||
|             Ok(None) => { | ||||
|                 if !job.enable_overwrite_detection || (!job.file_confirmed && !job.file_is_waiting) | ||||
|                 { | ||||
|                     // for getting error detail, we do not remove this job, we will handle it in io loop
 | ||||
|                     if job.job_error().is_none() { | ||||
|                         finished.push(job.id()); | ||||
|                     } | ||||
|                     stream.send(&new_done(job.id(), job.file_num())).await?; | ||||
|                 } else { | ||||
|                     // waiting confirmation.
 | ||||
|  | ||||
| @ -499,7 +499,7 @@ impl<T: InvokeUiSession> Remote<T> { | ||||
|                         } | ||||
|                         let mut msg = Message::new(); | ||||
|                         let mut file_action = FileAction::new(); | ||||
|                         file_action.set_send_confirm(FileTransferSendConfirmRequest { | ||||
|                         let req = FileTransferSendConfirmRequest { | ||||
|                             id, | ||||
|                             file_num, | ||||
|                             union: if need_override { | ||||
| @ -508,7 +508,9 @@ impl<T: InvokeUiSession> Remote<T> { | ||||
|                                 Some(file_transfer_send_confirm_request::Union::Skip(true)) | ||||
|                             }, | ||||
|                             ..Default::default() | ||||
|                         }); | ||||
|                         }; | ||||
|                         job.confirm(&req); | ||||
|                         file_action.set_send_confirm(req); | ||||
|                         msg.set_file_action(file_action); | ||||
|                         allow_err!(peer.send(&msg).await); | ||||
|                     } | ||||
| @ -862,18 +864,19 @@ impl<T: InvokeUiSession> Remote<T> { | ||||
|                                         match fs::is_write_need_confirmation(&write_path, &digest) { | ||||
|                                             Ok(res) => match res { | ||||
|                                                 DigestCheckResult::IsSame => { | ||||
|                                                     let msg= new_send_confirm(FileTransferSendConfirmRequest { | ||||
|                                                     let req = FileTransferSendConfirmRequest { | ||||
|                                                         id: digest.id, | ||||
|                                                         file_num: digest.file_num, | ||||
|                                                         union: Some(file_transfer_send_confirm_request::Union::Skip(true)), | ||||
|                                                         ..Default::default() | ||||
|                                                     }); | ||||
|                                                     }; | ||||
|                                                     job.confirm(&req); | ||||
|                                                     let msg = new_send_confirm(req); | ||||
|                                                     allow_err!(peer.send(&msg).await); | ||||
|                                                 } | ||||
|                                                 DigestCheckResult::NeedConfirm(digest) => { | ||||
|                                                     if let Some(overwrite) = overwrite_strategy { | ||||
|                                                         let msg = new_send_confirm( | ||||
|                                                             FileTransferSendConfirmRequest { | ||||
|                                                         let req = FileTransferSendConfirmRequest { | ||||
|                                                             id: digest.id, | ||||
|                                                             file_num: digest.file_num, | ||||
|                                                             union: Some(if overwrite { | ||||
| @ -882,8 +885,9 @@ impl<T: InvokeUiSession> Remote<T> { | ||||
|                                                                 file_transfer_send_confirm_request::Union::Skip(true) | ||||
|                                                             }), | ||||
|                                                             ..Default::default() | ||||
|                                                             }, | ||||
|                                                         ); | ||||
|                                                         }; | ||||
|                                                         job.confirm(&req); | ||||
|                                                         let msg = new_send_confirm(req); | ||||
|                                                         allow_err!(peer.send(&msg).await); | ||||
|                                                     } else { | ||||
|                                                         self.handler.override_file_confirm( | ||||
| @ -895,14 +899,14 @@ impl<T: InvokeUiSession> Remote<T> { | ||||
|                                                     } | ||||
|                                                 } | ||||
|                                                 DigestCheckResult::NoSuchFile => { | ||||
|                                                     let msg = new_send_confirm( | ||||
|                                                     FileTransferSendConfirmRequest { | ||||
|                                                     let req = FileTransferSendConfirmRequest { | ||||
|                                                         id: digest.id, | ||||
|                                                         file_num: digest.file_num, | ||||
|                                                         union: Some(file_transfer_send_confirm_request::Union::OffsetBlk(0)), | ||||
|                                                         ..Default::default() | ||||
|                                                     }, | ||||
|                                                 ); | ||||
|                                                     }; | ||||
|                                                     job.confirm(&req); | ||||
|                                                     let msg = new_send_confirm(req); | ||||
|                                                     allow_err!(peer.send(&msg).await); | ||||
|                                                 } | ||||
|                                             }, | ||||
| @ -923,11 +927,18 @@ impl<T: InvokeUiSession> Remote<T> { | ||||
|                             } | ||||
|                         } | ||||
|                         Some(file_response::Union::Done(d)) => { | ||||
|                             let mut err: Option<String> = None; | ||||
|                             if let Some(job) = fs::get_job(d.id, &mut self.write_jobs) { | ||||
|                                 job.modify_time(); | ||||
|                                 err = job.job_error(); | ||||
|                                 fs::remove_job(d.id, &mut self.write_jobs); | ||||
|                             } | ||||
|                             self.handle_job_status(d.id, d.file_num, None); | ||||
|                             if let Some(job) = fs::get_job(d.id, &mut self.read_jobs) { | ||||
|                                 job.modify_time(); | ||||
|                                 err = job.job_error(); | ||||
|                                 fs::remove_job(d.id, &mut self.read_jobs); | ||||
|                             } | ||||
|                             self.handle_job_status(d.id, d.file_num, err); | ||||
|                         } | ||||
|                         Some(file_response::Union::Error(e)) => { | ||||
|                             self.handle_job_status(e.id, e.file_num, Some(e.error)); | ||||
| @ -976,7 +987,8 @@ impl<T: InvokeUiSession> Remote<T> { | ||||
|                         self.handler.ui_handler.switch_display(&s); | ||||
|                         self.video_sender.send(MediaData::Reset).ok(); | ||||
|                         if s.width > 0 && s.height > 0 { | ||||
|                             self.handler.set_display(s.x, s.y, s.width, s.height, s.cursor_embeded); | ||||
|                             self.handler | ||||
|                                 .set_display(s.x, s.y, s.width, s.height, s.cursor_embeded); | ||||
|                         } | ||||
|                     } | ||||
|                     Some(misc::Union::CloseReason(c)) => { | ||||
|  | ||||
| @ -399,5 +399,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> = | ||||
|         ("hide_cm_tip", "在只允许密码连接并且只用固定密码的情况下才允许隐藏"), | ||||
|         ("wayland_experiment_tip", ""), | ||||
|         ("Right click to select tabs", "右键选择选项卡"), | ||||
|         ("Skipped", "已跳过"), | ||||
|     ].iter().cloned().collect(); | ||||
| } | ||||
|  | ||||
| @ -245,7 +245,13 @@ class JobTable: Reactor.Component { | ||||
|     var percent = job.total_size == 0 ? 100 : (100. * job.finished_size / job.total_size).toInteger(); // (100. * i / (n || 1)).toInteger(); | ||||
|     if (job.finished) percent = '100'; | ||||
|     if (percent) res += ", " + percent + "%"; | ||||
|     if (job.finished) res = translate("Finished") + " " + res; | ||||
|     if (job.finished) { | ||||
|       if (job.err == "skipped") { | ||||
|         res = translate("Skipped") + " " + res; | ||||
|       } else { | ||||
|         res = translate("Finished") + " " + res; | ||||
|       } | ||||
|     } | ||||
|     if (job.speed) res += ", " + getSize(0, job.speed) + "/s"; | ||||
|     return res; | ||||
|   } | ||||
| @ -268,9 +274,10 @@ class JobTable: Reactor.Component { | ||||
|     if (file_num < job.file_num) return; | ||||
|     job.file_num = file_num; | ||||
|     var n = job.num_entries || job.entries.length; | ||||
|     job.finished = job.file_num >= n - 1 || err == "cancel"; | ||||
|     job.finished = job.file_num >= n - 1 || err == "cancel" || err == "skipped"; | ||||
|     job.finished_size = finished_size; | ||||
|     job.speed = speed || 0; | ||||
|     job.err = err; | ||||
|     this.updateJob(job); | ||||
|     if (job.type == "del-dir") { | ||||
|       if (job.finished) { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user