mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Added sending info of stickered photos.
This commit is contained in:
parent
bc316a2536
commit
e05343d721
15 changed files with 113 additions and 28 deletions
|
@ -165,22 +165,30 @@ void EditMessageWithUploadedDocument(
|
||||||
HistoryItem *item,
|
HistoryItem *item,
|
||||||
const MTPInputFile &file,
|
const MTPInputFile &file,
|
||||||
const std::optional<MTPInputFile> &thumb,
|
const std::optional<MTPInputFile> &thumb,
|
||||||
SendOptions options) {
|
SendOptions options,
|
||||||
|
std::vector<MTPInputDocument> attachedStickers) {
|
||||||
if (!item || !item->media() || !item->media()->document()) {
|
if (!item || !item->media() || !item->media()->document()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const auto media = PrepareUploadedDocument(item, file, thumb);
|
const auto media = PrepareUploadedDocument(
|
||||||
|
item,
|
||||||
|
file,
|
||||||
|
thumb,
|
||||||
|
std::move(attachedStickers));
|
||||||
EditMessageWithUploadedMedia(item, options, media);
|
EditMessageWithUploadedMedia(item, options, media);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditMessageWithUploadedPhoto(
|
void EditMessageWithUploadedPhoto(
|
||||||
HistoryItem *item,
|
HistoryItem *item,
|
||||||
const MTPInputFile &file,
|
const MTPInputFile &file,
|
||||||
SendOptions options) {
|
SendOptions options,
|
||||||
|
std::vector<MTPInputDocument> attachedStickers) {
|
||||||
if (!item || !item->media() || !item->media()->photo()) {
|
if (!item || !item->media() || !item->media()->photo()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const auto media = PrepareUploadedPhoto(file);
|
const auto media = PrepareUploadedPhoto(
|
||||||
|
file,
|
||||||
|
std::move(attachedStickers));
|
||||||
EditMessageWithUploadedMedia(item, options, media);
|
EditMessageWithUploadedMedia(item, options, media);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,12 +31,14 @@ void EditMessageWithUploadedDocument(
|
||||||
HistoryItem *item,
|
HistoryItem *item,
|
||||||
const MTPInputFile &file,
|
const MTPInputFile &file,
|
||||||
const std::optional<MTPInputFile> &thumb,
|
const std::optional<MTPInputFile> &thumb,
|
||||||
SendOptions options);
|
SendOptions options,
|
||||||
|
std::vector<MTPInputDocument> attachedStickers);
|
||||||
|
|
||||||
void EditMessageWithUploadedPhoto(
|
void EditMessageWithUploadedPhoto(
|
||||||
HistoryItem *item,
|
HistoryItem *item,
|
||||||
const MTPInputFile &file,
|
const MTPInputFile &file,
|
||||||
SendOptions options);
|
SendOptions options,
|
||||||
|
std::vector<MTPInputDocument> attachedStickers);
|
||||||
|
|
||||||
mtpRequestId EditCaption(
|
mtpRequestId EditCaption(
|
||||||
not_null<HistoryItem*> item,
|
not_null<HistoryItem*> item,
|
||||||
|
|
|
@ -73,18 +73,24 @@ MTPVector<MTPDocumentAttribute> ComposeSendingDocumentAttributes(
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
MTPInputMedia PrepareUploadedPhoto(const MTPInputFile &file) {
|
MTPInputMedia PrepareUploadedPhoto(
|
||||||
|
const MTPInputFile &file,
|
||||||
|
std::vector<MTPInputDocument> attachedStickers) {
|
||||||
|
const auto flags = attachedStickers.empty()
|
||||||
|
? MTPDinputMediaUploadedPhoto::Flags(0)
|
||||||
|
: MTPDinputMediaUploadedPhoto::Flag::f_stickers;
|
||||||
return MTP_inputMediaUploadedPhoto(
|
return MTP_inputMediaUploadedPhoto(
|
||||||
MTP_flags(0),
|
MTP_flags(flags),
|
||||||
file,
|
file,
|
||||||
MTPVector<MTPInputDocument>(),
|
MTP_vector<MTPInputDocument>(ranges::to<QVector>(attachedStickers)),
|
||||||
MTP_int(0));
|
MTP_int(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
MTPInputMedia PrepareUploadedDocument(
|
MTPInputMedia PrepareUploadedDocument(
|
||||||
not_null<HistoryItem*> item,
|
not_null<HistoryItem*> item,
|
||||||
const MTPInputFile &file,
|
const MTPInputFile &file,
|
||||||
const std::optional<MTPInputFile> &thumb) {
|
const std::optional<MTPInputFile> &thumb,
|
||||||
|
std::vector<MTPInputDocument> attachedStickers) {
|
||||||
if (!item || !item->media() || !item->media()->document()) {
|
if (!item || !item->media() || !item->media()->document()) {
|
||||||
return MTP_inputMediaEmpty();
|
return MTP_inputMediaEmpty();
|
||||||
}
|
}
|
||||||
|
@ -92,7 +98,8 @@ MTPInputMedia PrepareUploadedDocument(
|
||||||
using DocFlags = MTPDinputMediaUploadedDocument::Flag;
|
using DocFlags = MTPDinputMediaUploadedDocument::Flag;
|
||||||
const auto flags = emptyFlag
|
const auto flags = emptyFlag
|
||||||
| (thumb ? DocFlags::f_thumb : emptyFlag)
|
| (thumb ? DocFlags::f_thumb : emptyFlag)
|
||||||
| (item->groupId() ? DocFlags::f_nosound_video : emptyFlag);
|
| (item->groupId() ? DocFlags::f_nosound_video : emptyFlag)
|
||||||
|
| (attachedStickers.empty() ? DocFlags::f_stickers : emptyFlag);
|
||||||
const auto document = item->media()->document();
|
const auto document = item->media()->document();
|
||||||
return MTP_inputMediaUploadedDocument(
|
return MTP_inputMediaUploadedDocument(
|
||||||
MTP_flags(flags),
|
MTP_flags(flags),
|
||||||
|
@ -100,7 +107,7 @@ MTPInputMedia PrepareUploadedDocument(
|
||||||
thumb.value_or(MTPInputFile()),
|
thumb.value_or(MTPInputFile()),
|
||||||
MTP_string(document->mimeString()),
|
MTP_string(document->mimeString()),
|
||||||
ComposeSendingDocumentAttributes(document),
|
ComposeSendingDocumentAttributes(document),
|
||||||
MTPVector<MTPInputDocument>(),
|
MTP_vector<MTPInputDocument>(ranges::to<QVector>(attachedStickers)),
|
||||||
MTP_int(0));
|
MTP_int(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,11 +11,14 @@ class HistoryItem;
|
||||||
|
|
||||||
namespace Api {
|
namespace Api {
|
||||||
|
|
||||||
MTPInputMedia PrepareUploadedPhoto(const MTPInputFile &file);
|
MTPInputMedia PrepareUploadedPhoto(
|
||||||
|
const MTPInputFile &file,
|
||||||
|
std::vector<MTPInputDocument> attachedStickers);
|
||||||
|
|
||||||
MTPInputMedia PrepareUploadedDocument(
|
MTPInputMedia PrepareUploadedDocument(
|
||||||
not_null<HistoryItem*> item,
|
not_null<HistoryItem*> item,
|
||||||
const MTPInputFile &file,
|
const MTPInputFile &file,
|
||||||
const std::optional<MTPInputFile> &thumb);
|
const std::optional<MTPInputFile> &thumb,
|
||||||
|
std::vector<MTPInputDocument> attachedStickers);
|
||||||
|
|
||||||
} // namespace Api
|
} // namespace Api
|
||||||
|
|
|
@ -3947,9 +3947,12 @@ void ApiWrap::sendFile(
|
||||||
void ApiWrap::sendUploadedPhoto(
|
void ApiWrap::sendUploadedPhoto(
|
||||||
FullMsgId localId,
|
FullMsgId localId,
|
||||||
const MTPInputFile &file,
|
const MTPInputFile &file,
|
||||||
Api::SendOptions options) {
|
Api::SendOptions options,
|
||||||
|
std::vector<MTPInputDocument> attachedStickers) {
|
||||||
if (const auto item = _session->data().message(localId)) {
|
if (const auto item = _session->data().message(localId)) {
|
||||||
const auto media = Api::PrepareUploadedPhoto(file);
|
const auto media = Api::PrepareUploadedPhoto(
|
||||||
|
file,
|
||||||
|
std::move(attachedStickers));
|
||||||
if (const auto groupId = item->groupId()) {
|
if (const auto groupId = item->groupId()) {
|
||||||
uploadAlbumMedia(item, groupId, media);
|
uploadAlbumMedia(item, groupId, media);
|
||||||
} else {
|
} else {
|
||||||
|
@ -3962,12 +3965,17 @@ void ApiWrap::sendUploadedDocument(
|
||||||
FullMsgId localId,
|
FullMsgId localId,
|
||||||
const MTPInputFile &file,
|
const MTPInputFile &file,
|
||||||
const std::optional<MTPInputFile> &thumb,
|
const std::optional<MTPInputFile> &thumb,
|
||||||
Api::SendOptions options) {
|
Api::SendOptions options,
|
||||||
|
std::vector<MTPInputDocument> attachedStickers) {
|
||||||
if (const auto item = _session->data().message(localId)) {
|
if (const auto item = _session->data().message(localId)) {
|
||||||
if (!item->media() || !item->media()->document()) {
|
if (!item->media() || !item->media()->document()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const auto media = Api::PrepareUploadedDocument(item, file, thumb);
|
const auto media = Api::PrepareUploadedDocument(
|
||||||
|
item,
|
||||||
|
file,
|
||||||
|
thumb,
|
||||||
|
std::move(attachedStickers));
|
||||||
const auto groupId = item->groupId();
|
const auto groupId = item->groupId();
|
||||||
if (groupId) {
|
if (groupId) {
|
||||||
uploadAlbumMedia(item, groupId, media);
|
uploadAlbumMedia(item, groupId, media);
|
||||||
|
|
|
@ -410,12 +410,14 @@ public:
|
||||||
void sendUploadedPhoto(
|
void sendUploadedPhoto(
|
||||||
FullMsgId localId,
|
FullMsgId localId,
|
||||||
const MTPInputFile &file,
|
const MTPInputFile &file,
|
||||||
Api::SendOptions options);
|
Api::SendOptions options,
|
||||||
|
std::vector<MTPInputDocument> attachedStickers);
|
||||||
void sendUploadedDocument(
|
void sendUploadedDocument(
|
||||||
FullMsgId localId,
|
FullMsgId localId,
|
||||||
const MTPInputFile &file,
|
const MTPInputFile &file,
|
||||||
const std::optional<MTPInputFile> &thumb,
|
const std::optional<MTPInputFile> &thumb,
|
||||||
Api::SendOptions options);
|
Api::SendOptions options,
|
||||||
|
std::vector<MTPInputDocument> attachedStickers);
|
||||||
|
|
||||||
void cancelLocalItem(not_null<HistoryItem*> item);
|
void cancelLocalItem(not_null<HistoryItem*> item);
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
|
||||||
#include "editor/scene_item_canvas.h"
|
#include "editor/scene_item_canvas.h"
|
||||||
#include "editor/scene_item_line.h"
|
#include "editor/scene_item_line.h"
|
||||||
|
#include "editor/scene_item_sticker.h"
|
||||||
#include "ui/rp_widget.h"
|
#include "ui/rp_widget.h"
|
||||||
|
|
||||||
#include <QGraphicsSceneMouseEvent>
|
#include <QGraphicsSceneMouseEvent>
|
||||||
|
@ -99,6 +100,18 @@ std::vector<QGraphicsItem*> Scene::items(Qt::SortOrder order) const {
|
||||||
return filteredItems;
|
return filteredItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<MTPInputDocument> Scene::attachedStickers() const {
|
||||||
|
const auto allItems = items();
|
||||||
|
|
||||||
|
return ranges::views::all(
|
||||||
|
allItems
|
||||||
|
) | ranges::views::filter([](QGraphicsItem *i) {
|
||||||
|
return i->isVisible() && (i->type() == ItemSticker::Type);
|
||||||
|
}) | ranges::views::transform([](QGraphicsItem *i) {
|
||||||
|
return qgraphicsitem_cast<ItemSticker*>(i)->sticker();
|
||||||
|
}) | ranges::to_vector;
|
||||||
|
}
|
||||||
|
|
||||||
Scene::~Scene() {
|
Scene::~Scene() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ public:
|
||||||
[[nodiscard]] rpl::producer<> addsItem() const;
|
[[nodiscard]] rpl::producer<> addsItem() const;
|
||||||
[[nodiscard]] rpl::producer<> mousePresses() const;
|
[[nodiscard]] rpl::producer<> mousePresses() const;
|
||||||
|
|
||||||
|
[[nodiscard]] std::vector<MTPInputDocument> attachedStickers() const;
|
||||||
protected:
|
protected:
|
||||||
void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
|
void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
|
||||||
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
|
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
|
||||||
|
|
|
@ -35,6 +35,7 @@ public:
|
||||||
QPainter *p,
|
QPainter *p,
|
||||||
const QStyleOptionGraphicsItem *option,
|
const QStyleOptionGraphicsItem *option,
|
||||||
QWidget *widget) override;
|
QWidget *widget) override;
|
||||||
|
int type() const override;
|
||||||
protected:
|
protected:
|
||||||
enum HandleType {
|
enum HandleType {
|
||||||
None,
|
None,
|
||||||
|
@ -46,7 +47,6 @@ protected:
|
||||||
void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
|
void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
|
||||||
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
|
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
|
||||||
|
|
||||||
int type() const override;
|
|
||||||
QRectF innerRect() const;
|
QRectF innerRect() const;
|
||||||
int size() const;
|
int size() const;
|
||||||
|
|
||||||
|
|
|
@ -85,4 +85,12 @@ void ItemSticker::paint(
|
||||||
ItemBase::paint(p, option, w);
|
ItemBase::paint(p, option, w);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MTPInputDocument ItemSticker::sticker() const {
|
||||||
|
return _document->mtpInput();
|
||||||
|
}
|
||||||
|
|
||||||
|
int ItemSticker::type() const {
|
||||||
|
return Type;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Editor
|
} // namespace Editor
|
||||||
|
|
|
@ -21,7 +21,7 @@ namespace Editor {
|
||||||
|
|
||||||
class ItemSticker : public ItemBase {
|
class ItemSticker : public ItemBase {
|
||||||
public:
|
public:
|
||||||
enum { Type = ItemBase::Type + 1 };
|
enum { Type = ItemBase::Type + 2 };
|
||||||
|
|
||||||
ItemSticker(
|
ItemSticker(
|
||||||
not_null<DocumentData*> document,
|
not_null<DocumentData*> document,
|
||||||
|
@ -33,6 +33,8 @@ public:
|
||||||
QPainter *p,
|
QPainter *p,
|
||||||
const QStyleOptionGraphicsItem *option,
|
const QStyleOptionGraphicsItem *option,
|
||||||
QWidget *widget) override;
|
QWidget *widget) override;
|
||||||
|
MTPInputDocument sticker() const;
|
||||||
|
int type() const override;
|
||||||
private:
|
private:
|
||||||
const not_null<DocumentData*> _document;
|
const not_null<DocumentData*> _document;
|
||||||
const std::shared_ptr<Data::DocumentMedia> _mediaView;
|
const std::shared_ptr<Data::DocumentMedia> _mediaView;
|
||||||
|
|
|
@ -161,12 +161,17 @@ Uploader::Uploader(not_null<ApiWrap*> api)
|
||||||
) | rpl::start_with_next([=](const UploadedPhoto &data) {
|
) | rpl::start_with_next([=](const UploadedPhoto &data) {
|
||||||
if (data.edit) {
|
if (data.edit) {
|
||||||
const auto item = session->data().message(data.fullId);
|
const auto item = session->data().message(data.fullId);
|
||||||
Api::EditMessageWithUploadedPhoto(item, data.file, data.options);
|
Api::EditMessageWithUploadedPhoto(
|
||||||
|
item,
|
||||||
|
data.file,
|
||||||
|
data.options,
|
||||||
|
data.attachedStickers);
|
||||||
} else {
|
} else {
|
||||||
_api->sendUploadedPhoto(
|
_api->sendUploadedPhoto(
|
||||||
data.fullId,
|
data.fullId,
|
||||||
data.file,
|
data.file,
|
||||||
data.options);
|
data.options,
|
||||||
|
data.attachedStickers);
|
||||||
}
|
}
|
||||||
}, _lifetime);
|
}, _lifetime);
|
||||||
|
|
||||||
|
@ -178,13 +183,15 @@ Uploader::Uploader(not_null<ApiWrap*> api)
|
||||||
item,
|
item,
|
||||||
data.file,
|
data.file,
|
||||||
data.thumb,
|
data.thumb,
|
||||||
data.options);
|
data.options,
|
||||||
|
data.attachedStickers);
|
||||||
} else {
|
} else {
|
||||||
_api->sendUploadedDocument(
|
_api->sendUploadedDocument(
|
||||||
data.fullId,
|
data.fullId,
|
||||||
data.file,
|
data.file,
|
||||||
data.thumb,
|
data.thumb,
|
||||||
data.options);
|
data.options,
|
||||||
|
data.attachedStickers);
|
||||||
}
|
}
|
||||||
}, _lifetime);
|
}, _lifetime);
|
||||||
|
|
||||||
|
@ -448,6 +455,9 @@ void Uploader::sendNext() {
|
||||||
: Api::SendOptions();
|
: Api::SendOptions();
|
||||||
const auto edit = uploadingData.file &&
|
const auto edit = uploadingData.file &&
|
||||||
uploadingData.file->to.replaceMediaOf;
|
uploadingData.file->to.replaceMediaOf;
|
||||||
|
const auto attachedStickers = uploadingData.file
|
||||||
|
? uploadingData.file->attachedStickers
|
||||||
|
: std::vector<MTPInputDocument>();
|
||||||
if (uploadingData.type() == SendMediaType::Photo) {
|
if (uploadingData.type() == SendMediaType::Photo) {
|
||||||
auto photoFilename = uploadingData.filename();
|
auto photoFilename = uploadingData.filename();
|
||||||
if (!photoFilename.endsWith(qstr(".jpg"), Qt::CaseInsensitive)) {
|
if (!photoFilename.endsWith(qstr(".jpg"), Qt::CaseInsensitive)) {
|
||||||
|
@ -464,7 +474,12 @@ void Uploader::sendNext() {
|
||||||
MTP_int(uploadingData.partsCount),
|
MTP_int(uploadingData.partsCount),
|
||||||
MTP_string(photoFilename),
|
MTP_string(photoFilename),
|
||||||
MTP_bytes(md5));
|
MTP_bytes(md5));
|
||||||
_photoReady.fire({ uploadingId, options, file, edit });
|
_photoReady.fire({
|
||||||
|
uploadingId,
|
||||||
|
options,
|
||||||
|
file,
|
||||||
|
edit,
|
||||||
|
attachedStickers });
|
||||||
} else if (uploadingData.type() == SendMediaType::File
|
} else if (uploadingData.type() == SendMediaType::File
|
||||||
|| uploadingData.type() == SendMediaType::ThemeFile
|
|| uploadingData.type() == SendMediaType::ThemeFile
|
||||||
|| uploadingData.type() == SendMediaType::Audio) {
|
|| uploadingData.type() == SendMediaType::Audio) {
|
||||||
|
@ -502,7 +517,8 @@ void Uploader::sendNext() {
|
||||||
options,
|
options,
|
||||||
file,
|
file,
|
||||||
thumb,
|
thumb,
|
||||||
edit });
|
edit,
|
||||||
|
attachedStickers });
|
||||||
} else if (uploadingData.type() == SendMediaType::Secure) {
|
} else if (uploadingData.type() == SendMediaType::Secure) {
|
||||||
_secureReady.fire({
|
_secureReady.fire({
|
||||||
uploadingId,
|
uploadingId,
|
||||||
|
|
|
@ -33,6 +33,7 @@ struct UploadedPhoto {
|
||||||
Api::SendOptions options;
|
Api::SendOptions options;
|
||||||
MTPInputFile file;
|
MTPInputFile file;
|
||||||
bool edit = false;
|
bool edit = false;
|
||||||
|
std::vector<MTPInputDocument> attachedStickers;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct UploadedDocument {
|
struct UploadedDocument {
|
||||||
|
@ -41,6 +42,7 @@ struct UploadedDocument {
|
||||||
MTPInputFile file;
|
MTPInputFile file;
|
||||||
std::optional<MTPInputFile> thumb;
|
std::optional<MTPInputFile> thumb;
|
||||||
bool edit = false;
|
bool edit = false;
|
||||||
|
std::vector<MTPInputDocument> attachedStickers;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct UploadSecureProgress {
|
struct UploadSecureProgress {
|
||||||
|
|
|
@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "core/mime_type.h"
|
#include "core/mime_type.h"
|
||||||
#include "base/unixtime.h"
|
#include "base/unixtime.h"
|
||||||
#include "base/qt_adapters.h"
|
#include "base/qt_adapters.h"
|
||||||
|
#include "editor/scene.h" // Editor::Scene::attachedStickers
|
||||||
#include "media/audio/media_audio.h"
|
#include "media/audio/media_audio.h"
|
||||||
#include "media/clip/media_clip_reader.h"
|
#include "media/clip/media_clip_reader.h"
|
||||||
#include "mtproto/facade.h"
|
#include "mtproto/facade.h"
|
||||||
|
@ -952,6 +953,16 @@ void FileLoadTask::process(Args &&args) {
|
||||||
_type = SendMediaType::File;
|
_type = SendMediaType::File;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_information) {
|
||||||
|
if (auto image = std::get_if<Ui::PreparedFileInformation::Image>(
|
||||||
|
&_information->media)) {
|
||||||
|
if (image->modifications.paint) {
|
||||||
|
_result->attachedStickers =
|
||||||
|
image->modifications.paint->attachedStickers();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_result->type = _type;
|
_result->type = _type;
|
||||||
_result->filepath = _filepath;
|
_result->filepath = _filepath;
|
||||||
_result->content = _content;
|
_result->content = _content;
|
||||||
|
|
|
@ -267,6 +267,8 @@ struct FileLoadResult {
|
||||||
PreparedPhotoThumbs photoThumbs;
|
PreparedPhotoThumbs photoThumbs;
|
||||||
TextWithTags caption;
|
TextWithTags caption;
|
||||||
|
|
||||||
|
std::vector<MTPInputDocument> attachedStickers;
|
||||||
|
|
||||||
void setFileData(const QByteArray &filedata);
|
void setFileData(const QByteArray &filedata);
|
||||||
void setThumbData(const QByteArray &thumbdata);
|
void setThumbData(const QByteArray &thumbdata);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue