Skip to content

Commit

Permalink
Big improvements to sending and recieving text along with saving files
Browse files Browse the repository at this point in the history
  • Loading branch information
Jacalz committed Jul 7, 2020
1 parent bab9449 commit 3177028
Show file tree
Hide file tree
Showing 4 changed files with 153 additions and 66 deletions.
78 changes: 78 additions & 0 deletions bridge/display.go
@@ -0,0 +1,78 @@
package bridge

import (
"fyne.io/fyne"
"fyne.io/fyne/dialog"
"fyne.io/fyne/layout"
"fyne.io/fyne/theme"
"fyne.io/fyne/widget"
)

// displayRecievedText handles the creation of a window for displaying text content.
func displayRecievedText(a fyne.App, content string) {
w := a.NewWindow("Recieved text")

textEntry := widget.NewMultiLineEntry()
textEntry.SetText(content)

copyText := widget.NewButtonWithIcon("Copy text", theme.ContentCopyIcon(), func() {
fyne.CurrentApp().Driver().AllWindows()[0].Clipboard().SetContent(content)
})

saveFile := widget.NewButtonWithIcon("Save text to file", theme.MoveDownIcon(), func() {
go func() {
dialog.ShowFileSave(func(file fyne.URIWriteCloser, err error) {
if err != nil {
fyne.LogError("Error on slecting file to write to", err)
dialog.ShowError(err, w)
return
} else if file == nil {
return
}

err = writeFile(file, []byte(content))
if err != nil {
dialog.ShowError(err, w)
return
}
}, w)
}()
})

textContainer := widget.NewScrollContainer(textEntry)
textContainer.SetMinSize(fyne.NewSize(400, 400))

actionContainer := fyne.NewContainerWithLayout(layout.NewGridLayout(2), copyText, saveFile)

w.SetContent(fyne.NewContainerWithLayout(layout.NewVBoxLayout(), textContainer, actionContainer))
w.Show()
}

// EnterSendText opens a new window for setting up text to send.
func (b *Bridge) EnterSendText(a fyne.App, text chan string) {
w := a.NewWindow("Enter text to send")

textEntry := widget.NewMultiLineEntry()
textContainer := widget.NewScrollContainer(textEntry)
textContainer.SetMinSize(fyne.NewSize(400, 400))

w.Canvas().Focus(textEntry)

cancel := widget.NewButtonWithIcon("Cancel", theme.CancelIcon(), func() {
textEntry.Text = ""
w.Close()
})

send := widget.NewButtonWithIcon("Send", theme.MailSendIcon(), func() {
w.Close()
})

w.SetOnClosed(func() {
text <- textEntry.Text
})

actionContainer := fyne.NewContainerWithLayout(layout.NewGridLayout(2), cancel, send)

w.SetContent(fyne.NewContainerWithLayout(layout.NewVBoxLayout(), textContainer, actionContainer))
w.Show()
}
71 changes: 40 additions & 31 deletions bridge/reciever.go
Expand Up @@ -2,60 +2,69 @@ package bridge

import (
"context"
"io"
"io/ioutil"
"os"
"path"

"fyne.io/fyne"
"fyne.io/fyne/dialog"
"fyne.io/fyne/widget"
"github.com/psanford/wormhole-william/wormhole"
)

