From b201a5a97583dc5aa1151e3fce3c43b46b738c40 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Mon, 4 Jan 2016 19:13:25 +0800
Subject: [PATCH] stable version 0.9.16 - new design of media, gifs and inline
 bots

---
 Telegram/SourceFiles/application.cpp        |  2 +-
 Telegram/SourceFiles/config.h               |  6 ++--
 Telegram/SourceFiles/dropdown.cpp           | 36 ++++++++++++++-------
 Telegram/SourceFiles/dropdown.h             |  8 ++---
 Telegram/SourceFiles/layout.cpp             | 17 ++++++++--
 Telegram/SourceFiles/layout.h               |  4 +--
 Telegram/Telegram.plist                     |  2 +-
 Telegram/Telegram.rc                        |  8 ++---
 Telegram/Telegram.xcodeproj/project.pbxproj | 12 +++----
 Telegram/Version                            |  8 ++---
 10 files changed, 64 insertions(+), 39 deletions(-)

diff --git a/Telegram/SourceFiles/application.cpp b/Telegram/SourceFiles/application.cpp
index 9313e0b85..ca89de07c 100644
--- a/Telegram/SourceFiles/application.cpp
+++ b/Telegram/SourceFiles/application.cpp
@@ -708,7 +708,7 @@ void Application::checkMapVersion() {
 			if (cDevVersion() && Local::oldMapVersion() < 9016) {
 //				versionFeatures = QString::fromUtf8("\xe2\x80\x94 Sticker management: manually rearrange your sticker packs, pack order is now synced across all your devices\n\xe2\x80\x94 Click and hold on a sticker to preview it before sending\n\xe2\x80\x94 New context menu for chats in chats list\n\xe2\x80\x94 Support for all existing emoji");// .replace('@', qsl("@") + QChar(0x200D));
 				versionFeatures = lng_new_version_text(lt_gifs_link, qsl("https://telegram.org/blog/gif-revolution"), lt_bots_link, qsl("https://telegram.org/blog/inline-bots")).trimmed();
-			} else if (Local::oldMapVersion() < 9015) {
+			} else if (Local::oldMapVersion() < 9016) {
 				versionFeatures = lng_new_version_text(lt_gifs_link, qsl("https://telegram.org/blog/gif-revolution"), lt_bots_link, qsl("https://telegram.org/blog/inline-bots")).trimmed();
 			} else {
 				versionFeatures = lang(lng_new_version_minor).trimmed();
diff --git a/Telegram/SourceFiles/config.h b/Telegram/SourceFiles/config.h
index 724296734..e41af8366 100644
--- a/Telegram/SourceFiles/config.h
+++ b/Telegram/SourceFiles/config.h
@@ -20,10 +20,10 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org
 */
 #pragma once
 
-static const int32 AppVersion = 9015;
-static const wchar_t *AppVersionStr = L"0.9.15";
+static const int32 AppVersion = 9016;
+static const wchar_t *AppVersionStr = L"0.9.16";
 static const bool DevVersion = false;
-#define BETA_VERSION (9015008ULL) // just comment this line to build public version
+//#define BETA_VERSION (9015008ULL) // just comment this line to build public version
 
 static const wchar_t *AppNameOld = L"Telegram Win (Unofficial)";
 static const wchar_t *AppName = L"Telegram Desktop";
diff --git a/Telegram/SourceFiles/dropdown.cpp b/Telegram/SourceFiles/dropdown.cpp
index 0ccdfbf77..87d9fd97b 100644
--- a/Telegram/SourceFiles/dropdown.cpp
+++ b/Telegram/SourceFiles/dropdown.cpp
@@ -1663,14 +1663,14 @@ void StickerPanInner::refreshStickers() {
 	updateSelected();
 }
 
-void StickerPanInner::inlineRowsAddItem(DocumentData *savedGif, InlineResult *result, InlineRow &row, int32 &sumWidth) {
+bool StickerPanInner::inlineRowsAddItem(DocumentData *savedGif, InlineResult *result, InlineRow &row, int32 &sumWidth) {
 	LayoutInlineItem *layout = 0;
 	if (savedGif) {
 		layout = layoutPrepareSavedGif(savedGif, (_inlineRows.size() * MatrixRowShift) + row.items.size());
 	} else if (result) {
 		layout = layoutPrepareInlineResult(result, (_inlineRows.size() * MatrixRowShift) + row.items.size());
 	}
-	if (!layout) return;
+	if (!layout) return false;
 
 	layout->preload();
 	if (inlineRowFinalize(row, sumWidth, layout->fullLine())) {
@@ -1678,6 +1678,7 @@ void StickerPanInner::inlineRowsAddItem(DocumentData *savedGif, InlineResult *re
 	}
 	row.items.push_back(layout);
 	sumWidth += layout->maxWidth();
+	return true;
 }
 
 bool StickerPanInner::inlineRowFinalize(InlineRow &row, int32 &sumWidth, bool force) {
@@ -1770,7 +1771,7 @@ LayoutInlineItem *StickerPanInner::layoutPrepareInlineResult(InlineResult *resul
 			layout = new LayoutInlineGif(result, 0, false);
 		} else if (result->type == qstr("photo")) {
 			layout = new LayoutInlinePhoto(result, 0);
-		} else if (result->type == qstr("web_player_video")) {
+		} else if (result->type == qstr("video")) {
 			layout = new LayoutInlineWebVideo(result);
 		} else if (result->type == qstr("article")) {
 			layout = new LayoutInlineArticle(result, _inlineWithThumb);
@@ -1901,14 +1902,14 @@ void StickerPanInner::clearInlineRowsPanel() {
 	clearInlineRows(false);
 }
 
-void StickerPanInner::refreshInlineRows(UserData *bot, const InlineResults &results, bool resultsDeleted) {
+int32 StickerPanInner::refreshInlineRows(UserData *bot, const InlineResults &results, bool resultsDeleted) {
 	_inlineBot = bot;
 	if (results.isEmpty() && (!_inlineBot || _inlineBot->username != cInlineGifBotUsername())) {
 		if (resultsDeleted) {
 			clearInlineRows(true);
 		}
 		emit emptyInlineRows();
-		return;
+		return 0;
 	}
 
 	if (_showingInlineItems) {
@@ -1921,7 +1922,7 @@ void StickerPanInner::refreshInlineRows(UserData *bot, const InlineResults &resu
 	_showingInlineItems = true;
 	_showingSavedGifs = false;
 
-	int32 count = results.size(), from = validateExistingInlineRows(results);
+	int32 count = results.size(), from = validateExistingInlineRows(results), added = 0;
 
 	if (count) {
 		_inlineRows.reserve(count);
@@ -1929,7 +1930,9 @@ void StickerPanInner::refreshInlineRows(UserData *bot, const InlineResults &resu
 		row.items.reserve(SavedGifsMaxPerRow);
 		int32 sumWidth = 0;
 		for (int32 i = from; i < count; ++i) {
-			inlineRowsAddItem(0, results.at(i), row, sumWidth);
+			if (inlineRowsAddItem(0, results.at(i), row, sumWidth)) {
+				++added;
+			}
 		}
 		inlineRowFinalize(row, sumWidth, true);
 	}
@@ -1943,6 +1946,8 @@ void StickerPanInner::refreshInlineRows(UserData *bot, const InlineResults &resu
 		_lastMousePos = QCursor::pos();
 		updateSelected();
 	}
+
+	return added;
 }
 
 int32 StickerPanInner::validateExistingInlineRows(const InlineResults &results) {
@@ -3722,7 +3727,10 @@ void EmojiPan::inlineResultsDone(const MTPmessages_BotResults &result) {
 	} else if (adding) {
 		it.value()->nextOffset = QString();
 	}
-	showInlineRows(!adding);
+
+	if (!showInlineRows(!adding)) {
+		it.value()->nextOffset = QString();
+	}
 	onScroll();
 }
 
@@ -3782,7 +3790,7 @@ void EmojiPan::onEmptyInlineRows() {
 	}
 }
 
-bool EmojiPan::refreshInlineRows() {
+bool EmojiPan::refreshInlineRows(int32 *added) {
 	bool clear = true;
 	InlineCache::const_iterator i = _inlineCache.constFind(_inlineQuery);
 	if (i != _inlineCache.cend()) {
@@ -3790,12 +3798,14 @@ bool EmojiPan::refreshInlineRows() {
 		_inlineNextOffset = i.value()->nextOffset;
 	}
 	if (clear) prepareShowHideCache();
-	s_inner.refreshInlineRows(_inlineBot, clear ? InlineResults() : i.value()->results, false);
+	int32 result = s_inner.refreshInlineRows(_inlineBot, clear ? InlineResults() : i.value()->results, false);
+	if (added) *added = result;
 	return !clear;
 }
 
-void EmojiPan::showInlineRows(bool newResults) {
-	bool clear = !refreshInlineRows();
+int32 EmojiPan::showInlineRows(bool newResults) {
+	int32 added = 0;
+	bool clear = !refreshInlineRows(&added);
 	if (newResults) s_scroll.scrollToY(0);
 
 	e_switch.updateText(clear ? QString() : _inlineBot->username);
@@ -3819,6 +3829,8 @@ void EmojiPan::showInlineRows(bool newResults) {
 			onSwitch();
 		}
 	}
+
+	return added;
 }
 
 void EmojiPan::recountContentMaxHeight() {
diff --git a/Telegram/SourceFiles/dropdown.h b/Telegram/SourceFiles/dropdown.h
index 9bbaf30ab..b0cac7d40 100644
--- a/Telegram/SourceFiles/dropdown.h
+++ b/Telegram/SourceFiles/dropdown.h
@@ -344,7 +344,7 @@ public:
 	void refreshStickers();
 	void refreshRecentStickers(bool resize = true);
 	void refreshSavedGifs();
-	void refreshInlineRows(UserData *bot, const InlineResults &results, bool resultsDeleted);
+	int32 refreshInlineRows(UserData *bot, const InlineResults &results, bool resultsDeleted);
 	void refreshRecent();
 	void inlineBotChanged();
 	void hideInlineRowsPanel();
@@ -458,7 +458,7 @@ private:
 	InlineLayouts _inlineLayouts;
 	LayoutInlineItem *layoutPrepareInlineResult(InlineResult *result, int32 position);
 
-	void inlineRowsAddItem(DocumentData *savedGif, InlineResult *result, InlineRow &row, int32 &sumWidth);
+	bool inlineRowsAddItem(DocumentData *savedGif, InlineResult *result, InlineRow &row, int32 &sumWidth);
 	bool inlineRowFinalize(InlineRow &row, int32 &sumWidth, bool force = false);
 
 	InlineRow &layoutInlineRow(InlineRow &row, int32 sumWidth = 0);
@@ -712,10 +712,10 @@ private:
 	QTimer _inlineRequestTimer;
 
 	void inlineBotChanged();
-	void showInlineRows(bool newResults);
+	int32 showInlineRows(bool newResults);
 	bool hideOnNoInlineResults();
 	void recountContentMaxHeight();
-	bool refreshInlineRows();
+	bool refreshInlineRows(int32 *added = 0);
 	UserData *_inlineBot;
 	QString _inlineQuery, _inlineNextQuery, _inlineNextOffset;
 	mtpRequestId _inlineRequestId;
diff --git a/Telegram/SourceFiles/layout.cpp b/Telegram/SourceFiles/layout.cpp
index 7f93461da..e987cb60e 100644
--- a/Telegram/SourceFiles/layout.cpp
+++ b/Telegram/SourceFiles/layout.cpp
@@ -1847,6 +1847,7 @@ void LayoutInlinePhoto::content_forget() {
 
 LayoutInlineWebVideo::LayoutInlineWebVideo(InlineResult *result) : LayoutInlineItem(result, 0, 0)
 , _send(new SendInlineItemLink())
+, _link(result->content_url.isEmpty() ? 0 : linkFromUrl(result->content_url))
 , _title(st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft - st::inlineThumbSize - st::inlineThumbSkip)
 , _description(st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft - st::inlineThumbSize - st::inlineThumbSkip) {
 	if (_result->duration) {
@@ -1904,8 +1905,13 @@ void LayoutInlineWebVideo::paint(Painter &p, const QRect &clip, uint32 selection
 }
 
 void LayoutInlineWebVideo::getState(TextLinkPtr &link, HistoryCursorState &cursor, int32 x, int32 y) const {
-	if (x >= 0 && x < _width && y >= 0 && y < _height) {
+	if (x >= 0 && x < st::inlineThumbSize && y >= st::inlineRowMargin && y < st::inlineRowMargin + st::inlineThumbSize) {
+		link = _link;
+		return;
+	}
+	if (x >= st::inlineThumbSize + st::inlineThumbSkip && x < _width && y >= 0 && y < _height) {
 		link = _send;
+		return;
 	}
 }
 
@@ -1934,6 +1940,7 @@ void LayoutInlineWebVideo::prepareThumb(int32 width, int32 height) const {
 LayoutInlineArticle::LayoutInlineArticle(InlineResult *result, bool withThumb) : LayoutInlineItem(result, 0, 0)
 , _send(new SendInlineItemLink())
 , _url(result->url.isEmpty() ? 0 : linkFromUrl(result->url))
+, _link(result->content_url.isEmpty() ? 0 : linkFromUrl(result->content_url))
 , _withThumb(withThumb)
 , _title(st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft - st::inlineThumbSize - st::inlineThumbSkip)
 , _description(st::emojiPanWidth - st::emojiScroll.width - st::inlineResultsLeft - st::inlineThumbSize - st::inlineThumbSkip) {
@@ -2033,7 +2040,12 @@ void LayoutInlineArticle::paint(Painter &p, const QRect &clip, uint32 selection,
 }
 
 void LayoutInlineArticle::getState(TextLinkPtr &link, HistoryCursorState &cursor, int32 x, int32 y) const {
-	if (x >= 0 && x < _width && y >= 0 && y < _height) {
+	int32 left = _withThumb ? (st::inlineThumbSize + st::inlineThumbSkip) : 0;
+	if (x >= 0 && x < left - st::inlineThumbSkip && y >= st::inlineRowMargin && y < st::inlineRowMargin + st::inlineThumbSize) {
+		link = _link;
+		return;
+	}
+	if (x >= left && x < _width && y >= 0 && y < _height) {
 		if (_url) {
 			int32 left = st::inlineThumbSize + st::inlineThumbSkip;
 			int32 titleHeight = qMin(_title.countHeight(_width - left), st::semiboldFont->height * 2);
@@ -2045,6 +2057,7 @@ void LayoutInlineArticle::getState(TextLinkPtr &link, HistoryCursorState &cursor
 			}
 		}
 		link = _send;
+		return;
 	}
 }
 
diff --git a/Telegram/SourceFiles/layout.h b/Telegram/SourceFiles/layout.h
index 5b790b3f1..0b346456c 100644
--- a/Telegram/SourceFiles/layout.h
+++ b/Telegram/SourceFiles/layout.h
@@ -666,7 +666,7 @@ public:
 
 private:
 
-	TextLinkPtr _send;
+	TextLinkPtr _send, _link;
 
 	mutable QPixmap _thumb;
 	Text _title, _description;
@@ -689,7 +689,7 @@ public:
 
 private:
 
-	TextLinkPtr _send, _url;
+	TextLinkPtr _send, _url, _link;
 
 	bool _withThumb;
 	mutable QPixmap _thumb;
diff --git a/Telegram/Telegram.plist b/Telegram/Telegram.plist
index 5da30bd6d..544089e81 100644
--- a/Telegram/Telegram.plist
+++ b/Telegram/Telegram.plist
@@ -11,7 +11,7 @@
 	<key>CFBundlePackageType</key>
 	<string>APPL</string>
 	<key>CFBundleShortVersionString</key>
-	<string>0.9.15</string>
+	<string>0.9.16</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleURLTypes</key>
diff --git a/Telegram/Telegram.rc b/Telegram/Telegram.rc
index f08a08ce3..934f5c678 100644
--- a/Telegram/Telegram.rc
+++ b/Telegram/Telegram.rc
@@ -34,8 +34,8 @@ IDI_ICON1               ICON                    "SourceFiles\\art\\icon256.ico"
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,9,15,8
- PRODUCTVERSION 0,9,15,8
+ FILEVERSION 0,9,16,0
+ PRODUCTVERSION 0,9,16,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -51,10 +51,10 @@ BEGIN
         BLOCK "040904b0"
         BEGIN
             VALUE "CompanyName", "Telegram Messenger LLP"
-            VALUE "FileVersion", "0.9.15.8"
+            VALUE "FileVersion", "0.9.16.0"
             VALUE "LegalCopyright", "Copyright (C) 2013"
             VALUE "ProductName", "Telegram Desktop"
-            VALUE "ProductVersion", "0.9.15.8"
+            VALUE "ProductVersion", "0.9.16.0"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/Telegram/Telegram.xcodeproj/project.pbxproj b/Telegram/Telegram.xcodeproj/project.pbxproj
index 6d3bd7db4..c8738b710 100644
--- a/Telegram/Telegram.xcodeproj/project.pbxproj
+++ b/Telegram/Telegram.xcodeproj/project.pbxproj
@@ -1701,7 +1701,7 @@
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 0.9.15;
+				CURRENT_PROJECT_VERSION = 0.9.16;
 				DEBUG_INFORMATION_FORMAT = dwarf;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
 				GCC_OPTIMIZATION_LEVEL = 0;
@@ -1720,7 +1720,7 @@
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				COPY_PHASE_STRIP = YES;
-				CURRENT_PROJECT_VERSION = 0.9.15;
+				CURRENT_PROJECT_VERSION = 0.9.16;
 				GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
 				GCC_OPTIMIZATION_LEVEL = fast;
 				GCC_PREFIX_HEADER = ./SourceFiles/stdafx.h;
@@ -1747,10 +1747,10 @@
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				CODE_SIGN_IDENTITY = "";
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 0.9.15;
+				CURRENT_PROJECT_VERSION = 0.9.16;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DYLIB_COMPATIBILITY_VERSION = 0.9;
-				DYLIB_CURRENT_VERSION = 0.9.15;
+				DYLIB_CURRENT_VERSION = 0.9.16;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				FRAMEWORK_SEARCH_PATHS = "";
 				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
@@ -1882,10 +1882,10 @@
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				CODE_SIGN_IDENTITY = "";
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 0.9.15;
+				CURRENT_PROJECT_VERSION = 0.9.16;
 				DEBUG_INFORMATION_FORMAT = dwarf;
 				DYLIB_COMPATIBILITY_VERSION = 0.9;
-				DYLIB_CURRENT_VERSION = 0.9.15;
+				DYLIB_CURRENT_VERSION = 0.9.16;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
 				FRAMEWORK_SEARCH_PATHS = "";
diff --git a/Telegram/Version b/Telegram/Version
index f3c04a2ab..8f5c67a00 100644
--- a/Telegram/Version
+++ b/Telegram/Version
@@ -1,6 +1,6 @@
-AppVersion         9015
+AppVersion         9016
 AppVersionStrMajor 0.9
-AppVersionStrSmall 0.9.15
-AppVersionStr      0.9.15
+AppVersionStrSmall 0.9.16
+AppVersionStr      0.9.16
 DevChannel         0
-BetaVersion        9015008
+BetaVersion        0 9015008