/**************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef ITEMWINDOW_H #define ITEMWINDOW_H #include #include QT_USE_NAMESPACE // ItemWindow: Primitive UI item classes for use with a ItemWindow based // on QRasterWindow without widgets allowing a simple UI without widgets. // Basic item to be used in a ItemWindow class Item : public QObject { Q_OBJECT public: explicit Item(QObject *parent = nullptr) : QObject(parent) {} virtual void paint(QPainter &painter) = 0; virtual void mouseEvent(QMouseEvent *) {} virtual void keyEvent(QKeyEvent *) {} }; // Positionable text item class TextItem : public Item { Q_OBJECT public: explicit TextItem(const QString &text, const QRect &rect, const QColor &col, QObject *parent = nullptr) : Item(parent), m_text(text), m_rect(rect), m_col(col) {} void paint(QPainter &painter) override; QRect rect() const { return m_rect; } private: const QString m_text; const QRect m_rect; const QColor m_col; }; // "button" item class ButtonItem : public TextItem { Q_OBJECT public: explicit ButtonItem(const QString &text, const QRect &rect, const QColor &col, QObject *parent = nullptr) : TextItem(text, rect, col, parent), m_shortcut(0) {} void mouseEvent(QMouseEvent *mouseEvent) override; void keyEvent(QKeyEvent *keyEvent) override; int shortcut() const { return m_shortcut; } void setShortcut(int shortcut) { m_shortcut = shortcut; } signals: void clicked(); private: int m_shortcut; }; #define PROPAGATE_EVENT(windowHandler, eventClass, itemHandler) \ void windowHandler(eventClass *e) override \ { \ foreach (Item *i, m_items) \ i->itemHandler(e); \ } class ItemWindow : public QRasterWindow { Q_OBJECT public: explicit ItemWindow(QWindow *parent = nullptr) : QRasterWindow(parent), m_background(Qt::white) {} void addItem(Item *item) { m_items.append(item); } QColor background() const { return m_background; } void setBackground(const QColor &background) { m_background = background; } protected: void paintEvent(QPaintEvent *) override; PROPAGATE_EVENT(mousePressEvent, QMouseEvent, mouseEvent) PROPAGATE_EVENT(mouseReleaseEvent, QMouseEvent, mouseEvent) PROPAGATE_EVENT(mouseDoubleClickEvent, QMouseEvent, mouseEvent) PROPAGATE_EVENT(mouseMoveEvent, QMouseEvent, mouseEvent) PROPAGATE_EVENT(keyPressEvent, QKeyEvent, keyEvent) PROPAGATE_EVENT(keyReleaseEvent, QKeyEvent, keyEvent) private: QList m_items; QColor m_background; }; #endif // ITEMWINDOW_H