Render typed PM media using shared Qt message roles
This commit is contained in:
1 parent
a281165450
commit
c58b92ecd7
2 files changed
+29
-3
No files matched your search
@@ -385,6 +385,17 @@ MessageList::MessageList(DbManager* db, AudioRecorder* recorder, QWidget *parent
|
||||
msgDelegate->setImageOpenCallback([this](const QString& path) {
|
||||
emit openImageRequested(path);
|
||||
});
|
||||
msgDelegate->setDownloadCallback([](const QModelIndex& index) {
|
||||
QString target = index.data(MsgChannelIdRole).toString();
|
||||
qint64 id = index.data(MsgIdRole).toLongLong();
|
||||
if (target.isEmpty() || target.startsWith("dm:") || id <= 0) return false;
|
||||
auto* req = (struct attachment_dl_req*)u_calloc(1, sizeof(struct attachment_dl_req));
|
||||
if (!req) { DEBUG_ERROR(DEBUG_CATEGORY_MEDIA, "attachment: download request allocation failed"); return false; }
|
||||
req->inst = gui_bridge_get_inst(); req->msg_id = id;
|
||||
snprintf(req->channel_id, sizeof(req->channel_id), "%s", target.toUtf8().constData());
|
||||
gui_bridge_post_uasync_fn(chat_core_attachment_download_trampoline, req);
|
||||
return true;
|
||||
});
|
||||
m_view->setItemDelegate(msgDelegate);
|
||||
m_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
||||
m_view->setSelectionMode(QAbstractItemView::NoSelection);
|
||||
@@ -1097,7 +1108,8 @@ void MessageList::onDmMessages(const uint8_t* data, int len) {
|
||||
item->setData(QVariant::fromValue(author), MsgAuthorNodeIdRole);
|
||||
item->setData(dir == 1 ? 1 : 0, MsgIsOutgoingRole);
|
||||
item->setData(m_currentChannelId, MsgChannelIdRole);
|
||||
item->setData(file ? QStringLiteral("application/octet-stream") : QStringLiteral("text/plain"), MsgContentTypeRole);
|
||||
QString type = message.value("content_type").toString(QStringLiteral("text/plain"));
|
||||
item->setData(type, MsgContentTypeRole);
|
||||
if (file) {
|
||||
QString path = message.value("media_path").toString();
|
||||
item->setData(path, MsgVoiceFileRole);
|
||||
@@ -1105,6 +1117,19 @@ void MessageList::onDmMessages(const uint8_t* data, int len) {
|
||||
item->setData((qint64)message.value("media_size").toDouble(), MsgFileSizeRole);
|
||||
item->setData(path.isEmpty() ? (state == "expired" ? 0 : 1) : 2, MsgFileDownloadStateRole);
|
||||
item->setData(status, MsgDeliveryStateRole);
|
||||
int duration = message.value("duration_ms").toInt();
|
||||
if (type == "audio/opus") {
|
||||
item->setData(QString::number(duration / 1000.0, 'f', 1) + "s", MsgVoiceDurationRole);
|
||||
item->setData((qint64)message.value("media_size").toDouble(), MsgVoiceFileSizeRole);
|
||||
QVariantList waveform;
|
||||
const QString levels = QStringLiteral("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
|
||||
for (QChar level : message.value("waveform").toString()) waveform.append(qMax(0, levels.indexOf(level)) / 63.0);
|
||||
item->setData(waveform, MsgVoiceWaveformRole);
|
||||
} else if (type == "video/mp4") {
|
||||
item->setData(duration, MsgVideoDurationMsRole);
|
||||
item->setData(message.value("width").toInt(), MsgVideoWidthRole);
|
||||
item->setData(message.value("height").toInt(), MsgVideoHeightRole);
|
||||
}
|
||||
}
|
||||
m_model->appendRow(item);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user