From a7b1d83a3c96d026fa151cc549c9b3a48f4a27b8 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 6 Sep 2018 14:33:24 +0300 Subject: [PATCH] Add upload new profile photo button to settings. --- .../SourceFiles/settings/settings_main.cpp | 106 +++++++++++++----- Telegram/SourceFiles/settings/settings_main.h | 1 - 2 files changed, 81 insertions(+), 26 deletions(-) diff --git a/Telegram/SourceFiles/settings/settings_main.cpp b/Telegram/SourceFiles/settings/settings_main.cpp index f803a7f99..ca2840ac2 100644 --- a/Telegram/SourceFiles/settings/settings_main.cpp +++ b/Telegram/SourceFiles/settings/settings_main.cpp @@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/language_box.h" #include "boxes/confirm_box.h" #include "boxes/about_box.h" +#include "boxes/photo_crop_box.h" #include "ui/wrap/vertical_layout.h" #include "ui/wrap/padding_wrap.h" #include "ui/widgets/labels.h" @@ -22,6 +23,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "storage/localstorage.h" #include "auth_session.h" #include "apiwrap.h" +#include "core/file_utilities.h" #include "styles/style_settings.h" namespace Settings { @@ -37,6 +39,57 @@ void AddDivider(not_null container) { container->add(object_ptr(container)); } +void SetupUploadPhotoButton( + not_null container, + not_null self) { + AddDivider(container); + AddSkip(container); + + const auto upload = [=] { + const auto imageExtensions = cImgExtensions(); + const auto filter = qsl("Image files (*") + + imageExtensions.join(qsl(" *")) + + qsl(");;") + + FileDialog::AllFilesFilter(); + const auto callback = [=](const FileDialog::OpenResult &result) { + if (result.paths.isEmpty() && result.remoteContent.isEmpty()) { + return; + } + + const auto image = result.remoteContent.isEmpty() + ? App::readImage(result.paths.front()) + : App::readImage(result.remoteContent); + if (image.isNull() + || image.width() > 10 * image.height() + || image.height() > 10 * image.width()) { + Ui::show(Box(lang(lng_bad_photo))); + return; + } + + auto box = Ui::show(Box(image, self)); + box->ready( + ) | rpl::start_with_next([=](QImage &&image) { + Auth().api().uploadPeerPhoto(self, std::move(image)); + }, box->lifetime()); + }; + FileDialog::GetOpenPath( + container.get(), + lang(lng_choose_image), + filter, + crl::guard(container, callback)); + }; + container->add(object_ptr