// RecieveData runs a receive using wormhole-william and handles types accordingly.
func (b *Bridge) RecieveData(code string, fileName chan string, w *fyne.Window) error {
c := wormhole.Client{PassPhraseComponentLength: b.ComponentLength}

msg, err := c.Receive(context.Background(), code)
// writeFile writes the given file to the file system and closes it when done.
func writeFile(file io.WriteCloser, content []byte) error {
_, err := file.Write(content)
if err != nil {
fyne.LogError("Error on receiving data", err)
return err
}
if err2 := file.Close(); err2 != nil {
fyne.LogError("Error on writing and closing the file", err)
return err
}

text, err := ioutil.ReadAll(msg)
if err != nil {
fyne.LogError("Error on reading received data", err)
fyne.LogError("Error on writing data to the file", err)
return err
}

if msg.Type == wormhole.TransferText {
textEntry := widget.NewMultiLineEntry()
textEntry.SetText(string(text))
fileName <- "Text Snippet"

dialog.ShowCustom("Received text", "Close", textEntry, *w)
return nil
}
return file.Close() // Not defering close du to security issues when writing to a file.
}

fileName <- msg.Name
// RecieveData runs a receive using wormhole-william and handles types accordingly.
func (b *Bridge) RecieveData(code string, fileName chan string, a fyne.App) error {
c := wormhole.Client{PassPhraseComponentLength: b.ComponentLength}

f, err := os.Create(path.Join(b.DownloadPath, msg.Name))
msg, err := c.Receive(context.Background(), code)
if err != nil {
fyne.LogError("Error on creating file", err)
fyne.LogError("Error on receiving data", err)
return err
}

_, err = f.Write(text)
if err != nil {
if err2 := f.Close(); err2 != nil {
fyne.LogError("Error on writing and closing the file", err)
switch msg.Type {
case wormhole.TransferText:
content, err := ioutil.ReadAll(msg)
if err != nil {
fyne.LogError("Error on reading received data", err)
return err
}

fyne.LogError("Error on writing data to the file", err)
return err
displayRecievedText(a, string(content))

fileName <- "Text Snippet"
case wormhole.TransferFile:
file, err := os.Create(path.Join(b.DownloadPath, msg.Name))
if err != nil {
fyne.LogError("Error on creating file", err)
return err
}

_, err = io.Copy(file, ioutil.NopCloser(msg))
if err != nil {
fyne.LogError("Error on copying contents to file", err)
return err
}

fileName <- msg.Name
case wormhole.TransferDirectory:
// Directories are currently not supported.
}

return f.Close()
return nil
}
2 changes: 1 addition & 1 deletion recieve.go
Expand Up @@ -35,7 +35,7 @@ func (ad *appData) recieveTab() *widget.TabItem {
recieveGrid.AddObject(finished)

go func() {
err := ad.Bridge.RecieveData(code, file, &ad.Window)
err := ad.Bridge.RecieveData(code, file, ad.App)
if err != nil {
finished.SetText("Failed")
dialog.ShowError(err, ad.Window)
Expand Down
68 changes: 34 additions & 34 deletions send.go
Expand Up @@ -31,7 +31,10 @@ func (ad *appData) sendTab() *widget.TabItem {

dialog.ShowFileOpen(func(file fyne.URIReadCloser, err error) {
if err != nil {
fyne.LogError("Error on picking the file", err)
fyne.LogError("Error on selecting file to send", err)
dialog.ShowError(err, ad.Window)
return
} else if file == nil {
return
}

Expand Down Expand Up @@ -61,43 +64,40 @@ func (ad *appData) sendTab() *widget.TabItem {
}()
}

textEntry := widget.NewMultiLineEntry()
textEntry.SetPlaceHolder("Enter text to send")

textChoice.OnTapped = func() {
go func() {
contentPicker.Hide()
textEntry.SetText("")

dialog.ShowCustomConfirm("Text to send", "Send", "Cancel", textEntry, func(send bool) {
if send {
text := textEntry.Text

var once sync.Once
progress := widget.NewProgressBar()
update := wormhole.WithProgress(func(sent int64, total int64) {
once.Do(func() { progress.Max = float64(total) })
progress.SetValue(float64(sent))
})

code := make(chan string)
go func() {
err := ad.Bridge.SendText(text, code, update)
if err != nil {
dialog.ShowError(err, ad.Window)
} else if ad.Notifications {
ad.App.SendNotification(fyne.NewNotification("Send completed", "The sending of text completed successfully"))
}

}()

codeLabel := widgets.NewCodeLabel(code)
sendGrid.AddObject(widget.NewLabel("Text Snippet"))
sendGrid.AddObject(codeLabel)
sendGrid.AddObject(progress)
text := make(chan string)

ad.Bridge.EnterSendText(ad.App, text)
t := <-text

if t == "" {
return
}

var once sync.Once
progress := widget.NewProgressBar()
update := wormhole.WithProgress(func(sent int64, total int64) {
once.Do(func() { progress.Max = float64(total) })
progress.SetValue(float64(sent))
})

code := make(chan string)
go func() {
err := ad.Bridge.SendText(t, code, update)
if err != nil {
dialog.ShowError(err, ad.Window)
} else if ad.Notifications {
ad.App.SendNotification(fyne.NewNotification("Send completed", "The sending of text completed successfully"))
}
textEntry.SetText("")
}, ad.Window)

}()

codeLabel := widgets.NewCodeLabel(code)
sendGrid.AddObject(widget.NewLabel("Text Snippet"))
sendGrid.AddObject(codeLabel)
sendGrid.AddObject(progress)
}()
}

Expand Down

0 comments on commit 3177028

Please sign in to comment.