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