Skip to content

Commit

Permalink
Make hit-test items auto-delete
Browse files Browse the repository at this point in the history
  • Loading branch information
SineStriker committed Jul 28, 2024
1 parent 63bc501 commit e9d163b
Show file tree
Hide file tree
Showing 7 changed files with 81 additions and 21 deletions.
2 changes: 1 addition & 1 deletion qmsetup
Submodule qmsetup updated 1 files
+18 −3 cmake/QMSetupAPI.cmake
79 changes: 68 additions & 11 deletions src/core/contexts/abstractwindowcontext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,27 @@ namespace QWK {
notifyWinIdChange();
}

bool AbstractWindowContext::setHitTestVisible(const QObject *obj, bool visible) {
bool AbstractWindowContext::setHitTestVisible(QObject *obj, bool visible) {
Q_ASSERT(obj);
if (!obj) {
return false;
}

auto it = m_hitTestVisibleItems.find(obj);
if (visible) {
if (it != m_hitTestVisibleItems.end()) {
return true;
}
connect(obj, &QObject::destroyed, this,
&AbstractWindowContext::_q_hitTestVisibleItemDestroyed);
m_hitTestVisibleItems.insert(obj);
} else {
m_hitTestVisibleItems.remove(obj);
if (it == m_hitTestVisibleItems.end()) {
return false;
}
disconnect(obj, &QObject::destroyed, this,
&AbstractWindowContext::_q_hitTestVisibleItemDestroyed);
m_hitTestVisibleItems.erase(it);
}
return true;
}
Expand All @@ -47,27 +58,39 @@ namespace QWK {
return false;
}

if (m_systemButtons[button] == obj) {
return false;
auto org = m_systemButtons[button];
if (org == obj) {
return true;
}

if (org) {
disconnect(org, &QObject::destroyed, this,
&AbstractWindowContext::_q_systemButtonDestroyed);
}
if (obj) {
connect(obj, &QObject::destroyed, this,
&AbstractWindowContext::_q_systemButtonDestroyed);
}
m_systemButtons[button] = obj;
return true;
}

bool AbstractWindowContext::setTitleBar(QObject *item) {
Q_ASSERT(item);
if (m_titleBar == item) {
auto org = m_titleBar;
if (org == item) {
return false;
}

if (m_titleBar) {
if (org) {
// Since the title bar is changed, all items inside it should be dereferenced right away
for (auto &button : m_systemButtons) {
button = nullptr;
}
m_hitTestVisibleItems.clear();
removeSystemButtonsAndHitTestItems();
disconnect(org, &QObject::destroyed, this,
&AbstractWindowContext::_q_titleBarDistroyed);
}
if (item) {
connect(item, &QObject::destroyed, this, &AbstractWindowContext::_q_titleBarDistroyed);
}

m_titleBar = item;
return true;
}
Expand Down Expand Up @@ -278,4 +301,38 @@ namespace QWK {
return false;
}

void AbstractWindowContext::removeSystemButtonsAndHitTestItems() {
for (auto &button : m_systemButtons) {
if (!button) {
continue;
}
disconnect(button, &QObject::destroyed, this,
&AbstractWindowContext::_q_systemButtonDestroyed);
button = nullptr;
}
for (auto &item : m_hitTestVisibleItems) {
disconnect(item, &QObject::destroyed, this,
&AbstractWindowContext::_q_hitTestVisibleItemDestroyed);
}
m_hitTestVisibleItems.clear();
}

void AbstractWindowContext::_q_titleBarDistroyed(QObject *obj) {
Q_UNUSED(obj)
removeSystemButtonsAndHitTestItems();
m_titleBar = nullptr;
}

void AbstractWindowContext::_q_hitTestVisibleItemDestroyed(QObject *obj) {
m_hitTestVisibleItems.remove(obj);
}

void AbstractWindowContext::_q_systemButtonDestroyed(QObject *obj) {
for (auto &item : m_systemButtons) {
if (item == obj) {
item = nullptr;
}
}
}

}
9 changes: 8 additions & 1 deletion src/core/contexts/abstractwindowcontext_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ namespace QWK {
inline WindowItemDelegate *delegate() const;

inline bool isHitTestVisible(const QObject *obj) const;
bool setHitTestVisible(const QObject *obj, bool visible);
bool setHitTestVisible(QObject *obj, bool visible);

inline QObject *systemButton(WindowAgentBase::SystemButton button) const;
bool setSystemButton(WindowAgentBase::SystemButton button, QObject *obj);
Expand Down Expand Up @@ -124,6 +124,13 @@ namespace QWK {

QVariantHash m_windowAttributes;
std::unique_ptr<WinIdChangeEventFilter> m_winIdChangeEventFilter;

void removeSystemButtonsAndHitTestItems();

private:
void _q_titleBarDistroyed(QObject *obj);
void _q_hitTestVisibleItemDestroyed(QObject *obj);
void _q_systemButtonDestroyed(QObject *obj);
};

inline QObject *AbstractWindowContext::host() const {
Expand Down
5 changes: 1 addition & 4 deletions src/quick/quickwindowagent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,11 +90,8 @@ namespace QWK {
Q_D(const QuickWindowAgent);
return d->context->isHitTestVisible(item);
}
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))

void QuickWindowAgent::setHitTestVisible(QQuickItem *item, bool visible) {
#else
void QuickWindowAgent::setHitTestVisible(const QQuickItem *item, bool visible) {
#endif
Q_D(QuickWindowAgent);
d->context->setHitTestVisible(item, visible);
}
Expand Down
3 changes: 1 addition & 2 deletions src/quick/quickwindowagent.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,10 @@ namespace QWK {

#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
Q_INVOKABLE bool isHitTestVisible(QQuickItem *item) const;
Q_INVOKABLE void setHitTestVisible(QQuickItem *item, bool visible = true);
#else
Q_INVOKABLE bool isHitTestVisible(const QQuickItem *item) const;
Q_INVOKABLE void setHitTestVisible(const QQuickItem *item, bool visible = true);
#endif
Q_INVOKABLE void setHitTestVisible(QQuickItem *item, bool visible = true);

#ifdef Q_OS_MAC
// The system button area APIs are experimental, very likely to change in the future.
Expand Down
2 changes: 1 addition & 1 deletion src/widgets/widgetwindowagent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ namespace QWK {
You're supposed to make sure that the specified widget \a w is a child or descendant
of the title bar widget.
*/
void WidgetWindowAgent::setHitTestVisible(const QWidget *w, bool visible) {
void WidgetWindowAgent::setHitTestVisible(QWidget *w, bool visible) {
Q_D(WidgetWindowAgent);
d->context->setHitTestVisible(w, visible);
}
Expand Down
2 changes: 1 addition & 1 deletion src/widgets/widgetwindowagent.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ namespace QWK {
#endif

bool isHitTestVisible(const QWidget *w) const;
void setHitTestVisible(const QWidget *w, bool visible = true);
void setHitTestVisible(QWidget *w, bool visible = true);

Q_SIGNALS:
void titleBarChanged(QWidget *w);
Expand Down

0 comments on commit e9d163b

Please sign in to comment.