Skip to content

Commit f6117c1

Browse files
committed
improve commit scrolling and selection
1 parent 417eaac commit f6117c1

File tree

3 files changed

+59
-22
lines changed

3 files changed

+59
-22
lines changed

src/core/OSTreeTUI.cpp

+36-19
Original file line numberDiff line numberDiff line change
@@ -79,28 +79,15 @@ OSTreeTUI::OSTreeTUI (const std::string& repo, const std::vector<std::string> st
7979

8080
// window specific shortcuts
8181
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-
}
9582
// 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();
9986
return true;
10087
}
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();
10491
return true;
10592
}
10693
return false;
@@ -290,11 +277,41 @@ std::vector<std::string> OSTreeTUI::parseVisibleCommitMap(cpplibostree::OSTreeRe
290277
return visibleCommitViewMap;
291278
}
292279

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+
293305
// SETTER & non-const GETTER
294306
void OSTreeTUI::setPromotionBranch(std::string promotionBranch) {
295307
this->promotionBranch = promotionBranch;
296308
}
297309

310+
void OSTreeTUI::setSelectedCommit(size_t selectedCommit) {
311+
this->selectedCommit = selectedCommit;
312+
adjustScrollToSelectedCommit();
313+
}
314+
298315
std::vector<std::string>& OSTreeTUI::getColumnToBranchMap() {
299316
return columnToBranchMap;
300317
}

src/core/OSTreeTUI.hpp

+13
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,22 @@ class OSTreeTUI {
7171
*/
7272
std::vector<std::string> parseVisibleCommitMap(cpplibostree::OSTreeRepo& repo, std::unordered_map<std::string, bool>& visibleBranches);
7373

74+
/**
75+
* @brief Adjust scroll offset to fit the selected commit
76+
*/
77+
void adjustScrollToSelectedCommit();
78+
79+
/**
80+
* @brief Adjust selected commit to fit to scroll commit (minimal adjustment of last selected)
81+
*
82+
* Warning: Currently only adjusts by 1
83+
*/
84+
void adjustSelectedCommitToScroll();
85+
7486
public:
7587
// "SETTER" & non-const GETTER
7688
void setPromotionBranch(std::string promotionBranch);
89+
void setSelectedCommit(size_t selectedCommit);
7790
std::vector<std::string>& getColumnToBranchMap();
7891

7992
// GETTER

src/core/commit.cpp

+10-3
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ Element DefaultRenderState(const WindowRenderState& state, ftxui::Color selected
7070
class CommitComponentImpl : public ComponentBase, public WindowOptions {
7171
public:
7272
explicit CommitComponentImpl(int position, std::string commit, OSTreeTUI& ostreetui) :
73-
hash(std::move(commit)),
73+
commitPosition(position),
74+
hash(std::move(commit)),
7475
ostreetui(ostreetui),
7576
commit(ostreetui.getOstreeRepo().getCommitList().at(hash)),
7677
newVersion(this->commit.version),
@@ -151,7 +152,7 @@ class CommitComponentImpl : public ComponentBase, public WindowOptions {
151152
drag_
152153
};
153154

154-
if (drag_initial_y / COMMIT_WINDOW_HEIGHT == ostreetui.getSelectedCommit()) { // selected
155+
if (commitPosition == ostreetui.getSelectedCommit()) { // selected
155156
element = render ? render(state) : DefaultRenderState(state, ostreetui.getBranchColorMap().at(commit.branch));
156157
} else {
157158
element = render ? render(state) : DefaultRenderState(state);
@@ -202,6 +203,11 @@ class CommitComponentImpl : public ComponentBase, public WindowOptions {
202203
return true;
203204
}
204205

206+
if (event.mouse().button == Mouse::Left) {
207+
// update ostreetui
208+
ostreetui.setSelectedCommit(commitPosition);
209+
}
210+
205211
mouse_hover_ = box_window_.Contain(event.mouse().x, event.mouse().y);
206212
// potentially indicate mouse hover
207213
//if (box_window_.Contain(event.mouse().x, event.mouse().y)) {}
@@ -223,7 +229,7 @@ class CommitComponentImpl : public ComponentBase, public WindowOptions {
223229
if (drag_) {
224230
left() = event.mouse().x - drag_start_x - box_.x_min;
225231
top() = event.mouse().y - drag_start_y - box_.y_min;
226-
// promotion
232+
// potential promotion
227233
ostreetui.setPromotionMode(true, hash, false);
228234
// calculate which branch currently is hovered over
229235
ostreetui.setPromotionBranch("");
@@ -301,6 +307,7 @@ class CommitComponentImpl : public ComponentBase, public WindowOptions {
301307
bool drag_ = false;
302308

303309
// ostree-tui specific members
310+
int commitPosition;
304311
std::string hash;
305312
OSTreeTUI& ostreetui;
306313

0 commit comments

Comments
 (0)