diff --git a/Telegram/SourceFiles/boxes/peers/manage_community_box.cpp b/Telegram/SourceFiles/boxes/peers/manage_community_box.cpp index f1d598097a..2ea985b537 100644 --- a/Telegram/SourceFiles/boxes/peers/manage_community_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/manage_community_box.cpp @@ -7,6 +7,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "boxes/peers/manage_community_box.h" +#include "api/api_peer_photo.h" #include "apiwrap.h" #include "boxes/peers/community_pending_requests_box.h" #include "boxes/peers/edit_participants_box.h" @@ -18,12 +19,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_session.h" #include "settings/settings_common.h" #include "ui/boxes/confirm_box.h" +#include "ui/controls/userpic_button.h" #include "ui/layers/generic_box.h" +#include "ui/ui_utility.h" #include "ui/vertical_list.h" #include "ui/widgets/buttons.h" #include "ui/widgets/checkbox.h" #include "ui/widgets/fields/input_field.h" #include "ui/widgets/labels.h" +#include "ui/wrap/padding_wrap.h" #include "ui/wrap/slide_wrap.h" #include "ui/wrap/vertical_layout.h" #include "window/window_session_controller.h" @@ -114,14 +118,56 @@ void ManageCommunityBox( const auto container = box->verticalLayout(); - const auto field = container->add( - object_ptr( - container, - st::defaultInputField, - tr::lng_community_create_name(), - community->name()), - st::boxRowPadding); - if (!canEdit) { + auto photo = (Ui::UserpicButton*)nullptr; + auto field = (Ui::InputField*)nullptr; + if (canEdit) { + const auto row = container->add( + object_ptr(container)); + const auto photoWrap = Ui::AttachParentChild( + row, + object_ptr>( + row, + object_ptr( + row, + navigation->parentController(), + community, + Ui::UserpicButton::Role::ChangePhoto, + Ui::UserpicButton::Source::PeerPhoto, + st::defaultUserpicButton, + Ui::PeerUserpicShape::Forum), + st::editPeerPhotoMargins)); + photo = photoWrap->entity(); + photo->showCustomOnChosen(); + const auto titleWrap = Ui::AttachParentChild( + row, + object_ptr>( + row, + object_ptr( + row, + st::editPeerTitleField, + tr::lng_community_create_name(), + community->name()), + st::editPeerTitleMargins)); + field = titleWrap->entity(); + photoWrap->heightValue( + ) | rpl::on_next([=](int height) { + row->resize(row->width(), height); + }, photoWrap->lifetime()); + row->widthValue( + ) | rpl::on_next([=](int width) { + const auto left = st::editPeerPhotoMargins.left() + + st::defaultUserpicButton.size.width(); + titleWrap->resizeToWidth(width - left); + titleWrap->moveToLeft(left, 0, width); + }, titleWrap->lifetime()); + } else { + field = container->add( + object_ptr( + container, + st::defaultInputField, + tr::lng_community_create_name(), + community->name()), + st::boxRowPadding); field->setEnabled(false); } @@ -247,6 +293,11 @@ void ManageCommunityBox( if (onlyAdmins != wasOnlyAdmins) { SaveCommunityWhoCanAddChats(community, onlyAdmins); } + if (auto image = photo->takeResultImage(); !image.isNull()) { + community->session().api().peerPhoto().upload( + community, + { std::move(image) }); + } box->closeBox(); }); box->addButton(tr::lng_cancel(), [=] { box->closeBox(); }); diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp index ec10d0fdc8..525a0a5789 100644 --- a/Telegram/SourceFiles/data/data_peer.cpp +++ b/Telegram/SourceFiles/data/data_peer.cpp @@ -464,11 +464,7 @@ void PeerData::paintUserpic( const auto cloud = userpicCloudImage(view); const auto ratio = style::DevicePixelRatio(); if (context.shape == Ui::PeerUserpicShape::Auto) { - context.shape = (isForum() && !isBot()) - ? Ui::PeerUserpicShape::Forum - : isMonoforum() - ? Ui::PeerUserpicShape::Monoforum - : Ui::PeerUserpicShape::Circle; + context.shape = userpicShape(); } Ui::ValidateUserpicCache( view, @@ -1296,7 +1292,10 @@ not_null PeerData::userpicPaintingPeer() const { } Ui::PeerUserpicShape PeerData::userpicShape() const { - return isForum() && !isBot() + const auto channel = asChannel(); + return (isForum() && !isBot()) + ? Ui::PeerUserpicShape::Forum + : (channel && channel->isCommunity()) ? Ui::PeerUserpicShape::Forum : isMonoforum() ? Ui::PeerUserpicShape::Monoforum diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp index 41ff68897c..66303e3391 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp @@ -1081,7 +1081,8 @@ const style::icon *ChatTypeIcon( st::dialogsChannelIcon, context.active, context.selected); - } else if (peer->displayAsForum()) { + } else if (peer->displayAsForum() + || (peer->isChannel() && peer->asChannel()->isCommunity())) { return &ThreeStateIcon( st::dialogsForumIcon, context.active,