Paint admin stars with different color in profile.

This commit is contained in:
John Preston 2017-07-03 13:31:37 +03:00
parent 0d38106ed0
commit d08dbb835f
5 changed files with 35 additions and 17 deletions

View File

@ -468,7 +468,10 @@ overviewPhotoSelectOverlay: #40ace333; // shared photos / videos / links fill fo
profileStatusFgOver: #7c99b2; // group members list in group profile user last seen text with mouse over profileStatusFgOver: #7c99b2; // group members list in group profile user last seen text with mouse over
profileVerifiedCheckBg: windowBgActive; // profile verified check icon background profileVerifiedCheckBg: windowBgActive; // profile verified check icon background
profileVerifiedCheckFg: windowFgActive; // profile verified check icon tick profileVerifiedCheckFg: windowFgActive; // profile verified check icon tick
profileAdminStartFg: windowBgActive; // group members list admin star icon profileAdminStartFg: windowBgActive; // group members list creator star icon
profileAdminStarFgOver: profileAdminStartFg; // group members list creator star icon with mouse over
profileOtherAdminStarFg: windowSubTextFg; // group members list admin star icon
profileOtherAdminStarFgOver: profileStatusFgOver; // group members list admin star icon with mouse over
// settings // settings
notificationsBoxMonitorFg: windowFg; // custom notifications settings box monitor color notificationsBoxMonitorFg: windowFg; // custom notifications settings box monitor color

View File

