| | |
| | | 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; |
| | | } |
| | |
| | | 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; |
| | | } |
| | |
| | | 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(), {})) { |
| | | 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; |
| | | } |
| | | m_windowAttributes.insert(it.key(), it.value()); |
| | | ++it; |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | 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) { |
| | |
| | | if (!attribute.isValid()) { |
| | | return true; |
| | | } |
| | | if (!m_windowHandle || !windowAttributeChanged(key, attribute, {})) { |
| | | if (m_windowHandle && !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_windowHandle && !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; |
| | |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |