mirror of https://github.com/procxx/kepka.git
Always create photo and document for inline bot results.
This commit is contained in:
parent
a09a52d95c
commit
5f12c6d85b
|
@ -336,7 +336,6 @@ void AutoDownloadBox::onSave() {
|
||||||
i.value()->automaticLoadSettingsChanged();
|
i.value()->automaticLoadSettingsChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Notify::automaticLoadSettingsChangedGif();
|
|
||||||
}
|
}
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3412,14 +3412,6 @@ bool EmojiPan::ui_isInlineItemBeingChosen() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmojiPan::notify_automaticLoadSettingsChangedGif() {
|
|
||||||
for_const (const internal::InlineCacheEntry *entry, _inlineCache) {
|
|
||||||
for_const (InlineBots::Result *l, entry->results) {
|
|
||||||
l->automaticLoadSettingsChangedGif();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EmojiPan::showAll() {
|
void EmojiPan::showAll() {
|
||||||
if (_stickersShown) {
|
if (_stickersShown) {
|
||||||
s_scroll.show();
|
s_scroll.show();
|
||||||
|
|
|
@ -614,7 +614,6 @@ public:
|
||||||
bool inlineResultsShown() const {
|
bool inlineResultsShown() const {
|
||||||
return s_inner.inlineResultsShown();
|
return s_inner.inlineResultsShown();
|
||||||
}
|
}
|
||||||
void notify_automaticLoadSettingsChangedGif();
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
|
|
|
@ -292,10 +292,6 @@ namespace Notify {
|
||||||
if (MainWidget *m = App::main()) m->notify_historyItemLayoutChanged(item);
|
if (MainWidget *m = App::main()) m->notify_historyItemLayoutChanged(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
void automaticLoadSettingsChangedGif() {
|
|
||||||
if (MainWidget *m = App::main()) m->notify_automaticLoadSettingsChangedGif();
|
|
||||||
}
|
|
||||||
|
|
||||||
void handlePendingHistoryUpdate() {
|
void handlePendingHistoryUpdate() {
|
||||||
if (MainWidget *m = App::main()) {
|
if (MainWidget *m = App::main()) {
|
||||||
m->notify_handlePendingHistoryUpdate();
|
m->notify_handlePendingHistoryUpdate();
|
||||||
|
|
|
@ -111,8 +111,6 @@ namespace Notify {
|
||||||
|
|
||||||
void historyItemLayoutChanged(const HistoryItem *item);
|
void historyItemLayoutChanged(const HistoryItem *item);
|
||||||
|
|
||||||
void automaticLoadSettingsChangedGif();
|
|
||||||
|
|
||||||
// handle pending resize() / paint() on history items
|
// handle pending resize() / paint() on history items
|
||||||
void handlePendingHistoryUpdate();
|
void handlePendingHistoryUpdate();
|
||||||
|
|
||||||
|
|
|
@ -6394,10 +6394,6 @@ void HistoryWidget::notify_historyItemLayoutChanged(const HistoryItem *item) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void HistoryWidget::notify_automaticLoadSettingsChangedGif() {
|
|
||||||
_emojiPan.notify_automaticLoadSettingsChangedGif();
|
|
||||||
}
|
|
||||||
|
|
||||||
void HistoryWidget::notify_handlePendingHistoryUpdate() {
|
void HistoryWidget::notify_handlePendingHistoryUpdate() {
|
||||||
if (hasPendingResizedItems()) {
|
if (hasPendingResizedItems()) {
|
||||||
updateListSize();
|
updateListSize();
|
||||||
|
|
|
@ -688,7 +688,6 @@ public:
|
||||||
void notify_userIsBotChanged(UserData *user);
|
void notify_userIsBotChanged(UserData *user);
|
||||||
void notify_migrateUpdated(PeerData *peer);
|
void notify_migrateUpdated(PeerData *peer);
|
||||||
void notify_clipStopperHidden(ClipStopperType type);
|
void notify_clipStopperHidden(ClipStopperType type);
|
||||||
void notify_automaticLoadSettingsChangedGif();
|
|
||||||
void notify_handlePendingHistoryUpdate();
|
void notify_handlePendingHistoryUpdate();
|
||||||
|
|
||||||
void cmd_search();
|
void cmd_search();
|
||||||
|
|
|
@ -44,107 +44,37 @@ DocumentData *FileBase::getShownDocument() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
int FileBase::content_width() const {
|
int FileBase::content_width() const {
|
||||||
if (DocumentData *document = getShownDocument()) {
|
DocumentData *document = getShownDocument();
|
||||||
if (document->dimensions.width() > 0) {
|
if (document->dimensions.width() > 0) {
|
||||||
return document->dimensions.width();
|
return document->dimensions.width();
|
||||||
}
|
|
||||||
if (!document->thumb->isNull()) {
|
|
||||||
return convertScale(document->thumb->width());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return getResultWidth();
|
if (!document->thumb->isNull()) {
|
||||||
|
return convertScale(document->thumb->width());
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int FileBase::content_height() const {
|
int FileBase::content_height() const {
|
||||||
if (DocumentData *document = getShownDocument()) {
|
DocumentData *document = getShownDocument();
|
||||||
if (document->dimensions.height() > 0) {
|
if (document->dimensions.height() > 0) {
|
||||||
return document->dimensions.height();
|
return document->dimensions.height();
|
||||||
}
|
|
||||||
if (!document->thumb->isNull()) {
|
|
||||||
return convertScale(document->thumb->height());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return getResultHeight();
|
if (!document->thumb->isNull()) {
|
||||||
}
|
return convertScale(document->thumb->height());
|
||||||
|
|
||||||
bool FileBase::content_loading() const {
|
|
||||||
if (DocumentData *document = getShownDocument()) {
|
|
||||||
return document->loading();
|
|
||||||
}
|
}
|
||||||
return _result->loading();
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
bool FileBase::content_displayLoading() const {
|
|
||||||
if (DocumentData *document = getShownDocument()) {
|
|
||||||
return document->displayLoading();
|
|
||||||
}
|
|
||||||
return _result->displayLoading();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FileBase::content_loaded() const {
|
|
||||||
if (DocumentData *document = getShownDocument()) {
|
|
||||||
return document->loaded();
|
|
||||||
}
|
|
||||||
return _result->loaded();
|
|
||||||
}
|
|
||||||
|
|
||||||
float64 FileBase::content_progress() const {
|
|
||||||
if (DocumentData *document = getShownDocument()) {
|
|
||||||
return document->progress();
|
|
||||||
}
|
|
||||||
return _result->progress();
|
|
||||||
}
|
|
||||||
|
|
||||||
void FileBase::content_automaticLoad() const {
|
|
||||||
if (DocumentData *document = getShownDocument()) {
|
|
||||||
document->automaticLoad(nullptr);
|
|
||||||
} else {
|
|
||||||
_result->automaticLoadGif();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FileBase::content_forget() {
|
|
||||||
if (DocumentData *document = getShownDocument()) {
|
|
||||||
document->forget();
|
|
||||||
} else {
|
|
||||||
_result->forget();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FileLocation FileBase::content_location() const {
|
|
||||||
if (DocumentData *document = getShownDocument()) {
|
|
||||||
return document->location();
|
|
||||||
}
|
|
||||||
return FileLocation();
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray FileBase::content_data() const {
|
|
||||||
if (DocumentData *document = getShownDocument()) {
|
|
||||||
return document->data();
|
|
||||||
}
|
|
||||||
return _result->data();
|
|
||||||
}
|
|
||||||
|
|
||||||
ImagePtr FileBase::content_thumb() const {
|
|
||||||
if (DocumentData *document = getShownDocument()) {
|
|
||||||
if (!document->thumb->isNull()) {
|
|
||||||
return document->thumb;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return getResultThumb();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int FileBase::content_duration() const {
|
int FileBase::content_duration() const {
|
||||||
if (DocumentData *document = getShownDocument()) {
|
DocumentData *document = getShownDocument();
|
||||||
if (document->duration() > 0) {
|
if (document->duration() > 0) {
|
||||||
return document->duration();
|
return document->duration();
|
||||||
} else if (SongData *song = document->song()) {
|
} else if (SongData *song = document->song()) {
|
||||||
if (song->duration) {
|
if (song->duration) {
|
||||||
return song->duration;
|
return song->duration;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return getResultDuration();
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Gif::Gif(Result *result) : FileBase(result) {
|
Gif::Gif(Result *result) : FileBase(result) {
|
||||||
|
@ -185,12 +115,13 @@ void DeleteSavedGifClickHandler::onClickImpl() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gif::paint(Painter &p, const QRect &clip, uint32 selection, const PaintContext *context) const {
|
void Gif::paint(Painter &p, const QRect &clip, uint32 selection, const PaintContext *context) const {
|
||||||
content_automaticLoad();
|
DocumentData *document = getShownDocument();
|
||||||
|
document->automaticLoad(nullptr);
|
||||||
|
|
||||||
bool loaded = content_loaded(), loading = content_loading(), displayLoading = content_displayLoading();
|
bool loaded = document->loaded(), loading = document->loading(), displayLoading = document->displayLoading();
|
||||||
if (loaded && !gif() && _gif != BadClipReader) {
|
if (loaded && !gif() && _gif != BadClipReader) {
|
||||||
Gif *that = const_cast<Gif*>(this);
|
Gif *that = const_cast<Gif*>(this);
|
||||||
that->_gif = new ClipReader(content_location(), content_data(), func(that, &Gif::clipCallback));
|
that->_gif = new ClipReader(document->location(), document->data(), func(that, &Gif::clipCallback));
|
||||||
if (gif()) _gif->setAutoplay();
|
if (gif()) _gif->setAutoplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +129,7 @@ void Gif::paint(Painter &p, const QRect &clip, uint32 selection, const PaintCont
|
||||||
if (displayLoading) {
|
if (displayLoading) {
|
||||||
ensureAnimation();
|
ensureAnimation();
|
||||||
if (!_animation->radial.animating()) {
|
if (!_animation->radial.animating()) {
|
||||||
_animation->radial.start(content_progress());
|
_animation->radial.start(document->progress());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool radial = isRadialAnimation(context->ms);
|
bool radial = isRadialAnimation(context->ms);
|
||||||
|
@ -255,6 +186,9 @@ void Gif::paint(Painter &p, const QRect &clip, uint32 selection, const PaintCont
|
||||||
p.drawSpriteLeft(deletePos, _width, st::stickerPanDelete);
|
p.drawSpriteLeft(deletePos, _width, st::stickerPanDelete);
|
||||||
p.setOpacity(1);
|
p.setOpacity(1);
|
||||||
}
|
}
|
||||||
|
if (!document->hasRemoteLocation()) {
|
||||||
|
p.fillRect(10, 10, 30, 30, QColor(255, 0, 0));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gif::getState(ClickHandlerPtr &link, HistoryCursorState &cursor, int x, int y) const {
|
void Gif::getState(ClickHandlerPtr &link, HistoryCursorState &cursor, int x, int y) const {
|
||||||
|
@ -286,7 +220,7 @@ void Gif::clickHandlerActiveChanged(const ClickHandlerPtr &p, bool active) {
|
||||||
if (p == _delete || p == _send) {
|
if (p == _delete || p == _send) {
|
||||||
bool wasactive = (_state & StateFlag::Over);
|
bool wasactive = (_state & StateFlag::Over);
|
||||||
if (active != wasactive) {
|
if (active != wasactive) {
|
||||||
if (!content_loaded()) {
|
if (!getShownDocument()->loaded()) {
|
||||||
ensureAnimation();
|
ensureAnimation();
|
||||||
float64 from = active ? 0 : 1, to = active ? 1 : 0;
|
float64 from = active ? 0 : 1, to = active ? 1 : 0;
|
||||||
EnsureAnimation(_animation->_a_over, from, func(this, &Gif::update));
|
EnsureAnimation(_animation->_a_over, from, func(this, &Gif::update));
|
||||||
|
@ -376,10 +310,11 @@ void Gif::step_radial(uint64 ms, bool timer) {
|
||||||
if (timer) {
|
if (timer) {
|
||||||
update();
|
update();
|
||||||
} else {
|
} else {
|
||||||
_animation->radial.update(content_progress(), !content_loading() || content_loaded(), ms);
|
DocumentData *document = getShownDocument();
|
||||||
if (!_animation->radial.animating() && content_loaded()) {
|
_animation->radial.update(document->progress(), !document->loading() || document->loaded(), ms);
|
||||||
|
if (!_animation->radial.animating() && document->loaded()) {
|
||||||
delete _animation;
|
delete _animation;
|
||||||
_animation = 0;
|
_animation = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -391,15 +326,15 @@ void Gif::clipCallback(ClipReaderNotification notification) {
|
||||||
if (_gif->state() == ClipError) {
|
if (_gif->state() == ClipError) {
|
||||||
delete _gif;
|
delete _gif;
|
||||||
_gif = BadClipReader;
|
_gif = BadClipReader;
|
||||||
content_forget();
|
getShownDocument()->forget();
|
||||||
} else if (_gif->ready() && !_gif->started()) {
|
} else if (_gif->ready() && !_gif->started()) {
|
||||||
int32 height = st::inlineMediaHeight;
|
int32 height = st::inlineMediaHeight;
|
||||||
QSize frame = countFrameSize();
|
QSize frame = countFrameSize();
|
||||||
_gif->start(frame.width(), frame.height(), _width, height, false);
|
_gif->start(frame.width(), frame.height(), _width, height, false);
|
||||||
} else if (_gif->paused() && !Ui::isInlineItemVisible(this)) {
|
} else if (_gif->paused() && !Ui::isInlineItemVisible(this)) {
|
||||||
delete _gif;
|
delete _gif;
|
||||||
_gif = 0;
|
_gif = nullptr;
|
||||||
content_forget();
|
getShownDocument()->forget();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -439,7 +374,7 @@ void Sticker::preload() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sticker::paint(Painter &p, const QRect &clip, uint32 selection, const PaintContext *context) const {
|
void Sticker::paint(Painter &p, const QRect &clip, uint32 selection, const PaintContext *context) const {
|
||||||
bool loaded = content_loaded();
|
bool loaded = getShownDocument()->loaded();
|
||||||
|
|
||||||
float64 over = _a_over.isNull() ? (_active ? 1 : 0) : _a_over.current();
|
float64 over = _a_over.isNull() ? (_active ? 1 : 0) : _a_over.current();
|
||||||
if (over > 0) {
|
if (over > 0) {
|
||||||
|
@ -519,7 +454,8 @@ Photo::Photo(Result *result) : ItemBase(result) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Photo::initDimensions() {
|
void Photo::initDimensions() {
|
||||||
int32 w = content_width(), h = content_height();
|
PhotoData *photo = getShownPhoto();
|
||||||
|
int32 w = photo->full->width(), h = photo->full->height();
|
||||||
if (w <= 0 || h <= 0) {
|
if (w <= 0 || h <= 0) {
|
||||||
_maxw = 0;
|
_maxw = 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -530,8 +466,6 @@ void Photo::initDimensions() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Photo::paint(Painter &p, const QRect &clip, uint32 selection, const PaintContext *context) const {
|
void Photo::paint(Painter &p, const QRect &clip, uint32 selection, const PaintContext *context) const {
|
||||||
bool loaded = content_loaded();
|
|
||||||
|
|
||||||
int32 height = st::inlineMediaHeight;
|
int32 height = st::inlineMediaHeight;
|
||||||
QSize frame = countFrameSize();
|
QSize frame = countFrameSize();
|
||||||
|
|
||||||
|
@ -543,6 +477,9 @@ void Photo::paint(Painter &p, const QRect &clip, uint32 selection, const PaintCo
|
||||||
} else {
|
} else {
|
||||||
p.drawPixmap(r.topLeft(), _thumb);
|
p.drawPixmap(r.topLeft(), _thumb);
|
||||||
}
|
}
|
||||||
|
if (getShownPhoto()->full->toDelayedStorageImage()) {
|
||||||
|
p.fillRect(10, 10, 30, 30, QColor(255, 0, 0));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Photo::getState(ClickHandlerPtr &link, HistoryCursorState &cursor, int x, int y) const {
|
void Photo::getState(ClickHandlerPtr &link, HistoryCursorState &cursor, int x, int y) const {
|
||||||
|
@ -559,7 +496,8 @@ PhotoData *Photo::getShownPhoto() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
QSize Photo::countFrameSize() const {
|
QSize Photo::countFrameSize() const {
|
||||||
int32 framew = content_width(), frameh = content_height(), height = st::inlineMediaHeight;
|
PhotoData *photo = getShownPhoto();
|
||||||
|
int32 framew = photo->full->width(), frameh = photo->full->height(), height = st::inlineMediaHeight;
|
||||||
if (framew * height > frameh * _width) {
|
if (framew * height > frameh * _width) {
|
||||||
if (framew < st::maxStickerSize || frameh > height) {
|
if (framew < st::maxStickerSize || frameh > height) {
|
||||||
if (frameh > height || (framew * height / frameh) <= st::maxStickerSize) {
|
if (frameh > height || (framew * height / frameh) <= st::maxStickerSize) {
|
||||||
|
@ -611,35 +549,6 @@ void Photo::prepareThumb(int32 width, int32 height, const QSize &frame) const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int Photo::content_width() const {
|
|
||||||
if (PhotoData *photo = getShownPhoto()) {
|
|
||||||
return photo->full->width();
|
|
||||||
}
|
|
||||||
return getResultWidth();
|
|
||||||
}
|
|
||||||
|
|
||||||
int Photo::content_height() const {
|
|
||||||
if (PhotoData *photo = getShownPhoto()) {
|
|
||||||
return photo->full->height();
|
|
||||||
}
|
|
||||||
return getResultHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Photo::content_loaded() const {
|
|
||||||
if (PhotoData *photo = getShownPhoto()) {
|
|
||||||
return photo->loaded();
|
|
||||||
}
|
|
||||||
return _result->loaded();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Photo::content_forget() {
|
|
||||||
if (PhotoData *photo = getShownPhoto()) {
|
|
||||||
photo->forget();
|
|
||||||
} else {
|
|
||||||
_result->forget();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Video::Video(Result *result) : FileBase(result)
|
Video::Video(Result *result) : FileBase(result)
|
||||||
, _link(getResultContentUrlHandler())
|
, _link(getResultContentUrlHandler())
|
||||||
, _title(st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft - st::inlineThumbSize - st::inlineThumbSkip)
|
, _title(st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft - st::inlineThumbSize - st::inlineThumbSkip)
|
||||||
|
@ -651,7 +560,7 @@ Video::Video(Result *result) : FileBase(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
void Video::initDimensions() {
|
void Video::initDimensions() {
|
||||||
bool withThumb = !content_thumb()->isNull();
|
bool withThumb = !getShownDocument()->thumb->isNull();
|
||||||
|
|
||||||
_maxw = st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft;
|
_maxw = st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft;
|
||||||
int32 textWidth = _maxw - (withThumb ? (st::inlineThumbSize + st::inlineThumbSkip) : 0);
|
int32 textWidth = _maxw - (withThumb ? (st::inlineThumbSize + st::inlineThumbSkip) : 0);
|
||||||
|
@ -680,7 +589,7 @@ void Video::initDimensions() {
|
||||||
void Video::paint(Painter &p, const QRect &clip, uint32 selection, const PaintContext *context) const {
|
void Video::paint(Painter &p, const QRect &clip, uint32 selection, const PaintContext *context) const {
|
||||||
int left = st::inlineThumbSize + st::inlineThumbSkip;
|
int left = st::inlineThumbSize + st::inlineThumbSkip;
|
||||||
|
|
||||||
bool withThumb = !content_thumb()->isNull();
|
bool withThumb = !getShownDocument()->thumb->isNull();
|
||||||
if (withThumb) {
|
if (withThumb) {
|
||||||
prepareThumb(st::inlineThumbSize, st::inlineThumbSize);
|
prepareThumb(st::inlineThumbSize, st::inlineThumbSize);
|
||||||
if (_thumb.isNull()) {
|
if (_thumb.isNull()) {
|
||||||
|
@ -727,7 +636,7 @@ void Video::getState(ClickHandlerPtr &link, HistoryCursorState &cursor, int x, i
|
||||||
}
|
}
|
||||||
|
|
||||||
void Video::prepareThumb(int32 width, int32 height) const {
|
void Video::prepareThumb(int32 width, int32 height) const {
|
||||||
ImagePtr thumb = content_thumb();
|
ImagePtr thumb = getShownDocument()->thumb;
|
||||||
if (thumb->loaded()) {
|
if (thumb->loaded()) {
|
||||||
if (_thumb.width() != width * cIntRetinaFactor() || _thumb.height() != height * cIntRetinaFactor()) {
|
if (_thumb.width() != width * cIntRetinaFactor() || _thumb.height() != height * cIntRetinaFactor()) {
|
||||||
int32 w = qMax(convertScale(thumb->width()), 1), h = qMax(convertScale(thumb->height()), 1);
|
int32 w = qMax(convertScale(thumb->width()), 1), h = qMax(convertScale(thumb->height()), 1);
|
||||||
|
@ -781,11 +690,12 @@ void File::initDimensions() {
|
||||||
void File::paint(Painter &p, const QRect &clip, uint32 selection, const PaintContext *context) const {
|
void File::paint(Painter &p, const QRect &clip, uint32 selection, const PaintContext *context) const {
|
||||||
int32 left = st::msgFileSize + st::inlineThumbSkip;
|
int32 left = st::msgFileSize + st::inlineThumbSkip;
|
||||||
|
|
||||||
bool loaded = content_loaded(), displayLoading = content_displayLoading();
|
DocumentData *document = getShownDocument();
|
||||||
|
bool loaded = document->loaded(), displayLoading = document->displayLoading();
|
||||||
if (displayLoading) {
|
if (displayLoading) {
|
||||||
ensureAnimation();
|
ensureAnimation();
|
||||||
if (!_animation->radial.animating()) {
|
if (!_animation->radial.animating()) {
|
||||||
_animation->radial.start(content_progress());
|
_animation->radial.start(document->progress());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool showPause = false;// updateStatusText(parent);
|
bool showPause = false;// updateStatusText(parent);
|
||||||
|
@ -797,7 +707,7 @@ void File::paint(Painter &p, const QRect &clip, uint32 selection, const PaintCon
|
||||||
float64 over = _animation->a_thumbOver.current();
|
float64 over = _animation->a_thumbOver.current();
|
||||||
p.setBrush(style::interpolate(st::msgFileInBg, st::msgFileInBgOver, over));
|
p.setBrush(style::interpolate(st::msgFileInBg, st::msgFileInBgOver, over));
|
||||||
} else {
|
} else {
|
||||||
bool over = ClickHandler::showAsActive(content_loading() ? _cancel : _open);
|
bool over = ClickHandler::showAsActive(document->loading() ? _cancel : _open);
|
||||||
p.setBrush((over ? st::msgFileInBgOver : st::msgFileInBg));
|
p.setBrush((over ? st::msgFileInBgOver : st::msgFileInBg));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -821,23 +731,12 @@ void File::paint(Painter &p, const QRect &clip, uint32 selection, const PaintCon
|
||||||
//} else {
|
//} else {
|
||||||
// icon = st::msgFileInDownload;
|
// icon = st::msgFileInDownload;
|
||||||
//}
|
//}
|
||||||
if (DocumentData *doc = getShownDocument()) {
|
if (document->isImage()) {
|
||||||
if (doc->isImage()) {
|
icon = st::msgFileInImage;
|
||||||
icon = st::msgFileInImage;
|
} else if (document->voice() || document->song()) {
|
||||||
} else if (doc->voice() || doc->song()) {
|
icon = st::msgFileInPlay;
|
||||||
icon = st::msgFileInPlay;
|
|
||||||
} else {
|
|
||||||
icon = st::msgFileInFile;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
QString mime = getResultContentType();
|
icon = st::msgFileInFile;
|
||||||
if (mime.startsWith(qstr("image/"))) {
|
|
||||||
icon = st::msgFileInImage;
|
|
||||||
} else if (mime.startsWith(qstr("audio/"))) {
|
|
||||||
icon = st::msgFileInPlay;
|
|
||||||
} else {
|
|
||||||
icon = st::msgFileInFile;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
p.drawSpriteCenter(iconCircle, icon);
|
p.drawSpriteCenter(iconCircle, icon);
|
||||||
|
|
||||||
|
@ -857,7 +756,7 @@ void File::paint(Painter &p, const QRect &clip, uint32 selection, const PaintCon
|
||||||
|
|
||||||
void File::getState(ClickHandlerPtr &link, HistoryCursorState &cursor, int x, int y) const {
|
void File::getState(ClickHandlerPtr &link, HistoryCursorState &cursor, int x, int y) const {
|
||||||
if (x >= 0 && x < st::msgFileSize && y >= st::inlineRowMargin && y < st::inlineRowMargin + st::msgFileSize) {
|
if (x >= 0 && x < st::msgFileSize && y >= st::inlineRowMargin && y < st::inlineRowMargin + st::msgFileSize) {
|
||||||
link = content_loading() ? _cancel : _open;
|
link = getShownDocument()->loading() ? _cancel : _open;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (x >= st::msgFileSize + st::inlineThumbSkip && x < _width && y >= 0 && y < _height) {
|
if (x >= st::msgFileSize + st::inlineThumbSkip && x < _width && y >= 0 && y < _height) {
|
||||||
|
@ -868,7 +767,7 @@ void File::getState(ClickHandlerPtr &link, HistoryCursorState &cursor, int x, in
|
||||||
|
|
||||||
void File::clickHandlerActiveChanged(const ClickHandlerPtr &p, bool active) {
|
void File::clickHandlerActiveChanged(const ClickHandlerPtr &p, bool active) {
|
||||||
if (p == _open || p == _cancel) {
|
if (p == _open || p == _cancel) {
|
||||||
if (active && !content_loaded()) {
|
if (active && !getShownDocument()->loaded()) {
|
||||||
ensureAnimation();
|
ensureAnimation();
|
||||||
_animation->a_thumbOver.start(1);
|
_animation->a_thumbOver.start(1);
|
||||||
_animation->_a_thumbOver.start();
|
_animation->_a_thumbOver.start();
|
||||||
|
@ -897,7 +796,8 @@ void File::step_radial(uint64 ms, bool timer) {
|
||||||
if (timer) {
|
if (timer) {
|
||||||
Ui::repaintInlineItem(this);
|
Ui::repaintInlineItem(this);
|
||||||
} else {
|
} else {
|
||||||
_animation->radial.update(content_progress(), content_loaded(), ms);
|
DocumentData *document = getShownDocument();
|
||||||
|
_animation->radial.update(document->progress(), document->loaded(), ms);
|
||||||
if (!_animation->radial.animating()) {
|
if (!_animation->radial.animating()) {
|
||||||
checkAnimationFinished();
|
checkAnimationFinished();
|
||||||
}
|
}
|
||||||
|
@ -914,7 +814,7 @@ void File::ensureAnimation() const {
|
||||||
|
|
||||||
void File::checkAnimationFinished() {
|
void File::checkAnimationFinished() {
|
||||||
if (_animation && !_animation->_a_thumbOver.animating() && !_animation->radial.animating()) {
|
if (_animation && !_animation->_a_thumbOver.animating() && !_animation->radial.animating()) {
|
||||||
if (content_loaded()) {
|
if (getShownDocument()->loaded()) {
|
||||||
_animation.clear();
|
_animation.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,15 +38,7 @@ protected:
|
||||||
|
|
||||||
int content_width() const;
|
int content_width() const;
|
||||||
int content_height() const;
|
int content_height() const;
|
||||||
bool content_loading() const;
|
|
||||||
bool content_displayLoading() const;
|
|
||||||
bool content_loaded() const;
|
|
||||||
float64 content_progress() const;
|
|
||||||
void content_automaticLoad() const;
|
|
||||||
void content_forget();
|
|
||||||
FileLocation content_location() const;
|
FileLocation content_location() const;
|
||||||
QByteArray content_data() const;
|
|
||||||
ImagePtr content_thumb() const;
|
|
||||||
int content_duration() const;
|
int content_duration() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -151,11 +143,6 @@ private:
|
||||||
|
|
||||||
QSize countFrameSize() const;
|
QSize countFrameSize() const;
|
||||||
|
|
||||||
int content_width() const;
|
|
||||||
int content_height() const;
|
|
||||||
bool content_loaded() const;
|
|
||||||
void content_forget();
|
|
||||||
|
|
||||||
mutable QPixmap _thumb;
|
mutable QPixmap _thumb;
|
||||||
mutable bool _thumbLoaded = false;
|
mutable bool _thumbLoaded = false;
|
||||||
void prepareThumb(int32 width, int32 height, const QSize &frame) const;
|
void prepareThumb(int32 width, int32 height, const QSize &frame) const;
|
||||||
|
|
|
@ -118,14 +118,6 @@ PhotoData *ItemBase::getResultPhoto() const {
|
||||||
return _result ? _result->_photo : nullptr;
|
return _result ? _result->_photo : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ItemBase::getResultWidth() const {
|
|
||||||
return _result ? _result->_width : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ItemBase::getResultHeight() const {
|
|
||||||
return _result ? _result->_height : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ImagePtr ItemBase::getResultThumb() const {
|
ImagePtr ItemBase::getResultThumb() const {
|
||||||
if (_result) {
|
if (_result) {
|
||||||
if (_result->_photo && !_result->_photo->thumb->isNull()) {
|
if (_result->_photo && !_result->_photo->thumb->isNull()) {
|
||||||
|
@ -187,9 +179,5 @@ QString ItemBase::getResultThumbLetter() const {
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString ItemBase::getResultContentType() const {
|
|
||||||
return _result->_content_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Layout
|
} // namespace Layout
|
||||||
} // namespace InlineBots
|
} // namespace InlineBots
|
||||||
|
|
|
@ -95,8 +95,6 @@ public:
|
||||||
protected:
|
protected:
|
||||||
DocumentData *getResultDocument() const;
|
DocumentData *getResultDocument() const;
|
||||||
PhotoData *getResultPhoto() const;
|
PhotoData *getResultPhoto() const;
|
||||||
int getResultWidth() const;
|
|
||||||
int getResultHeight() const;
|
|
||||||
ImagePtr getResultThumb() const;
|
ImagePtr getResultThumb() const;
|
||||||
QPixmap getResultContactAvatar(int width, int height) const;
|
QPixmap getResultContactAvatar(int width, int height) const;
|
||||||
int getResultDuration() const;
|
int getResultDuration() const;
|
||||||
|
@ -104,7 +102,6 @@ protected:
|
||||||
ClickHandlerPtr getResultUrlHandler() const;
|
ClickHandlerPtr getResultUrlHandler() const;
|
||||||
ClickHandlerPtr getResultContentUrlHandler() const;
|
ClickHandlerPtr getResultContentUrlHandler() const;
|
||||||
QString getResultThumbLetter() const;
|
QString getResultThumbLetter() const;
|
||||||
QString getResultContentType() const;
|
|
||||||
|
|
||||||
Result *_result = nullptr;
|
Result *_result = nullptr;
|
||||||
DocumentData *_doc = nullptr;
|
DocumentData *_doc = nullptr;
|
||||||
|
|
|
@ -24,6 +24,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
|
||||||
#include "inline_bots/inline_bot_layout_item.h"
|
#include "inline_bots/inline_bot_layout_item.h"
|
||||||
#include "inline_bots/inline_bot_send_data.h"
|
#include "inline_bots/inline_bot_send_data.h"
|
||||||
#include "mtproto/file_download.h"
|
#include "mtproto/file_download.h"
|
||||||
|
#include "ui/filedialog.h"
|
||||||
#include "mainwidget.h"
|
#include "mainwidget.h"
|
||||||
|
|
||||||
namespace InlineBots {
|
namespace InlineBots {
|
||||||
|
@ -103,8 +104,8 @@ UniquePointer<Result> Result::create(uint64 queryId, const MTPBotInlineResult &m
|
||||||
if (r.has_w()) result->_width = r.vw.v;
|
if (r.has_w()) result->_width = r.vw.v;
|
||||||
if (r.has_h()) result->_height = r.vh.v;
|
if (r.has_h()) result->_height = r.vh.v;
|
||||||
if (r.has_duration()) result->_duration = r.vduration.v;
|
if (r.has_duration()) result->_duration = r.vduration.v;
|
||||||
if (!result->_thumb_url.isEmpty() && (result->_thumb_url.startsWith(qstr("http://"), Qt::CaseInsensitive) || result->_thumb_url.startsWith(qstr("https://"), Qt::CaseInsensitive))) {
|
if (!result->_thumb_url.startsWith(qstr("http://"), Qt::CaseInsensitive) && !result->_thumb_url.startsWith(qstr("https://"), Qt::CaseInsensitive)) {
|
||||||
result->_thumb = ImagePtr(result->_thumb_url);
|
result->_thumb_url = QString();
|
||||||
}
|
}
|
||||||
message = &r.vsend_message;
|
message = &r.vsend_message;
|
||||||
} break;
|
} break;
|
||||||
|
@ -132,12 +133,11 @@ UniquePointer<Result> Result::create(uint64 queryId, const MTPBotInlineResult &m
|
||||||
case mtpc_botInlineMessageMediaAuto: {
|
case mtpc_botInlineMessageMediaAuto: {
|
||||||
const auto &r(message->c_botInlineMessageMediaAuto());
|
const auto &r(message->c_botInlineMessageMediaAuto());
|
||||||
if (result->_type == Type::Photo) {
|
if (result->_type == Type::Photo) {
|
||||||
result->sendData.reset(new internal::SendPhoto(result->_photo, result->_content_url, qs(r.vcaption)));
|
result->createPhoto();
|
||||||
|
result->sendData.reset(new internal::SendPhoto(result->_photo, qs(r.vcaption)));
|
||||||
} else {
|
} else {
|
||||||
if (!result->_document) {
|
result->createDocument();
|
||||||
|
result->sendData.reset(new internal::SendFile(result->_document, qs(r.vcaption)));
|
||||||
}
|
|
||||||
result->sendData.reset(new internal::SendFile(result->_document, result->_content_url, qs(r.vcaption)));
|
|
||||||
}
|
}
|
||||||
if (r.has_reply_markup()) {
|
if (r.has_reply_markup()) {
|
||||||
result->_mtpKeyboard = MakeUnique<MTPReplyMarkup>(r.vreply_markup);
|
result->_mtpKeyboard = MakeUnique<MTPReplyMarkup>(r.vreply_markup);
|
||||||
|
@ -194,6 +194,9 @@ UniquePointer<Result> Result::create(uint64 queryId, const MTPBotInlineResult &m
|
||||||
return UniquePointer<Result>();
|
return UniquePointer<Result>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (result->_thumb->isNull() && !result->_thumb_url.isEmpty()) {
|
||||||
|
result->_thumb = ImagePtr(result->_thumb_url);
|
||||||
|
}
|
||||||
LocationCoords location;
|
LocationCoords location;
|
||||||
if (result->getLocationCoords(&location)) {
|
if (result->getLocationCoords(&location)) {
|
||||||
int32 w = st::inlineThumbSize, h = st::inlineThumbSize;
|
int32 w = st::inlineThumbSize, h = st::inlineThumbSize;
|
||||||
|
@ -238,196 +241,11 @@ bool Result::onChoose(Layout::ItemBase *layout) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_type == Type::Photo) {
|
return true;
|
||||||
if (_thumb->loaded()) {
|
|
||||||
return true;
|
|
||||||
} else if (!_thumb->loading()) {
|
|
||||||
_thumb->loadEvenCancelled();
|
|
||||||
Ui::repaintInlineItem(layout);
|
|
||||||
}
|
|
||||||
} else if (_type == Type::Gif) {
|
|
||||||
if (loaded()) {
|
|
||||||
return true;
|
|
||||||
} else if (loading()) {
|
|
||||||
cancelFile();
|
|
||||||
Ui::repaintInlineItem(layout);
|
|
||||||
} else {
|
|
||||||
saveFile(QString(), LoadFromCloudOrLocal, false);
|
|
||||||
Ui::repaintInlineItem(layout);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Result::automaticLoadGif() {
|
|
||||||
if (loaded() || _type != Type::Gif) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (_content_type != qstr("video/mp4") && _content_type != qstr("image/gif")) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_loader != CancelledWebFileLoader) {
|
|
||||||
// if load at least anywhere
|
|
||||||
bool loadFromCloud = !(cAutoDownloadGif() & dbiadNoPrivate) || !(cAutoDownloadGif() & dbiadNoGroups);
|
|
||||||
saveFile(QString(), loadFromCloud ? LoadFromCloudOrLocal : LoadFromLocalOnly, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Result::automaticLoadSettingsChangedGif() {
|
|
||||||
if (loaded() || _loader != CancelledWebFileLoader) return;
|
|
||||||
_loader = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Result::saveFile(const QString &toFile, LoadFromCloudSetting fromCloud, bool autoLoading) {
|
|
||||||
if (loaded()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_loader == CancelledWebFileLoader) _loader = nullptr;
|
|
||||||
if (_loader) {
|
|
||||||
if (!_loader->setFileName(toFile)) {
|
|
||||||
cancelFile();
|
|
||||||
_loader = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_loader) {
|
|
||||||
if (fromCloud == LoadFromCloudOrLocal) _loader->permitLoadFromCloud();
|
|
||||||
} else {
|
|
||||||
_loader = new webFileLoader(_content_url, toFile, fromCloud, autoLoading);
|
|
||||||
regLoader(_loader, this);
|
|
||||||
|
|
||||||
_loader->connect(_loader, SIGNAL(progress(FileLoader*)), App::main(), SLOT(inlineResultLoadProgress(FileLoader*)));
|
|
||||||
_loader->connect(_loader, SIGNAL(failed(FileLoader*, bool)), App::main(), SLOT(inlineResultLoadFailed(FileLoader*, bool)));
|
|
||||||
_loader->start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Result::openFile() {
|
|
||||||
//if (loaded()) {
|
|
||||||
// bool playVoice = data->voice() && audioPlayer() && item;
|
|
||||||
// bool playMusic = data->song() && audioPlayer() && item;
|
|
||||||
// bool playAnimation = data->isAnimation() && item && item->getMedia();
|
|
||||||
// const FileLocation &location(data->location(true));
|
|
||||||
// if (!location.isEmpty() || (!data->data().isEmpty() && (playVoice || playMusic || playAnimation))) {
|
|
||||||
// if (playVoice) {
|
|
||||||
// AudioMsgId playing;
|
|
||||||
// AudioPlayerState playingState = AudioPlayerStopped;
|
|
||||||
// audioPlayer()->currentState(&playing, &playingState);
|
|
||||||
// if (playing.msgId == item->fullId() && !(playingState & AudioPlayerStoppedMask) && playingState != AudioPlayerFinishing) {
|
|
||||||
// audioPlayer()->pauseresume(OverviewVoiceFiles);
|
|
||||||
// } else {
|
|
||||||
// AudioMsgId audio(data, item->fullId());
|
|
||||||
// audioPlayer()->play(audio);
|
|
||||||
// if (App::main()) {
|
|
||||||
// App::main()->audioPlayProgress(audio);
|
|
||||||
// App::main()->mediaMarkRead(data);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// } else if (playMusic) {
|
|
||||||
// SongMsgId playing;
|
|
||||||
// AudioPlayerState playingState = AudioPlayerStopped;
|
|
||||||
// audioPlayer()->currentState(&playing, &playingState);
|
|
||||||
// if (playing.msgId == item->fullId() && !(playingState & AudioPlayerStoppedMask) && playingState != AudioPlayerFinishing) {
|
|
||||||
// audioPlayer()->pauseresume(OverviewFiles);
|
|
||||||
// } else {
|
|
||||||
// SongMsgId song(data, item->fullId());
|
|
||||||
// audioPlayer()->play(song);
|
|
||||||
// if (App::main()) App::main()->documentPlayProgress(song);
|
|
||||||
// }
|
|
||||||
// } else if (data->voice() || data->isVideo()) {
|
|
||||||
// psOpenFile(location.name());
|
|
||||||
// if (App::main()) App::main()->mediaMarkRead(data);
|
|
||||||
// } else if (data->size < MediaViewImageSizeLimit) {
|
|
||||||
// if (!data->data().isEmpty() && playAnimation) {
|
|
||||||
// if (action == ActionOnLoadPlayInline && item->getMedia()) {
|
|
||||||
// item->getMedia()->playInline(item);
|
|
||||||
// } else {
|
|
||||||
// App::wnd()->showDocument(data, item);
|
|
||||||
// }
|
|
||||||
// } else if (location.accessEnable()) {
|
|
||||||
// if (item && (data->isAnimation() || QImageReader(location.name()).canRead())) {
|
|
||||||
// if (action == ActionOnLoadPlayInline && item->getMedia()) {
|
|
||||||
// item->getMedia()->playInline(item);
|
|
||||||
// } else {
|
|
||||||
// App::wnd()->showDocument(data, item);
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// psOpenFile(location.name());
|
|
||||||
// }
|
|
||||||
// location.accessDisable();
|
|
||||||
// } else {
|
|
||||||
// psOpenFile(location.name());
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// psOpenFile(location.name());
|
|
||||||
// }
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
//QString filename = documentSaveFilename(data);
|
|
||||||
//if (filename.isEmpty()) return;
|
|
||||||
//if (!data->saveToCache()) {
|
|
||||||
// filename = documentSaveFilename(data);
|
|
||||||
// if (filename.isEmpty()) return;
|
|
||||||
//}
|
|
||||||
|
|
||||||
//saveFile()
|
|
||||||
//data->save(filename, action, item ? item->fullId() : FullMsgId());
|
|
||||||
}
|
|
||||||
|
|
||||||
void Result::cancelFile() {
|
|
||||||
if (!loading()) return;
|
|
||||||
|
|
||||||
unregLoader(_loader);
|
|
||||||
|
|
||||||
webFileLoader *l = _loader;
|
|
||||||
_loader = CancelledWebFileLoader;
|
|
||||||
if (l) {
|
|
||||||
l->cancel();
|
|
||||||
l->deleteLater();
|
|
||||||
l->stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray Result::data() const {
|
|
||||||
return _data;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Result::loading() const {
|
|
||||||
return _loader && _loader != CancelledWebFileLoader;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Result::loaded() const {
|
|
||||||
if (loading() && _loader->done()) {
|
|
||||||
unregLoader(_loader);
|
|
||||||
if (_loader->fileType() == mtpc_storage_fileUnknown) {
|
|
||||||
_loader->deleteLater();
|
|
||||||
_loader->stop();
|
|
||||||
_loader = CancelledWebFileLoader;
|
|
||||||
} else {
|
|
||||||
Result *that = const_cast<Result*>(this);
|
|
||||||
that->_data = _loader->bytes();
|
|
||||||
|
|
||||||
_loader->deleteLater();
|
|
||||||
_loader->stop();
|
|
||||||
_loader = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return !_data.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Result::displayLoading() const {
|
|
||||||
return loading() ? (!_loader->loadingLocal() || !_loader->autoLoading()) : false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Result::forget() {
|
void Result::forget() {
|
||||||
_thumb->forget();
|
_thumb->forget();
|
||||||
_data.clear();
|
|
||||||
if (_document) {
|
if (_document) {
|
||||||
_document->forget();
|
_document->forget();
|
||||||
}
|
}
|
||||||
|
@ -436,8 +254,20 @@ void Result::forget() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float64 Result::progress() const {
|
void Result::openFile() {
|
||||||
return loading() ? _loader->currentProgress() : (loaded() ? 1 : 0); return false;
|
if (_document) {
|
||||||
|
DocumentOpenClickHandler(_document).onClick(Qt::LeftButton);
|
||||||
|
} else if (_photo) {
|
||||||
|
PhotoOpenClickHandler(_photo).onClick(Qt::LeftButton);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Result::cancelFile() {
|
||||||
|
if (_document) {
|
||||||
|
DocumentCancelClickHandler(_document).onClick(Qt::LeftButton);
|
||||||
|
} else if (_photo) {
|
||||||
|
PhotoCancelClickHandler(_photo).onClick(Qt::LeftButton);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Result::hasThumbDisplay() const {
|
bool Result::hasThumbDisplay() const {
|
||||||
|
@ -476,8 +306,66 @@ QString Result::getLayoutDescription() const {
|
||||||
return sendData->getLayoutDescription(this);
|
return sendData->getLayoutDescription(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Result::createPhoto() {
|
||||||
|
if (_photo) return;
|
||||||
|
|
||||||
|
if (_thumb_url.isEmpty()) {
|
||||||
|
QSize thumb = shrinkToKeepAspect(_width, _height, 100, 100);
|
||||||
|
_thumb = ImagePtr(thumb.width(), thumb.height());
|
||||||
|
} else {
|
||||||
|
_thumb = ImagePtr(_thumb_url, QSize(100, 100));
|
||||||
|
}
|
||||||
|
ImagePtr medium = ImagePtr(_content_url, QSize(320, 320));
|
||||||
|
|
||||||
|
uint64 photoId = rand_value<uint64>();
|
||||||
|
_photo = App::photoSet(photoId, 0, 0, unixtime(), _thumb, medium, ImagePtr(_width, _height));
|
||||||
|
_photo->thumb = _thumb;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Result::createDocument() {
|
||||||
|
if (_document) return;
|
||||||
|
|
||||||
|
uint64 docId = rand_value<uint64>();
|
||||||
|
|
||||||
|
if (!_thumb_url.isEmpty()) {
|
||||||
|
_thumb = ImagePtr(_thumb_url, QSize(90, 90));
|
||||||
|
}
|
||||||
|
|
||||||
|
QString mime = _content_type;
|
||||||
|
|
||||||
|
QVector<MTPDocumentAttribute> attributes;
|
||||||
|
QSize dimensions(_width, _height);
|
||||||
|
if (_type == Type::Gif) {
|
||||||
|
const char *filename = (mime == qstr("video/mp4") ? "animation.gif.mp4" : "animation.gif");
|
||||||
|
attributes.push_back(MTP_documentAttributeFilename(MTP_string(filename)));
|
||||||
|
attributes.push_back(MTP_documentAttributeAnimated());
|
||||||
|
attributes.push_back(MTP_documentAttributeVideo(MTP_int(_duration), MTP_int(_width), MTP_int(_height)));
|
||||||
|
} else if (_type == Type::Video) {
|
||||||
|
attributes.push_back(MTP_documentAttributeVideo(MTP_int(_duration), MTP_int(_width), MTP_int(_height)));
|
||||||
|
} else if (_type == Type::Audio) {
|
||||||
|
MTPDdocumentAttributeAudio::Flags flags = 0;
|
||||||
|
if (mime == qstr("audio/ogg")) {
|
||||||
|
flags |= MTPDdocumentAttributeAudio::Flag::f_voice;
|
||||||
|
} else {
|
||||||
|
QStringList p = mimeTypeForName(mime).globPatterns();
|
||||||
|
QString pattern = p.isEmpty() ? QString() : p.front();
|
||||||
|
QString extension = pattern.isEmpty() ? qsl(".unknown") : pattern.replace('*', QString());
|
||||||
|
QString filename = filedialogDefaultName(qsl("inline"), extension, QString(), true);
|
||||||
|
attributes.push_back(MTP_documentAttributeFilename(MTP_string(filename)));
|
||||||
|
}
|
||||||
|
attributes.push_back(MTP_documentAttributeAudio(MTP_flags(flags), MTP_int(_duration), MTPstring(), MTPstring(), MTPbytes()));
|
||||||
|
}
|
||||||
|
|
||||||
|
MTPDocument document = MTP_document(MTP_long(docId), MTP_long(0), MTP_int(unixtime()), MTP_string(mime), MTP_int(0), MTP_photoSizeEmpty(MTP_string("")), MTP_int(MTP::maindc()), MTP_vector<MTPDocumentAttribute>(attributes));
|
||||||
|
|
||||||
|
_document = App::feedDocument(document);
|
||||||
|
_document->setContentUrl(_content_url);
|
||||||
|
if (!_thumb->isNull()) {
|
||||||
|
_document->thumb = _thumb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Result::~Result() {
|
Result::~Result() {
|
||||||
cancelFile();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace InlineBots
|
} // namespace InlineBots
|
||||||
|
|
|
@ -61,19 +61,10 @@ public:
|
||||||
// inline bot result. If it returns true you need to send this result.
|
// inline bot result. If it returns true you need to send this result.
|
||||||
bool onChoose(Layout::ItemBase *layout);
|
bool onChoose(Layout::ItemBase *layout);
|
||||||
|
|
||||||
void automaticLoadGif();
|
void forget();
|
||||||
void automaticLoadSettingsChangedGif();
|
|
||||||
void saveFile(const QString &toFile, LoadFromCloudSetting fromCloud, bool autoLoading);
|
|
||||||
void openFile();
|
void openFile();
|
||||||
void cancelFile();
|
void cancelFile();
|
||||||
|
|
||||||
QByteArray data() const;
|
|
||||||
bool loading() const;
|
|
||||||
bool loaded() const;
|
|
||||||
bool displayLoading() const;
|
|
||||||
void forget();
|
|
||||||
float64 progress() const;
|
|
||||||
|
|
||||||
bool hasThumbDisplay() const;
|
bool hasThumbDisplay() const;
|
||||||
|
|
||||||
void addToHistory(History *history, MTPDmessage::Flags flags, MsgId msgId, UserId fromId, MTPint mtpDate, UserId viaBotId, MsgId replyToId) const;
|
void addToHistory(History *history, MTPDmessage::Flags flags, MsgId msgId, UserId fromId, MTPint mtpDate, UserId viaBotId, MsgId replyToId) const;
|
||||||
|
@ -86,6 +77,7 @@ public:
|
||||||
~Result();
|
~Result();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void createPhoto();
|
||||||
void createDocument();
|
void createDocument();
|
||||||
|
|
||||||
enum class Type {
|
enum class Type {
|
||||||
|
@ -126,9 +118,6 @@ private:
|
||||||
|
|
||||||
UniquePointer<internal::SendData> sendData;
|
UniquePointer<internal::SendData> sendData;
|
||||||
|
|
||||||
QByteArray _data;
|
|
||||||
mutable webFileLoader *_loader = nullptr;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
Result *getResultFromLoader(FileLoader *loader);
|
Result *getResultFromLoader(FileLoader *loader);
|
||||||
|
|
||||||
|
|
|
@ -35,44 +35,6 @@ QString SendData::getLayoutDescription(const Result *owner) const {
|
||||||
return owner->_description;
|
return owner->_description;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImagePtr SendData::getResultThumb(const Result *owner) const {
|
|
||||||
return owner->_thumb;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SendData::getResultWidth(const Result *owner) const {
|
|
||||||
return owner->_width;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SendData::getResultHeight(const Result *owner) const {
|
|
||||||
return owner->_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString SendData::getResultMime(const Result *owner) const {
|
|
||||||
return owner->_content_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
QVector<MTPDocumentAttribute> SendData::prepareResultAttributes(const Result *owner) const {
|
|
||||||
QVector<MTPDocumentAttribute> result;
|
|
||||||
int duration = owner->_duration;
|
|
||||||
QSize dimensions(owner->_width, owner->_height);
|
|
||||||
using Type = Result::Type;
|
|
||||||
if (owner->_type == Type::Gif) {
|
|
||||||
const char *filename = (owner->_content_type == qstr("video/mp4") ? "animation.gif.mp4" : "animation.gif");
|
|
||||||
result.push_back(MTP_documentAttributeFilename(MTP_string(filename)));
|
|
||||||
result.push_back(MTP_documentAttributeAnimated());
|
|
||||||
result.push_back(MTP_documentAttributeVideo(MTP_int(owner->_duration), MTP_int(owner->_width), MTP_int(owner->_height)));
|
|
||||||
} else if (owner->_type == Type::Video) {
|
|
||||||
result.push_back(MTP_documentAttributeVideo(MTP_int(owner->_duration), MTP_int(owner->_width), MTP_int(owner->_height)));
|
|
||||||
} else if (owner->_type == Type::Audio) {
|
|
||||||
MTPDdocumentAttributeAudio::Flags flags = 0;
|
|
||||||
if (owner->_content_type == qstr("audio/ogg")) {
|
|
||||||
flags |= MTPDdocumentAttributeAudio::Flag::f_voice;
|
|
||||||
}
|
|
||||||
result.push_back(MTP_documentAttributeAudio(MTP_flags(flags), MTP_int(owner->_duration), MTPstring(), MTPstring(), MTPbytes()));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SendDataCommon::addToHistory(const Result *owner, History *history,
|
void SendDataCommon::addToHistory(const Result *owner, History *history,
|
||||||
MTPDmessage::Flags flags, MsgId msgId, UserId fromId, MTPint mtpDate,
|
MTPDmessage::Flags flags, MsgId msgId, UserId fromId, MTPint mtpDate,
|
||||||
UserId viaBotId, MsgId replyToId, const MTPReplyMarkup &markup) const {
|
UserId viaBotId, MsgId replyToId, const MTPReplyMarkup &markup) const {
|
||||||
|
@ -119,76 +81,13 @@ QString SendContact::getLayoutDescription(const Result *owner) const {
|
||||||
void SendPhoto::addToHistory(const Result *owner, History *history,
|
void SendPhoto::addToHistory(const Result *owner, History *history,
|
||||||
MTPDmessage::Flags flags, MsgId msgId, UserId fromId, MTPint mtpDate,
|
MTPDmessage::Flags flags, MsgId msgId, UserId fromId, MTPint mtpDate,
|
||||||
UserId viaBotId, MsgId replyToId, const MTPReplyMarkup &markup) const {
|
UserId viaBotId, MsgId replyToId, const MTPReplyMarkup &markup) const {
|
||||||
if (_photo) {
|
history->addNewPhoto(msgId, flags, viaBotId, replyToId, date(mtpDate), fromId, _photo, _caption, markup);
|
||||||
history->addNewPhoto(msgId, flags, viaBotId, replyToId, date(mtpDate), fromId, _photo, _caption, markup);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ImagePtr resultThumb = getResultThumb(owner);
|
|
||||||
QImage fileThumb(resultThumb->pix().toImage());
|
|
||||||
|
|
||||||
QVector<MTPPhotoSize> photoSizes;
|
|
||||||
|
|
||||||
QPixmap thumb = (fileThumb.width() > 100 || fileThumb.height() > 100) ? QPixmap::fromImage(fileThumb.scaled(100, 100, Qt::KeepAspectRatio, Qt::SmoothTransformation), Qt::ColorOnly) : QPixmap::fromImage(fileThumb);
|
|
||||||
ImagePtr thumbPtr = ImagePtr(thumb, "JPG");
|
|
||||||
photoSizes.push_back(MTP_photoSize(MTP_string("s"), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(thumb.width()), MTP_int(thumb.height()), MTP_int(0)));
|
|
||||||
|
|
||||||
QSize medium = resizeKeepAspect(getResultWidth(owner), getResultHeight(owner), 320, 320);
|
|
||||||
photoSizes.push_back(MTP_photoSize(MTP_string("m"), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(medium.width()), MTP_int(medium.height()), MTP_int(0)));
|
|
||||||
|
|
||||||
photoSizes.push_back(MTP_photoSize(MTP_string("x"), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(getResultWidth(owner)), MTP_int(getResultHeight(owner)), MTP_int(0)));
|
|
||||||
|
|
||||||
uint64 photoId = rand_value<uint64>();
|
|
||||||
PhotoData *ph = App::photoSet(photoId, 0, 0, unixtime(), thumbPtr, ImagePtr(medium.width(), medium.height()), ImagePtr(getResultWidth(owner), getResultHeight(owner)));
|
|
||||||
MTPPhoto photo = MTP_photo(MTP_long(photoId), MTP_long(0), MTP_int(ph->date), MTP_vector<MTPPhotoSize>(photoSizes));
|
|
||||||
|
|
||||||
MTPMessageMedia media = MTP_messageMediaPhoto(photo, MTP_string(_caption));
|
|
||||||
history->addNewMessage(MTP_message(MTP_flags(flags), MTP_int(msgId), MTP_int(fromId), peerToMTP(history->peer->id), MTPnullFwdHeader, MTP_int(viaBotId), MTP_int(replyToId), mtpDate, MTP_string(""), media, markup, MTPnullEntities, MTP_int(1), MTPint()), NewMessageUnread);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendFile::addToHistory(const Result *owner, History *history,
|
void SendFile::addToHistory(const Result *owner, History *history,
|
||||||
MTPDmessage::Flags flags, MsgId msgId, UserId fromId, MTPint mtpDate,
|
MTPDmessage::Flags flags, MsgId msgId, UserId fromId, MTPint mtpDate,
|
||||||
UserId viaBotId, MsgId replyToId, const MTPReplyMarkup &markup) const {
|
UserId viaBotId, MsgId replyToId, const MTPReplyMarkup &markup) const {
|
||||||
if (_document) {
|
history->addNewDocument(msgId, flags, viaBotId, replyToId, date(mtpDate), fromId, _document, _caption, markup);
|
||||||
history->addNewDocument(msgId, flags, viaBotId, replyToId, date(mtpDate), fromId, _document, _caption, markup);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64 docId = rand_value<uint64>();
|
|
||||||
|
|
||||||
ImagePtr resultThumb = getResultThumb(owner);
|
|
||||||
MTPPhotoSize thumbSize;
|
|
||||||
QPixmap thumb;
|
|
||||||
int tw = resultThumb->width(), th = resultThumb->height();
|
|
||||||
if (!resultThumb->isNull() && tw > 0 && th > 0 && tw < 20 * th && th < 20 * tw && resultThumb->loaded()) {
|
|
||||||
if (tw > th) {
|
|
||||||
if (tw > 90) {
|
|
||||||
th = th * 90 / tw;
|
|
||||||
tw = 90;
|
|
||||||
}
|
|
||||||
} else if (th > 90) {
|
|
||||||
tw = tw * 90 / th;
|
|
||||||
th = 90;
|
|
||||||
}
|
|
||||||
thumbSize = MTP_photoSize(MTP_string(""), MTP_fileLocationUnavailable(MTP_long(0), MTP_int(0), MTP_long(0)), MTP_int(tw), MTP_int(th), MTP_int(0));
|
|
||||||
thumb = resultThumb->pixNoCache(tw, th, ImagePixSmooth);
|
|
||||||
} else {
|
|
||||||
tw = th = 0;
|
|
||||||
thumbSize = MTP_photoSizeEmpty(MTP_string(""));
|
|
||||||
}
|
|
||||||
|
|
||||||
QVector<MTPDocumentAttribute> attributes = prepareResultAttributes(owner);
|
|
||||||
MTPDocument document = MTP_document(MTP_long(docId), MTP_long(0), MTP_int(unixtime()), MTP_string(getResultMime(owner)), MTP_int(owner->data().size()), thumbSize, MTP_int(MTP::maindc()), MTP_vector<MTPDocumentAttribute>(attributes));
|
|
||||||
|
|
||||||
if (!owner->data().isEmpty()) {
|
|
||||||
Local::writeStickerImage(mediaKey(DocumentFileLocation, MTP::maindc(), docId), owner->data());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tw > 0 && th > 0) {
|
|
||||||
App::feedDocument(document, thumb);
|
|
||||||
}
|
|
||||||
MTPMessageMedia media = MTP_messageMediaDocument(document, MTP_string(_caption));
|
|
||||||
history->addNewMessage(MTP_message(MTP_flags(flags), MTP_int(msgId), MTP_int(fromId), peerToMTP(history->peer->id), MTPnullFwdHeader, MTP_int(viaBotId), MTP_int(replyToId), mtpDate, MTP_string(""), media, markup, MTPnullEntities, MTP_int(1), MTPint()), NewMessageUnread);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
|
|
@ -55,17 +55,6 @@ public:
|
||||||
virtual QString getLayoutTitle(const Result *owner) const;
|
virtual QString getLayoutTitle(const Result *owner) const;
|
||||||
virtual QString getLayoutDescription(const Result *owner) const;
|
virtual QString getLayoutDescription(const Result *owner) const;
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
ImagePtr getResultThumb(const Result *owner) const;
|
|
||||||
int getResultWidth(const Result *owner) const;
|
|
||||||
int getResultHeight(const Result *owner) const;
|
|
||||||
QString getResultMime(const Result *owner) const;
|
|
||||||
QVector<MTPDocumentAttribute> prepareResultAttributes(const Result *owner) const;
|
|
||||||
|
|
||||||
void setResultDocument(const Result *owner, DocumentData *document) const;
|
|
||||||
void setResultPhoto(const Result *owner, PhotoData *photo) const;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// This class implements addHistory() for most of the types hiding
|
// This class implements addHistory() for most of the types hiding
|
||||||
|
@ -191,14 +180,13 @@ private:
|
||||||
// Message with photo.
|
// Message with photo.
|
||||||
class SendPhoto : public SendData {
|
class SendPhoto : public SendData {
|
||||||
public:
|
public:
|
||||||
SendPhoto(PhotoData *photo, const QString &url, const QString &caption)
|
SendPhoto(PhotoData *photo, const QString &caption)
|
||||||
: _photo(photo)
|
: _photo(photo)
|
||||||
, _url(url)
|
|
||||||
, _caption(caption) {
|
, _caption(caption) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isValid() const override {
|
bool isValid() const override {
|
||||||
return _photo || !_url.isEmpty();
|
return _photo != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void addToHistory(const Result *owner, History *history,
|
void addToHistory(const Result *owner, History *history,
|
||||||
|
@ -207,21 +195,20 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PhotoData *_photo;
|
PhotoData *_photo;
|
||||||
QString _url, _caption;
|
QString _caption;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Message with file.
|
// Message with file.
|
||||||
class SendFile : public SendData {
|
class SendFile : public SendData {
|
||||||
public:
|
public:
|
||||||
SendFile(DocumentData *document, const QString &url, const QString &caption)
|
SendFile(DocumentData *document, const QString &caption)
|
||||||
: _document(document)
|
: _document(document)
|
||||||
, _url(url)
|
|
||||||
, _caption(caption) {
|
, _caption(caption) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isValid() const override {
|
bool isValid() const override {
|
||||||
return _document || !_url.isEmpty();
|
return _document != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void addToHistory(const Result *owner, History *history,
|
void addToHistory(const Result *owner, History *history,
|
||||||
|
@ -230,7 +217,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DocumentData *_document;
|
DocumentData *_document;
|
||||||
QString _url, _caption;
|
QString _caption;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -838,10 +838,6 @@ void MainWidget::notify_historyItemLayoutChanged(const HistoryItem *item) {
|
||||||
if (overview) overview->notify_historyItemLayoutChanged(item);
|
if (overview) overview->notify_historyItemLayoutChanged(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWidget::notify_automaticLoadSettingsChangedGif() {
|
|
||||||
history.notify_automaticLoadSettingsChangedGif();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWidget::notify_handlePendingHistoryUpdate() {
|
void MainWidget::notify_handlePendingHistoryUpdate() {
|
||||||
history.notify_handlePendingHistoryUpdate();
|
history.notify_handlePendingHistoryUpdate();
|
||||||
}
|
}
|
||||||
|
|
|
@ -465,7 +465,6 @@ public:
|
||||||
void notify_migrateUpdated(PeerData *peer);
|
void notify_migrateUpdated(PeerData *peer);
|
||||||
void notify_clipStopperHidden(ClipStopperType type);
|
void notify_clipStopperHidden(ClipStopperType type);
|
||||||
void notify_historyItemLayoutChanged(const HistoryItem *item);
|
void notify_historyItemLayoutChanged(const HistoryItem *item);
|
||||||
void notify_automaticLoadSettingsChangedGif();
|
|
||||||
void notify_handlePendingHistoryUpdate();
|
void notify_handlePendingHistoryUpdate();
|
||||||
|
|
||||||
void cmd_search();
|
void cmd_search();
|
||||||
|
|
|
@ -1088,8 +1088,11 @@ public:
|
||||||
|
|
||||||
void setRemoteLocation(int32 dc, uint64 access);
|
void setRemoteLocation(int32 dc, uint64 access);
|
||||||
void setContentUrl(const QString &url);
|
void setContentUrl(const QString &url);
|
||||||
|
bool hasRemoteLocation() const {
|
||||||
|
return (_dc != 0 && _access != 0);
|
||||||
|
}
|
||||||
bool isValid() const {
|
bool isValid() const {
|
||||||
return (_dc != 0 && _access != 0) || !_url.isEmpty();
|
return hasRemoteLocation() || !_url.isEmpty();
|
||||||
}
|
}
|
||||||
MTPInputDocument mtpInput() const {
|
MTPInputDocument mtpInput() const {
|
||||||
if (_access) {
|
if (_access) {
|
||||||
|
|
|
@ -34,7 +34,7 @@ namespace {
|
||||||
WebImages webImages;
|
WebImages webImages;
|
||||||
|
|
||||||
Image *blank() {
|
Image *blank() {
|
||||||
static Image *img = getImage(qsl(":/gui/art/blank.gif"), "GIF");
|
static Image *img = internal::getImage(qsl(":/gui/art/blank.gif"), "GIF");
|
||||||
return img;
|
return img;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ ImagePtr::ImagePtr() : Parent(blank()) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ImagePtr::ImagePtr(int32 width, int32 height, const MTPFileLocation &location, ImagePtr def) :
|
ImagePtr::ImagePtr(int32 width, int32 height, const MTPFileLocation &location, ImagePtr def) :
|
||||||
Parent((location.type() == mtpc_fileLocation) ? (Image*)(getImage(StorageImageLocation(width, height, location.c_fileLocation()))) : def.v()) {
|
Parent((location.type() == mtpc_fileLocation) ? (Image*)(internal::getImage(StorageImageLocation(width, height, location.c_fileLocation()))) : def.v()) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Image::Image(const QString &file, QByteArray fmt) : _forgot(false) {
|
Image::Image(const QString &file, QByteArray fmt) : _forgot(false) {
|
||||||
|
@ -661,41 +661,6 @@ Image::~Image() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Image *getImage(const QString &file, QByteArray format) {
|
|
||||||
if (file.startsWith(qstr("http://"), Qt::CaseInsensitive) || file.startsWith(qstr("https://"), Qt::CaseInsensitive)) {
|
|
||||||
QString key = file;
|
|
||||||
WebImages::const_iterator i = webImages.constFind(key);
|
|
||||||
if (i == webImages.cend()) {
|
|
||||||
i = webImages.insert(key, new WebImage(file));
|
|
||||||
}
|
|
||||||
return i.value();
|
|
||||||
} else {
|
|
||||||
QFileInfo f(file);
|
|
||||||
QString key = qsl("//:%1//:%2//:").arg(f.size()).arg(f.lastModified().toTime_t()) + file;
|
|
||||||
LocalImages::const_iterator i = localImages.constFind(key);
|
|
||||||
if (i == localImages.cend()) {
|
|
||||||
i = localImages.insert(key, new Image(file, format));
|
|
||||||
}
|
|
||||||
return i.value();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Image *getImage(const QByteArray &filecontent, QByteArray format) {
|
|
||||||
return new Image(filecontent, format);
|
|
||||||
}
|
|
||||||
|
|
||||||
Image *getImage(const QPixmap &pixmap, QByteArray format) {
|
|
||||||
return new Image(pixmap, format);
|
|
||||||
}
|
|
||||||
|
|
||||||
Image *getImage(const QByteArray &filecontent, QByteArray format, const QPixmap &pixmap) {
|
|
||||||
return new Image(filecontent, format, pixmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
Image *getImage(int32 width, int32 height) {
|
|
||||||
return new DelayedStorageImage(width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clearStorageImages() {
|
void clearStorageImages() {
|
||||||
for (StorageImages::const_iterator i = storageImages.cbegin(), e = storageImages.cend(); i != e; ++i) {
|
for (StorageImages::const_iterator i = storageImages.cbegin(), e = storageImages.cend(); i != e; ++i) {
|
||||||
delete i.value();
|
delete i.value();
|
||||||
|
@ -976,33 +941,7 @@ void DelayedStorageImage::cancel() {
|
||||||
StorageImage::cancel();
|
StorageImage::cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
StorageImage *getImage(const StorageImageLocation &location, int32 size) {
|
WebImage::WebImage(const QString &url, QSize box) : _url(url), _box(box), _size(0), _width(0), _height(0) {
|
||||||
StorageKey key(storageKey(location));
|
|
||||||
StorageImages::const_iterator i = storageImages.constFind(key);
|
|
||||||
if (i == storageImages.cend()) {
|
|
||||||
i = storageImages.insert(key, new StorageImage(location, size));
|
|
||||||
}
|
|
||||||
return i.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
StorageImage *getImage(const StorageImageLocation &location, const QByteArray &bytes) {
|
|
||||||
StorageKey key(storageKey(location));
|
|
||||||
StorageImages::const_iterator i = storageImages.constFind(key);
|
|
||||||
if (i == storageImages.cend()) {
|
|
||||||
QByteArray bytesArr(bytes);
|
|
||||||
i = storageImages.insert(key, new StorageImage(location, bytesArr));
|
|
||||||
} else if (!i.value()->loaded()) {
|
|
||||||
QByteArray bytesArr(bytes);
|
|
||||||
i.value()->setData(bytesArr);
|
|
||||||
if (!location.isNull()) {
|
|
||||||
Local::writeImage(key, StorageImageSaved(mtpToStorageType(mtpc_storage_filePartial), bytes));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return i.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
WebImage::WebImage(const QString &url) : _url(url), _size(0), _width(0), _height(0) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 WebImage::countWidth() const {
|
int32 WebImage::countWidth() const {
|
||||||
|
@ -1015,14 +954,93 @@ int32 WebImage::countHeight() const {
|
||||||
|
|
||||||
void WebImage::setInformation(int32 size, int32 width, int32 height) {
|
void WebImage::setInformation(int32 size, int32 width, int32 height) {
|
||||||
_size = size;
|
_size = size;
|
||||||
_width = width;
|
if (!_box.isEmpty()) {
|
||||||
_height = height;
|
QSize final = shrinkToKeepAspect(width, height, _box.width(), _box.height());
|
||||||
|
_width = final.width();
|
||||||
|
_height = final.height();
|
||||||
|
} else {
|
||||||
|
_width = width;
|
||||||
|
_height = height;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FileLoader *WebImage::createLoader(LoadFromCloudSetting fromCloud, bool autoLoading) {
|
FileLoader *WebImage::createLoader(LoadFromCloudSetting fromCloud, bool autoLoading) {
|
||||||
return new webFileLoader(_url, QString(), fromCloud, autoLoading);
|
return new webFileLoader(_url, QString(), fromCloud, autoLoading);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
Image *getImage(const QString &file, QByteArray format) {
|
||||||
|
if (file.startsWith(qstr("http://"), Qt::CaseInsensitive) || file.startsWith(qstr("https://"), Qt::CaseInsensitive)) {
|
||||||
|
QString key = file;
|
||||||
|
WebImages::const_iterator i = webImages.constFind(key);
|
||||||
|
if (i == webImages.cend()) {
|
||||||
|
i = webImages.insert(key, new WebImage(file));
|
||||||
|
}
|
||||||
|
return i.value();
|
||||||
|
} else {
|
||||||
|
QFileInfo f(file);
|
||||||
|
QString key = qsl("//:%1//:%2//:").arg(f.size()).arg(f.lastModified().toTime_t()) + file;
|
||||||
|
LocalImages::const_iterator i = localImages.constFind(key);
|
||||||
|
if (i == localImages.cend()) {
|
||||||
|
i = localImages.insert(key, new Image(file, format));
|
||||||
|
}
|
||||||
|
return i.value();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Image *getImage(const QString &url, QSize box) {
|
||||||
|
QString key = qsl("//:%1//:%2//:").arg(box.width()).arg(box.height()) + url;
|
||||||
|
auto i = webImages.constFind(key);
|
||||||
|
if (i == webImages.cend()) {
|
||||||
|
i = webImages.insert(key, new WebImage(url, box));
|
||||||
|
}
|
||||||
|
return i.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
Image *getImage(const QByteArray &filecontent, QByteArray format) {
|
||||||
|
return new Image(filecontent, format);
|
||||||
|
}
|
||||||
|
|
||||||
|
Image *getImage(const QPixmap &pixmap, QByteArray format) {
|
||||||
|
return new Image(pixmap, format);
|
||||||
|
}
|
||||||
|
|
||||||
|
Image *getImage(const QByteArray &filecontent, QByteArray format, const QPixmap &pixmap) {
|
||||||
|
return new Image(filecontent, format, pixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
Image *getImage(int32 width, int32 height) {
|
||||||
|
return new DelayedStorageImage(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
StorageImage *getImage(const StorageImageLocation &location, int32 size) {
|
||||||
|
StorageKey key(storageKey(location));
|
||||||
|
StorageImages::const_iterator i = storageImages.constFind(key);
|
||||||
|
if (i == storageImages.cend()) {
|
||||||
|
i = storageImages.insert(key, new StorageImage(location, size));
|
||||||
|
}
|
||||||
|
return i.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
StorageImage *getImage(const StorageImageLocation &location, const QByteArray &bytes) {
|
||||||
|
StorageKey key(storageKey(location));
|
||||||
|
StorageImages::const_iterator i = storageImages.constFind(key);
|
||||||
|
if (i == storageImages.cend()) {
|
||||||
|
QByteArray bytesArr(bytes);
|
||||||
|
i = storageImages.insert(key, new StorageImage(location, bytesArr));
|
||||||
|
} else if (!i.value()->loaded()) {
|
||||||
|
QByteArray bytesArr(bytes);
|
||||||
|
i.value()->setData(bytesArr);
|
||||||
|
if (!location.isNull()) {
|
||||||
|
Local::writeImage(key, StorageImageSaved(mtpToStorageType(mtpc_storage_filePartial), bytes));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace internal
|
||||||
|
|
||||||
ReadAccessEnabler::ReadAccessEnabler(const PsFileBookmark *bookmark) : _bookmark(bookmark), _failed(_bookmark ? !_bookmark->enable() : false) {
|
ReadAccessEnabler::ReadAccessEnabler(const PsFileBookmark *bookmark) : _bookmark(bookmark), _failed(_bookmark ? !_bookmark->enable() : false) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -231,12 +231,6 @@ private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Image *getImage(const QString &file, QByteArray format);
|
|
||||||
Image *getImage(const QByteArray &filecontent, QByteArray format);
|
|
||||||
Image *getImage(const QPixmap &pixmap, QByteArray format);
|
|
||||||
Image *getImage(const QByteArray &filecontent, QByteArray format, const QPixmap &pixmap);
|
|
||||||
Image *getImage(int32 width, int32 height);
|
|
||||||
|
|
||||||
typedef QPair<uint64, uint64> StorageKey;
|
typedef QPair<uint64, uint64> StorageKey;
|
||||||
inline uint64 storageMix32To64(int32 a, int32 b) {
|
inline uint64 storageMix32To64(int32 a, int32 b) {
|
||||||
return (uint64(*reinterpret_cast<uint32*>(&a)) << 32) | uint64(*reinterpret_cast<uint32*>(&b));
|
return (uint64(*reinterpret_cast<uint32*>(&a)) << 32) | uint64(*reinterpret_cast<uint32*>(&b));
|
||||||
|
@ -300,10 +294,10 @@ public:
|
||||||
StorageImage(const StorageImageLocation &location, int32 size = 0);
|
StorageImage(const StorageImageLocation &location, int32 size = 0);
|
||||||
StorageImage(const StorageImageLocation &location, QByteArray &bytes);
|
StorageImage(const StorageImageLocation &location, QByteArray &bytes);
|
||||||
|
|
||||||
virtual void setInformation(int32 size, int32 width, int32 height);
|
void setInformation(int32 size, int32 width, int32 height) override;
|
||||||
virtual FileLoader *createLoader(LoadFromCloudSetting fromCloud, bool autoLoading);
|
FileLoader *createLoader(LoadFromCloudSetting fromCloud, bool autoLoading) override;
|
||||||
|
|
||||||
virtual const StorageImageLocation &location() const {
|
const StorageImageLocation &location() const override {
|
||||||
return _location;
|
return _location;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -311,8 +305,8 @@ protected:
|
||||||
StorageImageLocation _location;
|
StorageImageLocation _location;
|
||||||
int32 _size;
|
int32 _size;
|
||||||
|
|
||||||
virtual int32 countWidth() const;
|
int32 countWidth() const override;
|
||||||
virtual int32 countHeight() const;
|
int32 countHeight() const override;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -349,52 +343,61 @@ private:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
StorageImage *getImage(const StorageImageLocation &location, int32 size = 0);
|
|
||||||
StorageImage *getImage(const StorageImageLocation &location, const QByteArray &bytes);
|
|
||||||
Image *getImage(int32 width, int32 height, const MTPFileLocation &location);
|
|
||||||
|
|
||||||
class WebImage : public RemoteImage {
|
class WebImage : public RemoteImage {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
WebImage(const QString &url);
|
// If !box.isEmpty() then resize the image to fit in this box.
|
||||||
|
WebImage(const QString &url, QSize box = QSize());
|
||||||
|
|
||||||
virtual void setInformation(int32 size, int32 width, int32 height);
|
void setInformation(int32 size, int32 width, int32 height) override;
|
||||||
virtual FileLoader *createLoader(LoadFromCloudSetting fromCloud, bool autoLoading);
|
FileLoader *createLoader(LoadFromCloudSetting fromCloud, bool autoLoading) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual int32 countWidth() const;
|
int32 countWidth() const override;
|
||||||
virtual int32 countHeight() const;
|
int32 countHeight() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString _url;
|
QString _url;
|
||||||
|
QSize _box;
|
||||||
int32 _size, _width, _height;
|
int32 _size, _width, _height;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
WebImage *getImage(const QUrl &url);
|
namespace internal {
|
||||||
|
Image *getImage(const QString &file, QByteArray format);
|
||||||
|
Image *getImage(const QString &url, QSize box);
|
||||||
|
Image *getImage(const QByteArray &filecontent, QByteArray format);
|
||||||
|
Image *getImage(const QPixmap &pixmap, QByteArray format);
|
||||||
|
Image *getImage(const QByteArray &filecontent, QByteArray format, const QPixmap &pixmap);
|
||||||
|
Image *getImage(int32 width, int32 height);
|
||||||
|
StorageImage *getImage(const StorageImageLocation &location, int32 size = 0);
|
||||||
|
StorageImage *getImage(const StorageImageLocation &location, const QByteArray &bytes);
|
||||||
|
} // namespace internal
|
||||||
|
|
||||||
class ImagePtr : public ManagedPtr<Image> {
|
class ImagePtr : public ManagedPtr<Image> {
|
||||||
public:
|
public:
|
||||||
ImagePtr();
|
ImagePtr();
|
||||||
ImagePtr(const QString &file, QByteArray format = QByteArray()) : Parent(getImage(file, format)) {
|
ImagePtr(const QString &file, QByteArray format = QByteArray()) : Parent(internal::getImage(file, format)) {
|
||||||
}
|
}
|
||||||
ImagePtr(const QByteArray &filecontent, QByteArray format = QByteArray()) : Parent(getImage(filecontent, format)) {
|
ImagePtr(const QString &url, QSize box) : Parent(internal::getImage(url, box)) {
|
||||||
}
|
}
|
||||||
ImagePtr(const QByteArray &filecontent, QByteArray format, const QPixmap &pixmap) : Parent(getImage(filecontent, format, pixmap)) {
|
ImagePtr(const QByteArray &filecontent, QByteArray format = QByteArray()) : Parent(internal::getImage(filecontent, format)) {
|
||||||
}
|
}
|
||||||
ImagePtr(const QPixmap &pixmap, QByteArray format) : Parent(getImage(pixmap, format)) {
|
ImagePtr(const QByteArray &filecontent, QByteArray format, const QPixmap &pixmap) : Parent(internal::getImage(filecontent, format, pixmap)) {
|
||||||
}
|
}
|
||||||
ImagePtr(const StorageImageLocation &location, int32 size = 0) : Parent(getImage(location, size)) {
|
ImagePtr(const QPixmap &pixmap, QByteArray format) : Parent(internal::getImage(pixmap, format)) {
|
||||||
}
|
}
|
||||||
ImagePtr(const StorageImageLocation &location, const QByteArray &bytes) : Parent(getImage(location, bytes)) {
|
ImagePtr(const StorageImageLocation &location, int32 size = 0) : Parent(internal::getImage(location, size)) {
|
||||||
|
}
|
||||||
|
ImagePtr(const StorageImageLocation &location, const QByteArray &bytes) : Parent(internal::getImage(location, bytes)) {
|
||||||
}
|
}
|
||||||
ImagePtr(int32 width, int32 height, const MTPFileLocation &location, ImagePtr def = ImagePtr());
|
ImagePtr(int32 width, int32 height, const MTPFileLocation &location, ImagePtr def = ImagePtr());
|
||||||
ImagePtr(int32 width, int32 height) : Parent(getImage(width, height)) {
|
ImagePtr(int32 width, int32 height) : Parent(internal::getImage(width, height)) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline QSize resizeKeepAspect(int32 width, int32 height, int32 towidth, int32 toheight) {
|
inline QSize shrinkToKeepAspect(int32 width, int32 height, int32 towidth, int32 toheight) {
|
||||||
int32 w = qMax(width, 1), h = qMax(height, 1);
|
int32 w = qMax(width, 1), h = qMax(height, 1);
|
||||||
if (w * toheight > h * towidth) {
|
if (w * toheight > h * towidth) {
|
||||||
h = qRound(h * towidth / float64(w));
|
h = qRound(h * towidth / float64(w));
|
||||||
|
|
Loading…
Reference in New Issue