@ -132,7 +132,10 @@ profileMemberPhotoPosition: point(12px, 6px);
profileMemberNamePosition: point(68px, 11px); profileMemberNamePosition: point(68px, 11px);
profileMemberNameFg: windowBoldFg; profileMemberNameFg: windowBoldFg;
profileMemberStatusPosition: point(68px, 31px); profileMemberStatusPosition: point(68px, 31px);
profileMemberAdminIcon: icon {{ "profile_admin_star", profileAdminStartFg, point(4px, 3px) }}; profileMemberCreatorIcon: icon {{ "profile_admin_star", profileAdminStartFg, point(4px, 3px) }};
profileMemberCreatorIconOver: icon {{ "profile_admin_star", profileAdminStarFgOver, point(4px, 3px) }};
profileMemberAdminIcon: icon {{ "profile_admin_star", profileOtherAdminStarFg, point(4px, 3px) }};
profileMemberAdminIconOver: icon {{ "profile_admin_star", profileOtherAdminStarFgOver, point(4px, 3px) }};
profileLimitReachedLabel: FlatLabel(defaultFlatLabel) { profileLimitReachedLabel: FlatLabel(defaultFlatLabel) {
width: 180px; width: 180px;
margin: margins(profileMemberPaddingLeft, 9px, profileMemberPaddingLeft, 6px); margin: margins(profileMemberPaddingLeft, 9px, profileMemberPaddingLeft, 6px);

View File

@ -209,7 +209,7 @@ Ui::PopupMenu *GroupMembersWidget::fillPeerMenu(PeerData *selectedPeer) {
for_const (auto item, items()) { for_const (auto item, items()) {
if (item->peer == selectedPeer) { if (item->peer == selectedPeer) {
auto canRemoveAdmin = [item, chat, channel] { auto canRemoveAdmin = [item, chat, channel] {
if (item->hasAdminStar && !item->peer->isSelf()) { if ((item->adminState == Item::AdminState::Admin) && !item->peer->isSelf()) {
if (chat) { if (chat) {
// Adding of admins from context menu of chat participants // Adding of admins from context menu of chat participants
// is not supported, so the removing is also disabled. // is not supported, so the removing is also disabled.
@ -222,7 +222,7 @@ Ui::PopupMenu *GroupMembersWidget::fillPeerMenu(PeerData *selectedPeer) {
}; };
if (channel) { if (channel) {
if (channel->canEditAdmin(user)) { if (channel->canEditAdmin(user)) {
auto label = lang(item->hasAdminStar ? lng_context_edit_permissions : lng_context_promote_admin); auto label = lang((item->adminState != Item::AdminState::None) ? lng_context_edit_permissions : lng_context_promote_admin);
result->addAction(label, base::lambda_guarded(this, [this, user] { result->addAction(label, base::lambda_guarded(this, [this, user] {
editAdmin(user); editAdmin(user);
})); }));
@ -250,7 +250,7 @@ void GroupMembersWidget::updateItemStatusText(Item *item) {
auto user = member->user(); auto user = member->user();
if (member->statusText.isEmpty() || (member->onlineTextTill <= _now)) { if (member->statusText.isEmpty() || (member->onlineTextTill <= _now)) {
if (user->botInfo) { if (user->botInfo) {
auto seesAllMessages = (user->botInfo->readsAllHistory || member->hasAdminStar); auto seesAllMessages = (user->botInfo->readsAllHistory || (member->adminState != Item::AdminState::None));
member->statusText = lang(seesAllMessages ? lng_status_bot_reads_all : lng_status_bot_not_reads_all); member->statusText = lang(seesAllMessages ? lng_status_bot_reads_all : lng_status_bot_not_reads_all);
member->onlineTextTill = _now + 86400; member->onlineTextTill = _now + 86400;
} else { } else {
@ -390,15 +390,17 @@ void GroupMembersWidget::fillChatMembers(ChatData *chat) {
} }
void GroupMembersWidget::setItemFlags(Item *item, ChatData *chat) { void GroupMembersWidget::setItemFlags(Item *item, ChatData *chat) {
using AdminState = Item::AdminState;
auto user = getMember(item)->user(); auto user = getMember(item)->user();
auto isCreator = (peerFromUser(chat->creator) == item->peer->id); auto isCreator = (peerFromUser(chat->creator) == item->peer->id);
auto isAdmin = chat->admins.contains(user); auto isAdmin = chat->admins.contains(user);
item->hasAdminStar = isCreator || isAdmin; auto adminState = isCreator ? AdminState::Creator : isAdmin ? AdminState::Admin : AdminState::None;
item->adminState = adminState;
if (item->peer->id == AuthSession::CurrentUserPeerId()) { if (item->peer->id == AuthSession::CurrentUserPeerId()) {
item->hasRemoveLink = false; item->hasRemoveLink = false;
} else if (chat->amCreator() || (chat->amAdmin() && !item->hasAdminStar)) { } else if (chat->amCreator() || (chat->amAdmin() && (adminState == AdminState::None))) {
item->hasRemoveLink = true; item->hasRemoveLink = true;
} else if (chat->invitedByMe.contains(user) && !item->hasAdminStar) { } else if (chat->invitedByMe.contains(user) && (adminState == AdminState::None)) {
item->hasRemoveLink = true; item->hasRemoveLink = true;
} else { } else {
item->hasRemoveLink = false; item->hasRemoveLink = false;
@ -462,14 +464,16 @@ bool GroupMembersWidget::addUsersToEnd(ChannelData *megagroup) {
} }
void GroupMembersWidget::setItemFlags(Item *item, ChannelData *megagroup) { void GroupMembersWidget::setItemFlags(Item *item, ChannelData *megagroup) {
auto amCreatorOrAdmin = item->peer->isSelf() && (megagroup->hasAdminRights() || megagroup->amCreator()); using AdminState = Item::AdminState;
auto amCreator = item->peer->isSelf() && megagroup->amCreator();
auto amAdmin = item->peer->isSelf() && megagroup->hasAdminRights();
auto adminIt = megagroup->mgInfo->lastAdmins.constFind(getMember(item)->user()); auto adminIt = megagroup->mgInfo->lastAdmins.constFind(getMember(item)->user());
auto isAdmin = (adminIt != megagroup->mgInfo->lastAdmins.cend()); auto isAdmin = (adminIt != megagroup->mgInfo->lastAdmins.cend());
auto isCreator = megagroup->mgInfo->creator == item->peer; auto isCreator = megagroup->mgInfo->creator == item->peer;
auto adminCanEdit = isAdmin && adminIt->canEdit; auto adminCanEdit = isAdmin && adminIt->canEdit;
auto hasAdminStar = amCreatorOrAdmin || isAdmin || isCreator; auto adminState = (amCreator || isCreator) ? AdminState::Creator : (amAdmin || isAdmin) ? AdminState::Admin : AdminState::None;
if (item->hasAdminStar != hasAdminStar) { if (item->adminState != adminState) {
item->hasAdminStar = hasAdminStar; item->adminState = adminState;
auto user = item->peer->asUser(); auto user = item->peer->asUser();
t_assert(user != nullptr); t_assert(user != nullptr);
if (user->botInfo) { if (user->botInfo) {
@ -480,7 +484,7 @@ void GroupMembersWidget::setItemFlags(Item *item, ChannelData *megagroup) {
} }
if (item->peer->isSelf()) { if (item->peer->isSelf()) {
item->hasRemoveLink = false; item->hasRemoveLink = false;
} else if (megagroup->amCreator() || (megagroup->canBanMembers() && (!item->hasAdminStar || adminCanEdit))) { } else if (megagroup->amCreator() || megagroup->canBanMembers() && ((adminState == AdminState::None) || adminCanEdit)) {
item->hasRemoveLink = true; item->hasRemoveLink = true;
} else { } else {
item->hasRemoveLink = false; item->hasRemoveLink = false;

View File

@ -111,10 +111,13 @@ void PeerListWidget::paintItem(Painter &p, int x, int y, Item *item, bool select
p.drawTextLeft(nameLeft + nameWidth - _removeWidth, nameTop, width(), _removeText, _removeWidth); p.drawTextLeft(nameLeft + nameWidth - _removeWidth, nameTop, width(), _removeText, _removeWidth);
nameWidth -= _removeWidth + skip; nameWidth -= _removeWidth + skip;
} }
if (item->hasAdminStar) { if (item->adminState != Item::AdminState::None) {
nameWidth -= st::profileMemberAdminIcon.width(); nameWidth -= st::profileMemberAdminIcon.width();
int iconLeft = nameLeft + qMin(nameWidth, item->name.maxWidth()); auto iconLeft = nameLeft + qMin(nameWidth, item->name.maxWidth());
st::profileMemberAdminIcon.paint(p, QPoint(iconLeft, nameTop), width()); auto &icon = (item->adminState == Item::AdminState::Creator)
? (selected ? st::profileMemberCreatorIconOver : st::profileMemberCreatorIcon)
: (selected ? st::profileMemberAdminIconOver : st::profileMemberAdminIcon);
icon.paint(p, QPoint(iconLeft, nameTop), width());
} }
p.setPen(st::profileMemberNameFg); p.setPen(st::profileMemberNameFg);
item->name.drawLeftElided(p, nameLeft, nameTop, nameWidth, width()); item->name.drawLeftElided(p, nameLeft, nameTop, nameWidth, width());

View File

@ -48,7 +48,12 @@ public:
Text name; Text name;
QString statusText; QString statusText;
bool statusHasOnlineColor = false; bool statusHasOnlineColor = false;
bool hasAdminStar = false; enum class AdminState {
None,
Admin,
Creator,
};
AdminState adminState = AdminState::None;
bool hasRemoveLink = false; bool hasRemoveLink = false;
std::unique_ptr<Ui::RippleAnimation> ripple; std::unique_ptr<Ui::RippleAnimation> ripple;
}; };