File indexing completed on 2025-04-27 03:58:25

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2010-09-09
0007  * Description : tag region frame
0008  *
0009  * SPDX-FileCopyrightText: 2007      by Aurelien Gateau <agateau at kde dot org>
0010  * SPDX-FileCopyrightText: 2010-2011 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
0011  *
0012  * SPDX-License-Identifier: GPL-2.0-or-later
0013  *
0014  * ============================================================ */
0015 
0016 #ifndef DIGIKAM_REGION_FRAME_ITEM_H
0017 #define DIGIKAM_REGION_FRAME_ITEM_H
0018 
0019 // Qt includes
0020 
0021 #include <QFlags>
0022 
0023 // Local includes
0024 
0025 #include "dimgchilditem.h"
0026 #include "digikam_export.h"
0027 
0028 class QWidget;
0029 
0030 namespace Digikam
0031 {
0032 
0033 class DIGIKAM_EXPORT RegionFrameItem : public DImgChildItem         // clazy:exclude=ctor-missing-parent-argument
0034 {
0035     Q_OBJECT
0036 
0037 public:
0038 
0039     enum Flag
0040     {
0041         NoFlags           = 0,
0042         ShowResizeHandles = 1 << 0,
0043         MoveByDrag        = 1 << 1,
0044 
0045         GeometryEditable  = ShowResizeHandles | MoveByDrag
0046     };
0047     Q_DECLARE_FLAGS(Flags, Flag)
0048 
0049 public:
0050 
0051     explicit RegionFrameItem(QGraphicsItem* const parent);
0052     ~RegionFrameItem()                                      override;
0053 
0054     void  setFlags(Flags flags);
0055     void  changeFlags(Flags flags, bool addOrRemove);
0056     Flags flags()                                     const;
0057 
0058     /**
0059      * Sets a widget item as HUD item. A HUD item will be positioned relative to this item,
0060      * and repositioned on position changes or resizing.
0061      * Ownership of the item is taken, and it is made a child item of this item.
0062      * You can also add QWidget directly. It will be wrapped in a proxy item.
0063      */
0064     void             setHudWidget(QGraphicsWidget* const hudWidget);
0065     void             setHudWidget(QWidget* const widget, Qt::WindowFlags wFlags = Qt::WindowFlags());
0066     QGraphicsWidget* hudWidget()                      const;
0067     void             setHudWidgetVisible(bool visible);
0068 
0069     void setFixedRatio(double ratio);
0070 
0071     void setRectInSceneCoordinatesAdjusted(const QRectF& rect);
0072 
0073     QRectF boundingRect()                             const override;
0074 
0075 public Q_SLOTS:
0076 
0077     /**
0078      * The associated HUD item is dynamically moved to be visible.
0079      * This can only be done for _one_ region at a time.
0080      * Set the current primary view region of the scene by this method
0081      * to dynamically reposition the HUD inside this region.
0082      * The rect given is in scene coordinates.
0083      */
0084     void setViewportRect(const QRectF& rect);
0085 
0086 Q_SIGNALS:
0087 
0088     void geometryEdited();
0089 
0090 protected:
0091 
0092     void paint(QPainter* painter,
0093                const QStyleOptionGraphicsItem* option,
0094                QWidget* widget = nullptr)                   override;
0095     void mousePressEvent(QGraphicsSceneMouseEvent*)         override;
0096     void mouseMoveEvent(QGraphicsSceneMouseEvent*)          override;
0097     void mouseReleaseEvent(QGraphicsSceneMouseEvent*)       override;
0098     void hoverEnterEvent(QGraphicsSceneHoverEvent* event)   override;
0099     void hoverMoveEvent(QGraphicsSceneHoverEvent* event)    override;
0100     void hoverLeaveEvent(QGraphicsSceneHoverEvent* event)   override;
0101 
0102     bool eventFilter(QObject* watched, QEvent* event)       override;
0103 
0104 private Q_SLOTS:
0105 
0106     void slotUpdate();
0107     void slotSizeChanged();
0108     void slotPosChanged();
0109     void hudSizeChanged();
0110     void moveHudWidget();
0111 
0112 private:
0113 
0114     // Disable
0115     RegionFrameItem();
0116 
0117 private:
0118 
0119     class Private;
0120     Private* const d;
0121 };
0122 
0123 } // namespace Digikam
0124 
0125 Q_DECLARE_OPERATORS_FOR_FLAGS(Digikam::RegionFrameItem::Flags)
0126 
0127 #endif // DIGIKAM_REGION_FRAME_ITEM_H