feat(tracker/gioui): using mouse to select rectangles in tables

This commit is contained in:
5684185+vsariola@users.noreply.github.com 2024-10-15 13:24:14 +03:00
parent 04ca0a3f6e
commit 00b8e1872a
2 changed files with 37 additions and 17 deletions

View File

@ -5,6 +5,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [Unreleased]
### Added
- Dragging mouse to select rectangles in the tables
- The standalone tracker can open a MIDI port for receiving MIDI notes
([#166][i166])
- Units can have comments, to make it easier to distinguish between units of

View File

@ -26,6 +26,8 @@ type ScrollTable struct {
requestFocus bool
cursorMoved bool
eventFilters []event.Filter
drag bool
dragID pointer.ID
}
type ScrollTableStyle struct {
@ -49,7 +51,7 @@ func NewScrollTable(table tracker.Table, vertList, horizList tracker.List) *Scro
ret.eventFilters = []event.Filter{
key.FocusFilter{Target: ret},
transfer.TargetFilter{Target: ret, Type: "application/text"},
pointer.Filter{Target: ret, Kinds: pointer.Press},
pointer.Filter{Target: ret, Kinds: pointer.Press | pointer.Drag | pointer.Release | pointer.Cancel},
key.Filter{Focus: ret, Name: key.NameLeftArrow, Optional: key.ModShift | key.ModCtrl | key.ModAlt},
key.Filter{Focus: ret, Name: key.NameUpArrow, Optional: key.ModShift | key.ModCtrl | key.ModAlt},
key.Filter{Focus: ret, Name: key.NameRightArrow, Optional: key.ModShift | key.ModCtrl | key.ModAlt},
@ -138,6 +140,18 @@ func (s *ScrollTableStyle) handleEvents(gtx layout.Context, p image.Point) {
case key.FocusEvent:
s.ScrollTable.focused = e.Focus
case pointer.Event:
switch e.Kind {
case pointer.Press:
if s.ScrollTable.drag {
break
}
s.ScrollTable.dragID = e.PointerID
s.ScrollTable.drag = true
fallthrough
case pointer.Drag:
if s.ScrollTable.dragID != e.PointerID {
break
}
if int(e.Position.X) < p.X || int(e.Position.Y) < p.Y {
break
}
@ -150,11 +164,16 @@ func (s *ScrollTableStyle) handleEvents(gtx layout.Context, p image.Point) {
dy := (e.Position.Y + float32(s.ScrollTable.RowTitleList.List.Position.Offset)) / float32(gtx.Dp(s.CellHeight))
x := dx + float32(s.ScrollTable.ColTitleList.List.Position.First)
y := dy + float32(s.ScrollTable.RowTitleList.List.Position.First)
s.ScrollTable.Table.SetCursor2(tracker.Point{X: int(x), Y: int(y)})
if e.Kind == pointer.Press && !e.Modifiers.Contain(key.ModShift) {
s.ScrollTable.Table.SetCursorFloat(x, y)
if !e.Modifiers.Contain(key.ModShift) {
s.ScrollTable.Table.SetCursor2(s.ScrollTable.Table.Cursor())
}
s.ScrollTable.cursorMoved = true
case pointer.Release:
fallthrough
case pointer.Cancel:
s.ScrollTable.drag = false
}
case key.Event:
if e.State == key.Press {
s.ScrollTable.command(gtx, e)