From d06337dddc1d015d7b900890c20690f28ce8e5d9 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Sat, 16 Mar 2019 00:26:01 +0300 Subject: [PATCH] Added HistoryVisibilityBox. --- Telegram/Resources/langs/lang.strings | 1 + .../edit_peer_history_visibility_box.cpp | 130 +++++++++ .../peers/edit_peer_history_visibility_box.h | 51 ++++ .../boxes/peers/edit_peer_info_box.cpp | 273 ++++++------------ Telegram/SourceFiles/info/info.style | 35 ++- Telegram/gyp/telegram_sources.txt | 2 + 6 files changed, 299 insertions(+), 193 deletions(-) create mode 100644 Telegram/SourceFiles/boxes/peers/edit_peer_history_visibility_box.cpp create mode 100644 Telegram/SourceFiles/boxes/peers/edit_peer_history_visibility_box.h diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 7979575a6..84206bcc8 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -806,6 +806,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_manage_peer_group_type" = "Group type"; "lng_manage_private_group_title" = "Private"; +"lng_manage_public_group_title" = "Public"; "lng_manage_history_visibility_title" = "Chat history for new members"; "lng_manage_history_visibility_shown" = "Visible"; diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_history_visibility_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_history_visibility_box.cpp new file mode 100644 index 000000000..91af22ffb --- /dev/null +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_history_visibility_box.cpp @@ -0,0 +1,130 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "boxes/peers/edit_peer_history_visibility_box.h" + +#include "boxes/peers/edit_peer_permissions_box.h" +#include "boxes/peers/edit_participants_box.h" +#include "data/data_channel.h" +#include "data/data_chat.h" +#include "data/data_peer.h" +#include "lang/lang_keys.h" +#include "styles/style_boxes.h" +#include "styles/style_info.h" +#include "ui/widgets/checkbox.h" +#include "ui/widgets/labels.h" +#include "ui/wrap/padding_wrap.h" +#include "ui/wrap/slide_wrap.h" +#include "ui/wrap/vertical_layout.h" + +namespace { + +std::shared_ptr> historyVisibility; +Ui::SlideWrap *historyVisibilityWrap = nullptr; + +void AddRoundButton( + not_null container, + HistoryVisibility value, + LangKey groupTextKey, + LangKey groupAboutKey) { + container->add(object_ptr( + container, + st::editPeerHistoryVisibilityTopSkip)); + container->add(object_ptr>( + container, + historyVisibility, + value, + lang(groupTextKey), + st::defaultBoxCheckbox)); + container->add(object_ptr>( + container, + object_ptr( + container, + Lang::Viewer(groupAboutKey), + st::editPeerPrivacyLabel), + st::editPeerPrivacyLabelMargins)); +}; + +void FillContent( + not_null parent, + not_null peer, + std::optional savedValue = std::nullopt) { + + const auto canEdit = [&] { + if (const auto chat = peer->asChat()) { + return chat->canEditPreHistoryHidden(); + } else if (const auto channel = peer->asChannel()) { + return channel->canEditPreHistoryHidden(); + } + Unexpected("User in HistoryVisibilityEdit."); + }(); + if (!canEdit) { + return; + } + + const auto channel = peer->asChannel(); + + const auto result = parent->add(object_ptr>( + parent, + object_ptr(parent), + st::editPeerHistoryVisibilityMargins)); + historyVisibilityWrap = result; + const auto container = result->entity(); + + const auto defaultValue = savedValue.value_or( + (!channel || channel->hiddenPreHistory()) + ? HistoryVisibility::Hidden + : HistoryVisibility::Visible + ); + + historyVisibility = std::make_shared>(defaultValue); + + AddRoundButton( + container, + HistoryVisibility::Visible, + lng_manage_history_visibility_shown, + lng_manage_history_visibility_shown_about); + AddRoundButton( + container, + HistoryVisibility::Hidden, + lng_manage_history_visibility_hidden, + (peer->isChat() + ? lng_manage_history_visibility_hidden_legacy + : lng_manage_history_visibility_hidden_about)); +} + +} // namespace + +EditPeerHistoryVisibilityBox::EditPeerHistoryVisibilityBox( + QWidget*, + not_null peer, + FnMut savedCallback, + std::optional historyVisibilitySavedValue) +: _peer(peer) +, _savedCallback(std::move(savedCallback)) +, _historyVisibilitySavedValue(historyVisibilitySavedValue) { +} + +void EditPeerHistoryVisibilityBox::prepare() { + _peer->updateFull(); + + setTitle(langFactory(lng_manage_history_visibility_title)); + addButton(langFactory(lng_settings_save), [=] { + auto local = std::move(_savedCallback); + local(historyVisibility->value()); + closeBox(); + }); + addButton(langFactory(lng_cancel), [=] { closeBox(); }); + + setupContent(); +} + +void EditPeerHistoryVisibilityBox::setupContent() { + const auto content = Ui::CreateChild(this); + FillContent(content, _peer, _historyVisibilitySavedValue); + setDimensionsToContent(st::boxWidth, content); +} diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_history_visibility_box.h b/Telegram/SourceFiles/boxes/peers/edit_peer_history_visibility_box.h new file mode 100644 index 000000000..4f07dcf0f --- /dev/null +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_history_visibility_box.h @@ -0,0 +1,51 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "boxes/abstract_box.h" + +namespace style { +struct InfoProfileCountButton; +} // namespace style + +namespace Ui { +class VerticalLayout; +} // namespace Ui + +namespace Info { +namespace Profile { +class Button; +} // namespace Profile +} // namespace Info + +enum class HistoryVisibility { + Visible, + Hidden, +}; + +class EditPeerHistoryVisibilityBox : public BoxContent { +public: + + EditPeerHistoryVisibilityBox( + QWidget*, + not_null peer, + FnMut savedCallback, + std::optional historyVisibilitySavedValue = std::nullopt); + +protected: + void prepare() override; + +private: + void setupContent(); + + not_null _peer; + FnMut _savedCallback; + + std::optional _historyVisibilitySavedValue; + +}; diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp index 495bebd6f..5d1fd6771 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp @@ -7,63 +7,42 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "boxes/peers/edit_peer_info_box.h" -#include -#include -#include "info/profile/info_profile_button.h" -#include "ui/wrap/vertical_layout.h" -#include "ui/wrap/padding_wrap.h" -#include "ui/wrap/slide_wrap.h" -#include "ui/widgets/input_fields.h" -#include "ui/widgets/checkbox.h" -#include "ui/widgets/labels.h" -#include "ui/toast/toast.h" -#include "ui/special_buttons.h" -#include "boxes/confirm_box.h" -#include "boxes/photo_crop_box.h" -#include "boxes/add_contact_box.h" -#include "boxes/stickers_box.h" -#include "boxes/peer_list_controllers.h" -#include "boxes/peers/edit_participants_box.h" -#include "data/data_peer.h" -#include "data/data_chat.h" -#include "data/data_channel.h" -#include "chat_helpers/emoji_suggestions_widget.h" -#include "mtproto/sender.h" -#include "lang/lang_keys.h" -#include "mainwidget.h" -#include "core/application.h" #include "apiwrap.h" #include "auth_session.h" +#include "boxes/add_contact_box.h" +#include "boxes/confirm_box.h" +#include "boxes/peer_list_controllers.h" +#include "boxes/peers/edit_participants_box.h" +#include "boxes/peers/edit_peer_group_type_box.h" +#include "boxes/peers/edit_peer_history_visibility_box.h" +#include "boxes/peers/edit_peer_permissions_box.h" +#include "boxes/stickers_box.h" +#include "chat_helpers/emoji_suggestions_widget.h" +#include "data/data_channel.h" +#include "data/data_chat.h" +#include "data/data_peer.h" +#include "history/admin_log/history_admin_log_section.h" +#include "info/profile/info_profile_button.h" +#include "info/profile/info_profile_values.h" +#include "lang/lang_keys.h" +#include "mainwidget.h" +#include "mainwindow.h" +#include "mtproto/sender.h" #include "observer_peer.h" #include "styles/style_boxes.h" #include "styles/style_info.h" - #include "ui/rp_widget.h" -#include "boxes/peers/edit_peer_permissions_box.h" - -#include "info/profile/info_profile_button.h" -#include "info/profile/info_profile_icon.h" -#include "info/profile/info_profile_values.h" - -#include "mainwindow.h" - -#include "boxes/peers/edit_peer_info_box.h" -#include "boxes/peers/edit_peer_permissions_box.h" -#include "boxes/peers/edit_participants_box.h" -#include "ui/wrap/vertical_layout.h" +#include "ui/special_buttons.h" +#include "ui/toast/toast.h" +#include "ui/widgets/checkbox.h" +#include "ui/widgets/input_fields.h" #include "ui/widgets/labels.h" -#include "history/admin_log/history_admin_log_section.h" +#include "ui/wrap/padding_wrap.h" +#include "ui/wrap/slide_wrap.h" +#include "ui/wrap/vertical_layout.h" #include "window/window_controller.h" -#include "info/profile/info_profile_button.h" -#include "info/profile/info_profile_icon.h" -#include "info/profile/info_profile_values.h" -#include "data/data_channel.h" -#include "data/data_chat.h" -#include "mainwindow.h" -#include "auth_session.h" -#include "apiwrap.h" -#include "styles/style_boxes.h" -#include "styles/style_info.h" +#include +#include namespace { @@ -116,6 +95,20 @@ void AddButtonWithCount( &icon); } +void AddButtonWithText( + not_null parent, + rpl::producer &&text, + rpl::producer &&label, + Fn callback) { + ManagePeerBox::CreateButton( + parent, + std::move(text), + std::move(label), + std::move(callback), + st::manageGroupTopButtonWithText, + nullptr); +} + bool HasRecentActions(not_null channel) { return channel->hasAdminRights() || channel->amCreator(); } @@ -292,10 +285,6 @@ private: Public, Private, }; - enum class HistoryVisibility { - Visible, - Hidden, - }; enum class UsernameState { Normal, TooMany, @@ -317,10 +306,10 @@ private: Ui::SlideWrap *editInviteLinkWrap = nullptr; Ui::FlatLabel *inviteLink = nullptr; - std::shared_ptr> historyVisibility; - Ui::SlideWrap *historyVisibilityWrap = nullptr; - Ui::Checkbox *signatures = nullptr; + + std::optional historyVisibilitySavedValue = std::nullopt; + Ui::SlideWrap *historyVisibilityWrap = nullptr; }; struct Saving { std::optional username; @@ -339,7 +328,6 @@ private: object_ptr createUsernameEdit(); object_ptr createInviteLinkCreate(); object_ptr createInviteLinkEdit(); - object_ptr createHistoryVisibilityEdit(); object_ptr createSignaturesEdit(); object_ptr createStickersEdit(); object_ptr createDeleteButton(); @@ -471,14 +459,12 @@ object_ptr Controller::createContent() { addSkip(_wrap); // Divider. _wrap->add(createPrivaciesButtons()); addSkip(_wrap); // Divider. - _wrap->add(createManageGroupButtons()); addSkip(_wrap); // Divider. _wrap->add(createPrivaciesEdit()); _wrap->add(createInviteLinkCreate()); _wrap->add(createInviteLinkEdit()); - _wrap->add(createHistoryVisibilityEdit()); _wrap->add(createSignaturesEdit()); _wrap->add(createStickersEdit()); _wrap->add(createDeleteButton()); @@ -696,61 +682,62 @@ object_ptr Controller::createPrivaciesButtons() { if (!canEditUsername) { return nullptr; } + + const auto channel = _peer->asChannel(); + auto defaultValue = (!channel || channel->hiddenPreHistory()) + ? HistoryVisibility::Hidden + : HistoryVisibility::Visible; + + const auto update = std::make_shared>(); + auto result = object_ptr>( _wrap, object_ptr(_wrap), - st::editHehMargins); - auto container = result->entity(); + st::editPeerTopButtonsLayoutMargins); + auto resultContainer = result->entity(); + AddButtonWithText( + resultContainer, + std::move(Lang::Viewer(lng_manage_peer_group_type)), + update->events( + ) | rpl::map([](HistoryVisibility count) { + return HistoryVisibility::Visible == count ? QString("A") : QString("B"); + }), + [] {LOG(("BUTTON")); }); - const auto addPrivaciesButton = [=, &container](LangKey privacyTextKey) { - const auto button = container->add(object_ptr( + const auto addPrivaciesButton = [=](LangKey privacyTextKey, Ui::VerticalLayout* container) { + const auto boxCallback = [=](HistoryVisibility checked) { + update->fire(std::move(checked)); + _controls.historyVisibilitySavedValue = checked; + }; + const auto buttonCallback = [=]{ + Ui::show(Box( + _peer, + boxCallback, + _controls.historyVisibilitySavedValue + ), LayerOption::KeepOther); + }; + AddButtonWithText( container, std::move(Lang::Viewer(privacyTextKey)), - st::heeehButton - )); + update->events( + ) | rpl::map([](HistoryVisibility flag) { + return lang(HistoryVisibility::Visible == flag + ? lng_manage_history_visibility_shown + : lng_manage_history_visibility_hidden); + }), + buttonCallback); }; - addPrivaciesButton(lng_manage_peer_group_type); - addPrivaciesButton(lng_manage_history_visibility_title); + auto wrapLayout = resultContainer->add(object_ptr>( + resultContainer, + object_ptr(resultContainer), + st::boxOptionListPadding)); // Empty margins. + _controls.historyVisibilityWrap = wrapLayout; - // style::InfoProfileCountButton a = st::heehPermissionsButton; - // const auto name = Ui::CreateChild( - // button, - // std::move(rpl::single(QString("Heh"))), - // a.label); - // rpl::combine( - // button->widthValue(), - // std::move(rpl::single(QString("Heh"))), - // std::move(rpl::single(QString("Heh"))) - // ) | rpl::start_with_next([=, &a]( - // int width, - // const QString &button, - // const QString &text) { - // /*const auto available = width - // - a.padding.left() - // - a.padding.right() - // - a.font->width(button) - // - st::hehButtonRightSkip; - // name->setText(text); - // name->resizeToNaturalWidth(available); - // name->moveToRight(st::hehButtonRightSkip, st.padding.top());*/ - // }, name->lifetime()); - // name->setAttribute(Qt::WA_TransparentForMouseEvents); + addPrivaciesButton(lng_manage_history_visibility_title, wrapLayout->entity()); - - // style::InfoProfileCountButton a = st::managePeerButton; - // const auto label = Ui::CreateChild( - // button, - // std::move(rpl::single(QString("5"))), - // a.label); - // label->setAttribute(Qt::WA_TransparentForMouseEvents); - // rpl::combine( - // button->widthValue(), - // label->widthValue() - // ) | rpl::start_with_next([=, &a](int outerWidth, int width) { - // LOG(("POSITION: %1 %2").arg(a.labelPosition.x()).arg(a.labelPosition.y())); - // label->moveToRight(0, 0); - // }, label->lifetime()); + update->fire(std::move(defaultValue)); + refreshHistoryVisibility(); return std::move(result); } @@ -761,7 +748,7 @@ object_ptr Controller::createManageGroupButtons() { auto result = object_ptr>( _wrap, object_ptr(_wrap), - st::editHehMargins); + st::editPeerBottomButtonsLayoutMargins); auto container = result->entity(); if (const auto chat = _peer->asChat()) { @@ -1172,76 +1159,6 @@ void Controller::refreshCreateInviteLink() { anim::type::instant); } -object_ptr Controller::createHistoryVisibilityEdit() { - Expects(_wrap != nullptr); - - const auto canEdit = [&] { - if (const auto chat = _peer->asChat()) { - return chat->canEditPreHistoryHidden(); - } else if (const auto channel = _peer->asChannel()) { - return channel->canEditPreHistoryHidden(); - } - Unexpected("User in Controller::createHistoryVisibilityEdit."); - }(); - if (!canEdit) { - return nullptr; - } - const auto channel = _peer->asChannel(); - - auto result = object_ptr>( - _wrap, - object_ptr(_wrap), - st::editPeerInvitesMargins); - _controls.historyVisibilityWrap = result.data(); - auto container = result->entity(); - - _controls.historyVisibility - = std::make_shared>( - (!channel || channel->hiddenPreHistory()) - ? HistoryVisibility::Hidden - : HistoryVisibility::Visible); - auto addButton = [&]( - HistoryVisibility value, - LangKey groupTextKey, - LangKey groupAboutKey) { - container->add(object_ptr( - container, - st::editPeerPrivacyTopSkip + st::editPeerPrivacyBottomSkip)); - container->add(object_ptr>( - container, - _controls.historyVisibility, - value, - lang(groupTextKey), - st::defaultBoxCheckbox)); - container->add(object_ptr>( - container, - object_ptr( - container, - Lang::Viewer(groupAboutKey), - st::editPeerPrivacyLabel), - st::editPeerPrivacyLabelMargins)); - }; - - container->add(object_ptr( - container, - Lang::Viewer(lng_manage_history_visibility_title), - st::editPeerSectionLabel)); - addButton( - HistoryVisibility::Visible, - lng_manage_history_visibility_shown, - lng_manage_history_visibility_shown_about); - addButton( - HistoryVisibility::Hidden, - lng_manage_history_visibility_hidden, - (_peer->isChat() - ? lng_manage_history_visibility_hidden_legacy - : lng_manage_history_visibility_hidden_about)); - - refreshHistoryVisibility(); - - return std::move(result); -} - void Controller::refreshHistoryVisibility() { if (!_controls.historyVisibilityWrap) { return; @@ -1250,7 +1167,7 @@ void Controller::refreshHistoryVisibility() { || (_controls.privacy->value() == Privacy::Private); _controls.historyVisibilityWrap->toggle( historyVisibilityShown, - anim::type::instant); + anim::type::normal); } object_ptr Controller::createSignaturesEdit() { @@ -1422,12 +1339,12 @@ bool Controller::validateDescription(Saving &to) const { } bool Controller::validateHistoryVisibility(Saving &to) const { - if (!_controls.historyVisibility + if (!_controls.historyVisibilityWrap->toggled() || (_controls.privacy && _controls.privacy->value() == Privacy::Public)) { return true; } to.hiddenPreHistory - = (_controls.historyVisibility->value() == HistoryVisibility::Hidden); + = (_controls.historyVisibilitySavedValue == HistoryVisibility::Hidden); return true; } diff --git a/Telegram/SourceFiles/info/info.style b/Telegram/SourceFiles/info/info.style index 50a1db6d2..973473292 100644 --- a/Telegram/SourceFiles/info/info.style +++ b/Telegram/SourceFiles/info/info.style @@ -359,8 +359,8 @@ infoIconMediaLink: icon {{ "info_media_link", infoIconFg }}; infoIconMediaGroup: icon {{ "info_common_groups", infoIconFg }}; infoIconMediaVoice: icon {{ "info_media_voice", infoIconFg }}; infoIconMediaRound: icon {{ "info_media_round", infoIconFg }}; -infoIconRecentActions: icon {{ "info_recent_actions", infoIconFg }}; -infoIconAdministrators: icon {{ "info_administrators", infoIconFg }}; +infoIconRecentActions: icon {{ "info_recent_actions", infoIconFg, point(-2px, 0px) }}; +infoIconAdministrators: icon {{ "info_administrators", infoIconFg, point(-2px, -1px) }}; infoIconBlacklist: icon {{ "info_blacklist", infoIconFg }}; infoIconPermissions: icon {{ "info_permissions", infoIconFg }}; infoInformationIconPosition: point(25px, 12px); @@ -590,6 +590,7 @@ managePeerButton: InfoProfileCountButton { } labelPosition: point(25px, 12px); } + peerPermissionsButton: InfoProfileCountButton(managePeerButton) { button: InfoProfileButton(infoProfileButton) { padding: margins(24px, 12px, 24px, 10px); @@ -600,22 +601,23 @@ peerPermissionsButton: InfoProfileCountButton(managePeerButton) { manageGroupButton: InfoProfileCountButton(managePeerButton) { button: InfoProfileButton(infoProfileButton) { - padding: margins(72px, 12px, 24px, 10px); + padding: margins(72px, 10px, 24px, 8px); + font: font(14px); } + labelPosition: point(22px, 12px); iconPosition: point(20px, 5px); } -heeehButton: InfoProfileButton(infoProfileButton) { - font: boxTextFont; - padding: margins(23px, 10px, 22px, 11px); +manageGroupTopButtonWithText: InfoProfileCountButton(manageGroupButton) { + button: InfoProfileButton(infoProfileButton) { + padding: margins(22px, 10px, 24px, 8px); + font: font(14px); + } + labelPosition: point(22px, 11px); + iconPosition: point(0px, 0px); } -hehButtonRightSkip: 28px; -hehButtonRight: FlatLabel(defaultFlatLabel) { - textFg: windowActiveTextFg; - style: boxTextStyle; - maxHeight: 20px; -} +editPeerHistoryVisibilityMargins: margins(15px, 0px, 20px, 16px); terminateSessionsButton: InfoProfileButton(infoBlockButton) { padding: margins(23px, 12px, 23px, 10px); @@ -636,7 +638,10 @@ infoEmptyLabel: FlatLabel(defaultFlatLabel) { textFg: windowSubTextFg; } -editHehMargins: margins(0px, 10px, 0px, 0px); +editPeerBottomButtonsLayoutMargins: margins(0px, 11px, 0px, 7px); +editPeerTopButtonsLayoutMargins: margins(0px, 12px, 0px, 6px); + +editPeerHistoryVisibilityTopSkip: 8px; editPeerDeleteButtonMargins: margins(23px, 16px, 23px, 16px); editPeerDeleteButton: sessionTerminateAllButton; @@ -649,10 +654,10 @@ editPeerPrivaciesMargins: margins(23px, 10px, 23px, 0px); editPeerPrivacyTopSkip: 10px; editPeerPrivacyBottomSkip: 16px; editPeerPrivacyLabel: FlatLabel(defaultFlatLabel) { - minWidth: 263px; + minWidth: 220px; textFg: windowSubTextFg; } -editPeerPrivacyLabelMargins: margins(34px, 0px, 0px, 0px); +editPeerPrivacyLabelMargins: margins(34px, 0px, 48px, 0px); editPeerSectionLabel: FlatLabel(boxTitle) { style: TextStyle(defaultTextStyle) { font: font(15px semibold); diff --git a/Telegram/gyp/telegram_sources.txt b/Telegram/gyp/telegram_sources.txt index 8d21ef0c5..84455b942 100644 --- a/Telegram/gyp/telegram_sources.txt +++ b/Telegram/gyp/telegram_sources.txt @@ -8,6 +8,8 @@ <(src_loc)/boxes/peers/edit_peer_info_box.h <(src_loc)/boxes/peers/edit_peer_permissions_box.cpp <(src_loc)/boxes/peers/edit_peer_permissions_box.h +<(src_loc)/boxes/peers/edit_peer_history_visibility_box.cpp +<(src_loc)/boxes/peers/edit_peer_history_visibility_box.h <(src_loc)/boxes/peers/manage_peer_box.cpp <(src_loc)/boxes/peers/manage_peer_box.h <(src_loc)/boxes/about_box.cpp