~taiite/senpai

d41d7c5d975a4b9d80779065c4a4d9e09b35ae91 — delthas 6 months ago bbb92bb
Show the current channel topic at the top of the timeline
3 files changed, 44 insertions(+), 14 deletions(-)

M app.go
M ui/buffers.go
M ui/ui.go
M app.go => app.go +3 -1
@@ 674,7 674,8 @@ func (app *App) handleIRCEvent(netID string, ev interface{}) {
			app.win.JumpBufferIndex(i)
		}
		if ev.Topic != "" {
			app.printTopic(netID, ev.Channel)
			topic := ui.IRCString(ev.Topic).String()
			app.win.SetTopic(netID, ev.Channel, topic)
		}

		// Restore last buffer


@@ 733,6 734,7 @@ func (app *App) handleIRCEvent(netID string, ev interface{}) {
	case irc.TopicChangeEvent:
		topic := ui.IRCString(ev.Topic).String()
		body := fmt.Sprintf("Topic changed to: %s", topic)
		app.win.SetTopic(netID, ev.Channel, topic)
		app.win.AddLine(netID, ev.Channel, ui.NotifyUnread, ui.Line{
			At:        msg.TimeOrNow(),
			Head:      "--",

M ui/buffers.go => ui/buffers.go +37 -13
@@ 179,6 179,7 @@ type buffer struct {
	unread     bool

	lines []Line
	topic string

	scrollAmt int
	isAtTop   bool


@@ 206,7 207,7 @@ func NewBufferList() BufferList {

func (bs *BufferList) ResizeTimeline(tlInnerWidth, tlHeight int) {
	bs.tlInnerWidth = tlInnerWidth
	bs.tlHeight = tlHeight
	bs.tlHeight = tlHeight - 2
}

func (bs *BufferList) To(i int) bool {


@@ 356,6 357,15 @@ func (bs *BufferList) AddLines(netID, title string, before, after []Line) {
	}
}

func (bs *BufferList) SetTopic(netID, title string, topic string) {
	idx := bs.idx(netID, title)
	if idx < 0 {
		return
	}
	b := &bs.list[idx]
	b.topic = topic
}

func (bs *BufferList) Current() (netID, title string) {
	b := &bs.list[bs.current]
	return b.netID, b.title


@@ 532,12 542,22 @@ func (bs *BufferList) DrawHorizontalBufferList(screen tcell.Screen, x0, y0, widt
}

func (bs *BufferList) DrawTimeline(screen tcell.Screen, x0, y0, nickColWidth int) {
	clearArea(screen, x0, y0, bs.tlInnerWidth+nickColWidth+9, bs.tlHeight)
	clearArea(screen, x0, y0, bs.tlInnerWidth+nickColWidth+9, bs.tlHeight+2)

	b := &bs.list[bs.current]

	xTopic := x0
	printString(screen, &xTopic, y0, Styled(b.topic, tcell.StyleDefault))
	y0++
	for x := x0; x < x0+bs.tlInnerWidth+nickColWidth+9; x++ {
		st := tcell.StyleDefault.Foreground(tcell.ColorGray)
		screen.SetContent(x, y0, 0x2500, nil, st)
	}
	y0++

	yi := b.scrollAmt + y0 + bs.tlHeight
	for i := len(b.lines) - 1; 0 <= i; i-- {
		if yi < 0 {
		if yi < y0 {
			break
		}



@@ 550,15 570,17 @@ func (bs *BufferList) DrawTimeline(screen tcell.Screen, x0, y0, nickColWidth int
			continue
		}

		if i == 0 || b.lines[i-1].At.Truncate(time.Minute) != line.At.Truncate(time.Minute) {
			st := tcell.StyleDefault.Bold(true)
			printTime(screen, x0, yi, st, line.At.Local())
		}
		if yi >= y0 {
			if i == 0 || b.lines[i-1].At.Truncate(time.Minute) != line.At.Truncate(time.Minute) {
				st := tcell.StyleDefault.Bold(true)
				printTime(screen, x0, yi, st, line.At.Local())
			}

		identSt := tcell.StyleDefault.
			Foreground(line.HeadColor).
			Reverse(line.Highlight)
		printIdent(screen, x0+7, yi, nickColWidth, Styled(line.Head, identSt))
			identSt := tcell.StyleDefault.
				Foreground(line.HeadColor).
				Reverse(line.Highlight)
			printIdent(screen, x0+7, yi, nickColWidth, Styled(line.Head, identSt))
		}

		x := x1
		y := yi


@@ 574,7 596,7 @@ func (bs *BufferList) DrawTimeline(screen tcell.Screen, x0, y0, nickColWidth int
				x = x1
				y++
				nls = nls[1:]
				if bs.tlHeight <= y {
				if y0+bs.tlHeight <= y {
					break
				}
			}


@@ 583,7 605,9 @@ func (bs *BufferList) DrawTimeline(screen tcell.Screen, x0, y0, nickColWidth int
				continue
			}

			screen.SetContent(x, y, r, nil, style)
			if y >= y0 {
				screen.SetContent(x, y, r, nil, style)
			}
			x += runeWidth(r)
		}
	}

M ui/ui.go => ui/ui.go +4 -0
@@ 231,6 231,10 @@ func (ui *UI) JumpBufferNetwork(netID, sub string) bool {
	return false
}

func (ui *UI) SetTopic(netID, buffer string, topic string) {
	ui.bs.SetTopic(netID, buffer, topic)
}

func (ui *UI) SetStatus(status string) {
	ui.status = status
}