From f6a5181eff5a827a907a13a609f7c38de4874579 Mon Sep 17 00:00:00 2001 From: delthas Date: Sun, 13 Feb 2022 14:22:44 +0100 Subject: Enable clicking on channel members to open a query with them --- app.go | 27 +++++++++++++++++++++++++-- ui/ui.go | 29 +++++++++++++++++++++++------ 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/app.go b/app.go index 8b52465..d26cf68 100644 --- a/app.go +++ b/app.go @@ -430,16 +430,39 @@ func (app *App) handleMouseEvent(ev *tcell.EventMouse) { app.win.ScrollDownBy(4) } } - if ev.Buttons()&tcell.ButtonPrimary != 0 && x < app.cfg.ChanColWidth { - app.win.ClickBuffer(y + app.win.ChannelOffset()) + if ev.Buttons()&tcell.ButtonPrimary != 0 { + if x < app.cfg.ChanColWidth { + app.win.ClickBuffer(y + app.win.ChannelOffset()) + } else if x > w-app.cfg.MemberColWidth { + app.win.ClickMember(y + app.win.MemberOffset()) + } } if ev.Buttons() == 0 { if x < app.cfg.ChanColWidth { if i := y + app.win.ChannelOffset(); i == app.win.ClickedBuffer() { app.win.GoToBufferNo(i) } + } else if x > w-app.cfg.MemberColWidth { + if i := y + app.win.MemberOffset(); i == app.win.ClickedMember() { + netID, target := app.win.CurrentBuffer() + s := app.sessions[netID] + if s != nil && target != "" { + members := s.Names(target) + if i < len(members) { + buffer := members[i].Name.Name + i, added := app.win.AddBuffer(netID, "", buffer) + app.win.JumpBufferIndex(i) + if added { + s.MonitorAdd(buffer) + s.ReadGet(buffer) + s.NewHistoryRequest(buffer).WithLimit(500).Before(time.Now()) + } + } + } + } } app.win.ClickBuffer(-1) + app.win.ClickMember(-1) } } diff --git a/ui/ui.go b/ui/ui.go index fc1a2da..077f599 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -31,6 +31,7 @@ type UI struct { status string channelOffset int + memberClicked int memberOffset int } @@ -125,6 +126,14 @@ func (ui *UI) ShowBufferNumbers(enable bool) { ui.bs.ShowBufferNumbers(enable) } +func (ui *UI) ClickedMember() int { + return ui.memberClicked +} + +func (ui *UI) ClickMember(i int) { + ui.memberClicked = i +} + func (ui *UI) ScrollUp() { ui.bs.ScrollUp(ui.bs.tlHeight / 2) } @@ -164,6 +173,10 @@ func (ui *UI) ChannelOffset() int { return ui.channelOffset } +func (ui *UI) MemberOffset() int { + return ui.memberOffset +} + func (ui *UI) ScrollMemberUpBy(n int) { ui.memberOffset -= n if ui.memberOffset < 0 { @@ -358,7 +371,7 @@ func (ui *UI) Draw(members []irc.Member) { ui.bs.DrawVerticalBufferList(ui.screen, 0, 0, ui.config.ChanColWidth, h, &ui.channelOffset) } if ui.config.MemberColWidth != 0 { - drawVerticalMemberList(ui.screen, w-ui.config.MemberColWidth, 0, ui.config.MemberColWidth, h, members, &ui.memberOffset) + ui.drawVerticalMemberList(ui.screen, w-ui.config.MemberColWidth, 0, ui.config.MemberColWidth, h, members, &ui.memberOffset) } if ui.config.ChanColWidth == 0 { ui.drawStatusBar(ui.config.ChanColWidth, h-3, w-ui.config.MemberColWidth) @@ -403,13 +416,16 @@ func (ui *UI) drawStatusBar(x0, y, width int) { printString(ui.screen, &x, y, s.StyledString()) } -func drawVerticalMemberList(screen tcell.Screen, x0, y0, width, height int, members []irc.Member, offset *int) { +func (ui *UI) drawVerticalMemberList(screen tcell.Screen, x0, y0, width, height int, members []irc.Member, offset *int) { if y0+len(members)-*offset < height { *offset = y0 + len(members) - height if *offset < 0 { *offset = 0 } } + if ui.memberClicked >= len(members) { + ui.memberClicked = len(members) - 1 + } drawVerticalLine(screen, x0, y0, height) x0++ @@ -425,15 +441,16 @@ func drawVerticalMemberList(screen tcell.Screen, x0, y0, width, height int, memb } for i, m := range members[*offset:] { + reverse := i+*offset == ui.memberClicked x := x0 y := y0 + i if m.Disconnected { - disconnectedSt := tcell.StyleDefault.Foreground(tcell.ColorRed) + disconnectedSt := tcell.StyleDefault.Foreground(tcell.ColorRed).Reverse(reverse) printString(screen, &x, y, Styled("\u274C", disconnectedSt)) } else if m.PowerLevel != "" { x += padding - 1 powerLevelText := m.PowerLevel[:1] - powerLevelSt := tcell.StyleDefault.Foreground(tcell.ColorGreen) + powerLevelSt := tcell.StyleDefault.Foreground(tcell.ColorGreen).Reverse(reverse) printString(screen, &x, y, Styled(powerLevelText, powerLevelSt)) } else { x += padding @@ -442,9 +459,9 @@ func drawVerticalMemberList(screen tcell.Screen, x0, y0, width, height int, memb var name StyledString nameText := truncate(m.Name.Name, width-1, "\u2026") if m.Away { - name = Styled(nameText, tcell.StyleDefault.Foreground(tcell.ColorGray)) + name = Styled(nameText, tcell.StyleDefault.Foreground(tcell.ColorGray).Reverse(reverse)) } else { - name = PlainString(nameText) + name = Styled(nameText, tcell.StyleDefault.Reverse(reverse)) } printString(screen, &x, y, name) -- cgit v1.2.3