From 7966371dead9076db6c56de4074b36d6f628678b Mon Sep 17 00:00:00 2001 From: SineStriker <55847490+SineStriker@users.noreply.github.com> Date: 周五, 14 3月 2025 17:35:50 +0800 Subject: [PATCH] AWC: remove isEnabled in test methods --- src/core/contexts/abstractwindowcontext.cpp | 134 +++++++++++++++----------------------------- 1 files changed, 47 insertions(+), 87 deletions(-) diff --git a/src/core/contexts/abstractwindowcontext.cpp b/src/core/contexts/abstractwindowcontext.cpp index f838064..dcf41b5 100644 --- a/src/core/contexts/abstractwindowcontext.cpp +++ b/src/core/contexts/abstractwindowcontext.cpp @@ -32,21 +32,16 @@ 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); + m_hitTestVisibleItems.removeAll(nullptr); + m_hitTestVisibleItems.removeAll(obj); + m_hitTestVisibleItems.append(obj); } else { - if (it == m_hitTestVisibleItems.end()) { - return false; + for (auto &item : m_hitTestVisibleItems) { + if (item == obj) { + item = nullptr; + } } - disconnect(obj, &QObject::destroyed, this, - &AbstractWindowContext::_q_hitTestVisibleItemDestroyed); - m_hitTestVisibleItems.erase(it); } return true; } @@ -60,16 +55,7 @@ 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); + return false; } m_systemButtons[button] = obj; return true; @@ -85,11 +71,6 @@ if (org) { // Since the title bar is changed, all items inside it should be dereferenced right away removeSystemButtonsAndHitTestItems(); - disconnect(org, &QObject::destroyed, this, - &AbstractWindowContext::_q_titleBarDistroyed); - } - if (item) { - connect(item, &QObject::destroyed, this, &AbstractWindowContext::_q_titleBarDistroyed); } m_titleBar = item; return true; @@ -107,8 +88,7 @@ *button = WindowAgentBase::Unknown; for (int i = WindowAgentBase::WindowIcon; i <= WindowAgentBase::Close; ++i) { auto currentButton = m_systemButtons[i]; - if (!currentButton || !m_delegate->isVisible(currentButton) || - !m_delegate->isEnabled(currentButton)) { + if (!currentButton || !m_delegate->isVisible(currentButton)) { continue; } if (m_delegate->mapGeometryToScene(currentButton).contains(pos)) { @@ -141,22 +121,17 @@ return false; } - for (int i = WindowAgentBase::WindowIcon; i <= WindowAgentBase::Close; ++i) { - auto currentButton = m_systemButtons[i]; - if (currentButton && m_delegate->isVisible(currentButton) && - m_delegate->isEnabled(currentButton) && - m_delegate->mapGeometryToScene(currentButton).contains(pos)) { + WindowAgentBase::SystemButton button; + if (isInSystemButtons(pos, &button)) { + return true; + } + + for (auto item : m_hitTestVisibleItems) { + if (item && m_delegate->isVisible(item)&& + m_delegate->mapGeometryToScene(item).contains(pos)) { return false; } } - - for (auto widget : m_hitTestVisibleItems) { - if (widget && m_delegate->isVisible(widget) && m_delegate->isEnabled(widget) && - m_delegate->mapGeometryToScene(widget).contains(pos)) { - return false; - } - } - return true; } @@ -231,34 +206,38 @@ removeEventFilter(m_windowHandle); } m_windowHandle = m_delegate->hostWindow(m_host); + if (m_windowHandle) { + m_windowHandle->installEventFilter(this); + } if (oldWinId != m_windowId) { winIdChanged(m_windowId, oldWinId); - } - if (m_windowHandle) { - m_windowHandle->installEventFilter(this); - - // Refresh window attributes - auto attributes = m_windowAttributes; - m_windowAttributes.clear(); - for (auto it = attributes.begin(); it != attributes.end(); ++it) { - if (!windowAttributeChanged(it.key(), it.value(), {})) { - continue; + if (m_windowId) { + // Refresh window attributes + for (auto it = m_windowAttributesOrder.begin(); + it != m_windowAttributesOrder.end();) { + if (!windowAttributeChanged(it->first, it->second, {})) { + m_windowAttributes.remove(it->first); + it = m_windowAttributesOrder.erase(it); + continue; + } + ++it; } - m_windowAttributes.insert(it.key(), it.value()); } - } - // Send to shared dispatchers - if (oldWinId != m_windowId) { + // Send to shared dispatchers QEvent e(QEvent::WinIdChange); sharedDispatch(m_host, &e); } } QVariant AbstractWindowContext::windowAttribute(const QString &key) const { - return m_windowAttributes.value(key); + auto it = m_windowAttributes.find(key); + if (it == m_windowAttributes.end()) { + return {}; + } + return it.value()->second; } bool AbstractWindowContext::setWindowAttribute(const QString &key, const QVariant &attribute) { @@ -267,22 +246,27 @@ if (!attribute.isValid()) { return true; } - if (!m_windowHandle || !windowAttributeChanged(key, attribute, {})) { + if (m_windowId && !windowAttributeChanged(key, attribute, {})) { return false; } - m_windowAttributes.insert(key, attribute); + m_windowAttributes.insert( + key, m_windowAttributesOrder.insert(m_windowAttributesOrder.end(), + std::make_pair(key, attribute))); return true; } - if (it.value() == attribute) - return true; - if (!m_windowHandle || !windowAttributeChanged(key, attribute, it.value())) { + auto &listIter = it.value(); + auto &oldAttr = listIter->second; + if (m_windowId && !windowAttributeChanged(key, attribute, oldAttr)) { return false; } if (attribute.isValid()) { - it.value() = attribute; + oldAttr = attribute; + m_windowAttributesOrder.splice(m_windowAttributesOrder.end(), m_windowAttributesOrder, + listIter); } else { + m_windowAttributesOrder.erase(listIter); m_windowAttributes.erase(it); } return true; @@ -306,33 +290,9 @@ 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; - } - } } } -- Gitblit v1.9.1