File indexing completed on 2024-05-12 16:27:15
0001 /* 0002 SPDX-FileCopyrightText: 2021-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "roomavatarwidget.h" 0008 #include <KLocalizedString> 0009 #include <QBuffer> 0010 #include <QContextMenuEvent> 0011 #include <QFileDialog> 0012 #include <QImageReader> 0013 #include <QMenu> 0014 0015 RoomAvatarWidget::RoomAvatarWidget(QWidget *parent) 0016 : QPushButton(parent) 0017 { 0018 setIconSize(QSize(100, 100)); 0019 setFixedSize(QSize(120, 120)); 0020 0021 connect(this, &RoomAvatarWidget::clicked, this, &RoomAvatarWidget::slotChangeImage); 0022 } 0023 0024 RoomAvatarWidget::~RoomAvatarWidget() = default; 0025 0026 void RoomAvatarWidget::contextMenuEvent(QContextMenuEvent *event) 0027 { 0028 QMenu menu; 0029 menu.addAction(i18n("Change Picture..."), this, &RoomAvatarWidget::slotChangeImage); 0030 menu.addSeparator(); 0031 menu.addAction(i18n("Reset Avatar"), this, &RoomAvatarWidget::slotResetAvatar); 0032 menu.addSeparator(); 0033 menu.addAction(QIcon::fromTheme(QStringLiteral("dialog-cancel")), i18n("Cancel"), this, &RoomAvatarWidget::slotCancel); 0034 menu.exec(event->globalPos()); 0035 } 0036 0037 void RoomAvatarWidget::slotChangeImage() 0038 { 0039 QString filter; 0040 const QList<QByteArray> supportedImage = QImageReader::supportedImageFormats(); 0041 for (const QByteArray &ba : supportedImage) { 0042 if (!filter.isEmpty()) { 0043 filter += QLatin1Char(' '); 0044 } 0045 filter += QLatin1String("*.") + QString::fromLatin1(ba); 0046 } 0047 filter = QStringLiteral("%1 (%2)").arg(i18n("Image"), filter); 0048 const QString fileName = QFileDialog::getOpenFileName(this, i18n("Select Room Avatar"), QString(), filter); 0049 if (!fileName.isEmpty()) { 0050 mRoomAvatarPath = fileName; 0051 const QIcon img(mRoomAvatarPath); 0052 setIcon(img); 0053 mWasChanged = true; 0054 } 0055 } 0056 0057 void RoomAvatarWidget::slotCancel() 0058 { 0059 mWasChanged = false; 0060 setIcon(QIcon(mCurrentIconPath)); 0061 } 0062 0063 void RoomAvatarWidget::slotResetAvatar() 0064 { 0065 mRoomAvatarPath.clear(); 0066 setIcon(QIcon()); 0067 // Fetch default icons. 0068 mWasChanged = true; 0069 } 0070 0071 void RoomAvatarWidget::setCurrentIconPath(const QString ¤tPath) 0072 { 0073 mCurrentIconPath = currentPath; 0074 setIcon(QIcon(mCurrentIconPath)); 0075 } 0076 0077 bool RoomAvatarWidget::wasChanged() const 0078 { 0079 return mWasChanged; 0080 } 0081 0082 QString RoomAvatarWidget::roomAvatar() const 0083 { 0084 if (mRoomAvatarPath.isEmpty()) { 0085 return {}; 0086 } else { 0087 QImage b(mRoomAvatarPath); 0088 QByteArray ba; 0089 QBuffer buf(&ba); 0090 b.save(&buf, "png"); 0091 const QByteArray hexed = ba.toBase64(); 0092 buf.close(); 0093 return QString::fromUtf8(QByteArray("data:image/png;base64,") + hexed); 0094 } 0095 } 0096 0097 #include "moc_roomavatarwidget.cpp"