From 9186a4f3f5723989dc07ee5fe2d59aa88f0de552 Mon Sep 17 00:00:00 2001 From: ouwou <26526779+ouwou@users.noreply.github.com> Date: Thu, 4 Mar 2021 00:02:37 -0500 Subject: [PATCH] show crown next to owner --- README.md | 1 + components/memberlist.cpp | 25 ++++++++++++++++++------- components/memberlist.hpp | 3 ++- res/crown.png | Bin 0 -> 6610 bytes settings.cpp | 4 ++++ settings.hpp | 1 + windows/guildsettings/memberspane.cpp | 22 +++++++++++++++++++--- windows/guildsettings/memberspane.hpp | 4 +++- 8 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 res/crown.png diff --git a/README.md b/README.md index 884f70c..9c30f4f 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,7 @@ For example, memory_db would be set by adding `memory_db = true` under the line * emojis (true or false, default true) - resolve unicode and custom emojis to images. this needs to be false to allow GTK to render emojis by itself * css (string) - path to the main CSS file * animations (true or false, default true) - use animated images where available (e.g. server icons, emojis, avatars). false means static images will be used +* owner_crown (true or false, default true) - show a crown next to the owner #### misc * linkcolor (string) - color to use for links in messages diff --git a/components/memberlist.cpp b/components/memberlist.cpp index 5dfc26a..f256ce2 100644 --- a/components/memberlist.cpp +++ b/components/memberlist.cpp @@ -6,7 +6,7 @@ constexpr static const int MaxMemberListRows = 200; -MemberListUserRow::MemberListUserRow(Snowflake guild_id, const UserData *data) { +MemberListUserRow::MemberListUserRow(const GuildData &guild, const UserData *data) { ID = data->ID; m_ev = Gtk::manage(new Gtk::EventBox); m_box = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL)); @@ -14,6 +14,16 @@ MemberListUserRow::MemberListUserRow(Snowflake guild_id, const UserData *data) { m_avatar = Gtk::manage(new LazyImage(16, 16)); m_status_indicator = Gtk::manage(new StatusIndicator(ID)); + static bool crown = Abaddon::Get().GetSettings().GetShowOwnerCrown(); + if (crown && guild.OwnerID == data->ID) { + try { + auto pixbuf = Gdk::Pixbuf::create_from_file("./res/crown.png", 12, 12); + m_crown = Gtk::manage(new Gtk::Image(pixbuf)); + m_crown->set_valign(Gtk::ALIGN_CENTER); + m_crown->set_margin_end(8); + } catch (...) {} + } + m_status_indicator->set_margin_start(3); if (data->HasAvatar()) @@ -31,7 +41,7 @@ MemberListUserRow::MemberListUserRow(Snowflake guild_id, const UserData *data) { std::string display = data->Username; if (show_discriminator) display += "#" + data->Discriminator; - auto col_id = data->GetHoistedRole(guild_id, true); + auto col_id = data->GetHoistedRole(guild.ID, true); if (col_id.IsValid()) { auto color = Abaddon::Get().GetDiscordClient().GetRole(col_id)->Color; m_label->set_use_markup(true); @@ -49,6 +59,8 @@ MemberListUserRow::MemberListUserRow(Snowflake guild_id, const UserData *data) { m_box->add(*m_avatar); m_box->add(*m_status_indicator); m_box->add(*m_label); + if (m_crown != nullptr) + m_box->add(*m_crown); m_ev->add(*m_box); add(*m_ev); show_all(); @@ -118,10 +130,8 @@ void MemberList::UpdateMemberList() { for (const auto &id : ids) { auto user = discord.GetUser(id); - if (!user.has_value()) { - roleless_users.push_back(id); + if (!user.has_value() || user->IsDeleted()) continue; - } auto pos_role_id = discord.GetMemberHoistedRole(m_guild_id, id); // role for positioning auto col_role_id = discord.GetMemberHoistedRole(m_guild_id, id, true); // role for color @@ -140,9 +150,10 @@ void MemberList::UpdateMemberList() { } int num_rows = 0; - auto add_user = [this, &user_to_color, &num_rows](const UserData *data) -> bool { + const auto guild = *discord.GetGuild(m_guild_id); + auto add_user = [this, &user_to_color, &num_rows, guild](const UserData *data) -> bool { if (num_rows++ > MaxMemberListRows) return false; - auto *row = Gtk::manage(new MemberListUserRow(m_guild_id, data)); + auto *row = Gtk::manage(new MemberListUserRow(guild, data)); m_id_to_row[data->ID] = row; AttachUserMenuHandler(row, data->ID); m_listbox->add(*row); diff --git a/components/memberlist.hpp b/components/memberlist.hpp index 856d73c..5c8fc88 100644 --- a/components/memberlist.hpp +++ b/components/memberlist.hpp @@ -8,7 +8,7 @@ class LazyImage; class StatusIndicator; class MemberListUserRow : public Gtk::ListBoxRow { public: - MemberListUserRow(Snowflake guild_id, const UserData *data); + MemberListUserRow(const GuildData& guild, const UserData *data); Snowflake ID; @@ -18,6 +18,7 @@ private: LazyImage *m_avatar; StatusIndicator *m_status_indicator; Gtk::Label *m_label; + Gtk::Image *m_crown = nullptr; }; class MemberList { diff --git a/res/crown.png b/res/crown.png new file mode 100644 index 0000000000000000000000000000000000000000..6038716c50349cd451d0af36a6fe849232daa39d GIT binary patch literal 6610 zcmd5>c{r3|_kKxCBD+G_D_hE*m_gP_WgnzPkx{lvMP|k>Wl5B>WJoGytRrhi5t3y@ zCK7|n&M3=Z!uPz>cYXi={`<{!&E=W%-shbA+~+*cyzjVcd(x7hSCSWkAbzx!nLPw? zWP^7!f*V*S7Y?+8KU{%F(T)i4!XrHIfX~~mSh)s5935xjH%HaA2d98h;<~xZb%y}2 z>p|zQU4(*yg48eh`viKNzj9GM;2Jh_&QKCyY|v&Vj=@i62MHw48-$kMRK|Cl*ZIPZ zNP*z-T*0Q;Zx2;UC!=~r<6U&LFZouKZQm7T{#zq)-#+c9X)jPtJ(fOBd`h^WNu4|$ z3+?hxk*5lk#2>syoG2+{s*g5)lAq~JH>lsx&}zGwX25K3*ROxM5V{^!i^F#6Noi#V zQnIzMiBQ6gzs4+^gkBUnUhD1mW6OVN#HA!hu^atNS>r5(jN*YZIM;o{2A|HLd3dj~q20-$?K+0fkpYV{8qGjAd+{0}ON7p%L@1?rAg6hz%Q)yVc* zM97#GJcTQiyBsZ$`(+*uAb6mG=d(T~Y*Jn!urO~coy?W9-$&hV7J0ppVG@1`cptm! zK50(N*u4Mc57OFLS2J^cWON7@u!uz1g6h5hj=pmks2*IY$lJd{+-qz!z1-e!aPY|W zV&Ja1!o&+Ee!p2P`ktKXAg+ab&X5Z)tNLRiIuHsu<~NXk4YZlhDnFq**$ zx*MEcmF11;IHw+oHHbIY3#$e$nh2Q>a^(7HT(r`zx;`etSOV~OFMLFx3T_#27+~`K zGvsAauy-O_7Z205po@Tcq(%*u$)|CMc7@E5YrG=Mi}a~y;BN0)RNNp6Zf)SP`xr77 z2wY6OLjEGJOct%sH#>xyKKXWZu&1$e<8nWqu$E?5{z?3VDA!=$Cew^ zUaoGqsEp>pQ-$Oe)_r`a-|AP0Ta@DGO|%n|J7kK#wq^|AslsUi2X5-A>sru2lU+fQ z3+gU7CC1Nj>*Z+*cH4(N)z>N2KPl%{q`A_#1;ouC&gfw0R8BRW&|KETQ%668>%@NY zvIm%(9(lZA;cXtl_fh#mpsl7`?hKp2T`fM(VKy(jEm|O@>pmnOe4h^<3d3-Ov?7=Z zdtrXrNS;Er~H`5Zg2RgUFwEDqvJ zgYWheHqQgTMS>{rC-2~-3PLFFJY#s}0aj{MkTB;n@W?nr`1Byoe;J8>dBkug`Sjp; z8q%nSI-(JgbEQB>vaN_1diiDM8HLLC3h3G+y7kRP#JRO9<3nJE6!y63&rYVhuH@!v z8Q%LHHDqyf2)&bzt89^g4ua74)_-0~QWf7xQJ(ClV3R)&t{(l3C$lzq2uYk(AHMM? zI;g3?wUpyZQgqF7^8LwRBDsepL1_;!oMXl4_7w6?e`w1%9(KPzWOmSRZTG8Y-_rdVIdSke7d5#B-FI)aHd&_OJxTDM>eMlM1H6#6b4|m2A=ol2QkXD0E93$ z6|rNw;uy$xAF!}>sqBpeV4%z{(!gav$Yf+j_&rFi3c$S1CH%x zE9P2d=ALw{72djc=4=y7BdO1| zG}HB@o_$4s)9Em=*l{bqG{l+0?CK!b^IYh5y|kH?Ff@hR@z8T|gcjoizE`-vD`6f{ z-!xOKyW_`#GqbI0LK?q?9lpg_6ZrJjeE^WI|28FVIdmzp?r1kUkWX(4vlPPcK68Dg zf|o85aeh#IFD-z-tC~W%7qT3cvRcPWUrs9>8;oBqVx|vn_M|UHi8Q`6dQ$XY@jGwq z0BOHRQKvyo!`rbgo6ASI4S~N7E#PjMs*S<(k2PU?3);%pFZ*HWb}!=HiqF;(3S|2J z_?El4hNOoa$zO|n8HV>csCo_OjJ-JNck@j}JtEi^K3KSHNS#0DD$89|dt6;9d4~oW zty9-}cN(TFo?f~>UAjKIy<#n*)ESkvZe9GiJ=T$NCFx>^Uzt?E1+kq*G(WWa`lCCY zOS6HVOLDI3kA9d2eC%s;+gTLmyC@(nf*Rb?Ry^a%x>UV`XzAigK1kIY^1mrVq4)5m zZ8^8^1n)UiVp`o;`x*0s1$Bu!^aiR2hY9JuhxFO3Sk;rcf%&FivKV=mTJ(v2KgH8? zrpa87U&a0sI3{I4EFf5Aflek^Wqgf8>_($s<$QmdN+)6(4>yQ?aL z`{8O3rywvWH`(85nfYPrrt88Bnt3c`3@7TFgst3r7h7+hM=twoD8Z6L*Z;sh5(@g& z;)c!qIuv;P+akwj{Xg^Pl*)&b6`ut@?BARrsfBeHp)S@QEN@T%NA1bl93S)fyyiY4 z>ax+shZdGJmmB%(lj?%atRpP`7+A~pPIQ*)?fQ>-8+vYuGX{S<$`4?!3b_wH(xwGO z@cK6CCYOecmrkEFvX+dtsmQ6c{#19;sZ+$W-7*ea5imXDc9Zaxd!N$sn{!If^jO3# zI%OfIR|zaU-D6lNEA`j781-@(+QQj~WtkO|lX_rr<9JHK8RYtx+=+Et3j>0U&fdAW z?OZ{XI=n&kTV?Op_IY_M*$(O0w8hOe?-k-s`kXoMH-!QR#SWH#%1I1d!{lY%cV4ZE^7y|Y3$MGlRf?P3d(pse?ir^ z68|Wd`rdud#Rf3lJF-!8aRs}AD$k3|g%;R;2`WADY8$rjyO^`aoPXoK@9UTd#kmWa z_98`i=|rdRr(G(~^U(qVy&K~Eo{YuV$P`pbl=wGtk?1eJnK z`OH%P#staAP%`EPxeSjkeHOT1wW8IxIH;>H^NkCsGE9E*F+o7ouwWojBcPMHd+jyD zZmPM4U(CCGtuQcW9q+pStg2i2hc~7C=4G!=r>~zv`OJWzT~z%H}1{U34+(PxP;Y#T<@^D zzWTodl-O6tN{iQzy4HPW?zXz4QGBo{Ae(_pczu0GdG@*8-eIoIp+~zP5U3(j1JipR zDk`8CQGwQ@+h60;MRnpf+Fs)A%7rZ#p1*OhAq`Ft#vXl8xpzbAvgqtuqL|x_+k~X@ zSGF&huguEXRL(@hRC*aR}W;fN} z6ncwfC1OkUgGO1%MtblU9)Y?f4o;2JMAup&|DGV^9=ZzaCxmN<3E?ZIaCsW^1^wUh6oyFl32NMr zem|>s;86XoR-u%*9!l+cG@^iRVICyVKEBN*R@*)xCRCrIZBX*CE7II)J;<`<1AbYr z9cg3|AV{n44-083(iqENLC_1GN$_D{Xq!1>3zXKJ$6)%drMFH1SWjOOBl%dgK%D^O z&O5M-w7)z5l*s`-bb0~Ip{%SS9>~@r9mp6s@C>%w!S>rQJSWNq06&BVH|_J}UtJ*YKDPZ|^vG^7JmxE~xkB>7UWCm(VM1_S6@X98c#BmpA?}2@L3;|^9q9#jg7iv8vdX^%535$*96+_)39t~mZ9}B9 zPN0p7r`93J7=~bd*hW(Qy!jkG0w42TI89bz&l;m?UwS!*kG!*X&-%DyK4$ z_WW$llljjW$(P~6K;w;hrzUXR3^yc@*UEGcm?a0ca>AFv3}k?#iU%5XcBU)zilWx_ zUVviKdV7HowbFo_U}X)cnBB07Hhd%ysDBT@WdR(KUI5@~ zdN3Q`qBZH(^X%wdPnM7=jcm^=)iXH7*pVKiT|mL;j~D4$hlvIiUu*k+{f3}lE*@E- zC2{ zMzUcne1rs#fL8olR*l!fOR75r7+z6|rk-K2HS}Md!{tHjX?XHyh-t;aK1`}aj?xvj z3Zm?Hu`D6)NLy4u6nht4QHZ8k@+!i--`$m6lUBaZR(36>n`sphog~^REezRq7YO0m@B+5W~Ey4G&{_jqtk#o`!G`xI}P}<6|&6|WJxQ(n@?`| zZo_GuaCF^}pM8erNXmf`&0+IOMU(+v{4lSybNPUm_lniXoHB>3xLnvhZYfykL)o?< z%rKi*H5WJ@IoOJ}tN#SN4&(Dmn5mFpS(lMf6noOsPJ9Gmf?;0ojz9i3aN|8^+Gktv0(Kbf5s&4+6DW^G6M7(Id?!JJ zp;s$FXW;IYVQ(UfZHZynk+)=@|?`5tZEelBYBv3h_h>{e7 z_2zM1y6@DQh2RtD1i1ZfLlFr<=7; z*c|STtC<7}+z>9zHE*R&?W2>SaG7QIA%kU0U?kXR#w#^iPBD!N|32KVShz;q3Z2%p z$nH#H1Xov2ycAd=Uc`Jh9C25@>9l?D!ekaLO?B_=JQ7UKL{;)?TT_!MBXMNp=>szv zlxa(m!8*zJDf24&;4*SM7^;BdueU7H~nLCsh=` z;z{9wAZ>w>Ezp&F^BmA&%M}QEqJW1W@GA=hjU!~B@W5yR=$(E84>Y{{|0k?^lV_@C V-=>e*O*2?4wE0Q1qNDDS{{a^OjWPfL literal 0 HcmV?d00001 diff --git a/settings.cpp b/settings.cpp index bba97f3..11894de 100644 --- a/settings.cpp +++ b/settings.cpp @@ -77,3 +77,7 @@ std::string SettingsManager::GetMainCSS() const { bool SettingsManager::GetShowAnimations() const { return GetSettingBool("gui", "animations", true); } + +bool SettingsManager::GetShowOwnerCrown() const { + return GetSettingBool("gui", "owner_crown", true); +} diff --git a/settings.hpp b/settings.hpp index 09aeec2..88365ba 100644 --- a/settings.hpp +++ b/settings.hpp @@ -19,6 +19,7 @@ public: bool GetPrefetch() const; std::string GetMainCSS() const; bool GetShowAnimations() const; + bool GetShowOwnerCrown() const; bool IsValid() const; diff --git a/windows/guildsettings/memberspane.cpp b/windows/guildsettings/memberspane.cpp index 0f29223..5fbdada 100644 --- a/windows/guildsettings/memberspane.cpp +++ b/windows/guildsettings/memberspane.cpp @@ -40,11 +40,12 @@ GuildSettingsMembersPaneMembers::GuildSettingsMembersPaneMembers(Snowflake id) auto &discord = Abaddon::Get().GetDiscordClient(); auto members = discord.GetUsersInGuild(id); + const auto guild = *discord.GetGuild(GuildID); for (const auto member_id : members) { auto member = *discord.GetMember(member_id, GuildID); member.User = discord.GetUser(member_id); if (member.User->IsDeleted()) continue; - auto *row = Gtk::manage(new GuildSettingsMembersListItem(GuildID, member)); + auto *row = Gtk::manage(new GuildSettingsMembersListItem(guild, member)); row->show(); m_list.add(*row); } @@ -81,9 +82,9 @@ GuildSettingsMembersPaneMembers::type_signal_member_select GuildSettingsMembersP return m_signal_member_select; } -GuildSettingsMembersListItem::GuildSettingsMembersListItem(Snowflake guild_id, const GuildMember &member) +GuildSettingsMembersListItem::GuildSettingsMembersListItem(const GuildData &guild, const GuildMember &member) : UserID(member.User->ID) - , GuildID(guild_id) + , GuildID(guild.ID) , m_avatar(32, 32) { m_avatar.SetAnimated(true); @@ -113,14 +114,29 @@ GuildSettingsMembersListItem::GuildSettingsMembersListItem(Snowflake guild_id, c discord.signal_guild_member_update().connect(sigc::track_obj(member_update_cb, *this)); UpdateColor(); + static bool crown = Abaddon::Get().GetSettings().GetShowOwnerCrown(); + if (crown && guild.OwnerID == member.User->ID) { + try { + auto pixbuf = Gdk::Pixbuf::create_from_file("./res/crown.png", 12, 12); + m_crown = Gtk::manage(new Gtk::Image(pixbuf)); + m_crown->set_valign(Gtk::ALIGN_CENTER); + m_crown->set_margin_start(10); + m_crown->show(); + } catch (...) {} + } + m_avatar.set_margin_end(5); m_avatar.set_halign(Gtk::ALIGN_START); m_avatar.set_valign(Gtk::ALIGN_CENTER); m_name.set_halign(Gtk::ALIGN_START); m_name.set_valign(Gtk::ALIGN_CENTER); + m_main.set_hexpand(true); + m_main.add(m_avatar); m_main.add(m_name); + if (m_crown != nullptr) + m_main.add(*m_crown); m_ev.add(m_main); add(m_ev); diff --git a/windows/guildsettings/memberspane.hpp b/windows/guildsettings/memberspane.hpp index abffce5..7b221b2 100644 --- a/windows/guildsettings/memberspane.hpp +++ b/windows/guildsettings/memberspane.hpp @@ -2,6 +2,7 @@ #include #include #include "../../discord/member.hpp" +#include "../../discord/guild.hpp" #include "../../components/lazyimage.hpp" class GuildSettingsMembersPaneRolesItem : public Gtk::ListBoxRow { @@ -103,7 +104,7 @@ public: class GuildSettingsMembersListItem : public Gtk::ListBoxRow { public: - GuildSettingsMembersListItem(Snowflake guild_id, const GuildMember &member); + GuildSettingsMembersListItem(const GuildData &guild, const GuildMember &member); Glib::ustring DisplayTerm; @@ -117,6 +118,7 @@ private: LazyImage m_avatar; Gtk::Label m_name; Gtk::Box m_main; + Gtk::Image *m_crown = nullptr; }; class GuildSettingsMembersPane : public Gtk::Box {