Fixed crash in dropdown menu.

This commit is contained in:
23rd 2021-01-13 22:14:07 +03:00
parent 79146e54b9
commit a6a2a8dde0
4 changed files with 24 additions and 6 deletions

View file

@ -33,7 +33,7 @@ DropdownMenu::DropdownMenu(QWidget *parent, const style::DropdownMenu &st) : Inn
void DropdownMenu::init() {
InnerDropdown::setHiddenCallback([this] { hideFinish(); });
_menu->sizeValue(
_menu->resizesFromInner(
) | rpl::start_with_next([=] {
resizeToContent();
}, _menu->lifetime());

View file

@ -133,7 +133,7 @@ not_null<QAction*> Menu::addAction(base::unique_qptr<ItemBase> widget) {
_actionWidgets,
std::greater<>(),
&ItemBase::width))->contentWidth();
resize(newWidth, height());
resizeFromInner(newWidth, height());
}, widget->lifetime());
_actionWidgets.push_back(std::move(widget));
@ -143,7 +143,7 @@ not_null<QAction*> Menu::addAction(base::unique_qptr<ItemBase> widget) {
0,
ranges::plus(),
&ItemBase::height);
resize(width(), newHeight);
resizeFromInner(width(), newHeight);
updateSelected(QCursor::pos());
return action;
@ -164,7 +164,7 @@ void Menu::clearActions() {
delete action;
}
}
resize(_forceWidth ? _forceWidth : _st.widthMin, _st.skip * 2);
resizeFromInner(_forceWidth ? _forceWidth : _st.widthMin, _st.skip * 2);
}
void Menu::finishAnimating() {
@ -177,6 +177,18 @@ bool Menu::empty() const {
return _actionWidgets.empty();
}
void Menu::resizeFromInner(int w, int h) {
if ((w == width()) && (h == height())) {
return;
}
resize(w, h);
_resizesFromInner.fire({});
}
rpl::producer<> Menu::resizesFromInner() const {
return _resizesFromInner.events();
}
void Menu::setShowSource(TriggeredSource source) {
_mouseSelection = (source == TriggeredSource::Mouse);
setSelected((source == TriggeredSource::Mouse || _actions.empty()) ? -1 : 0);
@ -188,7 +200,7 @@ const std::vector<not_null<QAction*>> &Menu::actions() const {
void Menu::setForceWidth(int forceWidth) {
_forceWidth = forceWidth;
resize(_forceWidth, height());
resizeFromInner(_forceWidth, height());
}
void Menu::updateSelected(QPoint globalPosition) {

View file

@ -76,6 +76,8 @@ public:
}
void handleMouseRelease(QPoint globalPosition);
rpl::producer<> resizesFromInner() const;
protected:
void keyPressEvent(QKeyEvent *e) override;
void mouseMoveEvent(QMouseEvent *e) override;
@ -98,6 +100,8 @@ private:
ItemBase *findSelectedAction() const;
void resizeFromInner(int w, int h);
const style::Menu &_st;
Fn<void(const CallbackData &data)> _activatedCallback;
@ -118,6 +122,8 @@ private:
int _selected = -1;
bool _childShown = false;
rpl::event_stream<> _resizesFromInner;
};
} // namespace Ui::Menu

View file

@ -52,7 +52,7 @@ void PopupMenu::init() {
hideMenu(true);
}, lifetime());
_menu->sizeValue(
_menu->resizesFromInner(
) | rpl::start_with_next([=] {
handleMenuResize();
}, _menu->lifetime());