From 9036e9e8e366b21f0fc48f41e064264f951f2583 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 17 Apr 2024 15:09:11 +0400 Subject: [PATCH] Show pinned icon in stories. --- .../icons/dialogs/dialogs_pinned_shadow.png | Bin 0 -> 754 bytes .../icons/dialogs/dialogs_pinned_shadow@2x.png | Bin 0 -> 1608 bytes .../icons/dialogs/dialogs_pinned_shadow@3x.png | Bin 0 -> 2270 bytes Telegram/SourceFiles/data/data_story.cpp | 7 ++++++- Telegram/SourceFiles/history/history_item.cpp | 13 +++++++++++++ .../info/stories/info_stories_provider.cpp | 5 ++++- Telegram/SourceFiles/overview/overview.style | 9 +++++++++ .../SourceFiles/overview/overview_layout.cpp | 17 +++++++++++++++++ .../SourceFiles/overview/overview_layout.h | 3 +++ 9 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 Telegram/Resources/icons/dialogs/dialogs_pinned_shadow.png create mode 100644 Telegram/Resources/icons/dialogs/dialogs_pinned_shadow@2x.png create mode 100644 Telegram/Resources/icons/dialogs/dialogs_pinned_shadow@3x.png diff --git a/Telegram/Resources/icons/dialogs/dialogs_pinned_shadow.png b/Telegram/Resources/icons/dialogs/dialogs_pinned_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..19f8e0b158d6312eae7f165313329d23b4648e2a GIT binary patch literal 754 zcmVLlx=USN)&~kfpJj4hNecTHKs|^|NooX*s2r@zVI&0 z{ctXGw8xvA&wQWn+ zbywj31omorkmEQwj>BLuKx<81*OX;R(=-Nr6WDL9S0$xnG#YVtcSjHec%DbsbsUdJ zzQ4aY91fIaX;jOfFx$4VZ5yQ&N-12|B?tn-Fl0WT69fV0^O-1$czb&TpzAtw$xE1& z5~UQL=P@3SjjGvf#&Wr2xmfZ2XP!@S=KL6mwg)y28_pJ!Z76Z^_7>G7oMJ;m`zcN0%?Z1%i&6@$HCdJsMG>pjiqFqa(ln*2D&t4l!!ChEQIO|3 zd7e|2B~?`+grKS_k|bfhUb9-Q*lxER4hO2LqHWvXz`lo<@oJie)9J)+w*$a+UFy0f zj$^jlEni<>?Du<$qA;+l9$J>gU@%}f9HNw>>pGGoK?uQax5M{+wAO4k8=@#8NfPor z=X^e2#m^}04@4=2Wm#ldX8NR*!uNfYQlx3hdc9`9-&2<5mAaeJYulF7>BMHUF_{%Y z;JPlO(TJ+546v^2+rvR?P1kj%ZvaV>&@_$7>2Ns2aU9yV<#;@DJRVItF3SMhwxy~n z0Lroi;CwzCk4Y(!Qlhn{X&Pg#pEFVL?||+5XxlcH^~;`p;I-D~`Q`dgbyq;MaABSP k?>+FcZcXc(!2etS08ZD&)hKNhRsaA107*qoM6N<$f)O@jWdHyG literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/dialogs/dialogs_pinned_shadow@2x.png b/Telegram/Resources/icons/dialogs/dialogs_pinned_shadow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ac695b71d3dc4ce95e688e0854fcd44d68b8a600 GIT binary patch literal 1608 zcmV-O2DkZ%P)c48#s)NfgDIqR4(| zRDpKej*@iW-ZFw1nLErZ@O+#6hlx0cNG!pbJ$bSV;!0Eb7iVc>ZlgoxUP$B+gO%`<2X{i#bUwL)fLy**Svf8 zj`@5p73=%{30#(C?Duu8(n$PDReBUPw zL#ERyi^YQZe9mMt!S{VE%RrQi@S2m%(11=rWt zTwPtUTrLU2P^u|Z^nITo2nd1z$8j)C6J7s%i>~WXRaNHh@DgAztv3Nhh;7>@3`3U7 zrG%W#X867@K}^%cvMkw{4a0b%NY`~7k4NgdrYH*XJf|oM>bmB5Jjyonyw!ZSip2wp zqF@+?Y{IkIjL~R><2bTthKf9gYnq0lD2U^j$HzyaDB|()kt9iEk-X&3uL6n}w{1&Z z*W`IlmSyC5PF>gZeUGl|SeAupnomMC43|)@Cj!?tZ)*Oi431Ocw=J}HLh?-0+&am>TR1FO}F)oR84 z{XM(gj-n`JdwB`)&52rUP}enCma*IISg+SaQN(t;B~4T6x|U;y4a% z+Y-mIRKc<=f*@ct8sWMwecw~pHDy^+6opKS;q3R*BfoGF%d+r&pV@52#l;27<&x28 zMBn$aMdW!-+qT%Y&1^Pfu~;yfOfXGTI)=#IA>cWuyB7h6>e;rM~2OD9QwYOaF36V ztk-MeIF^8-ePmh2cs!~fj literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/dialogs/dialogs_pinned_shadow@3x.png b/Telegram/Resources/icons/dialogs/dialogs_pinned_shadow@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b05f0f35f9ef59e9ae309f7f7a17e9bb53b14b63 GIT binary patch literal 2270 zcmW+&eK^zW8z1H+ud@(ZsD@R;$~eneX|h;CD~r|HOpdZbB=3b$^D{-Q8X>EtRZCM- zl-FgIN*Z=KtJb_T8ljy;#QFBSuKVqe=XtK@x$n>YdG7qZL4GENwuT@O$b{hUyASZ# z-)f)-Sg*y8Cjqx2-k+QZ0vWCRty-Yca%&LC;3B~n7ZS~wETt!YdJAQSPi{JhGC)z6 zmZhvUF*UnyQ2gV)zkj|oQ3*<%$Vlua2{89q9@106Ey`_B5NyV6%S^+n>7LnDbHQ~j z;;i~NeNEX#dm!Lh%}grAe4eXi1s+f)V(t32ai5&fcft@Y))Jt;#Ip#NOFy3;kAZ#A z*i4_$9mPeFnLNbBC>s%Srv+ZGp>K*P_n2KcW3&Wa@TB1&4g@HikRuRuqD`0)Vw7=o zsUDe=fVCr%EWcs>I8g|eHi>jocpUT;@vcR;r1bzN>aM_0hVD{-@2_|LOMZ@Cy4OOt zZOA;WVtrvGZ~SUE4wTWzR#>T|qr)V}K@3<}8-q{Bz)bzw z;Ia%mSCli9fI9^`K2^V{i3MMPltDy{-=q3~0&5 zEpBxgRH$$=G&(RBPUugw+art7(n)m=y#p8B2VMSApLHke7K#JUfBv(%s4M#H!a@di z`}V=5CA+%1I&0IsvG3`7NtSsMEiz|w*xO#P;;LXj_SXg)b!P)!r}~Z(Jd$PyJnxj( z%b}t5cJ}t0uLqffwKPsqbc*~YVt0EDm@M}w<e$nUl2vsYcCXK_@%2uUQ70=QYKks3x? z5%H1OTdD0sBJpdkT++|ga=N^NFWX=gnRB~yq)6x2X$%agt85fbxCmb%LPqYxmz}hv z*&UFf$LdWbC|aqLu_Rll?nGa}K@pagwXu>UiW3e8p`onBNt7_oOGDG8MH!bF@euW1 z15->|slVF-5@EfL0QF~|trun)o$*AGcJb-039!@(eW|7&V;ZA~W61arl%;jykod=$ zr@{hiwOk+^D^Kntl*N=f#VD9Vn2F^~cxa30GGjjRzF;G=J!fjcx~R?i!Y-HK@%r8z zr(lgaj(C%9`=>VL!`B7xw`P>i`&v3Qw-Ayg08l04b)MCh?4Jcf2WJ6dHFFqO|U z0AOBST|GCiaXwOGV^yHbL-F3vGjs-y2ziDx5Tue&c)U-se`_>_k4S;cm9Zg3auzmYc8&2MgMYRXl{cmkam zMXs1o)-dR};gPS?7j_ex`}=RJENGuP1%fcm^6V`0V+cao1# z4V0eq$ShBC;t417kJxB3$6saIHo9U9Y14WAL zZj(^AaGT$PvfaMU$K6vrmM8s+Fz?poyO*oBcB9Yy!Q1xaeB(yc^+R~#4Yk+mnxD;P zQVmVv3ADU}0n(R#d2UY-xx5Ih?b;5-6B~1Xy_=Na#fx`)P{x?T+{_k$Xi&BnP%zU0 zjA>cGNZNZE7)LV!+pk#cF;s4uen^?39^)Rfn;RdBMz{XG<#{w304~Z{2NZVwkcDo* zDS)p;$S}@1$$LEJ@SzE+@g5b2Uj!@$wg6xUw%5i26rOBv!CcE}cLcCQ<^a6j zL^Z=f9t+?y^jg-s-^5;0IcYm^+6rYBKwx>-M%BT(i`k^8eN9sR<;Msx=(O>{dH>Z!03=}ku-YUW`8M7<&WzVOR(@~P*kKIS4o&>X01kb5ct+T%@c zU5`xYS`?Ih-hSL!OB1WeY&q)ggo8lZHaCnY;_Cj#yGt6=M237qWkO!-obX)zT6CUI z2U4%DpUZz$oL2H9h7E^+8RN%f=m$RB#g~1|9^nUS~Hym8aJ3J)vqW#4h$?H0zSxB=tIl-51E}#;Q#;t literal 0 HcmV?d00001 diff --git a/Telegram/SourceFiles/data/data_story.cpp b/Telegram/SourceFiles/data/data_story.cpp index d191d2360c..9db62b958b 100644 --- a/Telegram/SourceFiles/data/data_story.cpp +++ b/Telegram/SourceFiles/data/data_story.cpp @@ -390,7 +390,12 @@ TextWithEntities Story::inReplyText() const { } void Story::setPinnedToTop(bool pinned) { - _pinnedToTop = pinned; + if (_pinnedToTop != pinned) { + _pinnedToTop = pinned; + if (const auto item = _peer->owner().stories().lookupItem(this)) { + item->setIsPinned(pinned); + } + } } bool Story::pinnedToTop() const { diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 3dd4f26bb0..12727f64f4 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -1360,6 +1360,10 @@ void HistoryItem::setIsPinned(bool pinned) { const auto changed = (isPinned() != pinned); if (pinned) { _flags |= MessageFlag::Pinned; + if (_flags & MessageFlag::StoryItem) { + return; + } + auto &storage = _history->session().storage(); storage.add(Storage::SharedMediaAddExisting( _history->peer->id, @@ -1379,6 +1383,10 @@ void HistoryItem::setIsPinned(bool pinned) { } } else { _flags &= ~MessageFlag::Pinned; + if (_flags & MessageFlag::StoryItem) { + return; + } + _history->session().storage().remove(Storage::SharedMediaRemoveOne( _history->peer->id, Storage::SharedMediaType::Pinned, @@ -1687,6 +1695,11 @@ void HistoryItem::setStoryFields(not_null story) { /*ttlSeconds = */0); } setText(story->caption()); + if (story->pinnedToTop()) { + _flags |= MessageFlag::Pinned; + } else { + _flags &= ~MessageFlag::Pinned; + } } void HistoryItem::applyEdition(const MTPDmessageService &message) { diff --git a/Telegram/SourceFiles/info/stories/info_stories_provider.cpp b/Telegram/SourceFiles/info/stories/info_stories_provider.cpp index c3025bf854..6c9a7dabb3 100644 --- a/Telegram/SourceFiles/info/stories/info_stories_provider.cpp +++ b/Telegram/SourceFiles/info/stories/info_stories_provider.cpp @@ -343,7 +343,10 @@ std::unique_ptr Provider::createLayout( return nullptr; }; using namespace Overview::Layout; - const auto options = MediaOptions{ .story = true }; + const auto options = MediaOptions{ + .pinned = item->isPinned(), + .story = true, + }; if (const auto photo = getPhoto()) { return std::make_unique(delegate, item, photo, options); } else if (const auto file = getFile()) { diff --git a/Telegram/SourceFiles/overview/overview.style b/Telegram/SourceFiles/overview/overview.style index 82a9c70e6f..6910d536ba 100644 --- a/Telegram/SourceFiles/overview/overview.style +++ b/Telegram/SourceFiles/overview/overview.style @@ -140,3 +140,12 @@ overviewVideoPlaySelected: icon {{ "overview_video_play", historyFileThumbIconFg overviewVideoDownload: icon {{ "overview_video_download", historyFileThumbIconFg }}; overviewVideoDownloadSelected: icon {{ "overview_video_download", historyFileThumbIconFgSelected }}; overviewVideoRadialSize: 36px; + +storyPinnedIcon: icon{ + { "dialogs/dialogs_pinned_shadow", windowShadowFg }, + { "dialogs/dialogs_pinned", historyFileThumbIconFg } +}; +storyPinnedIconSelected: icon{ + { "dialogs/dialogs_pinned_shadow", windowShadowFg }, + { "dialogs/dialogs_pinned", historyFileThumbIconFgSelected } +}; diff --git a/Telegram/SourceFiles/overview/overview_layout.cpp b/Telegram/SourceFiles/overview/overview_layout.cpp index b742a6436c..e38bd1e239 100644 --- a/Telegram/SourceFiles/overview/overview_layout.cpp +++ b/Telegram/SourceFiles/overview/overview_layout.cpp @@ -339,6 +339,7 @@ Photo::Photo( , _spoiler(options.spoiler ? std::make_unique([=] { delegate->repaintItem(this); }) : nullptr) +, _pinned(options.pinned) , _story(options.story) { if (_data->inlineThumbnailBytes().isEmpty() && (_data->hasExact(Data::PhotoSize::Small) @@ -407,6 +408,14 @@ void Photo::paint(Painter &p, const QRect &clip, TextSelection selection, const if (selected) { p.fillRect(0, 0, _width, _height, st::overviewPhotoSelectOverlay); } + + if (_pinned) { + const auto &icon = selected + ? st::storyPinnedIconSelected + : st::storyPinnedIcon; + icon.paint(p, _width - icon.width(), 0, _width); + } + const auto checkDelta = st::overviewCheckSkip + st::overviewCheck.size; const auto checkLeft = _width - checkDelta; const auto checkTop = _height - checkDelta; @@ -475,6 +484,7 @@ Video::Video( , _spoiler(options.spoiler ? std::make_unique([=] { delegate->repaintItem(this); }) : nullptr) +, _pinned(options.pinned) , _story(options.story) { setDocumentLinks(_data); _data->loadThumbnail(parent->fullId()); @@ -547,6 +557,13 @@ void Video::paint(Painter &p, const QRect &clip, TextSelection selection, const p.fillRect(QRect(0, 0, _width, _height), st::overviewPhotoSelectOverlay); } + if (_pinned) { + const auto &icon = selected + ? st::storyPinnedIconSelected + : st::storyPinnedIcon; + icon.paint(p, _width - icon.width(), 0, _width); + } + if (!selected && !context->selecting && radialOpacity < 1.) { if (clip.intersects(QRect(0, _height - st::normalFont->height, _width, st::normalFont->height))) { const auto download = !loaded && !_dataMedia->canBePlayed(parent()); diff --git a/Telegram/SourceFiles/overview/overview_layout.h b/Telegram/SourceFiles/overview/overview_layout.h index 331d7f3e29..051dbb22e6 100644 --- a/Telegram/SourceFiles/overview/overview_layout.h +++ b/Telegram/SourceFiles/overview/overview_layout.h @@ -185,6 +185,7 @@ struct Info : public RuntimeComponent { struct MediaOptions { bool spoiler = false; + bool pinned = false; bool story = false; }; @@ -218,6 +219,7 @@ private: QPixmap _pix; bool _goodLoaded = false; + bool _pinned = false; bool _story = false; }; @@ -318,6 +320,7 @@ private: QPixmap _pix; bool _pixBlurred = true; + bool _pinned = false; bool _story = false; };