2
0
mirror of https://github.com/telegramdesktop/tdesktop synced 2025-09-05 08:55:59 +00:00

Implement keyboard navigation for recent peers.

This commit is contained in:
John Preston
2024-04-12 16:30:46 +04:00
parent 051ca51d3b
commit 19f5d95a3c
5 changed files with 110 additions and 72 deletions

View File

@@ -491,43 +491,60 @@ Suggestions::Suggestions(
Suggestions::~Suggestions() = default;
void Suggestions::selectSkip(int delta) {
if (!delta) {
return;
} else if (delta > 0) {
const auto hasRecent = false;
if (hasRecent && (_topPeers->selectedByKeyboard() || delta > 1)) {
void Suggestions::selectJump(Qt::Key direction, int pageSize) {
const auto recentHasSelection = [=] {
return _recentSelectJump(Qt::Key(), 0) == JumpResult::Applied;
};
if (pageSize) {
if (direction == Qt::Key_Down || direction == Qt::Key_Up) {
_topPeers->deselectByKeyboard();
if (!recentHasSelection()) {
if (direction == Qt::Key_Down) {
_recentSelectJump(direction, 0);
} else {
return;
}
}
if (_recentSelectJump(direction, pageSize) == JumpResult::AppliedAndOut) {
if (direction == Qt::Key_Up) {
_scroll->scrollTo(0);
}
}
}
} else if (direction == Qt::Key_Up) {
if (_recentSelectJump(direction, pageSize)
== JumpResult::AppliedAndOut) {
_topPeers->selectByKeyboard(Qt::Key());
_scroll->scrollTo(0);
} else {
_topPeers->selectByKeyboard(0);
}
} else {
if (_topPeers->selectedByKeyboard()) {
_topPeers->deselectByKeyboard();
}
}
}
void Suggestions::selectSkipPage(int height, int direction) {
if (_topPeers->selectedByKeyboard()) {
_topPeers->deselectByKeyboard();
} else if (direction == Qt::Key_Down) {
if (_topPeers->selectedByKeyboard()) {
if (_recentCount.current() > 0) {
_topPeers->deselectByKeyboard();
_recentSelectJump(direction, pageSize);
}
} else if (!_topPeersWrap->toggled() || recentHasSelection()) {
_recentSelectJump(direction, pageSize);
} else {
_topPeers->selectByKeyboard(Qt::Key());
_scroll->scrollTo(0);
}
} else if (direction == Qt::Key_Left || direction == Qt::Key_Right) {
if (!recentHasSelection()) {
_topPeers->selectByKeyboard(direction);
_scroll->scrollTo(0);
}
}
}
void Suggestions::chooseRow() {
if (_topPeers->chooseRow()) {
return;
if (!_topPeers->chooseRow()) {
_recentPeersChoose();
}
}
void Suggestions::selectLeft() {
_topPeers->selectLeft();
}
void Suggestions::selectRight() {
_topPeers->selectRight();
}
void Suggestions::paintEvent(QPaintEvent *e) {
QPainter(this).fillRect(e->rect(), st::windowBg);
}
@@ -559,7 +576,39 @@ object_ptr<Ui::SlideWrap<>> Suggestions::setupRecentPeers(
}, lifetime);
auto content = object_ptr<PeerListContent>(_content, controller);
delegate->setContent(content);
const auto raw = content.data();
_recentPeersChoose = [=] {
return raw->submitted();
};
_recentSelectJump = [raw](Qt::Key direction, int pageSize) {
const auto had = raw->hasSelection();
if (direction == Qt::Key()) {
return had ? JumpResult::Applied : JumpResult::NotApplied;
} else if (direction == Qt::Key_Up && !had) {
return JumpResult::NotApplied;
} else if (direction == Qt::Key_Down || direction == Qt::Key_Up) {
const auto delta = (direction == Qt::Key_Down) ? 1 : -1;
if (pageSize > 0) {
raw->selectSkipPage(pageSize, delta);
} else {
raw->selectSkip(delta);
}
return raw->hasSelection()
? JumpResult::Applied
: had
? JumpResult::AppliedAndOut
: JumpResult::NotApplied;
}
return JumpResult::NotApplied;
};
raw->scrollToRequests(
) | rpl::start_with_next([this](Ui::ScrollToRequest request) {
const auto add = _topPeersWrap->toggled() ? _topPeers->height() : 0;
_scroll->scrollToY(request.ymin + add, request.ymax + add);
}, lifetime);
delegate->setContent(raw);
controller->setDelegate(delegate);
return object_ptr<Ui::SlideWrap<>>(this, std::move(content));