159 lines
4.9 KiB
Go
159 lines
4.9 KiB
Go
package main
|
|
|
|
import (
|
|
"image/color"
|
|
"strconv"
|
|
"time"
|
|
|
|
"fyne.io/fyne/canvas"
|
|
|
|
"fyne.io/fyne"
|
|
"fyne.io/fyne/widget"
|
|
"github.com/kpetku/syndie-core/data"
|
|
)
|
|
|
|
func (client *GUI) renderChannelList() fyne.CanvasObject {
|
|
var hideEmptyChannels = true
|
|
|
|
client.channelPane = widget.NewVBox()
|
|
for _, channel := range client.db.Channels {
|
|
if hideEmptyChannels {
|
|
if len(client.db.chanList[channel.IdentHash]) == 0 {
|
|
continue
|
|
}
|
|
}
|
|
hbox := widget.NewHBox()
|
|
|
|
icon := canvas.NewImageFromImage(client.db.getAvatar(channel.IdentHash))
|
|
icon.SetMinSize(fyne.NewSize(32, 32))
|
|
|
|
rw := new(tappableLabel)
|
|
rw.SetText(channel.Name + " " + shortIdent(channel.IdentHash) + " (?/" + strconv.Itoa(len(client.db.chanList[channel.IdentHash])) + ")")
|
|
rw.chanID = channel.IdentHash
|
|
|
|
rw.selectedChannel = make(chan string)
|
|
go func() {
|
|
for click := range rw.selectedChannel {
|
|
c := click
|
|
client.selectedChannel = c
|
|
client.channelNeedle = 0
|
|
break
|
|
}
|
|
go client.repaint()
|
|
}()
|
|
|
|
hbox.Append(icon)
|
|
hbox.Append(rw)
|
|
client.channelPane.Append(hbox)
|
|
}
|
|
return client.channelPane
|
|
}
|
|
|
|
func (client *GUI) renderThreadList(needle int) fyne.CanvasObject {
|
|
client.threadPane = widget.NewVBox()
|
|
if client.selectedChannel == "" {
|
|
client.threadPane.Append(widget.NewLabel("Select a channel from the menu to the left to get started"))
|
|
} else {
|
|
for num, msg := range client.db.chanList[client.selectedChannel] {
|
|
if num <= client.channelNeedle || num < client.pagination {
|
|
currentMessage := msg
|
|
// TODO: Move this into it's own custom widget
|
|
first := widget.NewButton(msg.Subject, func() {
|
|
client.selectedMessage = currentMessage.ID
|
|
client.repaint()
|
|
})
|
|
first.Alignment = widget.ButtonAlignLeading
|
|
client.threadPane.Append(first)
|
|
second := new(tappableLabel)
|
|
second.msg = ¤tMessage
|
|
date := time.Unix(0, int64(msg.ID)*int64(time.Millisecond))
|
|
second.SetText("by " + client.db.nameFromChanIdentHash(msg.Author) + " " + shortIdent(msg.Author) + " on " + date.Format("2006-01-02"))
|
|
client.threadPane.Append(second)
|
|
}
|
|
if num == client.channelNeedle {
|
|
if num <= client.pagination {
|
|
continue
|
|
}
|
|
client.threadPane.Append(widget.NewButton("Show more messages", func() {
|
|
client.channelNeedle = needle + client.pagination
|
|
client.renderThreadList(needle + client.pagination)
|
|
client.repaint()
|
|
}))
|
|
}
|
|
}
|
|
if needle == client.channelNeedle {
|
|
if len(client.db.chanList[client.selectedChannel])-1 <= client.pagination {
|
|
return client.threadPane
|
|
}
|
|
if needle <= client.pagination {
|
|
client.threadPane.Append(widget.NewButton("Show more messages", func() {
|
|
if client.channelNeedle == needle {
|
|
client.channelNeedle = client.pagination + (client.pagination - 1)
|
|
} else {
|
|
client.channelNeedle = needle + client.pagination
|
|
}
|
|
client.renderThreadList(needle + client.pagination)
|
|
client.repaint()
|
|
}))
|
|
}
|
|
}
|
|
}
|
|
return client.threadPane
|
|
}
|
|
|
|
func (client *GUI) renderContentArea() fyne.CanvasObject {
|
|
client.contentPane = widget.NewVBox()
|
|
if client.selectedChannel == "" {
|
|
return client.contentPane
|
|
}
|
|
if client.selectedMessage != 0 {
|
|
var currentMessage data.Message
|
|
for _, msg := range client.db.chanList[client.selectedChannel] {
|
|
if msg.ID == client.selectedMessage {
|
|
currentMessage = msg
|
|
break
|
|
}
|
|
}
|
|
if currentMessage.Subject != "" {
|
|
client.contentPane.Append(newLabel("Subject: " + currentMessage.Subject))
|
|
client.contentPane.Append(canvas.NewLine(color.White))
|
|
if len(currentMessage.Raw.Page) > 0 {
|
|
for num, p := range currentMessage.Raw.Page[:1] {
|
|
if num >= 0 {
|
|
client.contentPane.Append(newLabel("Page: " + strconv.Itoa(num+1) + "/" + strconv.Itoa(len(currentMessage.Raw.Page)-1)))
|
|
client.contentPane.Append(newLabel(p.Data))
|
|
client.contentPane.Append(canvas.NewLine(color.White))
|
|
}
|
|
}
|
|
}
|
|
if len(currentMessage.Raw.Attachment) > 0 {
|
|
for num, a := range currentMessage.Raw.Attachment {
|
|
if num >= 0 {
|
|
client.contentPane.Append(newLabel("Attachment: " + strconv.Itoa(num+1) + "/" + strconv.Itoa(len(currentMessage.Raw.Attachment)) + " Name: " + a.Name))
|
|
client.contentPane.Append(newLabel("Type: " + a.ContentType + " Description: " + a.Description))
|
|
adata := a.Data
|
|
image, err := renderImage(imageExtFromName(a.ContentType), adata)
|
|
if err != nil {
|
|
client.contentPane.Append(widget.NewLabel("Unable to display preview"))
|
|
} else {
|
|
i := canvas.NewImageFromImage(image)
|
|
i.FillMode = canvas.ImageFillContain
|
|
i.SetMinSize(fyne.NewSize(fyne.Min(image.Bounds().Dx(), client.contentArea.Size().Width), image.Bounds().Dy()))
|
|
client.contentPane.Append(i)
|
|
}
|
|
client.contentPane.Append(canvas.NewLine(color.White))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return client.contentPane
|
|
}
|
|
|
|
func shortIdent(i string) string {
|
|
if len(i) > 6 {
|
|
return "[" + i[0:6] + "]"
|
|
}
|
|
return ""
|
|
}
|