[Improvement] Show group manage buttons in profile

This commit is contained in:
Eric Kotato 2022-09-11 05:38:05 +03:00 committed by Eric Kotato
parent 874e963210
commit 08eafe8a93
13 changed files with 215 additions and 3 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 677 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 991 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -233,6 +233,8 @@ void SaveBoostsUnrestrict(
api->registerModifyRequest(key, requestId); api->registerModifyRequest(key, requestId);
} }
} // namespace
void ShowEditPermissions( void ShowEditPermissions(
not_null<Window::SessionNavigation*> navigation, not_null<Window::SessionNavigation*> navigation,
not_null<PeerData*> peer) { not_null<PeerData*> peer) {
@ -2262,9 +2264,6 @@ void Controller::deleteChannel() {
}).send(); }).send();
} }
} // namespace
EditPeerInfoBox::EditPeerInfoBox( EditPeerInfoBox::EditPeerInfoBox(
QWidget*, QWidget*,
not_null<Window::SessionNavigation*> navigation, not_null<Window::SessionNavigation*> navigation,

View file

@ -26,6 +26,13 @@ class VerticalLayout;
class SettingsButton; class SettingsButton;
} // namespace Ui } // namespace Ui
void ShowEditPermissions(
not_null<Window::SessionNavigation*> navigation,
not_null<PeerData*> peer);
void ShowEditInviteLinks(
not_null<Window::SessionNavigation*> navigation,
not_null<PeerData*> peer);
class EditPeerInfoBox : public Ui::BoxContent { class EditPeerInfoBox : public Ui::BoxContent {
public: public:
EditPeerInfoBox( EditPeerInfoBox(

View file

@ -17,6 +17,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "base/unixtime.h" #include "base/unixtime.h"
#include "boxes/peers/add_bot_to_chat_box.h" #include "boxes/peers/add_bot_to_chat_box.h"
#include "boxes/peers/edit_contact_box.h" #include "boxes/peers/edit_contact_box.h"
#include "boxes/peers/edit_peer_info_box.h"
#include "boxes/peers/edit_peer_invite_links.h"
#include "boxes/peers/edit_participants_box.h"
#include "boxes/report_messages_box.h" #include "boxes/report_messages_box.h"
#include "boxes/share_box.h" #include "boxes/share_box.h"
#include "boxes/translate_box.h" #include "boxes/translate_box.h"
@ -40,6 +43,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "history/history_item_helpers.h" #include "history/history_item_helpers.h"
#include "history/view/history_view_context_menu.h" // HistoryView::ShowReportPeerBox #include "history/view/history_view_context_menu.h" // HistoryView::ShowReportPeerBox
#include "history/view/history_view_item_preview.h" #include "history/view/history_view_item_preview.h"
#include "history/admin_log/history_admin_log_section.h"
#include "info/info_controller.h" #include "info/info_controller.h"
#include "info/info_memento.h" #include "info/info_memento.h"
#include "info/profile/info_profile_icon.h" #include "info/profile/info_profile_icon.h"
@ -70,6 +74,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/wrap/vertical_layout.h" #include "ui/wrap/vertical_layout.h"
#include "window/window_controller.h" // Window::Controller::show. #include "window/window_controller.h" // Window::Controller::show.
#include "window/window_peer_menu.h" #include "window/window_peer_menu.h"
#include "mainwidget.h"
#include "window/window_session_controller.h" #include "window/window_session_controller.h"
#include "styles/style_info.h" #include "styles/style_info.h"
#include "styles/style_layers.h" #include "styles/style_layers.h"
@ -840,6 +845,31 @@ private:
}; };
class ManageFiller {
public:
ManageFiller(
not_null<Controller*> controller,
not_null<Ui::RpWidget*> parent,
not_null<PeerData*> peer);
object_ptr<Ui::RpWidget> fill();
private:
void addPeerPermissions(not_null<PeerData*> peer);
void addPeerAdmins(not_null<PeerData*> peer);
void addPeerInviteLinks(not_null<PeerData*> peer);
void addChannelBlockedUsers(not_null<ChannelData*> channel);
void addChannelRecentActions(not_null<ChannelData*> channel);
void fillChatActions(not_null<ChatData*> chat);
void fillChannelActions(not_null<ChannelData*> channel);
not_null<Controller*> _controller;
not_null<Ui::RpWidget*> _parent;
not_null<PeerData*> _peer;
object_ptr<Ui::VerticalLayout> _wrap = { nullptr };
};
void ReportReactionBox( void ReportReactionBox(
not_null<Ui::GenericBox*> box, not_null<Ui::GenericBox*> box,
not_null<Window::SessionController*> controller, not_null<Window::SessionController*> controller,
@ -2114,6 +2144,158 @@ object_ptr<Ui::RpWidget> ActionsFiller::fill() {
return { nullptr }; return { nullptr };
} }
ManageFiller::ManageFiller(
not_null<Controller*> controller,
not_null<Ui::RpWidget*> parent,
not_null<PeerData*> peer)
: _controller(controller)
, _parent(parent)
, _peer(peer) {
}
void ManageFiller::addPeerPermissions(
not_null<PeerData*> peer) {
if (peer->isUser() || (peer->isChannel() && !peer->isMegagroup())) return;
const auto canEditPermissions = [&] {
return peer->isChannel()
? peer->asChannel()->canEditPermissions()
: peer->asChat()->canEditPermissions();
}();
if (canEditPermissions) {
const auto controller = _controller;
auto button = AddActionButton(
_wrap,
tr::lng_manage_peer_permissions(),
rpl::single(true),
[=] { ShowEditPermissions(controller->parentController(), peer); },
&st::menuIconPermissions);
}
}
void ManageFiller::addPeerAdmins(
not_null<PeerData*> peer) {
if (peer->isUser()) return;
const auto canViewAdmins = [&] {
return peer->isChannel()
? peer->asChannel()->canViewAdmins()
: peer->asChat()->amIn();
}();
if (canViewAdmins) {
const auto controller = _controller;
auto button = AddActionButton(
_wrap,
tr::lng_manage_peer_administrators(),
rpl::single(true),
[=] { ParticipantsBoxController::Start(
controller->parentController(),
peer,
ParticipantsBoxController::Role::Admins);},
&st::menuIconAdmin);
}
}
void ManageFiller::addPeerInviteLinks(
not_null<PeerData*> peer) {
if (peer->isUser()) return;
const auto canHaveInviteLink = [&] {
return peer->isChannel()
? peer->asChannel()->canHaveInviteLink()
: peer->asChat()->canHaveInviteLink();
}();
if (canHaveInviteLink) {
const auto controller = _controller->parentController();
auto button = AddActionButton(
_wrap,
tr::lng_manage_peer_invite_links(),
rpl::single(true),
[=] {
controller->window().show(Box(ManageInviteLinksBox, peer, peer->session().user(), 0, 0),
Ui::LayerOption::KeepOther);
},
&st::menuIconLinks);
}
}
void ManageFiller::addChannelBlockedUsers(
not_null<ChannelData*> channel) {
if (channel->hasAdminRights() || channel->amCreator()) {
const auto controller = _controller;
auto button = AddActionButton(
_wrap,
tr::lng_manage_peer_removed_users(),
rpl::single(true),
[=] { ParticipantsBoxController::Start(
controller->parentController(),
channel,
ParticipantsBoxController::Role::Kicked);},
&st::menuIconRemove);
}
}
void ManageFiller::addChannelRecentActions(
not_null<ChannelData*> channel) {
if (channel->hasAdminRights() || channel->amCreator()) {
const auto controller = _controller;
auto button = AddActionButton(
_wrap,
tr::lng_manage_peer_recent_actions(),
rpl::single(true),
[=] {
if (const auto window = controller->parentController()) {
if (const auto mainwidget = window->widget()->sessionContent()) {
if (mainwidget->areRecentActionsOpened()) {
controller->showSection(
std::make_shared<AdminLog::SectionMemento>(channel));
}
}
}
},
&st::menuIconGroupLog);
}
}
void ManageFiller::fillChatActions(
not_null<ChatData*> chat) {
addPeerPermissions(chat);
addPeerAdmins(chat);
addPeerInviteLinks(chat);
}
void ManageFiller::fillChannelActions(
not_null<ChannelData*> channel) {
addPeerPermissions(channel);
addPeerAdmins(channel);
addPeerInviteLinks(channel);
addChannelBlockedUsers(channel);
addChannelRecentActions(channel);
}
object_ptr<Ui::RpWidget> ManageFiller::fill() {
auto wrapResult = [=](auto &&callback) {
_wrap = object_ptr<Ui::VerticalLayout>(_parent);
_wrap->add(CreateSkipWidget(_wrap));
callback();
_wrap->add(CreateSkipWidget(_wrap));
return std::move(_wrap);
};
if (auto chat = _peer->asChat()) {
return wrapResult([=] {
fillChatActions(chat);
});
} else if (auto channel = _peer->asChannel()) {
if (channel->isMegagroup() || channel->hasAdminRights() || channel->amCreator()) {
return wrapResult([=] {
fillChannelActions(channel);
});
}
}
return { nullptr };
}
} // namespace } // namespace
const char kOptionShowPeerIdBelowAbout[] = "show-peer-id-below-about"; const char kOptionShowPeerIdBelowAbout[] = "show-peer-id-below-about";
@ -2135,6 +2317,14 @@ object_ptr<Ui::RpWidget> SetupDetails(
return filler.fill(); return filler.fill();
} }
object_ptr<Ui::RpWidget> SetupManage(
not_null<Controller*> controller,
not_null<Ui::RpWidget*> parent,
not_null<PeerData*> peer) {
ManageFiller filler(controller, parent, peer);
return filler.fill();
}
object_ptr<Ui::RpWidget> SetupActions( object_ptr<Ui::RpWidget> SetupActions(
not_null<Controller*> controller, not_null<Controller*> controller,
not_null<Ui::RpWidget*> parent, not_null<Ui::RpWidget*> parent,

View file

@ -38,6 +38,11 @@ object_ptr<Ui::RpWidget> SetupDetails(
not_null<Ui::RpWidget*> parent, not_null<Ui::RpWidget*> parent,
not_null<Data::ForumTopic*> topic); not_null<Data::ForumTopic*> topic);
object_ptr<Ui::RpWidget> SetupManage(
not_null<Controller*> controller,
not_null<Ui::RpWidget*> parent,
not_null<PeerData*> peer);
object_ptr<Ui::RpWidget> SetupActions( object_ptr<Ui::RpWidget> SetupActions(
not_null<Controller*> controller, not_null<Controller*> controller,
not_null<Ui::RpWidget*> parent, not_null<Ui::RpWidget*> parent,

View file

@ -108,6 +108,10 @@ object_ptr<Ui::RpWidget> InnerWidget::setupContent(
} else { } else {
result->add(SetupDetails(_controller, parent, _peer, origin)); result->add(SetupDetails(_controller, parent, _peer, origin));
} }
if (auto manage = SetupManage(_controller, result.data(), _peer)) {
result->add(object_ptr<Ui::BoxContentDivider>(result));
result->add(std::move(manage));
}
result->add(setupSharedMedia(result.data())); result->add(setupSharedMedia(result.data()));
if (_topic) { if (_topic) {
return result; return result;

View file

@ -49,6 +49,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "dialogs/dialogs_widget.h" #include "dialogs/dialogs_widget.h"
#include "history/history_widget.h" #include "history/history_widget.h"
#include "history/history_item_helpers.h" // GetErrorTextForSending. #include "history/history_item_helpers.h" // GetErrorTextForSending.
#include "history/admin_log/history_admin_log_section.h"
#include "history/view/media/history_view_media.h" #include "history/view/media/history_view_media.h"
#include "history/view/history_view_service_message.h" #include "history/view/history_view_service_message.h"
#include "history/view/history_view_sublist_section.h" #include "history/view/history_view_sublist_section.h"
@ -1942,6 +1943,11 @@ void MainWidget::showNonPremiumLimitToast(bool download) {
}); });
} }
bool MainWidget::areRecentActionsOpened() {
return _mainSection
&& static_cast<AdminLog::Widget*>(_mainSection.data());
}
void MainWidget::showBackFromStack( void MainWidget::showBackFromStack(
const SectionShow &params) { const SectionShow &params) {
if (preventsCloseSection([=] { showBackFromStack(params); }, params)) { if (preventsCloseSection([=] { showBackFromStack(params); }, params)) {

View file

@ -236,6 +236,7 @@ public:
void showNonPremiumLimitToast(bool download); void showNonPremiumLimitToast(bool download);
bool areRecentActionsOpened();
void dialogsCancelled(); void dialogsCancelled();
private: private: