Incidenceeditor

attachmenticonview.cpp
1/*
2 SPDX-FileCopyrightText: 2003 Cornelius Schumacher <schumacher@kde.org>
3 SPDX-FileCopyrightText: 2005 Reinhold Kainhofer <reinhold@kainhofer.com>
4 SPDX-FileCopyrightText: 2005 Rafal Rzepecki <divide@users.sourceforge.net>
5 SPDX-FileCopyrightText: 2010 Bertjan Broeksema <broeksema@kde.org>
6 SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
7
8 SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
9
10 NOTE: May, 2010. Extracted this code from
11 kdepim/incidenceeditors/editorattachments.{h,cpp}
12*/
13
14#include <config-enterprise.h>
15
16#include "attachmenticonview.h"
17
18#include <KIconLoader>
19#include <KUrlMimeData>
20#include <QDir>
21#include <QTemporaryFile>
22
23#include <KIconEngine>
24#include <QDrag>
25#include <QKeyEvent>
26#include <QMimeData>
27#include <QMimeDatabase>
28
29using namespace IncidenceEditorNG;
30
31AttachmentIconItem::AttachmentIconItem(const KCalendarCore::Attachment &att, QListWidget *parent)
32 : QListWidgetItem(parent)
33{
34 if (!att.isEmpty()) {
35 mAttachment = att;
36 } else {
37 // for the enterprise, inline attachments are the default
38#if KDEPIM_ENTERPRISE_BUILD
39 mAttachment = KCalendarCore::Attachment(QByteArray()); // use the non-uri constructor
40 // as we want inline by default
41#else
42 mAttachment = KCalendarCore::Attachment(QString());
43#endif
44 }
45 readAttachment();
47}
48
49AttachmentIconItem::~AttachmentIconItem() = default;
50
51KCalendarCore::Attachment AttachmentIconItem::attachment() const
52{
53 return mAttachment;
54}
55
56const QString AttachmentIconItem::uri() const
57{
58 return mAttachment.uri();
59}
60
61const QString AttachmentIconItem::savedUri() const
62{
63 return mSaveUri;
64}
65
66void AttachmentIconItem::setUri(const QString &uri)
67{
68 mSaveUri = uri;
69 mAttachment.setUri(mSaveUri);
70 readAttachment();
71}
72
73void AttachmentIconItem::setData(const QByteArray &data)
74{
75 mAttachment.setDecodedData(data);
76 readAttachment();
77}
78
79const QString AttachmentIconItem::mimeType() const
80{
81 return mAttachment.mimeType();
82}
83
84void AttachmentIconItem::setMimeType(const QString &mime)
85{
86 mAttachment.setMimeType(mime);
87 readAttachment();
88}
89
90const QString AttachmentIconItem::label() const
91{
92 return mAttachment.label();
93}
94
95void AttachmentIconItem::setLabel(const QString &description)
96{
97 if (mAttachment.label() == description) {
98 return;
99 }
100 mAttachment.setLabel(description);
101 readAttachment();
102}
103
104bool AttachmentIconItem::isBinary() const
105{
106 return mAttachment.isBinary();
107}
108
109QPixmap AttachmentIconItem::icon() const
110{
111 QMimeDatabase db;
112 return icon(db.mimeTypeForName(mAttachment.mimeType()), mAttachment.uri(), mAttachment.isBinary());
113}
114
115QPixmap AttachmentIconItem::icon(const QMimeType &mimeType, const QString &uri, bool binary)
116{
117 const QString iconStr = mimeType.iconName();
118 QStringList overlays;
119 if (!uri.isEmpty() && !binary) {
120 overlays << QStringLiteral("emblem-link");
121 }
123}
124
125void AttachmentIconItem::readAttachment()
126{
127 setText(mAttachment.label());
129
130 QMimeDatabase db;
131 if (mAttachment.mimeType().isEmpty() || !(db.mimeTypeForName(mAttachment.mimeType()).isValid())) {
133 if (mAttachment.isUri()) {
134 mimeType = db.mimeTypeForUrl(QUrl(mAttachment.uri()));
135 } else {
136 mimeType = db.mimeTypeForData(mAttachment.decodedData());
137 }
138 mAttachment.setMimeType(mimeType.name());
139 }
140
141 setIcon(icon());
142}
143
144AttachmentIconView::AttachmentIconView(QWidget *parent)
145 : QListWidget(parent)
146{
147 setMovement(Static);
148 setAcceptDrops(true);
149 setSelectionMode(ExtendedSelection);
150 setSelectionRectVisible(false);
152 setFlow(LeftToRight);
153 setWrapping(true);
154#ifndef QT_NO_DRAGANDDROP
155 setDragDropMode(DragDrop);
156 setDragEnabled(true);
157#endif
158 setEditTriggers(EditKeyPressed);
159 setContextMenuPolicy(Qt::CustomContextMenu);
160}
161
162QUrl AttachmentIconItem::tempFileForAttachment()
163{
164 if (mTempFile.isValid()) {
165 return mTempFile;
166 }
167 QTemporaryFile *file = nullptr;
168
169 QMimeDatabase db;
170 QStringList patterns = db.mimeTypeForName(mAttachment.mimeType()).globPatterns();
171
172 if (!patterns.empty()) {
173 file = new QTemporaryFile(QDir::tempPath() + QLatin1StringView("/attachementview_XXXXX") + patterns.first().remove(QLatin1Char('*')));
174 } else {
175 file = new QTemporaryFile();
176 }
177 file->setParent(listWidget());
178
179 file->setAutoRemove(true);
180 file->open();
181 // read-only not to give the idea that it could be written to
183 file->write(QByteArray::fromBase64(mAttachment.data()));
184 mTempFile = QUrl::fromLocalFile(file->fileName());
185 file->close();
186 return mTempFile;
187}
188
189QMimeData *AttachmentIconView::mimeData(const QList<QListWidgetItem *> &items) const // clazy:exclude=function-args-by-ref
190{
191 // create a list of the URL:s that we want to drag
192 QList<QUrl> urls;
193 QStringList labels;
194 for (QListWidgetItem *it : items) {
195 if (it->isSelected()) {
196 auto item = static_cast<AttachmentIconItem *>(it);
197 if (item->isBinary()) {
198 urls.append(item->tempFileForAttachment());
199 } else {
200 urls.append(QUrl(item->uri()));
201 }
202 labels.append(QString::fromLatin1(QUrl::toPercentEncoding(item->label())));
203 }
204 }
205 if (selectionMode() == NoSelection) {
206 auto item = static_cast<AttachmentIconItem *>(currentItem());
207 if (item) {
208 urls.append(QUrl(item->uri()));
209 labels.append(QString::fromLatin1(QUrl::toPercentEncoding(item->label())));
210 }
211 }
212
213 QMap<QString, QString> metadata;
214 metadata[QStringLiteral("labels")] = labels.join(QLatin1Char(':'));
215
216 auto mimeData = new QMimeData;
217 mimeData->setUrls(urls);
218 KUrlMimeData::setMetaData(metadata, mimeData);
219 return mimeData;
220}
221
222QMimeData *AttachmentIconView::mimeData() const
223{
224 return mimeData(selectedItems());
225}
226
227void AttachmentIconView::startDrag(Qt::DropActions supportedActions)
228{
229 Q_UNUSED(supportedActions)
230#ifndef QT_NO_DRAGANDDROP
231 QPixmap pixmap;
232 if (selectedItems().size() > 1) {
233 pixmap = KIconLoader::global()->loadIcon(QStringLiteral("mail-attachment"), KIconLoader::Desktop);
234 }
235 if (pixmap.isNull()) {
236 pixmap = static_cast<AttachmentIconItem *>(currentItem())->icon();
237 }
238
239 const QPoint hotspot(pixmap.width() / 2, pixmap.height() / 2);
240
241 auto drag = new QDrag(this);
242 drag->setMimeData(mimeData());
243
244 drag->setPixmap(pixmap);
245 drag->setHotSpot(hotspot);
246 drag->exec(Qt::CopyAction);
247#endif
248}
249
250void AttachmentIconView::keyPressEvent(QKeyEvent *event)
251{
252 if ((event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) && currentItem() && state() != EditingState) {
253 Q_EMIT itemDoubleClicked(currentItem()); // ugly, but itemActivated() also includes single click
254 return;
255 }
257}
258
259#include "moc_attachmenticonview.cpp"
QByteArray decodedData() const
QString mimeType() const
void setDecodedData(const QByteArray &data)
QByteArray data() const
void setUri(const QString &uri)
void setMimeType(const QString &mime)
void setLabel(const QString &label)
static KIconLoader * global()
QPixmap loadIcon(const QString &name, KIconLoader::Group group, int size=0, int state=KIconLoader::DefaultState, const QStringList &overlays=QStringList(), QString *path_store=nullptr, bool canReturnNull=false) const
KCALUTILS_EXPORT QString mimeType()
KCRASH_EXPORT void setFlags(KCrash::CrashFlags flags)
KCOREADDONS_EXPORT void setMetaData(const MetaDataMap &metaData, QMimeData *mimeData)
virtual void keyPressEvent(QKeyEvent *event) override
State state() const const
QByteArray fromBase64(const QByteArray &base64, Base64Options options)
QString tempPath()
virtual bool setPermissions(Permissions permissions) override
virtual void close() override
QPixmap pixmap(QWindow *window, const QSize &size, Mode mode, State state) const const
qint64 write(const QByteArray &data)
void append(QList< T > &&value)
bool empty() const const
T & first()
QListWidgetItem * currentItem() const const
virtual bool event(QEvent *e) override
void itemDoubleClicked(QListWidgetItem *item)
QList< QListWidgetItem * > selectedItems() const const
virtual QVariant data(int role) const const
Qt::ItemFlags flags() const const
QListWidget * listWidget() const const
void setFlags(Qt::ItemFlags flags)
void setIcon(const QIcon &icon)
void setText(const QString &text)
void setUrls(const QList< QUrl > &urls)
QMimeType mimeTypeForData(QIODevice *device) const const
QMimeType mimeTypeForName(const QString &nameOrAlias) const const
QMimeType mimeTypeForUrl(const QUrl &url) const const
bool isValid() const const
Q_EMITQ_EMIT
void setParent(QObject *parent)
QString fromLatin1(QByteArrayView str)
bool isEmpty() const const
QString join(QChar separator) const const
CustomContextMenu
typedef DropActions
ItemIsDragEnabled
Key_Return
virtual QString fileName() const const override
void setAutoRemove(bool b)
QUrl fromLocalFile(const QString &localFile)
bool isValid() const const
QByteArray toPercentEncoding(const QString &input, const QByteArray &exclude, const QByteArray &include)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:19:37 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.