Don't show empty top bar selections.

This commit is contained in:
John Preston 2021-11-05 18:23:39 +04:00
parent 9be47f0870
commit 154c0e6bb2
2 changed files with 35 additions and 20 deletions

View file

@ -266,11 +266,11 @@ void TopBarWidget::setChooseForReportReason(
updateControlsVisibility(); updateControlsVisibility();
updateControlsGeometry(); updateControlsGeometry();
update(); update();
if (wasNoReason != nowNoReason && _selectedCount > 0) { if (wasNoReason != nowNoReason && showSelectedState()) {
toggleSelectedControls(false); toggleSelectedControls(false);
finishAnimating(); finishAnimating();
} }
setCursor((nowNoReason && !_selectedCount) setCursor((nowNoReason && !showSelectedState())
? style::cur_pointer ? style::cur_pointer
: style::cur_default); : style::cur_default);
} }
@ -584,9 +584,9 @@ QRect TopBarWidget::getMembersShowAreaGeometry() const {
} }
void TopBarWidget::mousePressEvent(QMouseEvent *e) { void TopBarWidget::mousePressEvent(QMouseEvent *e) {
auto handleClick = (e->button() == Qt::LeftButton) const auto handleClick = (e->button() == Qt::LeftButton)
&& (e->pos().y() < st::topBarHeight) && (e->pos().y() < st::topBarHeight)
&& !_selectedCount && !showSelectedState()
&& !_chooseForReportReason; && !_chooseForReportReason;
if (handleClick) { if (handleClick) {
if (_animatingMode && _back->rect().contains(e->pos())) { if (_animatingMode && _back->rect().contains(e->pos())) {
@ -924,7 +924,7 @@ void TopBarWidget::updateControlsVisibility() {
void TopBarWidget::updateMembersShowArea() { void TopBarWidget::updateMembersShowArea() {
const auto membersShowAreaNeeded = [&] { const auto membersShowAreaNeeded = [&] {
const auto peer = _activeChat.key.peer(); const auto peer = _activeChat.key.peer();
if ((_selectedCount > 0) || !peer) { if (showSelectedState() || !peer) {
return false; return false;
} else if (const auto chat = peer->asChat()) { } else if (const auto chat = peer->asChat()) {
return chat->amIn(); return chat->amIn();
@ -949,44 +949,58 @@ void TopBarWidget::updateMembersShowArea() {
_membersShowArea->setGeometry(getMembersShowAreaGeometry()); _membersShowArea->setGeometry(getMembersShowAreaGeometry());
} }
bool TopBarWidget::showSelectedState() const {
return (_selectedCount > 0)
&& (_canDelete || _canForward || _canSendNow);
}
void TopBarWidget::showSelected(SelectedState state) { void TopBarWidget::showSelected(SelectedState state) {
auto canDelete = (state.count > 0 && state.count == state.canDeleteCount); auto canDelete = (state.count > 0 && state.count == state.canDeleteCount);
auto canForward = (state.count > 0 && state.count == state.canForwardCount); auto canForward = (state.count > 0 && state.count == state.canForwardCount);
auto canSendNow = (state.count > 0 && state.count == state.canSendNowCount); auto canSendNow = (state.count > 0 && state.count == state.canSendNowCount);
if (_selectedCount == state.count && _canDelete == canDelete && _canForward == canForward && _canSendNow == canSendNow) { auto count = (!canDelete && !canForward && !canSendNow) ? 0 : state.count;
if (_selectedCount == count
&& _canDelete == canDelete
&& _canForward == canForward
&& _canSendNow == canSendNow) {
return; return;
} }
if (state.count == 0) { if (count == 0) {
// Don't change the visible buttons if the selection is cancelled. // Don't change the visible buttons if the selection is cancelled.
canDelete = _canDelete; canDelete = _canDelete;
canForward = _canForward; canForward = _canForward;
canSendNow = _canSendNow; canSendNow = _canSendNow;
} }
auto wasSelected = (_selectedCount > 0); const auto wasSelectedState = showSelectedState();
_selectedCount = state.count; const auto visibilityChanged = (_canDelete != canDelete)
if (_selectedCount > 0) { || (_canForward != canForward)
|| (_canSendNow != canSendNow);
_selectedCount = count;
_canDelete = canDelete;
_canForward = canForward;
_canSendNow = canSendNow;
const auto nowSelectedState = showSelectedState();
if (nowSelectedState) {
_forward->setNumbersText(_selectedCount); _forward->setNumbersText(_selectedCount);
_sendNow->setNumbersText(_selectedCount); _sendNow->setNumbersText(_selectedCount);
_delete->setNumbersText(_selectedCount); _delete->setNumbersText(_selectedCount);
if (!wasSelected) { if (!wasSelectedState) {
_forward->finishNumbersAnimation(); _forward->finishNumbersAnimation();
_sendNow->finishNumbersAnimation(); _sendNow->finishNumbersAnimation();
_delete->finishNumbersAnimation(); _delete->finishNumbersAnimation();
} }
} }
auto hasSelected = (_selectedCount > 0); if (visibilityChanged) {
if (_canDelete != canDelete || _canForward != canForward || _canSendNow != canSendNow) {
_canDelete = canDelete;
_canForward = canForward;
_canSendNow = canSendNow;
updateControlsVisibility(); updateControlsVisibility();
} }
if (wasSelected != hasSelected && !_chooseForReportReason) { if (wasSelectedState != nowSelectedState && !_chooseForReportReason) {
setCursor(hasSelected ? style::cur_default : style::cur_pointer); setCursor(nowSelectedState
? style::cur_default
: style::cur_pointer);
updateMembersShowArea(); updateMembersShowArea();
toggleSelectedControls(hasSelected); toggleSelectedControls(nowSelectedState);
} else { } else {
updateControlsGeometry(); updateControlsGeometry();
} }
@ -1002,7 +1016,7 @@ void TopBarWidget::toggleSelectedControls(bool shown) {
} }
bool TopBarWidget::showSelectedActions() const { bool TopBarWidget::showSelectedActions() const {
return (_selectedCount > 0) && !_chooseForReportReason; return showSelectedState() && !_chooseForReportReason;
} }
void TopBarWidget::selectedShowCallback() { void TopBarWidget::selectedShowCallback() {

View file

@ -57,6 +57,7 @@ public:
void updateControlsVisibility(); void updateControlsVisibility();
void finishAnimating(); void finishAnimating();
void showSelected(SelectedState state); void showSelected(SelectedState state);
[[nodiscard]] bool showSelectedState() const;
rpl::producer<bool> membersShowAreaActive() const { rpl::producer<bool> membersShowAreaActive() const {
return _membersShowAreaActive.events(); return _membersShowAreaActive.events();
} }