@@ -79,28 +79,15 @@ OSTreeTUI::OSTreeTUI (const std::string& repo, const std::vector<std::string> st
79
79
80
80
// window specific shortcuts
81
81
commitListComponent = CatchEvent (commitListComponent, [&](Event event) {
82
- // scroll
83
- if (event.is_mouse () && event.mouse ().button == Mouse::WheelUp) {
84
- if (scrollOffset < 0 ) {
85
- ++scrollOffset;
86
- }
87
- selectedCommit = (-scrollOffset + CommitRender::COMMIT_WINDOW_HEIGHT - 1 ) / CommitRender::COMMIT_WINDOW_HEIGHT;
88
- return true ;
89
- }
90
- if (event.is_mouse () && event.mouse ().button == Mouse::WheelDown) {
91
- --scrollOffset;
92
- selectedCommit = (-scrollOffset + CommitRender::COMMIT_WINDOW_HEIGHT - 1 ) / CommitRender::COMMIT_WINDOW_HEIGHT;
93
- return true ;
94
- }
95
82
// switch through commits
96
- if (event == Event::ArrowUp) {
97
- scrollOffset = std::min (0 , scrollOffset + CommitRender::COMMIT_WINDOW_HEIGHT );
98
- selectedCommit = -scrollOffset / CommitRender::COMMIT_WINDOW_HEIGHT ;
83
+ if (event == Event::ArrowUp || (event. is_mouse () && event. mouse (). button == Mouse::WheelUp) ) {
84
+ selectedCommit = std::max (0 , static_cast < int >(selectedCommit) - 1 );
85
+ adjustScrollToSelectedCommit () ;
99
86
return true ;
100
87
}
101
- if (event == Event::ArrowDown) {
102
- scrollOffset -= CommitRender::COMMIT_WINDOW_HEIGHT ;
103
- selectedCommit = -scrollOffset / CommitRender::COMMIT_WINDOW_HEIGHT ;
88
+ if (event == Event::ArrowDown || (event. is_mouse () && event. mouse (). button == Mouse::WheelDown) ) {
89
+ selectedCommit = std::min (selectedCommit + 1 , getVisibleCommitViewMap (). size () - 1 ) ;
90
+ adjustScrollToSelectedCommit () ;
104
91
return true ;
105
92
}
106
93
return false ;
@@ -290,11 +277,41 @@ std::vector<std::string> OSTreeTUI::parseVisibleCommitMap(cpplibostree::OSTreeRe
290
277
return visibleCommitViewMap;
291
278
}
292
279
280
+ void OSTreeTUI::adjustScrollToSelectedCommit () {
281
+ // try to scroll it to the middle
282
+ int windowHeight = screen.dimy () - 4 ;
283
+ int scollOffsetToFitCommitToTop = - selectedCommit * CommitRender::COMMIT_WINDOW_HEIGHT;
284
+ int newScroll = scollOffsetToFitCommitToTop + windowHeight / 2 - CommitRender::COMMIT_WINDOW_HEIGHT;
285
+ // adjust if on edges
286
+ int min = 0 ;
287
+ int max = - windowHeight - static_cast <int >(visibleCommitViewMap.size () - 1 ) * CommitRender::COMMIT_WINDOW_HEIGHT;
288
+ scrollOffset = std::max (newScroll, max);
289
+ scrollOffset = std::min (min, newScroll);
290
+ }
291
+
292
+ void OSTreeTUI::adjustSelectedCommitToScroll () {
293
+ int yToFit = selectedCommit * CommitRender::COMMIT_WINDOW_HEIGHT;
294
+ int maxVal = screen.dimy () - 4 - CommitRender::COMMIT_WINDOW_HEIGHT - scrollOffset;
295
+ int minVal = -scrollOffset;
296
+
297
+ if (yToFit > maxVal) {
298
+ --selectedCommit;
299
+ }
300
+ if (yToFit < minVal) {
301
+ ++selectedCommit;
302
+ }
303
+ }
304
+
293
305
// SETTER & non-const GETTER
294
306
void OSTreeTUI::setPromotionBranch (std::string promotionBranch) {
295
307
this ->promotionBranch = promotionBranch;
296
308
}
297
309
310
+ void OSTreeTUI::setSelectedCommit (size_t selectedCommit) {
311
+ this ->selectedCommit = selectedCommit;
312
+ adjustScrollToSelectedCommit ();
313
+ }
314
+
298
315
std::vector<std::string>& OSTreeTUI::getColumnToBranchMap () {
299
316
return columnToBranchMap;
300
317
}
0 commit comments