@@ -50,15 +50,19 @@ func (m lazyTableModel) Update(msg tea.Msg) (lazyTableModel, tea.Cmd) {
5050 var cmd tea.Cmd
5151
5252 render := false
53+ captureMessage := false
5354 switch msg := msg .(type ) {
5455 case tea.KeyMsg :
55- m , render = m .handleKey (msg , render )
56+ m , render , captureMessage = m .handleKey (msg , render )
5657
5758 case EntriesUpdateMsg :
5859 m .entries = msg .Entries
5960 render = true
6061 }
61- m .table , cmd = m .table .Update (msg )
62+
63+ if ! captureMessage {
64+ m .table , cmd = m .table .Update (msg )
65+ }
6266
6367 if m .table .Cursor () != m .lastCursor {
6468 render = true
@@ -92,18 +96,20 @@ func (m lazyTableModel) getCellRenderer() func(table.Model, string, table.CellPo
9296 }
9397}
9498
95- func (m lazyTableModel ) handleKey (msg tea.KeyMsg , render bool ) (lazyTableModel , bool ) {
99+ func (m lazyTableModel ) handleKey (msg tea.KeyMsg , render bool ) (lazyTableModel , bool , bool ) {
100+ captureMessage := false // when true, the key message must not be forwarded to the inner table
101+
96102 // toggle the reverse display of items.
97103 if key .Matches (msg , m .keys .Reverse ) {
98104 m .reverse = ! m .reverse
99105 render = true
100106 }
101107
102- // this function increases the viewport offset by 1 if possible. (scrolls down)
103- increaseOffset := func () {
108+ // this function increases the viewport offset by n if possible. (scrolls down)
109+ increaseOffset := func (n int ) {
104110 maxOffset := max (m .entries .Len ()- m .table .Height (), 0 )
105111
106- offset := min (m .offset + 1 , maxOffset )
112+ offset := min (m .offset + n , maxOffset )
107113 if offset != m .offset {
108114 m .offset = offset
109115 render = true
@@ -113,9 +119,9 @@ func (m lazyTableModel) handleKey(msg tea.KeyMsg, render bool) (lazyTableModel,
113119 }
114120 }
115121
116- // this function decreases the viewport offset by 1 if possible. (scrolls up)
117- decreaseOffset := func () {
118- offset := max (m .offset - 1 , 0 )
122+ // this function decreases the viewport offset by n if possible. (scrolls up)
123+ decreaseOffset := func (n int ) {
124+ offset := max (m .offset - n , 0 )
119125 if offset != m .offset {
120126 m .offset = offset
121127 render = true
@@ -131,17 +137,29 @@ func (m lazyTableModel) handleKey(msg tea.KeyMsg, render bool) (lazyTableModel,
131137 if key .Matches (msg , m .keys .Down ) {
132138 m .follow = false
133139 if m .table .Cursor ()+ 1 == m .table .Height () {
134- increaseOffset () // move the viewport
140+ increaseOffset (1 ) // move the viewport
135141 }
136142 }
137143
138144 if key .Matches (msg , m .keys .Up ) {
139145 m .follow = false
140146 if m .table .Cursor () == 0 {
141- decreaseOffset () // move the viewport
147+ decreaseOffset (1 ) // move the viewport
142148 }
143149 }
144150
151+ if key .Matches (msg , m .keys .PageDown ) {
152+ m .follow = false
153+ increaseOffset (m .table .Height () - 1 ) // move the viewport
154+ captureMessage = ! m .follow
155+ }
156+
157+ if key .Matches (msg , m .keys .PageUp ) {
158+ m .follow = false
159+ decreaseOffset (m .table .Height () - 1 ) // move the viewport
160+ captureMessage = ! m .follow
161+ }
162+
145163 if key .Matches (msg , m .keys .GotoTop ) {
146164 if m .reverse {
147165 // when follow is enabled, rendering will handle setting the offset to the correct value
@@ -164,7 +182,7 @@ func (m lazyTableModel) handleKey(msg tea.KeyMsg, render bool) (lazyTableModel,
164182 render = true
165183 }
166184
167- return m , render
185+ return m , render , captureMessage
168186}
169187
170188func (m lazyTableModel ) viewPortCursor () int {
0 commit comments