From 133bbc863086343fa5f3b0e10a1de545aa82f516 Mon Sep 17 00:00:00 2001 From: RadRussianRus Date: Mon, 5 Sep 2022 15:31:25 +0300 Subject: [PATCH] [Option][GUI] Folder options --- Telegram/Resources/icons/menu/hide.png | Bin 0 -> 2278 bytes Telegram/Resources/icons/menu/hide@2x.png | Bin 0 -> 2818 bytes Telegram/Resources/icons/menu/hide@3x.png | Bin 0 -> 3023 bytes Telegram/Resources/langs/rewrites/en.json | 9 ++ .../SourceFiles/kotato/kotato_settings.cpp | 12 ++ .../kotato/kotato_settings_menu.cpp | 19 ++++ Telegram/SourceFiles/ui/menu_icons.style | 1 + Telegram/SourceFiles/window/window.style | 3 +- .../window/window_filters_menu.cpp | 107 +++++++++++++----- .../SourceFiles/window/window_filters_menu.h | 1 + .../window/window_session_controller.cpp | 6 +- 11 files changed, 126 insertions(+), 32 deletions(-) create mode 100644 Telegram/Resources/icons/menu/hide.png create mode 100644 Telegram/Resources/icons/menu/hide@2x.png create mode 100644 Telegram/Resources/icons/menu/hide@3x.png diff --git a/Telegram/Resources/icons/menu/hide.png b/Telegram/Resources/icons/menu/hide.png new file mode 100644 index 0000000000000000000000000000000000000000..1cdc079bef68f8e494fe3cea3c85d71d7b6125eb GIT binary patch literal 2278 zcmb_ee^3-<7(N_j6r~(Vhv*NM#mvmT-Mzg%ZdVV5JLn*f2yYaf()M=uVD)bI+FgzV zvKa-$qDGry&{EUTF<{dC(I}%v=_oo#Na zdEfVW-}m{xZ{N<&dNDdGE=s4u(*+gk|;fHB8(I@A2MLL8O6*fP9V66He$5F0EK=qh$eGxI>(kC ziUpo5aK5VgXcR3hEYuegdP&Yhaf+f)%zzpU2tXi8k*G2OL{t(-JlJ@Jl?9(FNFt

`8#0Ht*}!ZF6>;`N3@C~BG?q!B8}xM;;$1e6Z2pwTuIt0 zc_bMG2JDC+3x|Ww5EYdXSw6#NfkE1OLEvbTHxovaiACI`i$ZY1h#_XPi9%dP!o(Te zCU+9=9J4{82zbVYKjg^bLnT97($SQ8A)=1`kM*DjSyza?Pgg6Z=$G??8mYX>5-)IupS?i zeW*BWJ|pJwU(l4pc&4dz#jJK)#;we!=guiT-&x$4wPSxtPuy31L)UKjuXiu(?pgQU(Du_e z?l%oyygk@EKu0_4+m_Y0-SEXui_}*SRb}sMO~^QuJO5K-b@Ps_=YA*8b{)Lj%U`Z* zTl4j|-TlADZ*Hn?<`1_|t2n)WF;tcLUV2SaS47!BvDX;4;>fNAYhJssDZS=1dIOYP zH@7PD4^v!p=gg={6Q77Iz4zwM^Bm@=xp-@^q;qS_&q?!o)VO)eYn{jRdu|R6ZEi~3 zQ+XzJ_Kbu>Hn`!c*xkP^Ibz!qf8+HhD@vX7)^)I0Y}t{kVi%INFJ?>2CJ<%V~2%2O})`PU`K|FEI1w*Ta+0|468b+YlyF{{2~%H*2ako=(8#d@!Z;xP9utR{QMK-P0=@z9~6(yuPh&<>zNz z2RVaa*tWIcV8ya}@0Tkty)^Y&Ymb^+S-fiXq$`mhx44gXFq`Ct?LQ@6>0TW;v3T$0 e-oM_j{&UK%4rB8(cPLi-63Ix*vh7cOeZ$`y`XzG! literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/hide@2x.png b/Telegram/Resources/icons/menu/hide@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c5dc78095b2b2b5e77127d4f2b72bb78821c7357 GIT binary patch literal 2818 zcmb_e4^R_V8V_hoi=tNabgn9KwF9D?-TWoHl3+qWI1K`3M(7-lo83*akYr;vfrJ*$ zaw<^dM8O-PAW}rsc7V!Ixhh<*C{j-mk%C3kYfsOfPWfZKVUAk47yeamwC8kgXLk4P zd%yR6zwi5g@4d~Bk6Rz$|7(99j~5Udqe%pB)O)|?3!c}vSv$e&bz4j_$K%Zk^xi(a zgJp|(yjLq3U6Lb7yAdZ@i-4e5JuPrqYyi#Ug-5t-1er!V_cKMrxE zDIk^CAwNkQ&yQs7G+!!^!K6?k<%eMcp-e2nur+)UDwHFr91)6Pp$wOxxJbmGyddDs zP8sk-P4uKM@TGuE4u=g#kc^BBL55hs+Kq@1!!QIDAtDhB5HRPqItUkRqtDW}oTrL*Nv!qjxmWn7^DmREF28ncPzJ?{8-r{=aPw1RtNnqnAue3p=*HdC4943*;VcH-; zVLc%xVVVe&NDbhjH;AUJZL%|9sS)O~goR=m2BV||gXI(k_=Qmt zEKDkw8T2x*pvN_W$1ohIo_lhMY^JwQw#*EFToyP%dgZQwNN=5K3YzR@o|BK4@;o^| z!$bq4KU4e(?;LAzWDs^*Wdyl<8GRuy;?EK3KhIt+H((ShLt(L0EQiDN5(z99iw&?? zju{LjDWYW@9 z5V?DBY-DUO?!s5brjbwG^4ot`rqwkMobDa%>FYhG+2y}5G<#`TdHL$lP?1QKy8$u&LSiChWsJr}^XKm`EiElCPl=D;aeH1+(BQp$#U`Lg4$dzib{8$oj?$cAJ z5_LMtYOQ5AHa0ePvu-z*vNtbJj^ogSk&%%bH*RnoS6p0tgi1|K-M)QzXlQ77c;BM0 zdU}3k?I{XhxMlHj>iQ(^FYl>2|xbva))6d;9B0fB4~F)$gA# z-q>{JOjuahiZ72B@7nbWg49)94EESK?!myovAEjWT3=t^?DvEH{Blc5N*wd!+S>Zc&9?LBRSWX& zK7M>QXUEBtC+m$a*Y&Gc6ZQuO1ywXRE36N1_4ls~4xW{{d#C!tykwfL{>b!hRu*$p zt-jN}^qbu+k)bDIT3TA#+S>d_>rR|lF1vE&ib|#G@+mAV+!t`@(4qGAQO?|V@ra0; zzShu(jg3;h7{^23(5ltG!YsF&sLpZSRFw@347B%lck5Jhhh~qR+wHsty0<6TtDaj{rk|FzP`S5zUocK zr1{JKee<*K?gb}OSr+*s@RRk?(f)^XKK?`K2A!^?|J3d4*XK#r1y_`o7I`-1B&DRh z)wcNUqt4fU%#$tcE;w?zv$M0SYkzfh^&HM;VKkL$v(>NpSOCM-x7>Q|d)sF>>;%$+ z4tL_m4_2vGnT*GiP6f;_DlT4Ox&}f{Nx57YTUK-F(#C^$srW$QlK8C9A)cIU_B8qA ze=k|PcEg3aW?lHJ?#xV(rNqG*GiHdI>s{&_N`>M)_}7woVp`62ww}mnN;8>0`=I0d zrrg}zfvfXMJ)XwXr@0H|4Gj$)9UYGzIfi3P{<=9i+4EjS1H&+jgI#;yd^lTeC^B|} z!S(BNm7_=HmxaBxb#(<1b3hKvX7iqNfj)=3+E;declYjF2jT@T`)EV>aN@Fn)vH#$ zu8tZruj|Ns=beH(fg4nN0tA~ritW07B%EpNyZ!Lq=Im_c)`Hma{dEyuP}T7 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/hide@3x.png b/Telegram/Resources/icons/menu/hide@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e32ae8b2909a41758375a5dd951794a38e945393 GIT binary patch literal 3023 zcmbVO2~-nz9*!0eP(VQr0X0Sr5ke*j3CUD)&+Z9C=k0;Rm2awf$w(HxxH<_8t_y4}%@%?|9 zz2O`FU}5fPP9P90c){FAa1J&crnABKt$i-@!O2V=ycs7D=GqvJS%ku32Li#kOD@=? z-NX-t5lrbV6k{UPJ6Wj)XaZriU$R<=B%oTN2$jlJ9MY4&H;{;OF^3ex;6r?MAS#mw zr)toRsT%}HY68L*ll;~YS0}@OK#6LF#AKyHg~Q1l(j+eot_?p^NW@8qHi1L(HwY3p z@xzIMmyqRQ#>cb%Vvc0KHx(}P}MWjJg76oEasB|)w3Hv}WjYgdQkbs&-EP*4r z>!!899fu^-YSl1>l9ZI>okaJ>G*Swc&1O>|8iht90|XgQQE7$AWEH;rEdv+D5sh4} zm18QRfl(;JbXpDxL^_p%QawYf!l%mw3Pwp5swq@&$dJ+`P>jsr)H;n~Qe2EsPz9<) zRazWisWVu$4AWw`4Eqi0naA%5fYS2$Ga4U^MX8*Tz_me%AdTsQd=QNbQq(9V62&o{ z20?=oL72-8*{I<_4Jy=P8UcnW-Zm=yZOFvHKtp5L#1%1el^9FHJ>FS^a)nxyL!v>T z+z^!vu>}wfrmGC=7Jm`Z&Q3S1)=YK8w3EJk1nrcnw( z&T^$tic-`nDTz2!NjMNwU>YC{qN7hn!RNy~6|NPk5R}K|kU-kra=930u_SCU#DvIn z2AxIr75Vs(S#-LDOlPqr5(J^4Og8)NdM<|O49zvHpYpjFLjcErR1pc4Mx&!lGK8`b zGE?lsCX3h-h%AD95SkeAVX_hCTedKb9BehA;$2olRARvB3kiLw3^78c(wS^Bga96v zm`x`mzJSt~!D328OoO2(Jpu>IanQY#=`FGm-7$TokP|0u0Sgg>-8m%0&}URkn*Le- zfqHzD^7Q&7845^$r} z>Ea+Vp-PH^2}&Uu@}U@J%~WeB|J}98XYb6Vw{S4*43{%g7TnCtX;cNMHDC(smSuN< z;a6I%sYyNre+_{GjA1<}`-INc+z#m0i zTwFNhFwf-vrVZa;>+FOWjM3rY;IJ@EsoWMDyAvel#JQQ-($eBbQXS!Wk;%;?hpVcZ zCC34Oe0==tQ@wZYxVyPcn5uROMWXJjSB*kn{Tvk)6;Z_e>jRSvT~Aln+4z+$t*y4U zwhf;(@Julbt9jf9axc84;AJ>@x#T*E$nGdQuy?On>73E$&vQNgWQKpT?RrnoT=RPa z1I8_9DED^+f7jR7H@kPF;p@Ue$I>}bF){gP%wq#j&u$A$9g2&OZ`GH%y1G^`Q#52` z5W1rmyZL6~wiO{OJw10^mxhGQ-L6YbH6P7oc~)1-Myg1vj1woA#Y2Q<$67~cXO|6% z#6-JM&N{7peY|0OR7nqOj< z)4V?xH#Rmlb57A{8W(Sji~IWLr58ECj&)bE?7zI!*4DPSehneY_EnReon2jY?k@G9 z5r+aF=ymwx-Ho7K%{)q!DQ zVbsr2sq~)Aa^c9xNKH-6u2W~>Cf-Y6#FHma#>TvP^QK>SJ-ob&^z6lp-T49Vs#UIC z?JNfehqdD_?(R85Sr;V-z01p@!o%mQL}IZK+zBd5QiWSbSgl&MitD)D^r>F&{7d!G zqY;%+adAt&tju!q3RtorbnH-5N5`Ybk1a=SmoBAro7X3qz46V&QX~=+hO?7XesxzU zpC8oA@$*YdOUrpwvOOW8ZQ#0I-*H7obC|~~l9gIoU0s>qwoq7j3LZ|^+Y zxjh$8niZr#QDa>?jxVRFif_BnXx;7YUqHT_GJ%V~aekmKG8SCjp>n9Gs5s9#XHy+g zjs&zmA05rx>GJ6AT|#ERUrp})-COi&#lX}@w@RFE_Vhe!vQVqlcb_~7)9Evu6uM;$82mY}b@J2EpR$P~Kw;-a2)> DefinitionMap { .type = SettingType::IntSetting, .defaultValue = 0, .limitHandler = IntLimit(0, 5), }}, + { "folders/count_unmuted_only", { + .type = SettingType::BoolSetting, + .defaultValue = false, }}, + { "folders/hide_edit_button", { + .type = SettingType::BoolSetting, + .defaultValue = false, }}, + { "folders/hide_names", { + .type = SettingType::BoolSetting, + .defaultValue = false, }}, + { "folders/hide_all_chats", { + .type = SettingType::BoolSetting, + .defaultValue = false, }}, }; using OldOptionKey = QString; diff --git a/Telegram/SourceFiles/kotato/kotato_settings_menu.cpp b/Telegram/SourceFiles/kotato/kotato_settings_menu.cpp index 4896931c3..95237d4fc 100644 --- a/Telegram/SourceFiles/kotato/kotato_settings_menu.cpp +++ b/Telegram/SourceFiles/kotato/kotato_settings_menu.cpp @@ -127,6 +127,21 @@ QString ChatIdLabel(int option) { ::Kotato::JsonSettings::Write(); \ }, container->lifetime()); +#define SettingsMenuJsonFilterSwitch(LangKey, Option) AddButton( \ + container, \ + rktr(#LangKey), \ + st::settingsButtonNoIcon \ +)->toggleOn( \ + rpl::single(::Kotato::JsonSettings::GetBool(#Option)) \ +)->toggledValue( \ +) | rpl::filter([](bool enabled) { \ + return (enabled != ::Kotato::JsonSettings::GetBool(#Option)); \ +}) | rpl::start_with_next([controller](bool enabled) { \ + ::Kotato::JsonSettings::Set(#Option, enabled); \ + ::Kotato::JsonSettings::Write(); \ + controller->reloadFiltersMenu(); \ +}, container->lifetime()); + void SetupKotatoChats( not_null controller, not_null container) { @@ -332,6 +347,10 @@ void SetupKotatoFolders( AddSkip(container); AddSubsectionTitle(container, rktr("ktg_settings_filters")); + SettingsMenuJsonFilterSwitch(ktg_settings_filters_only_unmuted_counter, folders/count_unmuted_only); + SettingsMenuJsonFilterSwitch(ktg_settings_filters_hide_all, folders/hide_all_chats); + SettingsMenuJsonFilterSwitch(ktg_settings_filters_hide_edit, folders/hide_edit_button); + SettingsMenuJsonFilterSwitch(ktg_settings_filters_hide_folder_names, folders/hide_names); AddSkip(container); } diff --git a/Telegram/SourceFiles/ui/menu_icons.style b/Telegram/SourceFiles/ui/menu_icons.style index 7be43b08f..1edca85ee 100644 --- a/Telegram/SourceFiles/ui/menu_icons.style +++ b/Telegram/SourceFiles/ui/menu_icons.style @@ -77,6 +77,7 @@ menuIconFake: icon {{ "menu/fake", menuIconColor }}; menuIconPersonal: icon {{ "menu/personal", menuIconColor }}; menuIconPorn: icon {{ "menu/porn", menuIconColor }}; menuIconViolence: icon {{ "menu/violence", menuIconColor }}; +menuIconHide: icon {{ "menu/hide", menuIconColor }}; menuIconMuteFor: icon {{ "menu/mute_for", menuIconColor }}; menuIconSilent: icon {{ "menu/silent", menuIconColor }}; menuIconCustomize: icon {{ "menu/customize", menuIconColor }}; diff --git a/Telegram/SourceFiles/window/window.style b/Telegram/SourceFiles/window/window.style index 3f079cacb..09fceb1e0 100644 --- a/Telegram/SourceFiles/window/window.style +++ b/Telegram/SourceFiles/window/window.style @@ -242,10 +242,11 @@ createThemeLink: InputField(defaultInputField) { } windowFiltersWidth: 72px; +windowFiltersWidthNoText: 50px; windowFiltersButton: SideBarButton(defaultSideBarButton) { textTop: 40px; textSkip: 6px; - minHeight: 62px; + minHeight: 48px; minTextWidth: 48px; style: TextStyle(defaultTextStyle) { font: font(11px semibold); diff --git a/Telegram/SourceFiles/window/window_filters_menu.cpp b/Telegram/SourceFiles/window/window_filters_menu.cpp index 657e0165d..2a9062d8e 100644 --- a/Telegram/SourceFiles/window/window_filters_menu.cpp +++ b/Telegram/SourceFiles/window/window_filters_menu.cpp @@ -7,6 +7,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "window/window_filters_menu.h" +#include "kotato/kotato_settings.h" +#include "kotato/kotato_lang.h" #include "mainwindow.h" #include "window/window_session_controller.h" #include "window/window_controller.h" @@ -24,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/wrap/vertical_layout.h" #include "ui/wrap/vertical_layout_reorder.h" #include "ui/widgets/popup_menu.h" +#include "ui/toast/toast.h" #include "ui/boxes/confirm_box.h" #include "boxes/filters/edit_filter_box.h" #include "boxes/premium_limits_box.h" @@ -105,7 +108,9 @@ void FiltersMenu::setup() { _parent->heightValue( ) | rpl::start_with_next([=](int height) { - const auto width = st::windowFiltersWidth; + const auto width = (::Kotato::JsonSettings::GetBool("folders/hide_names") + ? st::windowFiltersWidthNoText + : st::windowFiltersWidth); _outer.setGeometry({ 0, 0, width, height }); _menu.resizeToWidth(width); _menu.move(0, 0); @@ -240,11 +245,13 @@ void FiltersMenu::refresh() { void FiltersMenu::setupList() { _list = _container->add(object_ptr(_container)); - _setup = prepareButton( - _container, - -1, - tr::lng_filters_setup(tr::now), - Ui::FilterIcon::Edit); + if (!::Kotato::JsonSettings::GetBool("folders/hide_edit_button")) { + _setup = prepareButton( + _container, + -1, + tr::lng_filters_setup(tr::now), + Ui::FilterIcon::Edit); + } _reorder = std::make_unique(_list, &_scroll); _reorder->updates( @@ -279,7 +286,9 @@ base::unique_qptr FiltersMenu::prepareButton( bool toBeginning) { auto prepared = object_ptr( container, - id ? title : tr::lng_filters_all(tr::now), + (::Kotato::JsonSettings::GetBool("folders/hide_names") + ? QString() + : id ? title : tr::lng_filters_all(tr::now)), st::windowFiltersButton); auto added = toBeginning ? container->insert(0, std::move(prepared)) @@ -297,12 +306,22 @@ base::unique_qptr FiltersMenu::prepareButton( ) | rpl::start_with_next([=](const Dialogs::UnreadState &state) { const auto count = (state.chats + state.marks); const auto muted = (state.chatsMuted + state.marksMuted); - const auto string = !count - ? QString() - : (count > 99) - ? "99+" - : QString::number(count); - raw->setBadge(string, count == muted); + if (::Kotato::JsonSettings::GetBool("folders/count_unmuted_only")) { + const auto unmuted = count - muted; + const auto string = !unmuted + ? QString() + : (unmuted > 99) + ? "99+" + : QString::number(unmuted); + raw->setBadge(string, false); + } else { + const auto string = !count + ? QString() + : (count > 99) + ? "99+" + : QString::number(count); + raw->setBadge(string, count == muted); + } }, raw->lifetime()); } raw->setActive(_session->activeChatsFilterCurrent() == id); @@ -327,21 +346,25 @@ base::unique_qptr FiltersMenu::prepareButton( } } }); - if (id >= 0) { - raw->setAcceptDrops(true); - raw->events( - ) | rpl::filter([=](not_null e) { - return ((e->type() == QEvent::ContextMenu) && (id > 0)) - || e->type() == QEvent::DragEnter - || e->type() == QEvent::DragMove - || e->type() == QEvent::DragLeave; - }) | rpl::start_with_next([=](not_null e) { - if (raw->locked()) { - return; - } - if (e->type() == QEvent::ContextMenu) { + raw->setAcceptDrops(true); + raw->events( + ) | rpl::filter([=](not_null e) { + return ((e->type() == QEvent::ContextMenu) && (id > 0)) + || e->type() == QEvent::DragEnter + || e->type() == QEvent::DragMove + || e->type() == QEvent::DragLeave; + }) | rpl::start_with_next([=](not_null e) { + if (raw->locked()) { + return; + } + if (e->type() == QEvent::ContextMenu) { + if (id == -1) { + showEditMenu(QCursor::pos()); + } else if (id > 0) { showMenu(QCursor::pos(), id); - } else if (e->type() == QEvent::DragEnter) { + } + } else if (id >= 0) { + if (e->type() == QEvent::DragEnter) { using namespace Storage; const auto d = static_cast(e.get()); const auto data = d->mimeData(); @@ -357,8 +380,8 @@ base::unique_qptr FiltersMenu::prepareButton( _drag.filterId = FilterId(-1); _drag.timer.cancel(); } - }, raw->lifetime()); - } + } + }, raw->lifetime()); return button; } @@ -384,7 +407,7 @@ void FiltersMenu::showMenu(QPoint position, FilterId id) { addAction( tr::lng_filters_context_edit(tr::now), - [=] { showEditBox(id); }, + crl::guard(&_outer, [=] { showEditBox(id); }), &st::menuIconEdit); auto filteredChats = [=] { @@ -402,6 +425,30 @@ void FiltersMenu::showMenu(QPoint position, FilterId id) { _popupMenu->popup(position); } +void FiltersMenu::showEditMenu(QPoint position) { + if (_popupMenu) { + _popupMenu = nullptr; + return; + } + _popupMenu = base::make_unique_q( + _setup, + st::popupMenuWithIcons); + _popupMenu->addAction( + ktr("ktg_filters_hide_button"), + crl::guard(&_outer, [=] { + ::Kotato::JsonSettings::Set("folders/hide_edit_button", true); + ::Kotato::JsonSettings::Write(); + _setup = nullptr; + Ui::Toast::Show(Ui::Toast::Config{ + .text = { ktr("ktg_filters_hide_edit_toast") }, + .st = &st::windowArchiveToast, + .multiline = true, + }); + }), &st::menuIconHide); + + _popupMenu->popup(position); +} + void FiltersMenu::showEditBox(FilterId id) { EditExistingFilter(_session, id); } diff --git a/Telegram/SourceFiles/window/window_filters_menu.h b/Telegram/SourceFiles/window/window_filters_menu.h index a4084164b..db7708e53 100644 --- a/Telegram/SourceFiles/window/window_filters_menu.h +++ b/Telegram/SourceFiles/window/window_filters_menu.h @@ -48,6 +48,7 @@ private: bool toBeginning = false); void setupMainMenuIcon(); void showMenu(QPoint position, FilterId id); + void showEditMenu(QPoint position); void showEditBox(FilterId id); void showRemoveBox(FilterId id); void remove(FilterId id, std::vector> leave = {}); diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 601463962..d76f24bb7 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -2059,7 +2059,11 @@ not_null SessionController::content() const { } int SessionController::filtersWidth() const { - return _filters ? st::windowFiltersWidth : 0; + return _filters + ? (::Kotato::JsonSettings::GetBool("folders/hide_names") + ? st::windowFiltersWidthNoText + : st::windowFiltersWidth) + : 0; } rpl::producer SessionController::activeChatsFilter() const {