Allow custom rounding radius for PopupMenu.

This commit is contained in:
John Preston 2023-06-01 19:51:09 +04:00
parent 784dedac4d
commit 57143bfae1
2 changed files with 9 additions and 7 deletions

View file

@ -34,8 +34,8 @@ constexpr auto kShadowCornerMultiplier = 3;
style::margins padding, style::margins padding,
not_null<const style::Shadow*> shadow, not_null<const style::Shadow*> shadow,
not_null<const RoundRect*> body, not_null<const RoundRect*> body,
int radius,
rpl::lifetime &lifetime) { rpl::lifetime &lifetime) {
const auto radius = st::roundRadiusSmall;
const auto side = radius * kShadowCornerMultiplier; const auto side = radius * kShadowCornerMultiplier;
const auto middle = radius; const auto middle = radius;
const auto size = side * 2 + middle; const auto size = side * 2 + middle;
@ -62,6 +62,7 @@ constexpr auto kShadowCornerMultiplier = 3;
void PaintCachedShadow( void PaintCachedShadow(
QPainter &p, QPainter &p,
QSize outer, QSize outer,
int radius,
style::margins padding, style::margins padding,
const QImage &cached) { const QImage &cached) {
const auto fill = [&]( const auto fill = [&](
@ -81,7 +82,6 @@ void PaintCachedShadow(
fill(dstx, dsty, width, height, srcx, srcy, width, height); fill(dstx, dsty, width, height, srcx, srcy, width, height);
}; };
const auto radius = st::roundRadiusSmall;
const auto side = radius * kShadowCornerMultiplier; const auto side = radius * kShadowCornerMultiplier;
const auto middle = radius; const auto middle = radius;
const auto size = side * 2 + middle; const auto size = side * 2 + middle;
@ -164,7 +164,7 @@ void PaintCachedShadow(
PopupMenu::PopupMenu(QWidget *parent, const style::PopupMenu &st) PopupMenu::PopupMenu(QWidget *parent, const style::PopupMenu &st)
: RpWidget(parent) : RpWidget(parent)
, _st(st) , _st(st)
, _roundRect(ImageRoundRadius::Small, _st.menu.itemBg) , _roundRect(_st.radius, _st.menu.itemBg)
, _scroll(this, st::defaultMultiSelect.scroll) , _scroll(this, st::defaultMultiSelect.scroll)
, _menu(_scroll->setOwnedWidget( , _menu(_scroll->setOwnedWidget(
object_ptr<PaddingWrap<Menu::Menu>>( object_ptr<PaddingWrap<Menu::Menu>>(
@ -177,7 +177,7 @@ PopupMenu::PopupMenu(QWidget *parent, const style::PopupMenu &st)
PopupMenu::PopupMenu(QWidget *parent, QMenu *menu, const style::PopupMenu &st) PopupMenu::PopupMenu(QWidget *parent, QMenu *menu, const style::PopupMenu &st)
: RpWidget(parent) : RpWidget(parent)
, _st(st) , _st(st)
, _roundRect(ImageRoundRadius::Small, _st.menu.itemBg) , _roundRect(_st.radius, _st.menu.itemBg)
, _scroll(this, st::defaultMultiSelect.scroll) , _scroll(this, st::defaultMultiSelect.scroll)
, _menu(_scroll->setOwnedWidget( , _menu(_scroll->setOwnedWidget(
object_ptr<PaddingWrap<Menu::Menu>>( object_ptr<PaddingWrap<Menu::Menu>>(
@ -351,6 +351,7 @@ void PopupMenu::updateRoundingOverlay() {
_padding, _padding,
&_st.shadow, &_st.shadow,
&_roundRect, &_roundRect,
_st.radius,
_roundingOverlay->lifetime()); _roundingOverlay->lifetime());
_roundingOverlay->paintRequest( _roundingOverlay->paintRequest(
@ -361,7 +362,7 @@ void PopupMenu::updateRoundingOverlay() {
_roundRect.paint(p, _inner, RectPart::AllCorners); _roundRect.paint(p, _inner, RectPart::AllCorners);
if (!_grabbingForPanelAnimation) { if (!_grabbingForPanelAnimation) {
p.setCompositionMode(QPainter::CompositionMode_SourceOver); p.setCompositionMode(QPainter::CompositionMode_SourceOver);
PaintCachedShadow(p, size(), _padding, *shadow); PaintCachedShadow(p, size(), _st.radius, _padding, *shadow);
} }
}, _roundingOverlay->lifetime()); }, _roundingOverlay->lifetime());
@ -834,8 +835,7 @@ void PopupMenu::startShowAnimation() {
_showAnimation = std::make_unique<PanelAnimation>(_st.animation, _origin); _showAnimation = std::make_unique<PanelAnimation>(_st.animation, _origin);
_showAnimation->setFinalImage(std::move(cache), QRect(_inner.topLeft() * pixelRatio, _inner.size() * pixelRatio)); _showAnimation->setFinalImage(std::move(cache), QRect(_inner.topLeft() * pixelRatio, _inner.size() * pixelRatio));
if (_useTransparency) { if (_useTransparency) {
_showAnimation->setCornerMasks( _showAnimation->setCornerMasks(Images::CornersMask(_st.radius));
Images::CornersMask(ImageRoundRadius::Small));
} else { } else {
_showAnimation->setSkipShadow(true); _showAnimation->setSkipShadow(true);
} }

View file

@ -255,6 +255,7 @@ PopupMenu {
menu: Menu; menu: Menu;
radius: pixels;
duration: int; duration: int;
showDuration: int; showDuration: int;
} }
@ -849,6 +850,7 @@ defaultPopupMenu: PopupMenu {
menu: defaultMenu; menu: defaultMenu;
radius: 3px;
duration: 150; duration: 150;
showDuration: 200; showDuration: 200;
} }