1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 Jochen Becher
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of Qt Creator.
7 **
8 ** Commercial License Usage
9 ** Licensees holding valid commercial Qt licenses may use this file in
10 ** accordance with the commercial license agreement provided with the
11 ** Software or, alternatively, in accordance with the terms contained in
12 ** a written agreement between you and The Qt Company. For licensing terms
13 ** and conditions see https://www.qt.io/terms-conditions. For further
14 ** information use the contact form at https://www.qt.io/contact-us.
15 **
16 ** GNU General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU
18 ** General Public License version 3 as published by the Free Software
19 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
20 ** included in the packaging of this file. Please review the following
21 ** information to ensure the GNU General Public License requirements will
22 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
23 **
24 ****************************************************************************/
25 
26 #include "alignbuttonsitem.h"
27 
28 #include "qmt/diagram_scene/capabilities/alignable.h"
29 #include "qmt/infrastructure/qmtassert.h"
30 
31 #include <QPen>
32 #include <QBrush>
33 #include <QPainter>
34 #include <QGraphicsSceneMouseEvent>
35 #include <QDebug>
36 
37 namespace qmt {
38 
39 class AlignButtonsItem::AlignButtonItem : public QGraphicsRectItem
40 {
41 public:
AlignButtonItem(IAlignable::AlignType alignType,const QString & identifier,IAlignable * alignable,QGraphicsItem * parent)42     AlignButtonItem(IAlignable::AlignType alignType, const QString &identifier, IAlignable *alignable, QGraphicsItem *parent)
43         : QGraphicsRectItem(parent),
44           m_alignType(alignType),
45           m_identifier(identifier),
46           m_alignable(alignable),
47           m_pixmapItem(new QGraphicsPixmapItem(this))
48     {
49         setBrush(QBrush(QColor(192, 192, 192)));
50         setPen(QPen(QColor(64, 64, 64)));
51     }
52 
identifier() const53     QString identifier() const { return m_identifier; }
54 
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)55     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) final
56     {
57         Q_UNUSED(option)
58         Q_UNUSED(widget)
59 
60         painter->save();
61         painter->setPen(pen());
62         painter->setBrush(brush());
63         painter->drawRoundedRect(rect(), 3, 3);
64         painter->restore();
65     }
66 
mousePressEvent(QGraphicsSceneMouseEvent * event)67     void mousePressEvent(QGraphicsSceneMouseEvent *event) final
68     {
69         Q_UNUSED(event)
70     }
71 
mouseReleaseEvent(QGraphicsSceneMouseEvent * event)72     void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) final
73     {
74         if (contains(event->pos()))
75             m_alignable->align(m_alignType, m_identifier);
76     }
77 
setPixmap(const QPixmap & pixmap)78     void setPixmap(const QPixmap &pixmap)
79     {
80         setRect(0.0, 0.0, pixmap.width() + 2 * InnerBorder, pixmap.height() + 2 * InnerBorder);
81         m_pixmapItem->setPos(InnerBorder, InnerBorder);
82         m_pixmapItem->setPixmap(pixmap);
83     }
84 
85 private:
86     IAlignable::AlignType m_alignType = IAlignable::AlignLeft;
87     QString m_identifier;
88     IAlignable *m_alignable = nullptr;
89     QGraphicsPixmapItem *m_pixmapItem = nullptr;
90 };
91 
AlignButtonsItem(IAlignable * alignable,QGraphicsItem * parent)92 AlignButtonsItem::AlignButtonsItem(IAlignable *alignable, QGraphicsItem *parent)
93     : QGraphicsItem(parent),
94       m_alignable(alignable)
95 {
96 }
97 
~AlignButtonsItem()98 AlignButtonsItem::~AlignButtonsItem()
99 {
100     qDeleteAll(m_alignItems);
101 }
102 
boundingRect() const103 QRectF AlignButtonsItem::boundingRect() const
104 {
105     return childrenBoundingRect();
106 }
107 
paint(QPainter * painter,const QStyleOptionGraphicsItem * option,QWidget * widget)108 void AlignButtonsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
109 {
110     Q_UNUSED(painter)
111     Q_UNUSED(option)
112     Q_UNUSED(widget)
113 }
114 
clear()115 void AlignButtonsItem::clear()
116 {
117     qDeleteAll(m_alignItems);
118     m_alignItems.clear();
119 }
120 
addButton(IAlignable::AlignType alignType,const QString & identifier,qreal pos)121 void AlignButtonsItem::addButton(IAlignable::AlignType alignType, const QString &identifier, qreal pos)
122 {
123     auto item = new AlignButtonItem(alignType, identifier, m_alignable, this);
124     switch (alignType) {
125     case IAlignable::AlignLeft:
126     {
127         static const QPixmap alignLeftPixmap = QPixmap(":/modelinglib/25x25/align-left.png").scaled(NormalPixmapWidth, NormalPixmapHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
128         item->setPixmap(alignLeftPixmap);
129         item->setPos(pos - InnerBorder - 3.0, 0); // subtract additional shift of image within pixmap
130         break;
131     }
132     case IAlignable::AlignRight:
133     {
134         static const QPixmap alignRightPixmap = QPixmap(":/modelinglib/25x25/align-right.png").scaled(NormalPixmapWidth, NormalPixmapHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
135         item->setPixmap(alignRightPixmap);
136         item->setPos(pos - item->boundingRect().width() + InnerBorder + 3.0, 0);
137         break;
138     }
139     case IAlignable::AlignTop:
140     {
141         static const QPixmap alignTopPixmap = QPixmap(":/modelinglib/25x25/align-top.png").scaled(NormalPixmapWidth, NormalPixmapHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
142         item->setPixmap(alignTopPixmap);
143         item->setPos(0, pos - InnerBorder - 3.0);
144         break;
145     }
146     case IAlignable::AlignBottom:
147     {
148         static const QPixmap alignBottomPixmap = QPixmap(":/modelinglib/25x25/align-bottom.png").scaled(NormalPixmapWidth, NormalPixmapHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
149         item->setPixmap(alignBottomPixmap);
150         item->setPos(0, pos - item->boundingRect().height() + InnerBorder + 3.0);
151         break;
152     }
153     case IAlignable::AlignHcenter:
154     {
155         static const QPixmap alignHorizontalPixmap = QPixmap(":/modelinglib/25x25/align-horizontal.png").scaled(NormalPixmapWidth, NormalPixmapHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
156         item->setPixmap(alignHorizontalPixmap);
157         item->setPos(pos - item->boundingRect().center().x(), 0);
158         break;
159     }
160     case IAlignable::AlignVcenter:
161     {
162         static const QPixmap alignVerticalPixmap = QPixmap(":/modelinglib/25x25/align-vertical.png").scaled(NormalPixmapWidth, NormalPixmapHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
163         item->setPixmap(alignVerticalPixmap);
164         item->setPos(0, pos - item->boundingRect().center().y());
165         break;
166     }
167     case IAlignable::AlignWidth:
168     case IAlignable::AlignHeight:
169     case IAlignable::AlignSize:
170     case IAlignable::AlignHCenterDistance:
171     case IAlignable::AlignVCenterDistance:
172     case IAlignable::AlignHBorderDistance:
173     case IAlignable::AlignVBorderDistance:
174         QMT_CHECK(false);
175         break;
176     }
177     m_alignItems.append(item);
178 }
179 
180 } // namespace qmt
181