mirror of
https://github.com/telegramdesktop/tdesktop
synced 2025-01-25 08:44:38 +00:00
improved video, audio overview, fixed files overview
This commit is contained in:
parent
af9908f076
commit
41f5a87c80
@ -1184,6 +1184,15 @@ mediaUnreadSize: 7px;
|
||||
mediaUnreadSkip: 5px;
|
||||
mediaUnreadTop: 6px;
|
||||
|
||||
mediaInStyle: textStyle(defaultTextStyle) {
|
||||
linkFg: mediaInFg;
|
||||
linkFgDown: mediaInFg;
|
||||
}
|
||||
mediaInStyleSelected: textStyle(defaultTextStyle) {
|
||||
linkFg: mediaInFgSelected;
|
||||
linkFgDown: mediaInFgSelected;
|
||||
}
|
||||
|
||||
msgFileRedColor: #e47272;
|
||||
msgFileYellowColor: #efc274;
|
||||
msgFileGreenColor: #61b96e;
|
||||
|
@ -1325,6 +1325,7 @@ HistoryItem *History::createItem(HistoryBlock *block, const MTPMessage &msg, boo
|
||||
case mtpc_message: msgId = msg.c_message().vid.v; break;
|
||||
case mtpc_messageService: msgId = msg.c_messageService().vid.v; break;
|
||||
}
|
||||
if (!msgId) return 0;
|
||||
|
||||
HistoryItem *existing = App::histItemById(channelId(), msgId);
|
||||
if (existing) {
|
||||
@ -4613,12 +4614,12 @@ HistoryGif::~HistoryGif() {
|
||||
}
|
||||
|
||||
HistorySticker::HistorySticker(DocumentData *document) : HistoryMedia()
|
||||
, pixw(1)
|
||||
, pixh(1)
|
||||
, data(document) {
|
||||
data->thumb->load();
|
||||
if (!data->sticker()->alt.isEmpty()) {
|
||||
_emoji = data->sticker()->alt;
|
||||
, _pixw(1)
|
||||
, _pixh(1)
|
||||
, _data(document) {
|
||||
_data->thumb->load();
|
||||
if (!_data->sticker()->alt.isEmpty()) {
|
||||
_emoji = _data->sticker()->alt;
|
||||
int32 elen = 0;
|
||||
if (EmojiPtr e = emojiFromText(_emoji.constData(), _emoji.constEnd(), elen)) {
|
||||
_emoji = emojiString(e);
|
||||
@ -4627,20 +4628,20 @@ HistorySticker::HistorySticker(DocumentData *document) : HistoryMedia()
|
||||
}
|
||||
|
||||
void HistorySticker::initDimensions(const HistoryItem *parent) {
|
||||
pixw = data->dimensions.width();
|
||||
pixh = data->dimensions.height();
|
||||
if (pixw > st::maxStickerSize) {
|
||||
pixh = (st::maxStickerSize * pixh) / pixw;
|
||||
pixw = st::maxStickerSize;
|
||||
_pixw = _data->dimensions.width();
|
||||
_pixh = _data->dimensions.height();
|
||||
if (_pixw > st::maxStickerSize) {
|
||||
_pixh = (st::maxStickerSize * _pixh) / _pixw;
|
||||
_pixw = st::maxStickerSize;
|
||||
}
|
||||
if (pixh > st::maxStickerSize) {
|
||||
pixw = (st::maxStickerSize * pixw) / pixh;
|
||||
pixh = st::maxStickerSize;
|
||||
if (_pixh > st::maxStickerSize) {
|
||||
_pixw = (st::maxStickerSize * _pixw) / _pixh;
|
||||
_pixh = st::maxStickerSize;
|
||||
}
|
||||
if (pixw < 1) pixw = 1;
|
||||
if (pixh < 1) pixh = 1;
|
||||
_maxw = qMax(pixw, int16(st::minPhotoSize));
|
||||
_minh = qMax(pixh, int16(st::minPhotoSize));
|
||||
if (_pixw < 1) _pixw = 1;
|
||||
if (_pixh < 1) _pixh = 1;
|
||||
_maxw = qMax(_pixw, int16(st::minPhotoSize));
|
||||
_minh = qMax(_pixh, int16(st::minPhotoSize));
|
||||
if (const HistoryReply *reply = toHistoryReply(parent)) {
|
||||
_maxw += st::msgReplyPadding.left() + reply->replyToWidth();
|
||||
}
|
||||
@ -4651,7 +4652,7 @@ void HistorySticker::draw(Painter &p, const HistoryItem *parent, const QRect &r,
|
||||
if (_width < st::msgPadding.left() + st::msgPadding.right() + 1) return;
|
||||
|
||||
bool out = parent->out(), fromChannel = parent->fromChannel(), outbg = out && !fromChannel, hovered, pressed;
|
||||
bool already = !data->already().isEmpty(), hasdata = !data->data.isEmpty();
|
||||
bool already = !_data->already().isEmpty(), hasdata = !_data->data.isEmpty();
|
||||
|
||||
int32 usew = _maxw, usex = 0;
|
||||
const HistoryReply *reply = toHistoryReply(parent);
|
||||
@ -4664,27 +4665,27 @@ void HistorySticker::draw(Painter &p, const HistoryItem *parent, const QRect &r,
|
||||
}
|
||||
if (rtl()) usex = _width - usex - usew;
|
||||
|
||||
if (!already && !hasdata && !data->loader && data->status == FileReady) {
|
||||
data->save(QString());
|
||||
if (!already && !hasdata && !_data->loader && _data->status == FileReady) {
|
||||
_data->save(QString());
|
||||
}
|
||||
if (data->sticker()->img->isNull() && (already || hasdata)) {
|
||||
if (_data->sticker()->img->isNull() && (already || hasdata)) {
|
||||
if (already) {
|
||||
data->sticker()->img = ImagePtr(data->already());
|
||||
_data->sticker()->img = ImagePtr(_data->already());
|
||||
} else {
|
||||
data->sticker()->img = ImagePtr(data->data);
|
||||
_data->sticker()->img = ImagePtr(_data->data);
|
||||
}
|
||||
}
|
||||
if (selected) {
|
||||
if (data->sticker()->img->isNull()) {
|
||||
p.drawPixmap(QPoint(usex + (usew - pixw) / 2, (_minh - pixh) / 2), data->thumb->pixBlurredColored(st::msgStickerOverlay, pixw, pixh));
|
||||
if (_data->sticker()->img->isNull()) {
|
||||
p.drawPixmap(QPoint(usex + (usew - _pixw) / 2, (_minh - _pixh) / 2), _data->thumb->pixBlurredColored(st::msgStickerOverlay, _pixw, _pixh));
|
||||
} else {
|
||||
p.drawPixmap(QPoint(usex + (usew - pixw) / 2, (_minh - pixh) / 2), data->sticker()->img->pixColored(st::msgStickerOverlay, pixw, pixh));
|
||||
p.drawPixmap(QPoint(usex + (usew - _pixw) / 2, (_minh - _pixh) / 2), _data->sticker()->img->pixColored(st::msgStickerOverlay, _pixw, _pixh));
|
||||
}
|
||||
} else {
|
||||
if (data->sticker()->img->isNull()) {
|
||||
p.drawPixmap(QPoint(usex + (usew - pixw) / 2, (_minh - pixh) / 2), data->thumb->pixBlurred(pixw, pixh));
|
||||
if (_data->sticker()->img->isNull()) {
|
||||
p.drawPixmap(QPoint(usex + (usew - _pixw) / 2, (_minh - _pixh) / 2), _data->thumb->pixBlurred(_pixw, _pixh));
|
||||
} else {
|
||||
p.drawPixmap(QPoint(usex + (usew - pixw) / 2, (_minh - pixh) / 2), data->sticker()->img->pix(pixw, pixh));
|
||||
p.drawPixmap(QPoint(usex + (usew - _pixw) / 2, (_minh - _pixh) / 2), _data->sticker()->img->pix(_pixw, _pixh));
|
||||
}
|
||||
}
|
||||
|
||||
@ -4744,18 +4745,18 @@ const QString HistorySticker::inHistoryText() const {
|
||||
}
|
||||
|
||||
void HistorySticker::regItem(HistoryItem *item) {
|
||||
App::regDocumentItem(data, item);
|
||||
App::regDocumentItem(_data, item);
|
||||
}
|
||||
|
||||
void HistorySticker::unregItem(HistoryItem *item) {
|
||||
App::unregDocumentItem(data, item);
|
||||
App::unregDocumentItem(_data, item);
|
||||
}
|
||||
|
||||
void HistorySticker::updateFrom(const MTPMessageMedia &media, HistoryItem *parent, bool allowEmitResize) {
|
||||
if (media.type() == mtpc_messageMediaDocument) {
|
||||
App::feedDocument(media.c_messageMediaDocument().vdocument, data);
|
||||
if (!data->data.isEmpty()) {
|
||||
Local::writeStickerImage(mediaKey(mtpToLocationType(mtpc_inputDocumentFileLocation), data->dc, data->id), data->data);
|
||||
App::feedDocument(media.c_messageMediaDocument().vdocument, _data);
|
||||
if (!_data->data.isEmpty()) {
|
||||
Local::writeStickerImage(mediaKey(mtpToLocationType(mtpc_inputDocumentFileLocation), _data->dc, _data->id), _data->data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1673,8 +1673,8 @@ public:
|
||||
const QString inDialogsText() const;
|
||||
const QString inHistoryText() const;
|
||||
|
||||
DocumentData *document() {
|
||||
return data;
|
||||
DocumentData *getDocument() {
|
||||
return _data;
|
||||
}
|
||||
|
||||
void regItem(HistoryItem *item);
|
||||
@ -1691,8 +1691,8 @@ public:
|
||||
|
||||
private:
|
||||
|
||||
int16 pixw, pixh;
|
||||
DocumentData *data;
|
||||
int16 _pixw, _pixh;
|
||||
DocumentData *_data;
|
||||
QString _emoji;
|
||||
|
||||
};
|
||||
|
@ -941,10 +941,12 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
|
||||
_menu->addAction(lang(lng_context_reply_msg), _widget, SLOT(onReplyToMessage()));
|
||||
}
|
||||
if (item && !isUponSelected && !_contextMenuLnk) {
|
||||
if (HistorySticker *sticker = dynamic_cast<HistorySticker*>(msg ? msg->getMedia() : 0)) {
|
||||
DocumentData *doc = sticker->document();
|
||||
if (doc && doc->sticker() && doc->sticker()->set.type() != mtpc_inputStickerSetEmpty) {
|
||||
_menu->addAction(lang(doc->sticker()->setInstalled() ? lng_context_pack_info : lng_context_pack_add), _widget, SLOT(onStickerPackInfo()));
|
||||
if (HistoryMedia *media = (msg ? msg->getMedia() : 0)) {
|
||||
if (media->type() == MediaTypeSticker) {
|
||||
DocumentData *doc = media->getDocument();
|
||||
if (doc && doc->sticker() && doc->sticker()->set.type() != mtpc_inputStickerSetEmpty) {
|
||||
_menu->addAction(lang(doc->sticker()->setInstalled() ? lng_context_pack_info : lng_context_pack_add), _widget, SLOT(onStickerPackInfo()));
|
||||
}
|
||||
}
|
||||
}
|
||||
QString contextMenuText = item->selectedText(FullSelection);
|
||||
@ -6236,10 +6238,11 @@ void HistoryWidget::onReplyForwardPreviewCancel() {
|
||||
}
|
||||
|
||||
void HistoryWidget::onStickerPackInfo() {
|
||||
if (HistoryMessage *item = dynamic_cast<HistoryMessage*>(App::contextItem())) {
|
||||
if (HistorySticker *sticker = dynamic_cast<HistorySticker*>(item->getMedia())) {
|
||||
if (sticker->document() && sticker->document()->sticker() && sticker->document()->sticker()->set.type() != mtpc_inputStickerSetEmpty) {
|
||||
App::main()->stickersBox(sticker->document()->sticker()->set);
|
||||
if (HistoryMedia *media = (App::contextItem() ? App::contextItem()->getMedia() : 0)) {
|
||||
if (media->type() == MediaTypeSticker) {
|
||||
DocumentData *doc = media->getDocument();
|
||||
if (doc && doc->sticker() && doc->sticker()->set.type() != mtpc_inputStickerSetEmpty) {
|
||||
App::main()->stickersBox(doc->sticker()->set);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -437,15 +437,17 @@ void LayoutOverviewVideo::paint(Painter &p, const QRect &clip, uint32 selection,
|
||||
p.fillRect(QRect(0, 0, _width, _height), st::overviewPhotoSelectOverlay);
|
||||
}
|
||||
|
||||
if (clip.intersects(QRect(0, _height - st::normalFont->height, _width, st::normalFont->height))) {
|
||||
int32 statusX = st::msgDateImgPadding.x(), statusY = _height - st::normalFont->height - st::msgDateImgPadding.y();
|
||||
int32 statusW = st::normalFont->width(_statusText) + 2 * st::msgDateImgPadding.x();
|
||||
int32 statusH = st::normalFont->height + 2 * st::msgDateImgPadding.y();
|
||||
statusX = _width - statusW + statusX;
|
||||
p.fillRect(rtlrect(statusX - st::msgDateImgPadding.x(), statusY - st::msgDateImgPadding.y(), statusW, statusH, _width), selected ? st::msgDateImgBgSelected : st::msgDateImgBg);
|
||||
p.setFont(st::normalFont);
|
||||
p.setPen(st::white);
|
||||
p.drawTextLeft(statusX, statusY, _width, _statusText, statusW - 2 * st::msgDateImgPadding.x());
|
||||
if (!selected && !context->selecting && !already) {
|
||||
if (clip.intersects(QRect(0, _height - st::normalFont->height, _width, st::normalFont->height))) {
|
||||
int32 statusX = st::msgDateImgPadding.x(), statusY = _height - st::normalFont->height - st::msgDateImgPadding.y();
|
||||
int32 statusW = st::normalFont->width(_statusText) + 2 * st::msgDateImgPadding.x();
|
||||
int32 statusH = st::normalFont->height + 2 * st::msgDateImgPadding.y();
|
||||
statusX = _width - statusW + statusX;
|
||||
p.fillRect(rtlrect(statusX - st::msgDateImgPadding.x(), statusY - st::msgDateImgPadding.y(), statusW, statusH, _width), selected ? st::msgDateImgBgSelected : st::msgDateImgBg);
|
||||
p.setFont(st::normalFont);
|
||||
p.setPen(st::white);
|
||||
p.drawTextLeft(statusX, statusY, _width, _statusText, statusW - 2 * st::msgDateImgPadding.x());
|
||||
}
|
||||
}
|
||||
if (clip.intersects(QRect(0, 0, _width, st::normalFont->height))) {
|
||||
int32 statusX = st::msgDateImgPadding.x(), statusY = st::msgDateImgPadding.y();
|
||||
@ -536,7 +538,9 @@ LayoutOverviewAudio::LayoutOverviewAudio(AudioData *audio, HistoryItem *parent)
|
||||
, _data(audio) {
|
||||
setLinks(new AudioOpenLink(_data), new AudioSaveLink(_data), new AudioCancelLink(_data));
|
||||
updateName();
|
||||
_details.setText(st::normalFont, lng_date_and_duration(lt_date, textcmdLink(1, langDateTime(date(_data->date))), lt_duration, formatDurationText(_data->duration)), _defaultOptions);
|
||||
QString d = textcmdLink(1, textRichPrepare(langDateTime(date(_data->date))));
|
||||
TextParseOptions opts = { TextParseRichText, 0, 0, Qt::LayoutDirectionAuto };
|
||||
_details.setText(st::normalFont, lng_date_and_duration(lt_date, d, lt_duration, formatDurationText(_data->duration)), opts);
|
||||
_details.setLink(1, TextLinkPtr(new MessageLink(parent)));
|
||||
}
|
||||
|
||||
@ -622,8 +626,15 @@ void LayoutOverviewAudio::paint(Painter &p, const QRect &clip, uint32 selection,
|
||||
}
|
||||
|
||||
if (clip.intersects(rtlrect(nameleft, statustop, namewidth, st::normalFont->height, _width))) {
|
||||
p.setPen(selected ? st::msgInDateFgSelected : st::mediaInFg);
|
||||
_details.drawLeftElided(p, nameleft, statustop, namewidth, _width);
|
||||
p.setFont(st::normalFont);
|
||||
p.setPen(selected ? st::mediaInFgSelected : st::mediaInFg);
|
||||
if (_statusSize == FileStatusSizeLoaded || _statusSize == FileStatusSizeReady) {
|
||||
textstyleSet(&(selected ? st::mediaInStyleSelected : st::mediaInStyle));
|
||||
_details.drawLeftElided(p, nameleft, statustop, namewidth, _width);
|
||||
textstyleRestore();
|
||||
} else {
|
||||
p.drawTextLeft(nameleft, statustop, _width, _statusText);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -645,9 +656,11 @@ void LayoutOverviewAudio::getState(TextLinkPtr &link, HistoryCursorState &cursor
|
||||
return;
|
||||
}
|
||||
if (rtlrect(nameleft, statustop, _width - nameleft - nameright, st::normalFont->height, _width).contains(x, y)) {
|
||||
bool inText = false;
|
||||
_details.getStateLeft(link, inText, x - nameleft, y - statustop, _width, _width);
|
||||
cursor = inText ? HistoryInTextCursorState : HistoryDefaultCursorState;
|
||||
if (_statusSize == FileStatusSizeLoaded || _statusSize == FileStatusSizeReady) {
|
||||
bool inText = false;
|
||||
_details.getStateLeft(link, inText, x - nameleft, y - statustop, _width, _width);
|
||||
cursor = inText ? HistoryInTextCursorState : HistoryDefaultCursorState;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -619,8 +619,10 @@ void MainWidget::finishForwarding(History *hist, bool broadcast) {
|
||||
FullMsgId newId(peerToChannel(hist->peer->id), clientMsgId());
|
||||
HistoryMessage *msg = static_cast<HistoryMessage*>(_toForward.cbegin().value());
|
||||
hist->addNewForwarded(newId.msg, date(MTP_int(unixtime())), fromChannelName ? 0 : MTP::authedId(), msg);
|
||||
if (HistorySticker *sticker = dynamic_cast<HistorySticker*>(msg->getMedia())) {
|
||||
App::main()->incrementSticker(sticker->document());
|
||||
if (HistoryMedia *media = msg->getMedia()) {
|
||||
if (media->type() == MediaTypeSticker) {
|
||||
App::main()->incrementSticker(media->getDocument());
|
||||
}
|
||||
}
|
||||
App::historyRegRandom(randomId, newId);
|
||||
}
|
||||
|
@ -1503,12 +1503,12 @@ void MediaView::moveToNext(int32 delta) {
|
||||
_canDelete = item->canDelete();
|
||||
delete _gif;
|
||||
_gif = 0;
|
||||
if (item->getMedia()) {
|
||||
switch (item->getMedia()->type()) {
|
||||
if (HistoryMedia *media = item->getMedia()) {
|
||||
switch (media->type()) {
|
||||
case MediaTypePhoto: displayPhoto(static_cast<HistoryPhoto*>(item->getMedia())->photo(), item); preloadData(delta); break;
|
||||
case MediaTypeDocument: displayDocument(static_cast<HistoryDocument*>(item->getMedia())->getDocument(), item); preloadData(delta); break;
|
||||
case MediaTypeGif: displayDocument(static_cast<HistoryGif*>(item->getMedia())->getDocument(), item); preloadData(delta); break;
|
||||
case MediaTypeSticker: displayDocument(static_cast<HistorySticker*>(item->getMedia())->document(), item); preloadData(delta); break;
|
||||
case MediaTypeDocument:
|
||||
case MediaTypeGif:
|
||||
case MediaTypeSticker: displayDocument(media->getDocument(), item); preloadData(delta); break;
|
||||
}
|
||||
} else {
|
||||
displayDocument(0, item);
|
||||
@ -1554,9 +1554,9 @@ void MediaView::preloadData(int32 delta) {
|
||||
if (HistoryMedia *media = item->getMedia()) {
|
||||
switch (media->type()) {
|
||||
case MediaTypePhoto: static_cast<HistoryPhoto*>(media)->photo()->full->load(); break;
|
||||
case MediaTypeDocument: static_cast<HistoryDocument*>(media)->getDocument()->thumb->load(); break;
|
||||
case MediaTypeDocument:
|
||||
case MediaTypeGif: static_cast<HistoryGif*>(media)->getDocument()->thumb->load(); break;
|
||||
case MediaTypeSticker: static_cast<HistorySticker*>(media)->document()->sticker()->img->load(); break;
|
||||
case MediaTypeSticker: static_cast<HistorySticker*>(media)->getDocument()->sticker()->img->load(); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1578,9 +1578,9 @@ void MediaView::preloadData(int32 delta) {
|
||||
if (HistoryMedia *media = item->getMedia()) {
|
||||
switch (media->type()) {
|
||||
case MediaTypePhoto: static_cast<HistoryPhoto*>(media)->photo()->forget(); break;
|
||||
case MediaTypeDocument: static_cast<HistoryDocument*>(media)->getDocument()->forget(); break;
|
||||
case MediaTypeGif: static_cast<HistoryGif*>(media)->getDocument()->forget(); break;
|
||||
case MediaTypeSticker: static_cast<HistorySticker*>(media)->document()->forget(); break;
|
||||
case MediaTypeDocument:
|
||||
case MediaTypeGif:
|
||||
case MediaTypeSticker: media->getDocument()->forget(); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1939,9 +1939,9 @@ LayoutMediaItem *OverviewInner::getItemLayout(HistoryItem *item) {
|
||||
}
|
||||
}
|
||||
} else if (_type == OverviewDocuments || _type == OverviewAudioDocuments) {
|
||||
if (media && media->type() == MediaTypeDocument) {
|
||||
if (media && (media->type() == MediaTypeDocument || media->type() == MediaTypeGif)) {
|
||||
if ((i = _layoutItems.constFind(item)) == _layoutItems.cend()) {
|
||||
i = _layoutItems.insert(item, new LayoutOverviewDocument(static_cast<HistoryDocument*>(media)->getDocument(), item));
|
||||
i = _layoutItems.insert(item, new LayoutOverviewDocument(media->getDocument(), item));
|
||||
i.value()->initDimensions();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user