diff --git a/kittens/transfer/send.go b/kittens/transfer/send.go index 6149fa317..37ae61950 100644 --- a/kittens/transfer/send.go +++ b/kittens/transfer/send.go @@ -817,9 +817,65 @@ func (self *SendHandler) on_file_transfer_response(ftc *FileTransmissionCommand) self.send_file_metadata() } } + self.lp.CallSoon(self.loop_tick) return nil } +func (self *SendHandler) loop_tick(timer_id loop.IdType) (err error) { + if self.manager.state == SEND_WAITING_FOR_PERMISSION { + return + } + if self.transmit_started { + if err = self.transmit_next_chunk(); err != nil { + return err + } + if err = self.refresh_progress(timer_id); err != nil { + return err + } + } else { + return self.check_for_transmit_ok() + } + return +} + +func (self *SendHandler) check_for_transmit_ok() (err error) { + if self.transmit_ok_checked { + return self.start_transfer() + } + if self.manager.state != SEND_PERMISSION_GRANTED { + return + } + if self.opts.ConfirmPaths { + if self.manager.all_started { + self.print_check_paths() + } + return + } + self.transmit_ok_checked = true + self.start_transfer() + return +} + +func (self *SendHandler) print_check_paths() { + if self.check_paths_printed { + return + } + self.check_paths_printed = true + self.lp.Println(`The following file transfers will be performed. A red destination means an existing file will be overwritten.`) + for _, df := range self.manager.files { + fn := df.remote_final_path + if df.remote_initial_size > -1 { + fn = self.ctx.Red(fn) + } + self.lp.Println( + self.ctx.Prettify(fmt.Sprintf(":%s:`%s`", df.file_type.Color(), df.file_type.ShortText())), + df.display_name, '→', fn) + } + self.lp.Println(fmt.Sprintf(`Transferring %d files of total size: %s`, + len(self.manager.files), humanize.Size(self.manager.progress_tracker.total_bytes_to_transfer))) + self.print_continue_msg() +} + func (self *SendManager) activate_next_ready_file() *File { if self.active_idx > -1 && self.active_idx < len(self.files) { self.files[self.active_idx].transmit_ended_at = time.Now() @@ -1050,6 +1106,22 @@ func (self *SendHandler) on_key_event(ev *loop.KeyEvent) error { return nil } +func (self *SendHandler) on_writing_finished(msg_id loop.IdType) (err error) { + chunk_transmitted := self.manager.current_chunk_uncompressed_sz >= 0 + if chunk_transmitted { + self.manager.progress_tracker.on_transmit(self.manager.current_chunk_uncompressed_sz) + self.manager.current_chunk_uncompressed_sz = -1 + } + if self.quit_after_write_code > -1 { + self.lp.Quit(self.quit_after_write_code) + return + } + if self.manager.state == SEND_PERMISSION_GRANTED && (!self.transmit_started || chunk_transmitted) { + self.lp.CallSoon(self.loop_tick) + } + return +} + func (self *SendHandler) on_interrupt() { if self.quit_after_write_code > -1 { return @@ -1105,6 +1177,7 @@ func send_loop(opts *Options, files []*File) (err error, rc int) { lp.OnText = handler.on_text lp.OnKeyEvent = handler.on_key_event lp.OnResize = handler.on_resize + lp.OnWriteComplete = handler.on_writing_finished err = lp.Run() if err != nil { diff --git a/tools/cli/markup/prettify.go b/tools/cli/markup/prettify.go index 51f7f86d9..eac2d9cbf 100644 --- a/tools/cli/markup/prettify.go +++ b/tools/cli/markup/prettify.go @@ -19,8 +19,8 @@ var _ = fmt.Print type Context struct { fmt_ctx style.Context - Cyan, Green, Blue, BrightRed, Yellow, Italic, Bold, Dim, Title, Exe, Opt, Emph, Err, Code func(args ...interface{}) string - Url func(string, string) string + Cyan, Green, Blue, Magenta, Red, BrightRed, Yellow, Italic, Bold, Dim, Title, Exe, Opt, Emph, Err, Code func(args ...interface{}) string + Url func(string, string) string } var ( @@ -33,6 +33,8 @@ func New(allow_escape_codes bool) *Context { fmt_ctx := &ans.fmt_ctx ans.Cyan = fmt_ctx.SprintFunc("fg=bright-cyan") + ans.Red = fmt_ctx.SprintFunc("fg=red") + ans.Magenta = fmt_ctx.SprintFunc("fg=magenta") ans.Green = fmt_ctx.SprintFunc("fg=green") ans.Blue = fmt_ctx.SprintFunc("fg=blue") ans.BrightRed = fmt_ctx.SprintFunc("fg=bright-red") @@ -183,6 +185,8 @@ func (self *Context) Prettify(text string) string { return self.Green(val) case "cyan": return self.Cyan(val) + case "magenta": + return self.Magenta(val) case "emph": return self.Italic(val) default: diff --git a/tools/tui/loop/api.go b/tools/tui/loop/api.go index 012dafd9d..f66397c4a 100644 --- a/tools/tui/loop/api.go +++ b/tools/tui/loop/api.go @@ -112,6 +112,10 @@ func (self *Loop) AddTimer(interval time.Duration, repeats bool, callback TimerC return self.add_timer(interval, repeats, callback) } +func (self *Loop) CallSoon(callback TimerCallback) (IdType, error) { + return self.add_timer(0, false, callback) +} + func (self *Loop) RemoveTimer(id IdType) bool { return self.remove_timer(id) }