summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
Diffstat (limited to 'client')
-rw-r--r--client/application.go9
-rw-r--r--client/channel_list.go17
-rw-r--r--client/channel_window.go9
3 files changed, 32 insertions, 3 deletions
diff --git a/client/application.go b/client/application.go
index 3b627b1..e1d0956 100644
--- a/client/application.go
+++ b/client/application.go
@@ -93,6 +93,15 @@ func (a *application) OnEvent(cmd proto.Command) {
a.newChannel(*ch)
}
})
+ case "unread":
+ switch cl := a.currentWindow.(type) {
+ case channelLocation:
+ if cl.id != cmd.Target {
+ a.channelList.setUnread(channelLocation {id: cmd.Target}, true)
+ }
+ }
+ case "read":
+ a.channelList.setUnread(channelLocation {id: cmd.Target}, false)
}
}
diff --git a/client/channel_list.go b/client/channel_list.go
index bc89dba..c202d39 100644
--- a/client/channel_list.go
+++ b/client/channel_list.go
@@ -13,6 +13,7 @@ type channelListEntry struct {
name string
location channelLocation
clicked bool
+ unread bool
}
func (cl *channelList) Len() int {
@@ -33,7 +34,8 @@ func (cl *channelList) setChannels(cs []proto.Object) {
*cl = nil
for _, c := range cs {
*cl = append(*cl, channelListEntry {
- c.Fields[""], channelLocation {id: c.Id}, false,
+ name: c.Fields[""], location: channelLocation {id: c.Id},
+ unread: c.Fields["unread"] == "yes",
})
}
sort.Sort(cl)
@@ -48,6 +50,14 @@ func (cl *channelList) contains(location channelLocation) bool {
return false
}
+func (cl *channelList) setUnread(location channelLocation, unread bool) {
+ for i := 0; i < len(*cl); i++ {
+ if (*cl)[i].location == location {
+ (*cl)[i].unread = unread
+ }
+ }
+}
+
func (cl *channelList) findName(name string) channelLocation {
for i := 0; i < len(*cl); i++ {
if validate.Fold((*cl)[i].name) == validate.Fold(name) {
@@ -97,7 +107,7 @@ func (cl *channelList) traverse(direction int) int {
func (cl *channelList) add(name string, location channelLocation) {
cl.remove(location)
- entry := channelListEntry {name, location, false}
+ entry := channelListEntry {name: name, location: location}
*cl = append([]channelListEntry {entry}, *cl...)
}
@@ -107,12 +117,13 @@ func (cl *channelList) show(scroll *tui.ScrollState) {
})
scroll.ByMouse(mouse, false)
for i, entry := range *cl {
- var style *tui.Style
+ var style *tui.Style = &tui.Style {Fg: tui.White, Bg: tui.Black}
if entry.location == globalApp.currentWindow {
style = &tui.Style {Fg: tui.Black, Bg: tui.White}
} else if entry.clicked {
style = &tui.Style {Fg: tui.Black, Bg: tui.BrightBlack}
}
+ style.Bold = entry.unread
mouse := tui.Push("channel list." + entry.location.id, tui.Box {
Width: tui.Fill, Height: 1, NoWrap: true, Style: style,
diff --git a/client/channel_window.go b/client/channel_window.go
index 50b7165..f7832e1 100644
--- a/client/channel_window.go
+++ b/client/channel_window.go
@@ -95,6 +95,9 @@ func (cw *channelWindow) put(msg proto.Object) {
}
}
cw.addMessage(msg, true)
+ if globalApp.currentWindow == cw.location {
+ cw.setRead()
+ }
}
func (cw *channelWindow) Location() window.Location {
@@ -146,6 +149,11 @@ func (cw *channelWindow) Send(text string) {
globalApp.goTo(channelLocation {id: cw.location.id})
}
+func (cw *channelWindow) setRead() {
+ globalApp.Request(proto.NewCmd("read", cw.location.id), nil)
+ globalApp.channelList.setUnread(cw.location, false)
+}
+
func (cw *channelWindow) replyTo(id string) {
cw.replyingTo = id
}
@@ -393,6 +401,7 @@ func (cw *channelWindow) OnNavigate() {
if cw.jumpedTo != nil {
cw.Buf.ScrollTo(cw.jumpedTo.Id())
}
+ cw.setRead()
}
func (cw *channelWindow) goToMessage(id string) {