forked from quickshell/quickshell
core/popupanchor: reposition on popup size change
This commit is contained in:
parent
ebfa8ec448
commit
60388f10ca
3 changed files with 21 additions and 15 deletions
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <qlogging.h>
|
#include <qlogging.h>
|
||||||
#include <qobject.h>
|
#include <qobject.h>
|
||||||
|
#include <qsize.h>
|
||||||
#include <qtmetamacros.h>
|
#include <qtmetamacros.h>
|
||||||
#include <qwindow.h>
|
#include <qwindow.h>
|
||||||
|
|
||||||
|
@ -11,7 +12,8 @@
|
||||||
|
|
||||||
bool PopupAnchorState::operator==(const PopupAnchorState& other) const {
|
bool PopupAnchorState::operator==(const PopupAnchorState& other) const {
|
||||||
return this->rect == other.rect && this->edges == other.edges && this->gravity == other.gravity
|
return this->rect == other.rect && this->edges == other.edges && this->gravity == other.gravity
|
||||||
&& this->adjustment == other.adjustment && this->anchorpoint == other.anchorpoint;
|
&& this->adjustment == other.adjustment && this->anchorpoint == other.anchorpoint
|
||||||
|
&& this->size == other.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PopupAnchor::isDirty() const {
|
bool PopupAnchor::isDirty() const {
|
||||||
|
@ -128,8 +130,9 @@ void PopupAnchor::setAdjustment(PopupAdjustment::Flags adjustment) {
|
||||||
emit this->adjustmentChanged();
|
emit this->adjustmentChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PopupAnchor::updateAnchorpoint(const QPoint& anchorpoint) {
|
void PopupAnchor::updatePlacement(const QPoint& anchorpoint, const QSize& size) {
|
||||||
this->state.anchorpoint = anchorpoint;
|
this->state.anchorpoint = anchorpoint;
|
||||||
|
this->state.size = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static PopupPositioner* POSITIONER = nullptr; // NOLINT
|
static PopupPositioner* POSITIONER = nullptr; // NOLINT
|
||||||
|
@ -140,10 +143,15 @@ void PopupPositioner::reposition(PopupAnchor* anchor, QWindow* window, bool only
|
||||||
qFatal() << "Cannot reposition popup that does not have a transient parent.";
|
qFatal() << "Cannot reposition popup that does not have a transient parent.";
|
||||||
}
|
}
|
||||||
|
|
||||||
auto adjustment = anchor->adjustment();
|
|
||||||
auto screenGeometry = parentWindow->screen()->geometry();
|
|
||||||
auto parentGeometry = parentWindow->geometry();
|
auto parentGeometry = parentWindow->geometry();
|
||||||
auto windowGeometry = window->geometry();
|
auto windowGeometry = window->geometry();
|
||||||
|
|
||||||
|
anchor->updatePlacement(parentGeometry.topLeft(), windowGeometry.size());
|
||||||
|
if (onlyIfDirty && !anchor->isDirty()) return;
|
||||||
|
anchor->markClean();
|
||||||
|
|
||||||
|
auto adjustment = anchor->adjustment();
|
||||||
|
auto screenGeometry = parentWindow->screen()->geometry();
|
||||||
auto anchorRectGeometry = anchor->rect().qrect().translated(parentGeometry.topLeft());
|
auto anchorRectGeometry = anchor->rect().qrect().translated(parentGeometry.topLeft());
|
||||||
|
|
||||||
auto anchorEdges = anchor->edges();
|
auto anchorEdges = anchor->edges();
|
||||||
|
@ -160,10 +168,6 @@ void PopupPositioner::reposition(PopupAnchor* anchor, QWindow* window, bool only
|
||||||
: anchorEdges.testFlag(Edges::Bottom) ? anchorRectGeometry.bottom()
|
: anchorEdges.testFlag(Edges::Bottom) ? anchorRectGeometry.bottom()
|
||||||
: anchorRectGeometry.center().y();
|
: anchorRectGeometry.center().y();
|
||||||
|
|
||||||
anchor->updateAnchorpoint({anchorX, anchorY});
|
|
||||||
if (onlyIfDirty && !anchor->isDirty()) return;
|
|
||||||
anchor->markClean();
|
|
||||||
|
|
||||||
auto calcEffectiveX = [&]() {
|
auto calcEffectiveX = [&]() {
|
||||||
return anchorGravity.testFlag(Edges::Left) ? anchorX - windowGeometry.width() + 1
|
return anchorGravity.testFlag(Edges::Left) ? anchorX - windowGeometry.width() + 1
|
||||||
: anchorGravity.testFlag(Edges::Right) ? anchorX
|
: anchorGravity.testFlag(Edges::Right) ? anchorX
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <qobject.h>
|
#include <qobject.h>
|
||||||
#include <qpoint.h>
|
#include <qpoint.h>
|
||||||
#include <qqmlintegration.h>
|
#include <qqmlintegration.h>
|
||||||
|
#include <qsize.h>
|
||||||
#include <qtclasshelpermacros.h>
|
#include <qtclasshelpermacros.h>
|
||||||
#include <qtmetamacros.h>
|
#include <qtmetamacros.h>
|
||||||
#include <qwindow.h>
|
#include <qwindow.h>
|
||||||
|
@ -64,6 +65,7 @@ struct PopupAnchorState {
|
||||||
Edges::Flags gravity = Edges::Bottom | Edges::Right;
|
Edges::Flags gravity = Edges::Bottom | Edges::Right;
|
||||||
PopupAdjustment::Flags adjustment = PopupAdjustment::Slide;
|
PopupAdjustment::Flags adjustment = PopupAdjustment::Slide;
|
||||||
QPoint anchorpoint;
|
QPoint anchorpoint;
|
||||||
|
QSize size;
|
||||||
};
|
};
|
||||||
|
|
||||||
///! Anchorpoint or positioner for popup windows.
|
///! Anchorpoint or positioner for popup windows.
|
||||||
|
@ -123,7 +125,7 @@ public:
|
||||||
[[nodiscard]] PopupAdjustment::Flags adjustment() const;
|
[[nodiscard]] PopupAdjustment::Flags adjustment() const;
|
||||||
void setAdjustment(PopupAdjustment::Flags adjustment);
|
void setAdjustment(PopupAdjustment::Flags adjustment);
|
||||||
|
|
||||||
void updateAnchorpoint(const QPoint& anchorpoint);
|
void updatePlacement(const QPoint& anchorpoint, const QSize& size);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void windowChanged();
|
void windowChanged();
|
||||||
|
|
|
@ -26,12 +26,12 @@ ProxyPopupWindow::ProxyPopupWindow(QObject* parent): ProxyWindowBase(parent) {
|
||||||
|
|
||||||
void ProxyPopupWindow::completeWindow() {
|
void ProxyPopupWindow::completeWindow() {
|
||||||
this->ProxyWindowBase::completeWindow();
|
this->ProxyWindowBase::completeWindow();
|
||||||
QObject::connect(
|
|
||||||
this->window,
|
// clang-format off
|
||||||
&QWindow::visibleChanged,
|
QObject::connect(this->window, &QWindow::visibleChanged, this, &ProxyPopupWindow::onVisibleChanged);
|
||||||
this,
|
QObject::connect(this->window, &QWindow::widthChanged, this, &ProxyPopupWindow::reposition);
|
||||||
&ProxyPopupWindow::onVisibleChanged
|
QObject::connect(this->window, &QWindow::heightChanged, this, &ProxyPopupWindow::reposition);
|
||||||
);
|
// clang-format on
|
||||||
|
|
||||||
this->window->setFlag(Qt::ToolTip);
|
this->window->setFlag(Qt::ToolTip);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue