From f6216bb6213a15cdcdf50089f3c4a8e9a30d9337 Mon Sep 17 00:00:00 2001 From: Jeffas Date: Thu, 5 Sep 2019 23:32:36 +0100 Subject: Add Mouseable This adds the Mouseable interface. When this is implemented for a component that item can accept and process mouseevents. At the top level when a mouse event is received it is passed to the grid's handler and then it trickles down until it reaches a component that can actually handle it, such as the tablist, dirlist or msglist. A mouse event is passed so that components can handle other things such as scrolling with the mousewheel. The components themselves then perform the necessary actions. Clicking emails in the messagelist opens them in a new tab. Textinputs can be clicked to position the cursor inside them. Mouseevents are not forwarded to the terminal at the moment. Elements which do not handle mouse events are not required to implement the Mouseable interface. --- widgets/msglist.go | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) (limited to 'widgets/msglist.go') diff --git a/widgets/msglist.go b/widgets/msglist.go index 8ed716b..b7c921c 100644 --- a/widgets/msglist.go +++ b/widgets/msglist.go @@ -25,6 +25,7 @@ type MessageList struct { spinner *Spinner store *lib.MessageStore isInitalizing bool + aerc *Aerc } type msgSorter struct { @@ -55,12 +56,13 @@ func (s *msgSorter) Swap(i, j int) { s.uids[j] = tmp } -func NewMessageList(conf *config.AercConfig, logger *log.Logger) *MessageList { +func NewMessageList(conf *config.AercConfig, logger *log.Logger, aerc *Aerc) *MessageList { ml := &MessageList{ conf: conf, logger: logger, spinner: NewSpinner(&conf.Ui), isInitalizing: true, + aerc: aerc, } ml.spinner.OnInvalidate(func(_ ui.Drawable) { ml.Invalidate() @@ -161,6 +163,47 @@ func (ml *MessageList) Draw(ctx *ui.Context) { } } +func (ml *MessageList) MouseEvent(localX int, localY int, event tcell.Event) { + switch event := event.(type) { + case *tcell.EventMouse: + switch event.Buttons() { + case tcell.Button1: + if ml.aerc == nil { + return + } + selectedMsg, ok := ml.Clicked(localX, localY) + if ok { + ml.Select(selectedMsg) + acct := ml.aerc.SelectedAccount() + if acct.Messages().Empty() { + return + } + store := acct.Messages().Store() + msg := acct.Messages().Selected() + if msg == nil { + return + } + viewer := NewMessageViewer(acct, ml.aerc.Config(), store, msg) + ml.aerc.NewTab(viewer, msg.Envelope.Subject) + } + case tcell.WheelDown: + ml.store.Next() + ml.Scroll() + case tcell.WheelUp: + ml.store.Prev() + ml.Scroll() + } + } +} + +func (ml *MessageList) Clicked(x, y int) (int, bool) { + store := ml.Store() + if store == nil || ml.nmsgs == 0 || y >= ml.nmsgs { + return 0, false + } + return y + ml.scroll, true +} + func (ml *MessageList) Height() int { return ml.height } -- cgit v1.2.3