1 /*
2 This file is part of the KDE Kontact Plugin Interface Library.
3
4 SPDX-FileCopyrightText: 2003 Cornelius Schumacher <schumacher@kde.org>
5 SPDX-FileCopyrightText: 2003 Daniel Molkentin <molkentin@kde.org>
6
7 SPDX-License-Identifier: LGPL-2.0-or-later
8 */
9
10 #include "summary.h"
11
12 #include <QDrag>
13 #include <QDragEnterEvent>
14 #include <QDropEvent>
15 #include <QFont>
16 #include <QFontDatabase>
17 #include <QHBoxLayout>
18 #include <QIcon>
19 #include <QLabel>
20 #include <QMimeData>
21 #include <QMouseEvent>
22 #include <QPainter>
23 #include <QPixmap>
24 #include <QStyle>
25
26 using namespace KontactInterface;
27
28 //@cond PRIVATE
29 namespace KontactInterface
30 {
31 class SummaryMimeData : public QMimeData
32 {
33 Q_OBJECT
34 public:
hasFormat(const QString & format) const35 bool hasFormat(const QString &format) const override
36 {
37 return format == QLatin1String("application/x-kontact-summary");
38 }
39 };
40 }
41 //@endcond
42
43 //@cond PRIVATE
44 class Q_DECL_HIDDEN Summary::SummaryPrivate
45 {
46 public:
47 QPoint mDragStartPoint;
48 };
49 //@endcond
50
Summary(QWidget * parent)51 Summary::Summary(QWidget *parent)
52 : QWidget(parent)
53 , d(new SummaryPrivate)
54 {
55 setFont(QFontDatabase::systemFont(QFontDatabase::GeneralFont));
56 setAcceptDrops(true);
57 }
58
59 Summary::~Summary() = default;
60
summaryHeight() const61 int Summary::summaryHeight() const
62 {
63 return 1;
64 }
65
createHeader(QWidget * parent,const QString & iconname,const QString & heading)66 QWidget *Summary::createHeader(QWidget *parent, const QString &iconname, const QString &heading)
67 {
68 auto box = new QWidget(parent);
69 auto hbox = new QHBoxLayout(box);
70 hbox->setContentsMargins({});
71 hbox->setSpacing(0);
72 box->setAutoFillBackground(true);
73
74 QIcon icon = QIcon::fromTheme(iconname);
75
76 auto label = new QLabel(box);
77 hbox->addWidget(label);
78 label->setPixmap(icon.pixmap(style()->pixelMetric(QStyle::PM_ToolBarIconSize)));
79
80 label->setFixedSize(label->sizeHint());
81 label->setAcceptDrops(true);
82
83 label = new QLabel(heading, box);
84 hbox->addWidget(label);
85 label->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
86
87 box->setMaximumHeight(box->minimumSizeHint().height());
88
89 return box;
90 }
91
configModules() const92 QStringList Summary::configModules() const
93 {
94 return QStringList();
95 }
96
configChanged()97 void Summary::configChanged()
98 {
99 }
100
updateSummary(bool force)101 void Summary::updateSummary(bool force)
102 {
103 Q_UNUSED(force)
104 }
105
mousePressEvent(QMouseEvent * event)106 void Summary::mousePressEvent(QMouseEvent *event)
107 {
108 d->mDragStartPoint = event->pos();
109
110 QWidget::mousePressEvent(event);
111 }
112
mouseMoveEvent(QMouseEvent * event)113 void Summary::mouseMoveEvent(QMouseEvent *event)
114 {
115 if ((event->buttons() & Qt::LeftButton) && (event->pos() - d->mDragStartPoint).manhattanLength() > 4) {
116 auto drag = new QDrag(this);
117 drag->setMimeData(new SummaryMimeData());
118 drag->setObjectName(QStringLiteral("SummaryWidgetDrag"));
119
120 QPixmap pm = grab();
121 if (pm.width() > 300) {
122 pm = QPixmap::fromImage(pm.toImage().scaled(300, 300, Qt::KeepAspectRatio, Qt::SmoothTransformation));
123 }
124
125 QPainter painter;
126 painter.begin(&pm);
127 painter.setPen(QPalette::AlternateBase);
128 painter.drawRect(0, 0, pm.width(), pm.height());
129 painter.end();
130 drag->setPixmap(pm);
131 drag->exec(Qt::MoveAction);
132 } else {
133 QWidget::mouseMoveEvent(event);
134 }
135 }
136
dragEnterEvent(QDragEnterEvent * event)137 void Summary::dragEnterEvent(QDragEnterEvent *event)
138 {
139 if (event->mimeData()->hasFormat(QStringLiteral("application/x-kontact-summary"))) {
140 event->acceptProposedAction();
141 }
142 }
143
dropEvent(QDropEvent * event)144 void Summary::dropEvent(QDropEvent *event)
145 {
146 const int alignment = (event->pos().y() < (height() / 2) ? Qt::AlignTop : Qt::AlignBottom);
147 Q_EMIT summaryWidgetDropped(this, event->source(), alignment);
148 }
149
150 #include <summary.moc>
151