| | |
| | | return menuBar; |
| | | }(); |
| | | |
| | | static const auto buttonStyleSheet = QLatin1String{ "QPushButton{color:black;};QPushButton:hover{background-color:black;color:white;}" }; |
| | | static const auto buttonStyleSheet = QLatin1String{ R"( |
| | | QPushButton { |
| | | background-color:white; |
| | | color:black; |
| | | } |
| | | QPushButton:hover { |
| | | background-color:black; |
| | | color:white; |
| | | } |
| | | QPushButton:pressed { |
| | | background-color:red; |
| | | color:white; |
| | | } |
| | | )" }; |
| | | |
| | | auto iconButton = new QPushButton("I"); |
| | | iconButton->setFlat(true); |
| | | iconButton->setAttribute(Qt::WA_Hover); |
| | | iconButton->setMouseTracking(true); |
| | | iconButton->setStyleSheet(buttonStyleSheet); |
| | | auto minButton = new QPushButton("—"); |
| | | minButton->setFlat(true); |
| | | minButton->setAttribute(Qt::WA_Hover); |
| | | minButton->setMouseTracking(true); |
| | | minButton->setStyleSheet(buttonStyleSheet); |
| | | auto maxButton = new QPushButton("🗖"); |
| | | maxButton->setStyleSheet(buttonStyleSheet); |
| | | maxButton->setCheckable(true); |
| | | maxButton->setFlat(true); |
| | | maxButton->setAttribute(Qt::WA_Hover); |
| | | maxButton->setMouseTracking(true); |
| | | maxButton->setStyleSheet(buttonStyleSheet); |
| | | auto closeButton = new QPushButton("✖"); |
| | | closeButton->setFlat(true); |
| | | closeButton->setAttribute(Qt::WA_Hover); |
| | | closeButton->setMouseTracking(true); |
| | | closeButton->setStyleSheet(buttonStyleSheet); |
| | | |
| | | auto windowBar = new QWK::WindowBar(); |
| | |
| | | setMenuWidget(windowBar); |
| | | setCentralWidget(clockWidget); |
| | | setWindowTitle("Example MainWindow"); |
| | | resize(1024, 768); |
| | | resize(640, 480); |
| | | } |
| | |
| | | |
| | | AbstractWindowContext::~AbstractWindowContext() = default; |
| | | |
| | | bool AbstractWindowContext::setHitTestVisible(QObject *obj, bool visible) { |
| | | bool AbstractWindowContext::setHitTestVisible(const QObject *obj, bool visible) { |
| | | Q_ASSERT(obj); |
| | | if (!obj) { |
| | | return false; |
| | |
| | | } |
| | | |
| | | bool AbstractWindowContext::setSystemButton(CoreWindowAgent::SystemButton button, |
| | | QObject *obj) { |
| | | const QObject *obj) { |
| | | Q_ASSERT(obj); |
| | | Q_ASSERT(button != CoreWindowAgent::Unknown); |
| | | if (!obj || (button == CoreWindowAgent::Unknown)) { |
| | |
| | | return true; |
| | | } |
| | | |
| | | bool AbstractWindowContext::setTitleBar(QObject *item) { |
| | | bool AbstractWindowContext::setTitleBar(const QObject *item) { |
| | | Q_ASSERT(item); |
| | | if (!item) { |
| | | return false; |
| | |
| | | continue; |
| | | } |
| | | if (m_delegate->mapGeometryToScene(currentButton).contains(pos)) { |
| | | *button = CoreWindowAgent::WindowIcon; |
| | | *button = static_cast<CoreWindowAgent::SystemButton>(i); |
| | | return true; |
| | | } |
| | | } |
| | |
| | | inline QObject *host() const; |
| | | inline QWindow *window() const; |
| | | |
| | | inline bool isHitTestVisible(QObject *obj) const; |
| | | bool setHitTestVisible(QObject *obj, bool visible); |
| | | inline bool isHitTestVisible(const QObject *obj) const; |
| | | bool setHitTestVisible(const QObject *obj, bool visible); |
| | | bool setHitTestVisible(const QRect &rect, bool visible); |
| | | |
| | | inline QObject *systemButton(CoreWindowAgent::SystemButton button) const; |
| | | bool setSystemButton(CoreWindowAgent::SystemButton button, QObject *obj); |
| | | inline const QObject *systemButton(CoreWindowAgent::SystemButton button) const; |
| | | bool setSystemButton(CoreWindowAgent::SystemButton button, const QObject *obj); |
| | | |
| | | inline QObject *titleBar() const; |
| | | bool setTitleBar(QObject *obj); |
| | | inline const QObject *titleBar() const; |
| | | bool setTitleBar(const QObject *obj); |
| | | |
| | | void showSystemMenu(const QPoint &pos); |
| | | |
| | |
| | | std::unique_ptr<WindowItemDelegate> m_delegate; |
| | | QWindow *m_windowHandle; |
| | | |
| | | QSet<QObject *> m_hitTestVisibleItems; |
| | | QSet<const QObject *> m_hitTestVisibleItems; |
| | | QList<QRect> m_hitTestVisibleRects; |
| | | |
| | | QObject *m_titleBar{}; |
| | | std::array<QObject *, CoreWindowAgent::NumSystemButton> m_systemButtons{}; |
| | | const QObject *m_titleBar{}; |
| | | std::array<const QObject *, CoreWindowAgent::NumSystemButton> m_systemButtons{}; |
| | | |
| | | // Cached shape |
| | | mutable bool hitTestVisibleShapeDirty{}; |
| | |
| | | return m_windowHandle; |
| | | } |
| | | |
| | | inline bool AbstractWindowContext::isHitTestVisible(QObject *obj) const { |
| | | inline bool AbstractWindowContext::isHitTestVisible(const QObject *obj) const { |
| | | return m_hitTestVisibleItems.contains(obj); |
| | | } |
| | | |
| | | inline QObject * |
| | | inline const QObject * |
| | | AbstractWindowContext::systemButton(CoreWindowAgent::SystemButton button) const { |
| | | return m_systemButtons[button]; |
| | | } |
| | | |
| | | inline QObject *AbstractWindowContext::titleBar() const { |
| | | inline const QObject *AbstractWindowContext::titleBar() const { |
| | | return m_titleBar; |
| | | } |
| | | |
| | |
| | | return true; |
| | | } |
| | | |
| | | QQuickItem *QuickWindowAgent::titleBar() const { |
| | | const QQuickItem *QuickWindowAgent::titleBar() const { |
| | | Q_D(const QuickWindowAgent); |
| | | return static_cast<QQuickItem *>(d->context->titleBar()); |
| | | return static_cast<const QQuickItem *>(d->context->titleBar()); |
| | | } |
| | | |
| | | void QuickWindowAgent::setTitleBar(QQuickItem *item) { |
| | | void QuickWindowAgent::setTitleBar(const QQuickItem *item) { |
| | | Q_D(QuickWindowAgent); |
| | | if (!d->context->setTitleBar(item)) { |
| | | return; |
| | |
| | | Q_EMIT titleBarWidgetChanged(item); |
| | | } |
| | | |
| | | QQuickItem *QuickWindowAgent::systemButton(SystemButton button) const { |
| | | const QQuickItem *QuickWindowAgent::systemButton(SystemButton button) const { |
| | | Q_D(const QuickWindowAgent); |
| | | return static_cast<QQuickItem *>(d->context->systemButton(button)); |
| | | return static_cast<const QQuickItem *>(d->context->systemButton(button)); |
| | | } |
| | | |
| | | void QuickWindowAgent::setSystemButton(SystemButton button, QQuickItem *item) { |
| | | void QuickWindowAgent::setSystemButton(SystemButton button, const QQuickItem *item) { |
| | | Q_D(QuickWindowAgent); |
| | | if (!d->context->setSystemButton(button, item)) { |
| | | return; |
| | |
| | | Q_EMIT systemButtonChanged(button, item); |
| | | } |
| | | |
| | | bool QuickWindowAgent::isHitTestVisible(QQuickItem *item) const { |
| | | bool QuickWindowAgent::isHitTestVisible(const QQuickItem *item) const { |
| | | Q_D(const QuickWindowAgent); |
| | | return d->context->isHitTestVisible(item); |
| | | } |
| | | |
| | | void QuickWindowAgent::setHitTestVisible(QQuickItem *item, bool visible) { |
| | | void QuickWindowAgent::setHitTestVisible(const QQuickItem *item, bool visible) { |
| | | Q_D(QuickWindowAgent); |
| | | d->context->setHitTestVisible(item, visible); |
| | | } |
| | |
| | | public: |
| | | bool setup(QQuickWindow *window); |
| | | |
| | | QQuickItem *titleBar() const; |
| | | void setTitleBar(QQuickItem *item); |
| | | const QQuickItem *titleBar() const; |
| | | void setTitleBar(const QQuickItem *item); |
| | | |
| | | QQuickItem *systemButton(SystemButton button) const; |
| | | void setSystemButton(SystemButton button, QQuickItem *item); |
| | | const QQuickItem *systemButton(SystemButton button) const; |
| | | void setSystemButton(SystemButton button, const QQuickItem *item); |
| | | |
| | | bool isHitTestVisible(QQuickItem *item) const; |
| | | void setHitTestVisible(QQuickItem *item, bool visible = true); |
| | | bool isHitTestVisible(const QQuickItem *item) const; |
| | | void setHitTestVisible(const QQuickItem *item, bool visible = true); |
| | | void setHitTestVisible(const QRect &rect, bool visible = true); |
| | | |
| | | Q_SIGNALS: |
| | | void titleBarWidgetChanged(QQuickItem *item); |
| | | void systemButtonChanged(SystemButton button, QQuickItem *item); |
| | | void titleBarWidgetChanged(const QQuickItem *item); |
| | | void systemButtonChanged(SystemButton button, const QQuickItem *item); |
| | | |
| | | protected: |
| | | QuickWindowAgent(QuickWindowAgentPrivate &d, QObject *parent = nullptr); |
| | |
| | | return true; |
| | | } |
| | | |
| | | QWidget *WidgetWindowAgent::titleBar() const { |
| | | const QWidget *WidgetWindowAgent::titleBar() const { |
| | | Q_D(const WidgetWindowAgent); |
| | | return static_cast<QWidget *>(d->context->titleBar()); |
| | | return static_cast<const QWidget *>(d->context->titleBar()); |
| | | } |
| | | |
| | | void WidgetWindowAgent::setTitleBar(QWidget *w) { |
| | | void WidgetWindowAgent::setTitleBar(const QWidget *w) { |
| | | Q_D(WidgetWindowAgent); |
| | | if (!d->context->setTitleBar(w)) { |
| | | return; |
| | |
| | | Q_EMIT titleBarWidgetChanged(w); |
| | | } |
| | | |
| | | QWidget *WidgetWindowAgent::systemButton(SystemButton button) const { |
| | | const QWidget *WidgetWindowAgent::systemButton(SystemButton button) const { |
| | | Q_D(const WidgetWindowAgent); |
| | | return static_cast<QWidget *>(d->context->systemButton(button)); |
| | | return static_cast<const QWidget *>(d->context->systemButton(button)); |
| | | } |
| | | |
| | | void WidgetWindowAgent::setSystemButton(SystemButton button, QWidget *w) { |
| | | void WidgetWindowAgent::setSystemButton(SystemButton button, const QWidget *w) { |
| | | Q_D(WidgetWindowAgent); |
| | | if (!d->context->setSystemButton(button, w)) { |
| | | return; |
| | |
| | | Q_EMIT systemButtonChanged(button, w); |
| | | } |
| | | |
| | | bool WidgetWindowAgent::isHitTestVisible(QWidget *w) const { |
| | | bool WidgetWindowAgent::isHitTestVisible(const QWidget *w) const { |
| | | Q_D(const WidgetWindowAgent); |
| | | return d->context->isHitTestVisible(w); |
| | | } |
| | | |
| | | void WidgetWindowAgent::setHitTestVisible(QWidget *w, bool visible) { |
| | | void WidgetWindowAgent::setHitTestVisible(const QWidget *w, bool visible) { |
| | | Q_D(WidgetWindowAgent); |
| | | d->context->setHitTestVisible(w, visible); |
| | | } |
| | |
| | | public: |
| | | bool setup(QWidget *w); |
| | | |
| | | QWidget *titleBar() const; |
| | | void setTitleBar(QWidget *w); |
| | | const QWidget *titleBar() const; |
| | | void setTitleBar(const QWidget *w); |
| | | |
| | | QWidget *systemButton(SystemButton button) const; |
| | | void setSystemButton(SystemButton button, QWidget *w); |
| | | const QWidget *systemButton(SystemButton button) const; |
| | | void setSystemButton(SystemButton button, const QWidget *w); |
| | | |
| | | bool isHitTestVisible(QWidget *w) const; |
| | | void setHitTestVisible(QWidget *w, bool visible = true); |
| | | bool isHitTestVisible(const QWidget *w) const; |
| | | void setHitTestVisible(const QWidget *w, bool visible = true); |
| | | void setHitTestVisible(const QRect &rect, bool visible = true); |
| | | |
| | | Q_SIGNALS: |
| | | void titleBarWidgetChanged(QWidget *w); |
| | | void systemButtonChanged(SystemButton button, QWidget *w); |
| | | void titleBarWidgetChanged(const QWidget *w); |
| | | void systemButtonChanged(SystemButton button, const QWidget *w); |
| | | |
| | | protected: |
| | | WidgetWindowAgent(WidgetWindowAgentPrivate &d, QObject *parent = nullptr); |