mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-16 14:17:12 +02:00
Try to show the reaction button outside of the bubble.
This commit is contained in:
parent
9486c266b5
commit
e722645e7c
4 changed files with 35 additions and 9 deletions
|
@ -1867,11 +1867,16 @@ Reactions::ButtonParameters Message::reactionButtonParameters(
|
|||
st::reactionCornerCenter.y()))
|
||||
: (QPoint(contentRect.width(), innerHeight)
|
||||
+ st::reactionCornerCenter));
|
||||
if (reactionState.itemId != result.context) {
|
||||
if (!contentRect.contains(position)) {
|
||||
return {};
|
||||
}
|
||||
if (reactionState.itemId != result.context
|
||||
&& !contentRect.contains(position)) {
|
||||
result.outside = true;
|
||||
}
|
||||
const auto minSkip = (st::reactionCornerShadow.left()
|
||||
+ st::reactionCornerSize.width()
|
||||
+ st::reactionCornerShadow.right()) / 2;
|
||||
result.center = QPoint(
|
||||
std::min(std::max(result.center.x(), minSkip), width() - minSkip),
|
||||
result.center.y());
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ constexpr auto kMaskCacheIndex = 2;
|
|||
constexpr auto kCacheColumsCount = 3;
|
||||
constexpr auto kButtonShowDelay = crl::time(300);
|
||||
constexpr auto kButtonExpandDelay = crl::time(300);
|
||||
constexpr auto kButtonHideDelay = crl::time(200);
|
||||
|
||||
[[nodiscard]] QPoint LocalPosition(not_null<QWheelEvent*> e) {
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||
|
@ -60,11 +61,13 @@ constexpr auto kButtonExpandDelay = crl::time(300);
|
|||
|
||||
Button::Button(
|
||||
Fn<void(QRect)> update,
|
||||
ButtonParameters parameters)
|
||||
ButtonParameters parameters,
|
||||
Fn<void()> hideMe)
|
||||
: _update(std::move(update))
|
||||
, _collapsed(QPoint(), CountOuterSize())
|
||||
, _finalHeight(_collapsed.height())
|
||||
, _expandTimer([=] { applyState(State::Inside, _update); }) {
|
||||
, _expandTimer([=] { applyState(State::Inside, _update); })
|
||||
, _hideTimer(hideMe) {
|
||||
applyParameters(parameters, nullptr);
|
||||
}
|
||||
|
||||
|
@ -152,6 +155,11 @@ void Button::applyParameters(
|
|||
update(_geometry);
|
||||
}
|
||||
}
|
||||
if (parameters.outside && _state == State::Shown) {
|
||||
_hideTimer.callOnce(kButtonHideDelay);
|
||||
} else {
|
||||
_hideTimer.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
void Button::updateExpandDirection(const ButtonParameters ¶meters) {
|
||||
|
@ -202,6 +210,7 @@ void Button::applyState(State state) {
|
|||
void Button::applyState(State state, Fn<void(QRect)> update) {
|
||||
if (state == State::Hidden) {
|
||||
_expandTimer.cancel();
|
||||
_hideTimer.cancel();
|
||||
}
|
||||
const auto finalHeight = (state == State::Inside)
|
||||
? _expandedHeight
|
||||
|
@ -332,6 +341,10 @@ void Manager::updateButton(ButtonParameters parameters) {
|
|||
} else if (_button) {
|
||||
_button->applyParameters(parameters);
|
||||
return;
|
||||
} else if (parameters.outside) {
|
||||
_buttonShowTimer.cancel();
|
||||
_scheduledParameters = std::nullopt;
|
||||
return;
|
||||
}
|
||||
const auto globalPositionChanged = _scheduledParameters
|
||||
&& (_scheduledParameters->globalPointer != parameters.globalPointer);
|
||||
|
@ -345,7 +358,10 @@ void Manager::updateButton(ButtonParameters parameters) {
|
|||
}
|
||||
|
||||
void Manager::showButtonDelayed() {
|
||||
_button = std::make_unique<Button>(_buttonUpdate, *_scheduledParameters);
|
||||
_button = std::make_unique<Button>(
|
||||
_buttonUpdate,
|
||||
*_scheduledParameters,
|
||||
[=]{ updateButton({}); });
|
||||
}
|
||||
|
||||
void Manager::applyList(std::vector<Data::Reaction> list) {
|
||||
|
|
|
@ -53,6 +53,7 @@ struct ButtonParameters {
|
|||
int reactionsCount = 1;
|
||||
int visibleTop = 0;
|
||||
int visibleBottom = 0;
|
||||
bool outside = false;
|
||||
};
|
||||
|
||||
enum class ButtonState {
|
||||
|
@ -64,7 +65,10 @@ enum class ButtonState {
|
|||
|
||||
class Button final {
|
||||
public:
|
||||
Button(Fn<void(QRect)> update, ButtonParameters parameters);
|
||||
Button(
|
||||
Fn<void(QRect)> update,
|
||||
ButtonParameters parameters,
|
||||
Fn<void()> hideMe);
|
||||
~Button();
|
||||
|
||||
void applyParameters(ButtonParameters parameters);
|
||||
|
@ -106,6 +110,7 @@ private:
|
|||
ButtonStyle _style = ButtonStyle::Incoming;
|
||||
|
||||
base::Timer _expandTimer;
|
||||
base::Timer _hideTimer;
|
||||
std::optional<QPoint> _lastGlobalPosition;
|
||||
|
||||
};
|
||||
|
|
|
@ -976,7 +976,7 @@ reactionInfoBetween: 3px;
|
|||
|
||||
reactionCornerSize: size(40px, 32px);
|
||||
reactionCornerRadius: 14px;
|
||||
reactionCornerCenter: point(-10px, -8px);
|
||||
reactionCornerCenter: point(12px, -12px);
|
||||
reactionCornerImage: 24px;
|
||||
reactionCornerShadow: margins(4px, 4px, 4px, 8px);
|
||||
reactionCornerActiveAreaPadding: margins(10px, 10px, 10px, 10px);
|
||||
|
|
Loading…
Add table
Reference in a new issue