diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index e8d4a5b914..d4c43a97f1 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -1039,6 +1039,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_edit_privacy_forwards_always_empty" = "Always allow"; "lng_edit_privacy_forwards_never_empty" = "Never allow"; "lng_edit_privacy_forwards_exceptions" = "These settings will override the values above."; +"lng_edit_privacy_forwards_exceptions_everyone" = "You can add users or entire groups which will not see your profile photo."; +"lng_edit_privacy_forwards_exceptions_nobody" = "Add users or entire groups which will still see your profile photo."; "lng_edit_privacy_forwards_always_title" = "Always allow"; "lng_edit_privacy_forwards_never_title" = "Never allow"; "lng_edit_privacy_forwards_sample_message" = "Reinhardt, we need to find you some new tunes 🎶"; @@ -1053,6 +1055,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_edit_privacy_profile_photo_exceptions" = "These settings will override the values above."; "lng_edit_privacy_profile_photo_always_title" = "Always allow"; "lng_edit_privacy_profile_photo_never_title" = "Never allow"; +"lng_edit_privacy_profile_photo_public_set" = "Set Public Photo"; +"lng_edit_privacy_profile_photo_public_update" = "Update Public Photo"; +"lng_edit_privacy_profile_photo_public_remove" = "Remove Public Photo"; +"lng_edit_privacy_profile_photo_public_about" = "You can upload a public photo for those who are restricted from viewing your real profile photo."; +"lng_edit_privacy_profile_photo_public_toast" = "This photo is now set for those who are restricted from viewing your main photo."; "lng_edit_privacy_voices_title" = "Voice messages settings"; "lng_edit_privacy_voices_header" = "Who can send me voice messages"; @@ -1183,6 +1190,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_profile_info_section" = "Info"; "lng_info_tab_media" = "Media"; +"lng_info_public_photo" = "public photo"; "lng_info_mobile_label" = "Mobile"; "lng_info_mobile_hidden" = "Hidden"; "lng_info_username_label" = "Username"; @@ -2468,6 +2476,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_mediaview_group_photo" = "Group Photo"; "lng_mediaview_channel_photo" = "Channel Photo"; "lng_mediaview_profile_photo" = "Profile Photo"; +"lng_mediaview_profile_public_photo" = "Public Photo"; "lng_mediaview_file_n_of_amount" = "{file} {n} of {amount}"; "lng_mediaview_n_of_amount" = "Photo {n} of {amount}"; "lng_mediaview_doc_image" = "File"; diff --git a/Telegram/SourceFiles/boxes/edit_privacy_box.cpp b/Telegram/SourceFiles/boxes/edit_privacy_box.cpp index 075958f53e..69aa79d169 100644 --- a/Telegram/SourceFiles/boxes/edit_privacy_box.cpp +++ b/Telegram/SourceFiles/boxes/edit_privacy_box.cpp @@ -276,6 +276,11 @@ void EditPrivacyBox::setupContent() { ? tr::lng_edit_privacy_exceptions_count(tr::now, lt_count, count) : tr::lng_edit_privacy_exceptions_add(tr::now); }); + _controller->handleExceptionsChange( + exception, + update->events_starting_with({}) | rpl::map([=] { + return Settings::ExceptionUsersCount(exceptions(exception)); + })); auto text = _controller->exceptionButtonTextKey(exception); const auto always = (exception == Exception::Always); const auto button = content->add( diff --git a/Telegram/SourceFiles/boxes/edit_privacy_box.h b/Telegram/SourceFiles/boxes/edit_privacy_box.h index fad806fbb3..6a78c41ae5 100644 --- a/Telegram/SourceFiles/boxes/edit_privacy_box.h +++ b/Telegram/SourceFiles/boxes/edit_privacy_box.h @@ -57,6 +57,10 @@ public: Exception exception) const = 0; [[nodiscard]] virtual auto exceptionsDescription() const -> rpl::producer = 0; + virtual void handleExceptionsChange( + Exception exception, + rpl::producer value) { + } [[nodiscard]] virtual object_ptr setupAboveWidget( not_null parent, @@ -72,7 +76,7 @@ public: } [[nodiscard]] virtual object_ptr setupBelowWidget( not_null controller, - not_null parent) const { + not_null parent) { return { nullptr }; } diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 3dc8fe6522..3e37c05211 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -4930,16 +4930,24 @@ void OverlayWidget::updateHeader() { lt_amount, QString::number(count)); } else { - _headerText = tr::lng_mediaview_n_of_amount( - tr::now, - lt_n, - QString::number(index + 1), - lt_amount, - QString::number(count)); + if (_user + && (index == count - 1) + && SyncUserFallbackPhotoViewer(_user)) { + _headerText = tr::lng_mediaview_profile_public_photo(tr::now); + } else { + _headerText = tr::lng_mediaview_n_of_amount( + tr::now, + lt_n, + QString::number(index + 1), + lt_amount, + QString::number(count)); + } } } else { if (_document) { - _headerText = _document->filename().isEmpty() ? tr::lng_mediaview_doc_image(tr::now) : _document->filename(); + _headerText = _document->filename().isEmpty() + ? tr::lng_mediaview_doc_image(tr::now) + : _document->filename(); } else if (_message) { _headerText = tr::lng_mediaview_single_photo(tr::now); } else if (_user) { diff --git a/Telegram/SourceFiles/settings/settings.style b/Telegram/SourceFiles/settings/settings.style index 2967af9950..8650dd42b0 100644 --- a/Telegram/SourceFiles/settings/settings.style +++ b/Telegram/SourceFiles/settings/settings.style @@ -15,6 +15,10 @@ settingsButton: SettingsButton(infoProfileButton) { padding: margins(60px, 10px, 22px, 10px); iconLeft: 20px; } +settingsButtonLight: SettingsButton(settingsButton) { + textFg: lightButtonFg; + textFgOver: lightButtonFgOver; +} settingsButtonNoIcon: SettingsButton(settingsButton) { padding: margins(22px, 10px, 22px, 8px); } @@ -24,6 +28,10 @@ settingsAttentionButton: SettingsButton(settingsButtonNoIcon) { textFg: attentionButtonFg; textFgOver: attentionButtonFgOver; } +settingsAttentionButtonWithIcon: SettingsButton(settingsButton) { + textFg: attentionButtonFg; + textFgOver: attentionButtonFgOver; +} settingsOptionDisabled: SettingsButton(settingsButtonNoIcon) { textFg: windowSubTextFg; textFgOver: windowSubTextFg; @@ -94,6 +102,7 @@ settingsIconDownload: icon {{ "settings/download", settingsIconFg }}; settingsIconMention: icon {{ "settings/mention", settingsIconFg }}; settingsIconTopics: icon {{ "settings/topics", settingsIconFg }}; settingsIconTTL: icon {{ "settings/ttl", settingsIconFg }}; +settingsIconPhoto: icon {{ "settings/photo", settingsIconFg }}; settingsPremiumIconChannelsOff: icon {{ "settings/premium/channels_off", settingsIconFg }}; settingsPremiumIconDouble: icon {{ "settings/premium/double", settingsIconFg }}; diff --git a/Telegram/SourceFiles/settings/settings_privacy_controllers.cpp b/Telegram/SourceFiles/settings/settings_privacy_controllers.cpp index 8a85b73c68..bfcfdc8530 100644 --- a/Telegram/SourceFiles/settings/settings_privacy_controllers.cpp +++ b/Telegram/SourceFiles/settings/settings_privacy_controllers.cpp @@ -7,45 +7,55 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "settings/settings_privacy_controllers.h" -#include "settings/settings_common.h" -#include "lang/lang_keys.h" +#include "api/api_peer_photo.h" #include "apiwrap.h" -#include "main/main_session.h" -#include "data/data_user.h" -#include "data/data_session.h" -#include "data/data_changes.h" -#include "data/data_peer_values.h" // Data::AmPremiumValue. +#include "base/call_delayed.h" +#include "base/event_filter.h" +#include "base/unixtime.h" +#include "boxes/peer_list_controllers.h" +#include "boxes/peers/peer_short_info_box.h" +#include "boxes/peers/prepare_short_info_box.h" +#include "calls/calls_instance.h" #include "core/application.h" #include "core/core_settings.h" +#include "data/data_changes.h" +#include "data/data_file_origin.h" +#include "data/data_peer_values.h" // Data::AmPremiumValue. +#include "data/data_photo_media.h" +#include "data/data_session.h" +#include "data/data_user.h" +#include "data/data_user_photos.h" // UserPhotosViewer. +#include "editor/photo_editor_layer_widget.h" #include "history/admin_log/history_admin_log_item.h" +#include "history/history.h" +#include "history/history_item.h" +#include "history/history_item_components.h" #include "history/view/history_view_element.h" #include "history/view/history_view_message.h" -#include "history/history_item_components.h" -#include "history/history_item.h" -#include "history/history.h" -#include "calls/calls_instance.h" -#include "base/unixtime.h" -#include "base/event_filter.h" -#include "ui/chat/chat_theme.h" -#include "ui/chat/chat_style.h" -#include "ui/widgets/checkbox.h" -#include "ui/wrap/padding_wrap.h" -#include "ui/wrap/vertical_layout.h" -#include "ui/wrap/slide_wrap.h" -#include "ui/image/image_prepare.h" +#include "lang/lang_keys.h" +#include "main/main_session.h" +#include "settings/settings_common.h" +#include "settings/settings_privacy_security.h" +#include "ui/boxes/confirm_box.h" #include "ui/cached_round_corners.h" +#include "ui/chat/chat_style.h" +#include "ui/chat/chat_theme.h" +#include "ui/image/image_prepare.h" +#include "ui/image/image_prepare.h" +#include "ui/painter.h" #include "ui/text/format_values.h" // Ui::FormatPhone #include "ui/text/text_utilities.h" -#include "ui/painter.h" +#include "ui/widgets/checkbox.h" +#include "ui/wrap/padding_wrap.h" +#include "ui/wrap/slide_wrap.h" +#include "ui/wrap/vertical_layout.h" #include "window/section_widget.h" #include "window/window_controller.h" #include "window/window_session_controller.h" -#include "boxes/peer_list_controllers.h" -#include "ui/boxes/confirm_box.h" -#include "settings/settings_privacy_security.h" #include "styles/style_chat.h" #include "styles/style_boxes.h" #include "styles/style_settings.h" +#include "styles/style_info.h" #include #include @@ -744,7 +754,7 @@ auto CallsPrivacyController::exceptionsDescription() const object_ptr CallsPrivacyController::setupBelowWidget( not_null controller, - not_null parent) const { + not_null parent) { auto result = object_ptr(parent); const auto content = result.data(); @@ -1018,14 +1028,160 @@ rpl::producer ProfilePhotoPrivacyController::title() const { return tr::lng_edit_privacy_profile_photo_title(); } -bool ProfilePhotoPrivacyController::hasOption(Option option) const { - return (option != Option::Nobody); -} - rpl::producer ProfilePhotoPrivacyController::optionsTitleKey() const { return tr::lng_edit_privacy_profile_photo_header(); } +object_ptr ProfilePhotoPrivacyController::setupAboveWidget( + not_null parent, + rpl::producer