From 8024722bd5db50bc3ec602b807819a87bd65035e Mon Sep 17 00:00:00 2001 From: raven Date: Tue, 10 Feb 2026 17:22:58 -0600 Subject: channel read status --- client/application.go | 9 +++++++++ client/channel_list.go | 17 ++++++++++++++--- client/channel_window.go | 9 +++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) (limited to 'client') 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) { -- cgit v1.2.3