|
|
|
|
@ -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); |
|
|
|
|
} |
|
|
|
|
|