Display premium / fake / scam badge in group members.

This commit is contained in:
John Preston 2022-05-24 10:56:12 +04:00
parent 3b379c67ac
commit 490f6f7e50
4 changed files with 75 additions and 77 deletions

View File

@ -30,6 +30,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "base/unixtime.h" #include "base/unixtime.h"
#include "ui/widgets/popup_menu.h" #include "ui/widgets/popup_menu.h"
#include "ui/ui_utility.h" #include "ui/ui_utility.h"
#include "info/profile/info_profile_values.h"
#include "window/window_session_controller.h" #include "window/window_session_controller.h"
#include "history/history.h" #include "history/history.h"
#include "styles/style_menu_icons.h" #include "styles/style_menu_icons.h"
@ -1930,8 +1931,19 @@ auto ParticipantsBoxController::computeType(
: (user && _additional.adminRights(user).has_value()) : (user && _additional.adminRights(user).has_value())
? Rights::Admin ? Rights::Admin
: Rights::Normal; : Rights::Normal;
// result.canRemove = _additional.canRemoveParticipant(participant);
result.adminRank = user ? _additional.adminRank(user) : QString(); result.adminRank = user ? _additional.adminRank(user) : QString();
using Badge = Info::Profile::Badge;
result.badge = !user
? Badge::None
: user->isScam()
? Badge::Scam
: user->isFake()
? Badge::Fake
: user->isVerified()
? Badge::Verified
: user->isPremium()
? Badge::Premium
: Badge::None;
return result; return result;
} }

View File

@ -492,14 +492,6 @@ infoMembersAdminIconOver: icon {{
profileOtherAdminStarFgOver, profileOtherAdminStarFgOver,
point(4px, 3px) point(4px, 3px)
}}; }};
infoMembersRemoveIcon: icon {{
"simple_close",
menuIconFg
}};
infoMembersRemoveIconOver: icon {{
"simple_close",
menuIconFgOver
}};
infoMembersAdminIconMarigns: margins(10px, 18px, 10px, 10px); infoMembersAdminIconMarigns: margins(10px, 18px, 10px, 10px);
infoMembersRemoveIconMargins: margins(10px, 12px, 12px, 10px); infoMembersRemoveIconMargins: margins(10px, 12px, 12px, 10px);

View File

