From 17baac710ebc6dd2f2e4ad726384a36afed60304 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Mon, 7 Oct 2019 14:34:40 +0300
Subject: [PATCH] Fix save dialog in macOS for streamed videos.

---
 Telegram/SourceFiles/core/application.cpp     |  6 +++++
 Telegram/SourceFiles/core/application.h       |  1 +
 Telegram/SourceFiles/core/file_utilities.cpp  | 22 +++++++++++--------
 .../media/view/media_view_overlay_widget.cpp  | 17 +++++++++-----
 .../media/view/media_view_overlay_widget.h    |  2 ++
 5 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp
index a2b99e6cd..1d0a23af7 100644
--- a/Telegram/SourceFiles/core/application.cpp
+++ b/Telegram/SourceFiles/core/application.cpp
@@ -729,6 +729,12 @@ QWidget *Application::getFileDialogParent() {
 		: nullptr;
 }
 
+void Application::notifyFileDialogShown(bool shown) {
+	if (_mediaView) {
+		_mediaView->notifyFileDialogShown(shown);
+	}
+}
+
 void Application::checkMediaViewActivation() {
 	if (_mediaView && !_mediaView->isHidden()) {
 		_mediaView->activateWindow();
diff --git a/Telegram/SourceFiles/core/application.h b/Telegram/SourceFiles/core/application.h
index 84b9edabe..8ee6961c3 100644
--- a/Telegram/SourceFiles/core/application.h
+++ b/Telegram/SourceFiles/core/application.h
@@ -99,6 +99,7 @@ public:
 	bool closeActiveWindow();
 	bool minimizeActiveWindow();
 	QWidget *getFileDialogParent();
+	void notifyFileDialogShown(bool shown);
 
 	// Media view interface.
 	void checkMediaViewActivation();
diff --git a/Telegram/SourceFiles/core/file_utilities.cpp b/Telegram/SourceFiles/core/file_utilities.cpp
index 0434d5599..3b0591df6 100644
--- a/Telegram/SourceFiles/core/file_utilities.cpp
+++ b/Telegram/SourceFiles/core/file_utilities.cpp
@@ -360,11 +360,13 @@ bool GetDefault(
 		Platform::FileDialog::InitLastPath();
 	}
 
-    remoteContent = QByteArray();
+	remoteContent = QByteArray();
 	if (startFile.isEmpty() || startFile.at(0) != '/') {
 		startFile = cDialogLastPath() + '/' + startFile;
 	}
 	QString file;
+
+	Core::App().notifyFileDialogShown(true);
 	if (type == Type::ReadFiles) {
 		files = QFileDialog::getOpenFileNames(Core::App().getFileDialogParent(), caption, startFile, filter);
 		QString path = files.isEmpty() ? QString() : QFileInfo(files.back()).absoluteDir().absolutePath();
@@ -373,17 +375,19 @@ bool GetDefault(
 			Local::writeUserSettings();
 		}
 		return !files.isEmpty();
-    } else if (type == Type::ReadFolder) {
+	} else if (type == Type::ReadFolder) {
 		file = QFileDialog::getExistingDirectory(Core::App().getFileDialogParent(), caption, startFile);
-    } else if (type == Type::WriteFile) {
+	} else if (type == Type::WriteFile) {
 		file = QFileDialog::getSaveFileName(Core::App().getFileDialogParent(), caption, startFile, filter);
-    } else {
+	} else {
 		file = QFileDialog::getOpenFileName(Core::App().getFileDialogParent(), caption, startFile, filter);
-    }
-    if (file.isEmpty()) {
-        files = QStringList();
-        return false;
-    }
+	}
+	Core::App().notifyFileDialogShown(false);
+
+	if (file.isEmpty()) {
+		files = QStringList();
+		return false;
+	}
 	if (type != Type::ReadFolder) {
 		// Save last used directory for all queries except directory choosing.
 		auto path = QFileInfo(file).absoluteDir().absolutePath();
diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp
index 9aa9e6cc9..ad3109ef1 100644
--- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp
+++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp
@@ -1095,6 +1095,17 @@ void OverlayWidget::onToMessage() {
 	}
 }
 
+void OverlayWidget::notifyFileDialogShown(bool shown) {
+	if (shown && isHidden()) {
+		return;
+	}
+	if (shown) {
+		Ui::Platform::BringToBack(this);
+	} else {
+		Ui::Platform::ShowOverAll(this);
+	}
+}
+
 void OverlayWidget::onSaveAs() {
 	QString file;
 	if (_doc) {
@@ -1116,9 +1127,7 @@ void OverlayWidget::onSaveAs() {
 				filter = mimeType.filterString() + qsl(";;") + FileDialog::AllFilesFilter();
 			}
 
-			Ui::Platform::BringToBack(this);
 			file = FileNameForSave(tr::lng_save_file(tr::now), filter, qsl("doc"), name, true, alreadyDir);
-			Ui::Platform::ShowOverAll(this);
 			if (!file.isEmpty() && file != location.name()) {
 				if (_doc->data().isEmpty()) {
 					QFile(file).remove();
@@ -1142,7 +1151,6 @@ void OverlayWidget::onSaveAs() {
 	} else {
 		if (!_photo || !_photo->loaded()) return;
 
-		Ui::Platform::BringToBack(this);
 		auto filter = qsl("JPEG Image (*.jpg);;") + FileDialog::AllFilesFilter();
 		FileDialog::GetWritePath(
 			this,
@@ -1158,9 +1166,6 @@ void OverlayWidget::onSaveAs() {
 				if (!result.isEmpty() && _photo == photo && photo->loaded()) {
 					photo->large()->original().save(result, "JPG");
 				}
-				Ui::Platform::ShowOverAll(this);
-			}), crl::guard(this, [=] {
-				Ui::Platform::ShowOverAll(this);
 			}));
 	}
 	activateWindow();
diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h
index e5be29ad4..7c3152a13 100644
--- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h
+++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h
@@ -92,6 +92,8 @@ public:
 
 	PeerData *ui_getPeerForMouseAction();
 
+	void notifyFileDialogShown(bool shown);
+
 	void clearData();
 
 	~OverlayWidget();