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