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 &currentPath)
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"