File indexing completed on 2024-12-08 12:55:20
0001 // SPDX-FileCopyrightText: 2021 kaniini <https://git.pleroma.social/kaniini> 0002 // SPDX-FileCopyrightText: 2021 Carl Schwan <carl@carlschwan.eu> 0003 // SPDX-License-Identifier: GPL-3.0-only 0004 0005 #include "attachmenteditormodel.h" 0006 #include "account/abstractaccount.h" 0007 #include "account/account.h" 0008 #include <QTimer> 0009 0010 AttachmentEditorModel::AttachmentEditorModel(QObject *parent, AbstractAccount *account) 0011 : QAbstractListModel(parent) 0012 , m_account(account) 0013 { 0014 } 0015 0016 int AttachmentEditorModel::rowCount(const QModelIndex &parent) const 0017 { 0018 Q_UNUSED(parent); 0019 return m_attachments.size(); 0020 } 0021 0022 int AttachmentEditorModel::count() const 0023 { 0024 return rowCount({}); 0025 } 0026 0027 QVariant AttachmentEditorModel::data(const QModelIndex &index, int role) const 0028 { 0029 if (!index.isValid()) { 0030 return {}; 0031 } 0032 const int row = index.row(); 0033 const auto &attachment = m_attachments[row]; 0034 0035 switch (role) { 0036 case PreviewRole: 0037 return attachment->m_preview_url; 0038 case DescriptionRole: 0039 return attachment->description(); 0040 } 0041 0042 return {}; 0043 } 0044 0045 QHash<int, QByteArray> AttachmentEditorModel::roleNames() const 0046 { 0047 return { 0048 {PreviewRole, QByteArrayLiteral("preview")}, 0049 {DescriptionRole, QByteArrayLiteral("description")}, 0050 }; 0051 } 0052 0053 QNetworkReply *AttachmentEditorModel::append(const QUrl &filename) 0054 { 0055 if (rowCount({}) >= 4) { 0056 return nullptr; 0057 } 0058 return m_account->upload(filename, [=](QNetworkReply *reply) { 0059 const auto doc = QJsonDocument::fromJson(reply->readAll()); 0060 0061 if (!doc.isObject()) { 0062 return; 0063 } 0064 0065 beginInsertRows({}, m_attachments.count(), m_attachments.count()); 0066 m_attachments.append(new Attachment{doc.object(), this}); 0067 endInsertRows(); 0068 Q_EMIT countChanged(); 0069 }); 0070 } 0071 0072 void AttachmentEditorModel::appendExisting(Attachment *attachment) 0073 { 0074 beginInsertRows({}, m_attachments.count(), m_attachments.count()); 0075 m_attachments.append(attachment); 0076 endInsertRows(); 0077 Q_EMIT countChanged(); 0078 } 0079 0080 void AttachmentEditorModel::removeAttachment(int row) 0081 { 0082 beginRemoveRows({}, row, row); 0083 m_attachments.removeAt(row); 0084 endRemoveRows(); 0085 Q_EMIT countChanged(); 0086 } 0087 0088 void AttachmentEditorModel::setDescription(int row, const QString &description) 0089 { 0090 auto &attachment = m_attachments[row]; 0091 const auto id = attachment->id(); 0092 attachment->setDescription(description); 0093 0094 const auto attachementUrl = m_account->apiUrl(QStringLiteral("/api/v1/media/%1").arg(id)); 0095 const QJsonObject obj{ 0096 {"description", description}, 0097 }; 0098 const QJsonDocument doc(obj); 0099 m_account->put(attachementUrl, doc, true, this, nullptr); 0100 Q_EMIT dataChanged(index(row, 0), index(row, 0), {DescriptionRole}); 0101 } 0102 0103 const QVector<Attachment *> &AttachmentEditorModel::attachments() const 0104 { 0105 return m_attachments; 0106 }