Refactor things and add proper wheel scroll support
This commit is contained in:
parent
e414e20215
commit
c128666109
@ -260,7 +260,8 @@ func (c *Container) processOwnMembershipChange(evt *gomatrix.Event) {
|
|||||||
if evt.Unsigned.PrevContent != nil {
|
if evt.Unsigned.PrevContent != nil {
|
||||||
prevMembership, _ = evt.Unsigned.PrevContent["membership"].(string)
|
prevMembership, _ = evt.Unsigned.PrevContent["membership"].(string)
|
||||||
}
|
}
|
||||||
if membership == prevMembership {
|
const Hour = 1 * 60 * 60 * 1000
|
||||||
|
if membership == prevMembership || evt.Unsigned.Age > Hour {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
switch membership {
|
switch membership {
|
||||||
@ -273,11 +274,6 @@ func (c *Container) processOwnMembershipChange(evt *gomatrix.Event) {
|
|||||||
|
|
||||||
// HandleMembership is the event handler for the m.room.membership state event.
|
// HandleMembership is the event handler for the m.room.membership state event.
|
||||||
func (c *Container) HandleMembership(evt *gomatrix.Event) {
|
func (c *Container) HandleMembership(evt *gomatrix.Event) {
|
||||||
const Hour = 1 * 60 * 60 * 1000
|
|
||||||
if evt.Unsigned.Age > Hour {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if evt.StateKey != nil && *evt.StateKey == c.config.Session.UserID {
|
if evt.StateKey != nil && *evt.StateKey == c.config.Session.UserID {
|
||||||
c.processOwnMembershipChange(evt)
|
c.processOwnMembershipChange(evt)
|
||||||
}
|
}
|
||||||
|
@ -195,16 +195,26 @@ func (view *MainView) KeyEventHandler(roomView *widget.RoomView, key *tcell.Even
|
|||||||
} else {
|
} else {
|
||||||
return key
|
return key
|
||||||
}
|
}
|
||||||
} else if k == tcell.KeyPgUp || k == tcell.KeyPgDn || k == tcell.KeyUp || k == tcell.KeyDown {
|
} else if k == tcell.KeyPgUp || k == tcell.KeyPgDn || k == tcell.KeyUp || k == tcell.KeyDown || k == tcell.KeyEnd || k == tcell.KeyHome {
|
||||||
msgView := roomView.MessageView()
|
msgView := roomView.MessageView()
|
||||||
if k == tcell.KeyPgUp || k == tcell.KeyUp {
|
|
||||||
if msgView.IsAtTop() {
|
if msgView.IsAtTop() && (k == tcell.KeyPgUp || k == tcell.KeyUp) {
|
||||||
go view.LoadHistory(roomView.Room.ID, false)
|
go view.LoadHistory(roomView.Room.ID, false)
|
||||||
} else {
|
|
||||||
msgView.MoveUp(k == tcell.KeyPgUp)
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
msgView.MoveDown(k == tcell.KeyPgDn)
|
switch k {
|
||||||
|
case tcell.KeyPgUp:
|
||||||
|
msgView.AddScrollOffset(msgView.Height() / 2)
|
||||||
|
case tcell.KeyPgDn:
|
||||||
|
msgView.AddScrollOffset(-msgView.Height() / 2)
|
||||||
|
case tcell.KeyUp:
|
||||||
|
msgView.AddScrollOffset(1)
|
||||||
|
case tcell.KeyDown:
|
||||||
|
msgView.AddScrollOffset(-1)
|
||||||
|
case tcell.KeyHome:
|
||||||
|
msgView.AddScrollOffset(msgView.TotalHeight())
|
||||||
|
case tcell.KeyEnd:
|
||||||
|
msgView.AddScrollOffset(-msgView.TotalHeight())
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return key
|
return key
|
||||||
@ -212,9 +222,28 @@ func (view *MainView) KeyEventHandler(roomView *widget.RoomView, key *tcell.Even
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const WheelScrollOffsetDiff = 3
|
||||||
|
|
||||||
func (view *MainView) MouseEventHandler(roomView *widget.RoomView, event *tcell.EventMouse) *tcell.EventMouse {
|
func (view *MainView) MouseEventHandler(roomView *widget.RoomView, event *tcell.EventMouse) *tcell.EventMouse {
|
||||||
if event.Buttons() != tcell.ButtonNone {
|
if event.Buttons() == tcell.ButtonNone {
|
||||||
|
return event
|
||||||
|
}
|
||||||
view.BumpFocus()
|
view.BumpFocus()
|
||||||
|
|
||||||
|
msgView := roomView.MessageView()
|
||||||
|
x, y := event.Position()
|
||||||
|
|
||||||
|
switch event.Buttons() {
|
||||||
|
case tcell.WheelUp:
|
||||||
|
if msgView.IsAtTop() {
|
||||||
|
go view.LoadHistory(roomView.Room.ID, false)
|
||||||
|
} else {
|
||||||
|
msgView.AddScrollOffset(WheelScrollOffsetDiff)
|
||||||
|
}
|
||||||
|
case tcell.WheelDown:
|
||||||
|
msgView.AddScrollOffset(-WheelScrollOffsetDiff)
|
||||||
|
default:
|
||||||
|
debug.Print("Mouse event received:", event.Buttons(), event.Modifiers(), x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
return event
|
return event
|
||||||
|
@ -211,48 +211,43 @@ func (view *MessageView) recalculateBuffers() {
|
|||||||
|
|
||||||
const PaddingAtTop = 5
|
const PaddingAtTop = 5
|
||||||
|
|
||||||
func (view *MessageView) MoveUp(page bool) {
|
func (view *MessageView) AddScrollOffset(diff int) {
|
||||||
_, _, _, height := view.GetInnerRect()
|
_, _, _, height := view.GetInnerRect()
|
||||||
|
|
||||||
totalHeight := len(view.textBuffer)
|
totalHeight := len(view.textBuffer)
|
||||||
if view.ScrollOffset >= totalHeight-height {
|
if diff >= 0 && view.ScrollOffset >= totalHeight-height {
|
||||||
// If the user is at the top and presses page up again, add a bit of blank space.
|
// If the user is at the top and presses page up again, add a bit of blank space.
|
||||||
if page {
|
if view.ScrollOffset+diff >= totalHeight-height+PaddingAtTop {
|
||||||
view.ScrollOffset = totalHeight - height + PaddingAtTop
|
view.ScrollOffset = totalHeight - height + PaddingAtTop
|
||||||
} else if view.ScrollOffset < totalHeight-height+PaddingAtTop {
|
} else {
|
||||||
view.ScrollOffset++
|
view.ScrollOffset += diff
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if page {
|
view.ScrollOffset += diff
|
||||||
view.ScrollOffset += height / 2
|
|
||||||
} else {
|
|
||||||
view.ScrollOffset++
|
|
||||||
}
|
|
||||||
if view.ScrollOffset > totalHeight-height {
|
if view.ScrollOffset > totalHeight-height {
|
||||||
view.ScrollOffset = totalHeight - height
|
view.ScrollOffset = totalHeight - height
|
||||||
|
} else if view.ScrollOffset < 0 {
|
||||||
|
view.ScrollOffset = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (view *MessageView) Height() int {
|
||||||
|
_, _, _, height := view.GetInnerRect()
|
||||||
|
return height
|
||||||
|
}
|
||||||
|
|
||||||
|
func (view *MessageView) TotalHeight() int {
|
||||||
|
return len(view.textBuffer)
|
||||||
|
}
|
||||||
|
|
||||||
func (view *MessageView) IsAtTop() bool {
|
func (view *MessageView) IsAtTop() bool {
|
||||||
_, _, _, height := view.GetInnerRect()
|
_, _, _, height := view.GetInnerRect()
|
||||||
totalHeight := len(view.textBuffer)
|
totalHeight := len(view.textBuffer)
|
||||||
return view.ScrollOffset >= totalHeight-height+PaddingAtTop
|
return view.ScrollOffset >= totalHeight-height+PaddingAtTop
|
||||||
}
|
}
|
||||||
|
|
||||||
func (view *MessageView) MoveDown(page bool) {
|
|
||||||
_, _, _, height := view.GetInnerRect()
|
|
||||||
if page {
|
|
||||||
view.ScrollOffset -= height / 2
|
|
||||||
} else {
|
|
||||||
view.ScrollOffset--
|
|
||||||
}
|
|
||||||
if view.ScrollOffset < 0 {
|
|
||||||
view.ScrollOffset = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (view *MessageView) writeLine(screen tcell.Screen, line string, x, y int, color tcell.Color) {
|
func (view *MessageView) writeLine(screen tcell.Screen, line string, x, y int, color tcell.Color) {
|
||||||
offsetX := 0
|
offsetX := 0
|
||||||
for _, ch := range line {
|
for _, ch := range line {
|
||||||
|
Loading…
Reference in New Issue
Block a user