@ -8,10 +8,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "info/profile/info_profile_members_controllers.h" #include "info/profile/info_profile_members_controllers.h"
#include "boxes/peers/edit_participants_box.h" #include "boxes/peers/edit_participants_box.h"
#include "info/profile/info_profile_values.h"
#include "data/data_chat.h" #include "data/data_chat.h"
#include "data/data_user.h" #include "data/data_user.h"
#include "ui/unread_badge.h"
#include "lang/lang_keys.h" #include "lang/lang_keys.h"
#include "styles/style_info.h" #include "styles/style_info.h"
#include "styles/style_boxes.h"
#include "styles/style_dialogs.h"
namespace Info { namespace Info {
namespace Profile { namespace Profile {
@ -21,63 +25,48 @@ MemberListRow::MemberListRow(
Type type) Type type)
: PeerListRowWithLink(user) : PeerListRowWithLink(user)
, _type(type) { , _type(type) {
PeerListRowWithLink::setActionLink(_type.adminRank); setType(type);
} }
void MemberListRow::setType(Type type) { void MemberListRow::setType(Type type) {
_type = type; _type = type;
PeerListRowWithLink::setActionLink(_type.adminRank); _fakeScamSize = (_type.badge == Badge::Fake)
? Ui::ScamBadgeSize(true)
: (_type.badge == Badge::Scam)
? Ui::ScamBadgeSize(false)
: QSize();
PeerListRowWithLink::setActionLink(!_type.adminRank.isEmpty()
? _type.adminRank
: (_type.rights == Rights::Creator)
? tr::lng_owner_badge(tr::now)
: (_type.rights == Rights::Admin)
? tr::lng_admin_badge(tr::now)
: QString());
} }
bool MemberListRow::rightActionDisabled() const { bool MemberListRow::rightActionDisabled() const {
return !canRemove(); return true;
}
QSize MemberListRow::rightActionSize() const {
return canRemove()
? QRect(
QPoint(),
st::infoMembersRemoveIcon.size()).marginsAdded(
st::infoMembersRemoveIconMargins).size()
: PeerListRowWithLink::rightActionSize();
}
void MemberListRow::rightActionPaint(
Painter &p,
int x,
int y,
int outerWidth,
bool selected,
bool actionSelected) {
if (_type.canRemove && selected) {
x += st::infoMembersRemoveIconMargins.left();
y += st::infoMembersRemoveIconMargins.top();
(actionSelected
? st::infoMembersRemoveIconOver
: st::infoMembersRemoveIcon).paint(p, x, y, outerWidth);
} else {
PeerListRowWithLink::rightActionPaint(
p,
x,
y,
outerWidth,
selected,
actionSelected);
}
} }
QMargins MemberListRow::rightActionMargins() const { QMargins MemberListRow::rightActionMargins() const {
return canRemove() const auto skip = st::contactsCheckPosition.x();
? QMargins() return QMargins(
: PeerListRowWithLink::rightActionMargins(); skip,
st::defaultPeerListItem.namePosition.y(),
st::defaultPeerListItem.photoPosition.x() + skip,
0);
} }
int MemberListRow::nameIconWidth() const { int MemberListRow::nameIconWidth() const {
return (_type.rights == Rights::Admin) switch (_type.badge) {
? st::infoMembersAdminIcon.width() case Badge::None: return 0;
: (_type.rights == Rights::Creator) case Badge::Verified: return st::dialogsVerifiedIcon.width();
? st::infoMembersCreatorIcon.width() case Badge::Premium: return st::dialogsPremiumIcon.width();
: 0; case Badge::Scam:
case Badge::Fake:
return st::dialogsScamSkip + _fakeScamSize.width();
}
return 0;
} }
not_null<UserData*> MemberListRow::user() const { not_null<UserData*> MemberListRow::user() const {
@ -90,16 +79,31 @@ void MemberListRow::paintNameIcon(
int y, int y,
int outerWidth, int outerWidth,
bool selected) { bool selected) {
const auto icon = [&] { switch (_type.badge) {
return (_type.rights == Rights::Admin) case Badge::None: return;
? (selected case Badge::Verified:
? &st::infoMembersAdminIconOver (selected
: &st::infoMembersAdminIcon) ? st::dialogsVerifiedIconOver
: (selected : st::dialogsVerifiedIcon).paint(p, x, y, outerWidth);
? &st::infoMembersCreatorIconOver break;
: &st::infoMembersCreatorIcon); case Badge::Premium:
}(); (selected
icon->paint(p, x, y, outerWidth); ? st::dialogsPremiumIconOver
: st::dialogsPremiumIcon).paint(p, x, y, outerWidth);
break;
case Badge::Scam:
case Badge::Fake:
return Ui::DrawScamBadge(
(_type.badge == Badge::Fake),
p,
QRect(
x + st::dialogsScamSkip,
y + (st::normalFont->height - _fakeScamSize.height()) / 2,
_fakeScamSize.width(),
_fakeScamSize.height()),
outerWidth,
(selected ? st::dialogsScamFgOver : st::dialogsScamFg));
}
} }
void MemberListRow::refreshStatus() { void MemberListRow::refreshStatus() {
@ -114,10 +118,6 @@ void MemberListRow::refreshStatus() {
} }
} }
bool MemberListRow::canRemove() const {
return _type.canRemove;
}
std::unique_ptr<PeerListController> CreateMembersController( std::unique_ptr<PeerListController> CreateMembersController(
not_null<Window::SessionNavigation*> navigation, not_null<Window::SessionNavigation*> navigation,
not_null<PeerData*> peer) { not_null<PeerData*> peer) {

View File

@ -16,6 +16,8 @@ class SessionNavigation;
namespace Info { namespace Info {
namespace Profile { namespace Profile {
enum class Badge;
class MemberListRow final : public PeerListRowWithLink { class MemberListRow final : public PeerListRowWithLink {
public: public:
enum class Rights { enum class Rights {
@ -24,8 +26,8 @@ public:
Creator, Creator,
}; };
struct Type { struct Type {
Badge badge;
Rights rights; Rights rights;
bool canRemove = false;
QString adminRank; QString adminRank;
}; };
@ -34,14 +36,6 @@ public:
void setType(Type type); void setType(Type type);
bool rightActionDisabled() const override; bool rightActionDisabled() const override;
QMargins rightActionMargins() const override; QMargins rightActionMargins() const override;
QSize rightActionSize() const override;
void rightActionPaint(
Painter &p,
int x,
int y,
int outerWidth,
bool selected,
bool actionSelected) override;
int nameIconWidth() const override; int nameIconWidth() const override;
void paintNameIcon( void paintNameIcon(
Painter &p, Painter &p,
@ -54,8 +48,8 @@ public:
not_null<UserData*> user() const; not_null<UserData*> user() const;
private: private:
[[nodiscard]] bool canRemove() const;
Type _type; Type _type;
QSize _fakeScamSize;
}; };