From e43ea5101ed9289fe870c42f57f1b15d7b2a5600 Mon Sep 17 00:00:00 2001 From: John Preston <johnprestonmail@gmail.com> Date: Sat, 2 Jan 2016 07:43:41 +0800 Subject: [PATCH] resizing inline results to small heights started, fixed sticker with reply display --- Telegram/SourceFiles/dropdown.cpp | 55 +++++++++++++++++++++++-------- Telegram/SourceFiles/dropdown.h | 8 +++-- Telegram/SourceFiles/history.cpp | 10 +++--- 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/Telegram/SourceFiles/dropdown.cpp b/Telegram/SourceFiles/dropdown.cpp index 85dfa1047..5767a3b10 100644 --- a/Telegram/SourceFiles/dropdown.cpp +++ b/Telegram/SourceFiles/dropdown.cpp @@ -1252,8 +1252,8 @@ void StickerPanInner::setScrollTop(int top) { updateSelected(); } -int StickerPanInner::countHeight() { - int result = 0, minLastH = _maxHeight - st::stickerPanPadding; +int32 StickerPanInner::countHeight(bool plain) { + int result = 0, minLastH = plain ? 0 : (_maxHeight - st::stickerPanPadding); if (_showingInlineItems) { result = st::emojiPanHeader; for (int i = 0, l = _inlineRows.count(); i < l; ++i) { @@ -1876,20 +1876,27 @@ uint64 StickerPanInner::currentSet(int yOffset) const { return _sets.isEmpty() ? RecentStickerSetId : _sets.back().id; } +void StickerPanInner::hideInlineRowsPanel() { + clearInlineRows(false); + if (_showingInlineItems) { + _showingSavedGifs = cShowingSavedGifs(); + if (_showingSavedGifs) { + refreshSavedGifs(); + emit scrollToY(0); + emit scrollUpdated(); + } else { + showStickerSet(RecentStickerSetId); + } + } +} + void StickerPanInner::refreshInlineRows(UserData *bot, const InlineResults &results, bool resultsDeleted) { int32 count = results.size(), until = 0, untilrow = 0, untilcol = 0; if (!count) { - clearInlineRows(resultsDeleted); - if (_showingInlineItems) { - _showingSavedGifs = cShowingSavedGifs(); - if (_showingSavedGifs) { - refreshSavedGifs(); - emit scrollToY(0); - emit scrollUpdated(); - } else { - showStickerSet(RecentStickerSetId); - } + if (resultsDeleted) { + clearInlineRows(true); } + emit emptyInlineRows(); return; } @@ -2559,6 +2566,8 @@ EmojiPan::EmojiPan(QWidget *parent) : TWidget(parent) , _iconSelX(0, 0) , _iconsStartAnim(0) , _stickersShown(false) +, _shownFromInlineQuery(false) +, _contentMaxHeight(st::emojiPanMaxHeight) , _a_slide(animation(this, &EmojiPan::step_slide)) , e_scroll(this, st::emojiScroll) , e_inner() @@ -2620,6 +2629,8 @@ EmojiPan::EmojiPan(QWidget *parent) : TWidget(parent) connect(&s_inner, SIGNAL(selected(PhotoData*)), this, SIGNAL(photoSelected(PhotoData*))); connect(&s_inner, SIGNAL(selected(InlineResult*,UserData*)), this, SIGNAL(inlineResultSelected(InlineResult*,UserData*))); + connect(&s_inner, SIGNAL(emptyInlineRows()), this, SLOT(onEmptyInlineRows())); + connect(&s_switch, SIGNAL(clicked()), this, SLOT(onSwitch())); connect(&e_switch, SIGNAL(clicked()), this, SLOT(onSwitch())); s_switch.moveToRight(0, 0, st::emojiPanWidth); @@ -2648,7 +2659,7 @@ EmojiPan::EmojiPan(QWidget *parent) : TWidget(parent) } void EmojiPan::setMaxHeight(int32 h) { - h = qMin(int(st::emojiPanMaxHeight), h); + h = qMin(_contentMaxHeight, h); int32 he = h - st::rbEmoji.height; int32 hs = h - (s_inner.showSectionIcons() ? st::rbEmoji.height : 0); if (h == _maxHeight && he == _maxHeightEmoji && hs == _maxHeightStickers) return; @@ -3170,6 +3181,8 @@ void EmojiPan::hideStart() { } void EmojiPan::hideAnimated() { + if (_hiding) return; + if (_cache.isNull()) { QPixmap from = _fromCache, to = _toCache; _fromCache = _toCache = QPixmap(); @@ -3219,9 +3232,13 @@ void EmojiPan::showStart() { e_inner.refreshRecent(); if (s_inner.inlineResultsShown() && refreshInlineRows()) { _stickersShown = true; + _shownFromInlineQuery = true; + _contentMaxHeight = qMin(s_inner.countHeight(true), int(st::emojiPanMaxHeight)); } else { s_inner.refreshRecent(); _stickersShown = false; + _shownFromInlineQuery = false; + _contentMaxHeight = st::emojiPanMaxHeight; } s_inner.preloadImages(); setMaxHeight(_maxHeight); @@ -3706,6 +3723,14 @@ void EmojiPan::onInlineRequest() { _inlineRequestId = MTP::send(MTPmessages_GetInlineBotResults(_inlineBot->inputUser, MTP_string(_inlineQuery), MTP_string(nextOffset)), rpcDone(&EmojiPan::inlineResultsDone), rpcFail(&EmojiPan::inlineResultsFail)); } +void EmojiPan::onEmptyInlineRows() { + if (_shownFromInlineQuery) { + hideAnimated(); + } else { + s_inner.hideInlineRowsPanel(); + } +} + bool EmojiPan::refreshInlineRows() { bool clear = true; InlineCache::const_iterator i = _inlineCache.constFind(_inlineQuery); @@ -3726,6 +3751,10 @@ void EmojiPan::showInlineRows(bool newResults) { e_switch.moveToRight(0, 0, st::emojiPanWidth); bool hidden = isHidden(); + if (!hidden && _shownFromInlineQuery && !clear) { + _contentMaxHeight = qMax(s_inner.countHeight(true), int(st::emojiPanMaxHeight)); + setMaxHeight(_maxHeight); + } if (clear && !hidden && _stickersShown && s_inner.inlineResultsShown()) { hideAnimated(); } else if (!clear) { diff --git a/Telegram/SourceFiles/dropdown.h b/Telegram/SourceFiles/dropdown.h index 75ce7c634..1d749e2ac 100644 --- a/Telegram/SourceFiles/dropdown.h +++ b/Telegram/SourceFiles/dropdown.h @@ -347,6 +347,7 @@ public: void refreshInlineRows(UserData *bot, const InlineResults &results, bool resultsDeleted); void refreshRecent(); void inlineBotChanged(); + void hideInlineRowsPanel(); void fillIcons(QList<StickerIcon> &icons); void fillPanels(QVector<EmojiPanel*> &panels); @@ -364,6 +365,7 @@ public: bool inlineResultsShown() const { return _showingInlineItems && !_showingSavedGifs; } + int32 countHeight(bool plain = false); ~StickerPanInner() { clearInlineRows(true); @@ -387,6 +389,7 @@ signals: void removing(quint64 setId); void refreshIcons(); + void emptyInlineRows(); void switchToEmoji(); @@ -406,7 +409,6 @@ private: void appendSet(uint64 setId); - int32 countHeight(); void selectEmoji(EmojiPtr emoji); QRect stickerRect(int tab, int sel); @@ -608,6 +610,7 @@ public slots: void onSaveConfigDelayed(int32 delay); void onInlineRequest(); + void onEmptyInlineRows(); signals: @@ -664,7 +667,8 @@ private: anim::ivalue _iconsX, _iconSelX; uint64 _iconsStartAnim; - bool _stickersShown; + bool _stickersShown, _shownFromInlineQuery; + int32 _contentMaxHeight; QPixmap _fromCache, _toCache; anim::ivalue a_fromCoord, a_toCoord; anim::fvalue a_fromAlpha, a_toAlpha; diff --git a/Telegram/SourceFiles/history.cpp b/Telegram/SourceFiles/history.cpp index ca81b46b1..160fd9f55 100644 --- a/Telegram/SourceFiles/history.cpp +++ b/Telegram/SourceFiles/history.cpp @@ -6554,12 +6554,12 @@ int32 HistoryMessage::resize(int32 width) { if (width < st::msgMinWidth) return _height; width -= st::msgMargin.left() + st::msgMargin.right(); + if (width < st::msgPadding.left() + st::msgPadding.right() + 1) { + width = st::msgPadding.left() + st::msgPadding.right() + 1; + } else if (width > st::msgMaxWidth) { + width = st::msgMaxWidth; + } if (drawBubble()) { - if (width < st::msgPadding.left() + st::msgPadding.right() + 1) { - width = st::msgPadding.left() + st::msgPadding.right() + 1; - } else if (width > st::msgMaxWidth) { - width = st::msgMaxWidth; - } bool media = (_media && _media->isDisplayed()); if (width >= _maxw) { _height = _minh;