From 4ec579112c4c1505cbebf3168899323c8eb4bf3d Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 25 Feb 2016 13:32:31 +0300 Subject: [PATCH] beta 9026001 message/post edit done --- Telegram/Resources/lang.strings | 4 + Telegram/Resources/style.txt | 1 + Telegram/SourceFiles/art/sprite.png | Bin 180813 -> 181268 bytes Telegram/SourceFiles/art/sprite_200x.png | Bin 243908 -> 245187 bytes Telegram/SourceFiles/config.h | 2 +- Telegram/SourceFiles/history.cpp | 15 +- Telegram/SourceFiles/history.h | 58 +- Telegram/SourceFiles/historywidget.cpp | 576 ++++++++++++++------ Telegram/SourceFiles/historywidget.h | 28 +- Telegram/SourceFiles/localstorage.cpp | 172 ++++-- Telegram/SourceFiles/localstorage.h | 13 +- Telegram/SourceFiles/mainwidget.cpp | 8 +- Telegram/SourceFiles/structs.h | 4 + Telegram/SourceFiles/types.cpp | 2 + Telegram/SourceFiles/types.h | 16 + Telegram/Telegram.rc | 8 +- Telegram/Telegram.xcodeproj/project.pbxproj | 10 +- Telegram/Version | 2 +- 18 files changed, 660 insertions(+), 259 deletions(-) diff --git a/Telegram/Resources/lang.strings b/Telegram/Resources/lang.strings index e89b8be690..cfc0023038 100644 --- a/Telegram/Resources/lang.strings +++ b/Telegram/Resources/lang.strings @@ -127,6 +127,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org "lng_edit_deleted" = "This message was deleted"; "lng_edit_too_long" = "Your message text is too long"; "lng_edit_message" = "Edit message"; +"lng_edit_message_text" = "New message text.."; "lng_deleted" = "Unknown"; "lng_deleted_message" = "Deleted message"; @@ -653,6 +654,8 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org "lng_comment_ph" = "Write a comment.."; "lng_broadcast_ph" = "Broadcast a message.."; "lng_record_cancel" = "Release outside this field to cancel"; +"lng_will_be_notified" = "Members will be notified when you post"; +"lng_wont_be_notified" = "Members will not be notified when you post"; "lng_empty_history" = ""; "lng_willbe_history" = "Please select a chat to start messaging"; "lng_message_with_from" = "[c]{from}:[/c] {message}"; @@ -712,6 +715,7 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org "lng_context_open_link" = "Open Link"; "lng_context_copy_link" = "Copy Link"; +"lng_context_copy_post_link" = "Copy Post Link"; "lng_context_open_email" = "Write to this address"; "lng_context_copy_email" = "Copy email address"; "lng_context_open_hashtag" = "Search by hashtag"; diff --git a/Telegram/Resources/style.txt b/Telegram/Resources/style.txt index 5638278665..2068c1fe5b 100644 --- a/Telegram/Resources/style.txt +++ b/Telegram/Resources/style.txt @@ -1429,6 +1429,7 @@ replyTop: 8px; replyBottom: 6px; replyIconPos: point(13px, 13px); replyIcon: sprite(343px, 197px, 24px, 24px); +editIcon: sprite(371px, 286px, 24px, 24px); replyCancel: iconedButton(btnDefIconed) { icon: sprite(165px, 24px, 14px, 14px); iconPos: point(17px, 17px); diff --git a/Telegram/SourceFiles/art/sprite.png b/Telegram/SourceFiles/art/sprite.png index ce32997180845c214bfe77e720afd2f259214f31..11d3fbb61b14acdf5d354db367b911179094fe38 100644 GIT binary patch delta 15980 zcma*OWn5KX&<09_G}0-E64DJ)A|=w&UDDmnrjb^xayLD&I9o?xc|ZR*&*|}Y-U5Fb*|MxrxJ*m@VD@fW)so@0zjIHJ?*m|e&HnJJh~pv@5V@n9DW2L5;1i(YCI*usP2gLG8n~HXO$+F z$f&2A9EM3rWKE_lw!jSOjMCW{e0jtt`{LJxCuPA(eR>alZ}$;;_|duSH+l4noLsi zq<7GM66AnCtnd4VjFlK$8wUpSNeC_Lo$RI#iAMi$Vt6EXF(wHgJ5_c}{EfrI-F%JT zPg6KD#%6zhNW@L%@C&D;(#>mEM?F>ANV+Z6BxD8Iw%jomzXIDfYWL@C$!?J;8ZtMl z^AJD|xgxoqyyU@_#d33W?jLy?Kci4uUW!ptGdPH{Queg*Cy+868@af{^SY@cb z+MRES{jPGO`zs!;KN)IvdVfSdU27hoX+p_8*VJ@i#Lq9^7|KO|D6nn<5g{BqaR{HBJ4#Lt%}2Bod~ZDWw`ZAP zAfli)UbFK!xB%`iI*>&cZcqx5Q{agab1^_WV z%o+2uU9?;_hvjlr)h(Pt<@V>jF36-hYib^bdOaiOoa3+YE$R)AA18z7mLU==e&i z;y*Dx{V!GQ1ghZTG`_q%@{3yXi<}${506?mfNqpkSYD3VSUG9aFtxlaw{FENR%stcS#Zdtn_9|N*3+DR#OW%_PZLyXXWXHBqMiCl0CCm*O6b11vsId^DCL=17bX z?FjkWtCrE`(EeZh^taLQ&xlq-u3W zx-kEq_1{%hzl;W=ZvDrNjg8sd&%W>Zh2Tg=Q{-i5ch8M3EG*>a=IYn&lmD99%gxI2 zySwusAtg1pvU(&{NLC>$m`b3_qyF<0c}n z@a-PHCF-ibPh21@lZ!NU{b+Z4bO%XRb;&qAH3^E9tatgDS^C;m^-q{uWh93yE_&qH zfoNvt{I`?s;?I#pO5bVH&ac#tN;6`fe?r+7#f{)k6;_^#)7y?XHxM>E{oto(W?(($ zLzb79DU7z**x1@<79^tqimmZ1(RL#-&S2#G>yv`|dV<}E_p@#3Mn*_t)5WfCe4fbdCF=@^B-YWt|- zt`&?YTfcfbiVTmbN=BEfy3HT2(QR`z#1-l2=qRbFbLJlL#i@9B5^rwYt_~MOb#%y! zii&az3aG_cz{sDToz130RVt7(9!X;Ju6NYcrGP@AhbwKVi;J4yl$7qhgn}7l``v)A zZzyC6@>1uW-?{k zLwn2LADWRZI3=|>86!RYKCUe(y10-19@8LuWxRv)o@i!f#shw9D`;08MSC*P~9Z~pdxYCVs+c^baHlI~z77ik7=ExGXGJ)o@0F#hlNEy^g19>&g<~@s| zxMHV3gy9*9BT0$x*ELO~W;vs^Lvhzz+ zV_hSn(BOoI4hyE!)lP=pES_MJ2K(dZ(Ive)Zh)+cNRc3TPMU_FzeUe)A5WZ$mNq0T z3>7>-Jsytu!I-u;(6qEP*t&B+cw{p(GooKd+DZA}7XBGbDH6uUlsz)<81*b!Xr_cA z!45wdW+W$Ge{?fw2)K?ej0jcYoh`rBwr9yO!_=hdG_A9_;%+o|_3J5{IQAE1q9FOm z31l!i+KutqFSAY!9kS6pxpWTxQpKu>=TDBwcF^=VIhL9AX~onES;Jpc$8Kl>1N45^ z{CgtiL=F`5^!j*RNFq<)O-&uES8%q4MpV@@`q1Tyf}gD0^CBdO&tz7m>E(QuAYKg1 z*7lTnV)z{|ARsWFOW&H%(3HfHxl{w2jUhucSg#0z+!tsFA{%Z3snnBGEiTlR{2Dz{ zRHDfdM~2xHSC7|OwkW`GB(CzlK15FK;St5;_PoQ(MnN5TApxsM39!=Rf<dNOruFihS=Qo_x4`2pr2H&R0r<%kTN+@uJ=iL@XO1n(hsp#0gsKTbuDDe ztQ=kpo3}cc`%7G5>@w|$E?q-u3Hj_yO!<1oPj;&4wEUcMF1zQ{E{VrwaTF!2JuC`Y zJ@6-QCdy)saYw%QUEAm!3+}B4LDqKwz@Q=aKu(EHhBRfuBL^P9b*lmGW_6MF@7%BH z6QG9A1DBaqpz_$6`alP~j^J(3l%2wsU|unxGv8ThGHH(I=czkiS0q%$H3&L$vq=oV zifaDBwzq|Dl3WZ&T=lgA?G&bdrlrVyD(Jh0&njg0q<+4~q3F^fccusY>+PzzXlC); z?z}KEMMXwTCRQ4f3?dEermqzxhBq7KZh14UpXM5?0_-8Y%NB4{QA`qHNyg@HP^W3% zq|KWy$4DUEF=WR})(+aM*RX2M>0@5{JteK~x~DkX3rhksvt8qQ@n`9ZF1S>35|$I^ zGjOrRaH|YqR0AinKCDCNNADH%sxVID2NQl~4`Zr?tO^QCP`IDjLrAf)~Wp=k~&_hB`m?=Y+V=}@F7%hBG~VjaFfOJo2xZCx8TJMFi@RsNDMcgy!aEAJ4DuYOvw@ zVy^siU>?-cTC$Zd%8`t|8zR{Qk=*d1n^zZdpzoNT3IahGR+9(hIqb7#r!#(lhKX$> zm$&XVNr%+wlm0h-hw7pJp5{8o2{EqR2+wX5yoiVhbPEd$GaH*LXPR}p!+Exp)Kn?p z%NI(1eyxlMx);y}bMN@{w3w_c2AFJ*T=_%pBhb~VH}Gsy$Tx>O+IDh7nzA zIGLDQAC>|XO<2!jm3;((HQV!IIL8{+Om)5xXG7r>v48e`9UtiDVx*Yo&oOeCb$4hbKbgK%!$Kwzihy$m?QP5zyl|H8J_7puk#uU^8IPQxWf4u6T1UM2j1%B6nicmEy|o=|ChE z3{vac)57pY?np7Tv`kZq@!m^?Q{B379)>g-SuSXLvMSyM7r$164Th&;#nRDL(5$e- zKNQF95oj5_#qPM9nQL`YiAG?)ImgRIDi8CSy4=pomSBgV>0oC_U8mb!%Q; z5NKay2oDvN-^j>_;&VSA89g1{sjPoPZS75Ps(+oMs;cU|BL#I(u?g05sgt2A4r}1G zFoRC3&eq#mbiE8S1213q5NBkahnmSj*&3rHu6$Q}dyloI^t(kg;401O_XpH-M;S#8 z`4g2EHO~Kpn7kBH1w8%Asi$xav1`9(tQWkJ0LKC9+tdB6A=yR_s(=4Kc4ic``BtFylrsVlJ z7B|}j?zU=-zp)By!p*={zUuUw!~B9MD~KEJC6glJIi%rI>laSAgtE0R$*dKC`T40_ zd@O_(Qrp4_mT=mvqumP&+rH`h!J^DDWvEKuRKRb&gFjspqK#AU(`euqmtfuZ8m_du zQ@skR2;fS6S*4(0y1dYBZz8P28$QqmKglZ`mRcKs&L+5paxkPN8=H7Ehd$qm5vBub z{7r5aH&L)J#zC)YBm)FJ%JALvL95(^_W!A8g>$Cs{sVFWtzKaiW7=iG-nWCrm7Tk_ z!XNkZ`&fjI?oP>~3yk@pt19RBe`hMXpHX_cB*c zr-&T0&;c#dSj>vFRj$3-6v* zj`s(D@Ni?5rkRC(YrY3*{<^2BbYrRyjsHD_0uq(pSp{b7{ z&G-r(T6ephL< z6k#;)2O6)%Z%JIOs$Fp+FJQVJ&t9uUEkT4P+ys7@xlvCd;k$OkuWVr)GaIf)O9muf zIsJwO7Upm`Np+zjwBp3u%vA*mvaF8X$Iv`~YkLc;B3IHbtn?%mZ)-`Buuyf5ha=yb z5Oudr9rqn3q!ikLR3NXZDLFvm`?(*|M*&D9uoLiieL#e*cf&!H5e^alfQsZTkw0s9 z@-KspR_z)Vw^e_#Sb4@zWBLu01HB$bPzd4qh)(v1N0VE2Q1zyb-oO!Vqz2o_l~$K` zb&jiiCd6WMoZ+iK$CfYQ?^ERnk3h_a#GNi1trdE7(KMaHW7SY*NJ`u%Xv<2?#bol!(mxA?Vr5L z>kW=dN>jdPnrW!5e4N2b{E6hQuEb-{yM?LYXIzu$4Ud~Hk+NLr#t8*C0r-mHhp6`IAj5^By&N=h86eg+Z@prEVF$6_ji&+O@tAgl+B+VE&b-b5+XeYVX`6RBah0iwHYw+nXA%%YU!1#~{h;s}a<<`PZy7 z)8%@E+9|gW5G|>>7TCSKyv)tZV>9Rur07w8G`4ID@8-mnrcw8DW=C1rZZotO|B=vl z_Ofnh^D;>JBS?8(N~n~Sl=*gV{@dHzcQiB-xr#{eiNoU3(r79wDzyy_v1w_`6#`Q^ zkB$d(?T?5z!anoU*CXhVj@4DA;=ZEWZALif z4Gs>E%m^Lc*$AxwkZjo`;|7Qat=i1?8ER(_jg5w3&`;@!6o-~wmcy=Y{)-!@iC!&n zfo@Ppj;le>B;-GhRWK*~U^A_9KR3}ETGLPHy}LZPCySX3xxa8+>1cxR$PkXiGy(?R z(!8SIo(!Rv*nJyXV2WxpMAviAp6!P5&bxXkxhyOUua6-;`(P!LvZ^Y&AV9$`4A{~M{h{wg)o@Z?+Hzpks?l{k+dQ&xXt}G!+S)S~ z6cm&u;2zWFd5r{_V|eY|hVH(@QvM;rU`&dq;t)e<;+aGAoqyA&iyr?(rU9Liw*=M{ z%RT}%H+RC6ym0#dz6D4$L1@`?jyP2|KavpW7*AQ&W?-P>rr-F3?0f%k(bUZRe3-h+P17h!9P9u)SEiwR;c#tGSV(}*G6@@v`5na;yG*y_ zvv-SxcT0G5RC7{VwkO};Kdkn*%4oJK`{@vX$Pna~>%bm6GQMoOx43Onjl7GQK&?1o zIG6xQO*Nz{>5`OhB!glH8iHs@=H#NYswW@?{5F(^GN`K`1@l8zck7L8X00aX>~j0) zIGxM{dkqb%zpAzdMO!Yn4_=2!U@>EfoZH|L5EwQrEws4WRwRh?YO9!SH9~qAJo!E9 z7`w&b0RfN+=wS*F`>Qj8NfJz%iVAaF8X;6D)N%gGxR*!iww=f%f~61hqtV;Fc2F_t zM3g$P!Rzj3DH$y=ucRa^(q|Y+MWCdl0-lh~RK_O{KV6%`>|a(YH(iJ7J}ph;l0>@o z#o4CNVJQXp1U^1-V<4v>9NSsX6vtMz5il$cDj2$O#|S|ND{6lv^@#9rqo;>k*g1m; za(?c$RqtOo1r7rbH@*j~VC-Vvxazs_KjK?9$fJocw%3`sPe_9s;1M~&QT{&ROBta6 z7F!EVPL1nXW#nY$N40N@wFF@M;PefADg7XQ8L#X0K0E12rDrAXRm+_G!P>$iO-|K$AqR(iO(yyIE;dVZ z)@+$`;bXuJ2q2*#ooCL*CM4XsKYVT=wB>b*9sF0L|3Hq@PrH|4{FMC@r{GTL{u#26 zkuo-U)>C76bcLn{rpc}pU`xCM;drm7`X-j`WSwdrjsyo?glGZJI0>$u-nDUEV>40{ zK7-j20WZ9$$RcrO3T9x@GfbS7XS#w={id3VMBeIvwc7!~R3bPuGmUtzAiPvO=mftn z7?0+$lo7XKG!j}?h{-vf3o|Fza5q_ZY`N=^uBODl(7C>Zqy5XSsuX!sU4=E4Kw zY^aY$I2`f&mwRY&hjSLJ9{f{1xYDK<-i)fgaHN2ID%(@7@RH+OpT$@a4C2nxiD!L} z%eEpZT*zE&9+O&z(}EJ!Yq}duog#_WCobq}vwj36RygBEZn~6>8PqO~Mo}{e+0Dg) z`oXP+eOfX;aA)Qbqq5%puyURGGq>8UwO!u0;qFx8BQp!jNrO@F@YY$->e%3*fo_yf zc}D`jSC7K_iEj33X7F}G7dTOu7_)-aY|k7`_Sp}+U1LdgkS zMrbp_dPkBP)!b5gdPNwH?`ZgEk9)oBgWceFG&Eo!rDa6pqHhlM;x?v&K)t!Q5>-OA zb;#OufXz~7PR{3BSg2kG`9N;mDg2c;{p#m1l|3%@L$!SMFZCbNmi~(Ku&_jfT?4RP zaPu!#zObYOjeaS^m8iJ9JPM@bf%Wy=uW@k)hle*G1O#`!$fkyP3Yizwjs^+#-Y~f| zNC4*P;hw_g1^Kdi*A70qgk$BeI%PIbtk#%%CU4%K3U^*(%xP4p2bQXT6%`Gj5ia>9 z{q<`YoZY`aIOaRQ7}1-W+B3#ezfEUSmr;PNG=-Jj9a#K=->{cH(D?lPVlPh#`6^y~ zv(DfExs_5oJKgf23Osc-jJ0Z#kF`P^Q|UmZC5Rq$5SIhn{x;?Wxo_XZ*pF{HgrqKw zm(TOfbgEqL<2#2TE=MrT+BL0aIaSde#_O-PB^dmv{HY>7cb!&mHm1r-LJm1*)y+Ot zt6T?bCK>IsnNm4zK;3w~Zdkz%Y;ApgaM~0)+A0G~(q z1i3{FM52Pu2QEkU+Q5JlhT$P zT+D9Jji5(X^hICQ0E&PXPOJXby@+P*y3@0Bpws8%`&C%ol8TdUp$`>7usTsUN)0QX z`0a5~D}n6P6YI{5Xu*a1l1JYS@Dr)x!BI6(+REy%&~xQ5L!497kL3PW@Pvy;R~|*=ARu5%a2ItFisFSMc9J@6NAse44caukNwC1{ z!bULo9t&@U@FZu-+OBWNhIT`UZEID`!x;YfE%Idn7XezfZO(VckQN{*Hr7Z`WsX&t zKY?o}imLwPOCSIsnZVO`>iLaO8Y-fc@?622iDlN%#S##LPtJPtutC_7RBtg;Oj;nD z%I&$?AGykhKWFEnijI}e6O4AYag&Ki?0xjaaY0uGgSd;MT?Xkjgi|=ArLo>!QAo|} z69>1ni!A(nJBD`Bw3CrKVp21+<-n)swjSgfa!0al0`#5!A!G;TLZ?P9UC8R>9MzjC z;yQeNoXY+a$0#a-&4@9~wGz{JjQj8aim0m_cCq zEUaE-*f)KD+%m>MP_9yDi7FjMXlkt5&W+RO3|vO(EB<#)q>Tjg243|r1-ITn zIK&2!)6@oIAP`2|72>=JY;JDOtn_X?-Jf(USaA;!8A5M#Tp{?1RY@7MomgV<=o%CL?uf1<(yu}ycM^Wyzt{i4Y%#e1355pGZF2hZ1?9GWZ32u{NL*&7ur)|69fya8 zHu|IA2=_4%T(5YZoFGdx!W`N}rmmLk{9^eIIDo-C+&>Vjub3Qba2eVsFDyV|U#0%= z^)}rpm~k$wg0Zn?pl;#l?B~mo|Li)!>$E$r>kEpCBbAzERTR+!bzlSuFZBN0ql`Qtl;bNIc;;~%;s6#Nx z7m?TS!}Xrd5;L)8xaJ`wJWnl3oUMjc_NTqw7+&y@zq3r)Al#yScFTs^iHrA@gTeAV zn1vU9oLyBkJIW$N;#75G0*yyxA=J}2Wj~e0i9A&xAtCv`VTuqN6O#=CN{C{M?g+7| zsR!pA-|)6t3eGe+W$$~^)BvpX$sOwh{LOe6!>ZPsA%DV_&_S+F&5J`1SA0DUJJUi( zA`tcr4N&|kBM_QH`<%h9LFc?ny826>0))4h;QM?+#9ZT=g~cP-a1(!Ki%|Kw9abP@ z^=I64+RNp)BsyZEy>Gp~uV+xAQ0sCMbbP}ED-_56)gS7>g(z#QE@$_j-&Z3XEnZi5 zo=G3o8Z>=5#vRFb;9h-V$HwY~mFo8ybfUnueCU}^5I{*Rhn4loT-uYV*n>@p>`0xM zGOH)OZ-A5Z9rI&a$jg&+M-3DbGb)3&hN^=;L!crToSNtQWPzuf37320Ew?90j8SKr zar^ev&BYwpdu8rG^~20*frbmWKU#STX+TF)G0usSRIte-ctYwuv2FE=*dgYobrrE0 zOjOQ5NyQAOtj{S0$#x_%$%<7TP&5;bM&bn#AF`BnVm07kqox zjYApH$FTTiBM7Bo*{!5fgv&fDZbmX*UJvP=i2eDI*4Eapx(jH1{R2k>DM% zs}#m*8%;5LJX2oP(uJMXb62W_hTq-lDAyNJI#Z*7T86TU$}doZ77-E2ToSEg9i{n5 z+bC)b3r{wzhSxWpd6Mn>?pEUq1VH&r33guWTOi^D%xj-L7K38!Nk?->{Am`YFqLsrH`|&ExLH+JIXW@y zc_*&;R4OW&YIyIF zIya%UY5S>49PHEomTaVfL68ct&2o(XyrlHU76-dFQ!6VJSFVDL=+yg%GH>yYH-|xF zRF<8J!yx5W2CrupGn##1RZ@&A40R|m*G$c(d!&#Co0J2y6?#BQHl1rp@!iaEpX6|W zd4>=q=4x8W=p(n4ne7wgBn2WFEg@Q~4vl#&!IhVn$4iC@VYAGeCP&-idXisT8wcjPw8_bD zE=P+&J?oSJ3rocqj~xq+j_t(a;yyy-)7`-i9wDJ#i(y|FBB)^%6mu|;(PNYsTT~Yp zTl}ylA#cVZEO@tUCpwulr#BYSw)-}em%vXLxs+{8B6@#Gwqk|7jF@T<0h68&G^m}L?A!YdV(wuiG}QyXv)<~9IJsL^UN zSIS(}IP®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 delta 15516 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 diff --git a/Telegram/SourceFiles/art/sprite_200x.png b/Telegram/SourceFiles/art/sprite_200x.png index 16b454f0570083120156ac334862d07f4734f772..daa7b16f35a39439cd138bb9030cfda00ecc16d0 100644 GIT binary patch delta 36648 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 delta 35380 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 || (peer->isUser() && peer->asUser()->botInfo)) { outboxReadBefore = INT_MAX; } @@ -2674,6 +2674,12 @@ void History::removeBlock(HistoryBlock *block) { delete block; } +History::~History() { + clear(); + deleteAndMark(msgDraft); + deleteAndMark(editDraft); +} + int32 HistoryBlock::geomResize(int32 newWidth, int32 *ytransform, const HistoryItem *resizedItem) { int32 y = 0; for (Items::iterator i = items.begin(), e = items.end(); i != e; ++i) { @@ -2926,7 +2932,8 @@ bool HistoryItem::canEdit(const QDateTime &cur) const { t != MediaTypeFile && t != MediaTypeGif && t != MediaTypeMusicFile && - t != MediaTypeVoiceFile) { + t != MediaTypeVoiceFile && + t != MediaTypeWebPage) { return false; } } diff --git a/Telegram/SourceFiles/history.h b/Telegram/SourceFiles/history.h index d1e410d1fd..6bf69c08f5 100644 --- a/Telegram/SourceFiles/history.h +++ b/Telegram/SourceFiles/history.h @@ -149,6 +149,42 @@ struct SendAction { int32 progress; }; +struct HistoryDraft { + HistoryDraft() : msgId(0), previewCancelled(false) { + } + HistoryDraft(const QString &text, MsgId msgId, const MessageCursor &cursor, bool previewCancelled) + : text(text) + , msgId(msgId) + , cursor(cursor) + , previewCancelled(previewCancelled) { + } + HistoryDraft(const FlatTextarea &field, MsgId msgId, bool previewCancelled) + : text(field.getLastText()) + , msgId(msgId) + , cursor(field) + , previewCancelled(previewCancelled) { + } + QString text; + MsgId msgId; // replyToId for message draft, editMsgId for edit draft + MessageCursor cursor; + bool previewCancelled; +}; +struct HistoryEditDraft : public HistoryDraft { + HistoryEditDraft() + : HistoryDraft() + , saveRequest(0) { + } + HistoryEditDraft(const QString &text, MsgId msgId, const MessageCursor &cursor, bool previewCancelled, mtpRequestId saveRequest = 0) + : HistoryDraft(text, msgId, cursor, previewCancelled) + , saveRequest(saveRequest) { + } + HistoryEditDraft(const FlatTextarea &field, MsgId msgId, bool previewCancelled, mtpRequestId saveRequest = 0) + : HistoryDraft(field, msgId, previewCancelled) + , saveRequest(saveRequest) { + } + mtpRequestId saveRequest; +}; + class HistoryMedia; class HistoryMessage; class HistoryUnreadBar; @@ -184,9 +220,7 @@ public: void blockResized(HistoryBlock *block, int32 dh); void removeBlock(HistoryBlock *block); - virtual ~History() { - clear(); - } + virtual ~History(); HistoryItem *createItem(HistoryBlock *block, const MTPMessage &msg, bool applyServiceAction); HistoryItem *createItemForwarded(HistoryBlock *block, MsgId id, int32 flags, QDateTime date, int32 from, HistoryMessage *msg); @@ -284,10 +318,20 @@ public: typedef QList NotifyQueue; NotifyQueue notifies; - QString draft; - MsgId draftToId; - MessageCursor draftCursor; - bool draftPreviewCancelled; + HistoryDraft *msgDraft; + HistoryEditDraft *editDraft; + HistoryDraft *draft() { + return editDraft ? editDraft : msgDraft; + } + void setMsgDraft(HistoryDraft *draft) { + if (msgDraft) delete msgDraft; + msgDraft = draft; + } + void setEditDraft(HistoryEditDraft *draft) { + if (editDraft) delete editDraft; + editDraft = draft; + } + int32 lastWidth, lastScrollTop; MsgId lastShowAtMsgId; bool mute; diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp index bba4594afa..b21d9f3cd5 100644 --- a/Telegram/SourceFiles/historywidget.cpp +++ b/Telegram/SourceFiles/historywidget.cpp @@ -2609,9 +2609,11 @@ void CollapseButton::paintEvent(QPaintEvent *e) { HistoryWidget::HistoryWidget(QWidget *parent) : TWidget(parent) , _replyToId(0) -, _replyTo(0) , _replyToNameVersion(0) -, _replyForwardPreviewCancel(this, st::replyCancel) +, _editMsgId(0) +, _replyEditMsg(0) +, _fieldBarCancel(this, st::replyCancel) +, _saveEditMsgRequestId(0) , _reportSpamStatus(dbiprsUnknown) , _previewData(0) , _previewRequest(0) @@ -2661,7 +2663,10 @@ HistoryWidget::HistoryWidget(QWidget *parent) : TWidget(parent) , _field(this, st::taMsgField, lang(lng_message_ph)) , _a_record(animation(this, &HistoryWidget::step_record)) , _a_recording(animation(this, &HistoryWidget::step_recording)) -, _recording(false), _inRecord(false), _inField(false), _inReply(false) +, _recording(false) +, _inRecord(false) +, _inField(false) +, _inReplyEdit(false) , a_recordingLevel(0, 0), _recordingSamples(0) , a_recordOver(0, 0), a_recordDown(0, 0), a_recordCancel(st::recordCancel->c, st::recordCancel->c) , _recordCancelWidth(st::recordFont->width(lang(lng_record_cancel))) @@ -2697,7 +2702,7 @@ HistoryWidget::HistoryWidget(QWidget *parent) : TWidget(parent) connect(&_reportSpamPanel, SIGNAL(clearClicked()), this, SLOT(onReportSpamClear())); connect(&_toHistoryEnd, SIGNAL(clicked()), this, SLOT(onHistoryToEnd())); connect(&_collapseComments, SIGNAL(clicked()), this, SLOT(onCollapseComments())); - connect(&_replyForwardPreviewCancel, SIGNAL(clicked()), this, SLOT(onReplyForwardPreviewCancel())); + connect(&_fieldBarCancel, SIGNAL(clicked()), this, SLOT(onFieldBarCancel())); connect(&_send, SIGNAL(clicked()), this, SLOT(onSend())); connect(&_unblock, SIGNAL(clicked()), this, SLOT(onUnblock())); connect(&_botStart, SIGNAL(clicked()), this, SLOT(onBotStart())); @@ -2745,7 +2750,7 @@ HistoryWidget::HistoryWidget(QWidget *parent) : TWidget(parent) connect(&_field, SIGNAL(cursorPositionChanged()), this, SLOT(onDraftSaveDelayed())); connect(&_field, SIGNAL(cursorPositionChanged()), this, SLOT(onCheckMentionDropdown()), Qt::QueuedConnection); - _replyForwardPreviewCancel.hide(); + _fieldBarCancel.hide(); _scroll.hide(); _scroll.move(0, 0); @@ -2897,20 +2902,20 @@ void HistoryWidget::onTextChange() { updateStickersByEmoji(); if (_peer && (!_peer->isChannel() || _peer->isMegagroup() || !_peer->asChannel()->canPublish() || (!_peer->asChannel()->isBroadcast() && !_broadcast.checked()))) { - if (!_inlineBot && (_textUpdateEventsFlags & TextUpdateEventsSendTyping)) { + if (!_inlineBot && !_editMsgId && (_textUpdateEventsFlags & TextUpdateEventsSendTyping)) { updateSendAction(_history, SendActionTyping); } } if (cHasAudioCapture()) { - if (!_field.hasSendText() && !readyToForward()) { + if (!_field.hasSendText() && !readyToForward() && !_editMsgId) { _previewCancelled = false; _send.hide(); - setMouseTracking(true); + updateMouseTracking(); mouseMoveEvent(0); } else if (!_field.isHidden() && _send.isHidden()) { _send.show(); - setMouseTracking(false); + updateMouseTracking(); _a_record.stop(); _inRecord = _inField = false; a_recordOver = a_recordDown = anim::fvalue(0, 0); @@ -2931,7 +2936,9 @@ void HistoryWidget::onTextChange() { void HistoryWidget::onDraftSaveDelayed() { if (!_peer || !(_textUpdateEventsFlags & TextUpdateEventsSaveDraft)) return; if (!_field.textCursor().anchor() && !_field.textCursor().position() && !_field.verticalScrollBar()->value()) { - if (!Local::hasDraftPositions(_peer->id)) return; + if (!Local::hasDraftCursors(_peer->id)) { + return; + } } onDraftSave(true); } @@ -2947,30 +2954,77 @@ void HistoryWidget::onDraftSave(bool delayed) { return _saveDraftTimer.start(SaveDraftTimeout); } } - writeDraft(); + writeDrafts(Nil, Nil); } -void HistoryWidget::writeDraft(MsgId *replyTo, const QString *text, const MessageCursor *cursor, bool *previewCancelled) { +void HistoryWidget::writeDrafts(HistoryDraft **msgDraft, HistoryEditDraft **editDraft) { + if (!msgDraft && _editMsgId) msgDraft = &_history->msgDraft; + bool save = _peer && (_saveDraftStart > 0); _saveDraftStart = 0; _saveDraftTimer.stop(); if (_saveDraftText) { if (save) { - Local::writeDraft(_peer->id, Local::MessageDraft(replyTo ? (*replyTo) : _replyToId, text ? (*text) : _field.getLastText(), previewCancelled ? (*previewCancelled) : _previewCancelled)); + Local::MessageDraft localMsgDraft, localEditDraft; + if (msgDraft) { + if (*msgDraft) { + localMsgDraft = Local::MessageDraft((*msgDraft)->msgId, (*msgDraft)->text, (*msgDraft)->previewCancelled); + } + } else { + localMsgDraft = Local::MessageDraft(_replyToId, _field.getLastText(), _previewCancelled); + } + if (editDraft) { + if (*editDraft) { + localEditDraft = Local::MessageDraft((*editDraft)->msgId, (*editDraft)->text, (*editDraft)->previewCancelled); + } + } else if (_editMsgId) { + localEditDraft = Local::MessageDraft(_editMsgId, _field.getLastText(), _previewCancelled); + } + Local::writeDrafts(_peer->id, localMsgDraft, localEditDraft); if (_migrated) { - Local::writeDraft(_migrated->peer->id, Local::MessageDraft()); + Local::writeDrafts(_migrated->peer->id, Local::MessageDraft(), Local::MessageDraft()); } } _saveDraftText = false; } if (save) { - Local::writeDraftPositions(_peer->id, cursor ? (*cursor) : MessageCursor(_field)); + MessageCursor msgCursor, editCursor; + if (msgDraft) { + if (*msgDraft) { + msgCursor = (*msgDraft)->cursor; + } + } else { + msgCursor = MessageCursor(_field); + } + if (editDraft) { + if (*editDraft) { + editCursor = (*editDraft)->cursor; + } + } else if (_editMsgId) { + editCursor = MessageCursor(_field); + } + Local::writeDraftCursors(_peer->id, msgCursor, editCursor); if (_migrated) { - Local::writeDraftPositions(_migrated->peer->id, MessageCursor()); + Local::writeDraftCursors(_migrated->peer->id, MessageCursor(), MessageCursor()); } } } +void HistoryWidget::writeDrafts(History *history) { + Local::MessageDraft localMsgDraft, localEditDraft; + MessageCursor msgCursor, editCursor; + if (history->msgDraft) { + localMsgDraft = Local::MessageDraft(history->msgDraft->msgId, history->msgDraft->text, history->msgDraft->previewCancelled); + msgCursor = history->msgDraft->cursor; + } + if (history->editDraft) { + localEditDraft = Local::MessageDraft(history->editDraft->msgId, history->editDraft->text, history->editDraft->previewCancelled); + editCursor = history->editDraft->cursor; + } + Local::writeDrafts(history->peer->id, localMsgDraft, localEditDraft); + Local::writeDraftCursors(history->peer->id, msgCursor, editCursor); +} + void HistoryWidget::cancelSendAction(History *history, SendActionType type) { QMap, mtpRequestId>::iterator i = _sendActionRequests.find(qMakePair(history, type)); if (i != _sendActionRequests.cend()) { @@ -3374,16 +3428,36 @@ void HistoryWidget::fastShowAtEnd(History *h) { } void HistoryWidget::applyDraft(bool parseLinks) { - if (!_history) return; - setFieldText(_history->draft); - _field.setFocus(); + HistoryDraft *draft = _history ? _history->draft() : 0; + if (!draft) { + setFieldText(QString()); + _field.setFocus(); + _editMsgId = _replyToId = 0; + return; + } + _textUpdateEventsFlags = 0; - _history->draftCursor.applyTo(_field); + setFieldText(draft->text); + _field.setFocus(); + draft->cursor.applyTo(_field); _textUpdateEventsFlags = TextUpdateEventsSaveDraft | TextUpdateEventsSendTyping; - _previewCancelled = _history->draftPreviewCancelled; + _previewCancelled = draft->previewCancelled; + if (_history->editDraft) { + _editMsgId = _history->editDraft->msgId; + _replyToId = 0; + } else { + _editMsgId = 0; + _replyToId = readyToForward() ? 0 : _history->msgDraft->msgId; + } if (parseLinks) { onPreviewParse(); } + if (_editMsgId || _replyToId) { + updateReplyEditTexts(); + if (!_replyEditMsg && App::api()) { + App::api()->requestReplyTo(0, _peer->asChannel(), _editMsgId ? _editMsgId : _replyToId); + } + } } void HistoryWidget::showHistory(const PeerId &peerId, MsgId showAtMsgId, bool reload) { @@ -3441,13 +3515,22 @@ void HistoryWidget::showHistory(const PeerId &peerId, MsgId showAtMsgId, bool re clearAllLoadRequests(); if (_history) { - _history->draft = _field.getLastText(); - if (_migrated) _migrated->draft = QString(); // use migrated draft only once - _history->draftCursor.fillFrom(_field); - _history->draftToId = _replyToId; - _history->draftPreviewCancelled = _previewCancelled; + if (_editMsgId) { + _history->setEditDraft(new HistoryEditDraft(_field, _editMsgId, _previewCancelled, _saveEditMsgRequestId)); + } else { + if (_replyToId || !_field.getLastText().isEmpty()) { + _history->setMsgDraft(new HistoryDraft(_field, _replyToId, _previewCancelled)); + } else { + _history->setMsgDraft(Nil); + } + _history->setEditDraft(Nil); + } + if (_migrated) { + _migrated->setMsgDraft(Nil); // use migrated draft only once + _migrated->setEditDraft(Nil); + } - writeDraft(&_history->draftToId, &_history->draft, &_history->draftCursor, &_history->draftPreviewCancelled); + writeDrafts(&_history->msgDraft, &_history->editDraft); if (_scroll.scrollTop() + 1 <= _scroll.scrollTopMax()) { _history->lastWidth = _list->width(); @@ -3467,16 +3550,14 @@ void HistoryWidget::showHistory(const PeerId &peerId, MsgId showAtMsgId, bool re updateBotKeyboard(); } - if (_replyToId) { - _replyTo = 0; - _replyToId = 0; - _replyForwardPreviewCancel.hide(); - } - if (_previewData && _previewData->pendingTill >= 0) { - _previewData = 0; - _replyForwardPreviewCancel.hide(); - } + _editMsgId = 0; + _saveEditMsgRequestId = 0; + _replyToId = 0; + _replyEditMsg = 0; + _previewData = 0; _previewCache.clear(); + _fieldBarCancel.hide(); + if (_list) _list->deleteLater(); _list = 0; _scroll.takeWidget(); @@ -3552,39 +3633,20 @@ void HistoryWidget::showHistory(const PeerId &peerId, MsgId showAtMsgId, bool re App::main()->peerUpdated(_peer); - if (_history->draftToId > 0 || !_history->draft.isEmpty()) { - applyDraft(false); - _replyToId = readyToForward() ? 0 : _history->draftToId; - } else if (_migrated && !_migrated->draft.isEmpty()) { - _history->draft = _migrated->draft; - _history->draftCursor = _migrated->draftCursor; - _history->draftPreviewCancelled = _migrated->draftPreviewCancelled; - _history->draftToId = 0; - _migrated->draft = QString(); // use migrated draft only once - applyDraft(false); - _replyToId = 0; - } else { - bool fromMigrated = false; - Local::MessageDraft draft = Local::readDraft(_peer->id); - if (draft.replyTo <= 0 && draft.text.isEmpty() && _migrated) { - fromMigrated = true; - draft = Local::readDraft(_migrated->peer->id); + Local::readDraftsWithCursors(_history); + if (_migrated) { + Local::readDraftsWithCursors(_migrated); + _migrated->setEditDraft(Nil); + if (_migrated->msgDraft && !_migrated->msgDraft->text.isEmpty()) { + _migrated->msgDraft->msgId = 0; // edit and reply to drafts can't migrate + if (!_history->msgDraft) { + _history->setMsgDraft(new HistoryDraft(*_migrated->msgDraft)); + } } - setFieldText(draft.text); - _field.setFocus(); - if (!draft.text.isEmpty()) { - MessageCursor cur = Local::readDraftPositions(fromMigrated ? _migrated->peer->id : _peer->id); - _textUpdateEventsFlags = 0; - cur.applyTo(_field); - _textUpdateEventsFlags = TextUpdateEventsSaveDraft | TextUpdateEventsSendTyping; - } - _replyToId = readyToForward() ? 0 : draft.replyTo; - _previewCancelled = draft.previewCancelled; - } - if (_replyToId) { - updateReplyTo(); - if (!_replyTo && App::api()) App::api()->requestReplyTo(0, _peer->asChannel(), _replyToId); + _migrated->setMsgDraft(Nil); } + applyDraft(false); + resizeEvent(0); if (!_previewCancelled) { onPreviewParse(); @@ -3755,7 +3817,7 @@ void HistoryWidget::updateControlsVisibility() { _muteUnmute.hide(); _attachMention.hide(); _field.hide(); - _replyForwardPreviewCancel.hide(); + _fieldBarCancel.hide(); _attachDocument.hide(); _attachPhoto.hide(); _attachEmoji.hide(); @@ -3812,7 +3874,7 @@ void HistoryWidget::updateControlsVisibility() { _attachPhoto.hide(); _broadcast.hide(); _kbScroll.hide(); - _replyForwardPreviewCancel.hide(); + _fieldBarCancel.hide(); _attachDocument.hide(); _attachPhoto.hide(); _attachEmoji.hide(); @@ -3849,7 +3911,7 @@ void HistoryWidget::updateControlsVisibility() { _attachPhoto.hide(); _broadcast.hide(); _kbScroll.hide(); - _replyForwardPreviewCancel.hide(); + _fieldBarCancel.hide(); } else { _unblock.hide(); _botStart.hide(); @@ -3857,11 +3919,9 @@ void HistoryWidget::updateControlsVisibility() { _muteUnmute.hide(); if (cHasAudioCapture() && !_field.hasSendText() && !readyToForward()) { _send.hide(); - setMouseTracking(true); mouseMoveEvent(0); } else { _send.show(); - setMouseTracking(false); _a_record.stop(); _inRecord = _inField = false; a_recordOver = anim::fvalue(0, 0); @@ -3924,14 +3984,14 @@ void HistoryWidget::updateControlsVisibility() { } updateFieldPlaceholder(); } - if (_replyToId || readyToForward() || (_previewData && _previewData->pendingTill >= 0) || _kbReplyTo) { - if (_replyForwardPreviewCancel.isHidden()) { - _replyForwardPreviewCancel.show(); + if (_editMsgId || _replyToId || readyToForward() || (_previewData && _previewData->pendingTill >= 0) || _kbReplyTo) { + if (_fieldBarCancel.isHidden()) { + _fieldBarCancel.show(); resizeEvent(0); update(); } } else { - _replyForwardPreviewCancel.hide(); + _fieldBarCancel.hide(); } } } else { @@ -3945,7 +4005,7 @@ void HistoryWidget::updateControlsVisibility() { _attachPhoto.hide(); _broadcast.hide(); _kbScroll.hide(); - _replyForwardPreviewCancel.hide(); + _fieldBarCancel.hide(); _attachDocument.hide(); _attachPhoto.hide(); _attachEmoji.hide(); @@ -3961,6 +4021,12 @@ void HistoryWidget::updateControlsVisibility() { update(); } } + updateMouseTracking(); +} + +void HistoryWidget::updateMouseTracking() { + bool trackMouse = !_fieldBarCancel.isHidden() || (cHasAudioCapture() && _send.isHidden() && !_field.isHidden()); + setMouseTracking(trackMouse); } void HistoryWidget::newUnreadMsg(History *history, HistoryItem *item) { @@ -4432,12 +4498,84 @@ void HistoryWidget::onCollapseComments() { showHistory(_peer->id, switchAt); } +void HistoryWidget::saveEditMsg() { + if (_saveEditMsgRequestId) return; + + WebPageId webPageId = _previewCancelled ? CancelledWebPageId : ((_previewData && _previewData->pendingTill >= 0) ? _previewData->id : 0); + + EntitiesInText sendingEntities, leftEntities; + QString sendingText, leftText = prepareTextWithEntities(_field.getLastText(), leftEntities, itemTextOptions(_history, App::self()).flags); + + if (!textSplit(sendingText, sendingEntities, leftText, leftEntities, MaxMessageSize)) { + _field.selectAll(); + _field.setFocus(); + return; + } else if (!leftText.isEmpty()) { + Ui::showLayer(new InformBox(lang(lng_edit_too_long))); + return; + } + + int32 sendFlags = 0; + if (webPageId == CancelledWebPageId) { + sendFlags |= MTPmessages_SendMessage::flag_no_webpage; + } + MTPVector localEntities = linksToMTP(sendingEntities), sentEntities = linksToMTP(sendingEntities, true); + if (!sentEntities.c_vector().v.isEmpty()) { + sendFlags |= MTPmessages_SendMessage::flag_entities; + } + _saveEditMsgRequestId = MTP::send(MTPchannels_EditMessage(MTP_int(sendFlags), _history->peer->asChannel()->inputChannel, MTP_int(_editMsgId), MTP_string(sendingText), sentEntities), rpcDone(&HistoryWidget::saveEditMsgDone, _history), rpcFail(&HistoryWidget::saveEditMsgFail, _history)); +} + +void HistoryWidget::saveEditMsgDone(History *history, const MTPUpdates &updates, mtpRequestId req) { + if (App::main()) { + App::main()->sentUpdatesReceived(updates); + } + if (req == _saveEditMsgRequestId) { + _saveEditMsgRequestId = 0; + cancelEdit(); + } + if (history->editDraft && history->editDraft->saveRequest == req) { + history->setEditDraft(Nil); + writeDrafts(history); + } +} + +bool HistoryWidget::saveEditMsgFail(History *history, const RPCError &error, mtpRequestId req) { + if (mtpIsFlood(error)) return false; + if (req == _saveEditMsgRequestId) { + _saveEditMsgRequestId = 0; + } + if (history->editDraft && history->editDraft->saveRequest == req) { + history->editDraft->saveRequest = 0; + } + + QString err = error.type(); + if (err == qstr("MESSAGE_ID_INVALID") || err == qstr("CHAT_ADMIN_REQUIRED") || err == qstr("MESSAGE_EDIT_TIME_EXPIRED")) { + Ui::showLayer(new InformBox(lang(lng_edit_error))); + } else if (err == qstr("MESSAGE_NOT_MODIFIED")) { + cancelEdit(); + } else if (err == qstr("MESSAGE_EMPTY")) { + _field.selectAll(); + _field.setFocus(); + } else { + Ui::showLayer(new InformBox(lang(lng_edit_error))); + } + update(); + return true; +} + void HistoryWidget::onSend(bool ctrlShiftEnter, MsgId replyTo) { if (!_history) return; + if (_editMsgId) { + saveEditMsg(); + return; + } + bool lastKeyboardUsed = lastForceReplyReplied(FullMsgId(_channel, replyTo)); WebPageId webPageId = _previewCancelled ? CancelledWebPageId : ((_previewData && _previewData->pendingTill >= 0) ? _previewData->id : 0); + App::main()->sendMessage(_history, _field.getLastText(), replyTo, _broadcast.checked(), webPageId); setFieldText(QString()); @@ -4658,7 +4796,7 @@ void HistoryWidget::animShow(const QPixmap &bgAnimCache, const QPixmap &bgAnimTo _kbHide.hide(); _cmdStart.hide(); _field.hide(); - _replyForwardPreviewCancel.hide(); + _fieldBarCancel.hide(); _send.hide(); _unblock.hide(); _botStart.hide(); @@ -4846,7 +4984,7 @@ void HistoryWidget::mouseMoveEvent(QMouseEvent *e) { QPoint pos(e ? e->pos() : mapFromGlobal(QCursor::pos())); bool inRecord = _send.geometry().contains(pos); bool inField = pos.y() >= (_scroll.y() + _scroll.height()) && pos.y() < height() && pos.x() >= 0 && pos.x() < width(); - bool inReply = QRect(st::replySkip, _field.y() - st::sendPadding - st::replyHeight, width() - st::replySkip - _replyForwardPreviewCancel.width(), st::replyHeight).contains(pos) && replyToId(); + bool inReplyEdit = QRect(st::replySkip, _field.y() - st::sendPadding - st::replyHeight, width() - st::replySkip - _fieldBarCancel.width(), st::replyHeight).contains(pos) && (_editMsgId || replyToId()); bool startAnim = false; if (inRecord != _inRecord) { _inRecord = inRecord; @@ -4862,9 +5000,9 @@ void HistoryWidget::mouseMoveEvent(QMouseEvent *e) { a_recordCancel.start(_inField ? st::recordCancel->c : st::recordCancelActive->c); startAnim = true; } - if (inReply != _inReply) { - _inReply = inReply; - setCursor(inReply ? style::cur_pointer : style::cur_default); + if (inReplyEdit != _inReplyEdit) { + _inReplyEdit = inReplyEdit; + setCursor(inReplyEdit ? style::cur_pointer : style::cur_default); } if (startAnim) _a_record.start(); } @@ -5204,8 +5342,9 @@ void HistoryWidget::onKbToggle(bool manual) { _field.setMaxHeight(st::maxFieldHeight); _kbReplyTo = 0; - if (!readyToForward() && (!_previewData || _previewData->pendingTill < 0) && !_replyToId) { - _replyForwardPreviewCancel.hide(); + if (!readyToForward() && (!_previewData || _previewData->pendingTill < 0) && !_editMsgId && !_replyToId) { + _fieldBarCancel.hide(); + updateMouseTracking(); } } else { if (_history) { @@ -5223,10 +5362,11 @@ void HistoryWidget::onKbToggle(bool manual) { _field.setMaxHeight(st::maxFieldHeight); _kbReplyTo = (_peer->isChat() || _peer->isChannel() || _keyboard.forceReply()) ? App::histItemById(_keyboard.forMsgId()) : 0; - if (_kbReplyTo && !_replyToId) { + if (_kbReplyTo && !_editMsgId && !_replyToId) { updateReplyToName(); - _replyToText.setText(st::msgFont, _kbReplyTo->inDialogsText(), _textDlgOptions); - _replyForwardPreviewCancel.show(); + _replyEditMsgText.setText(st::msgFont, _kbReplyTo->inDialogsText(), _textDlgOptions); + _fieldBarCancel.show(); + updateMouseTracking(); } if (manual && _history) { _history->lastKeyboardHiddenId = 0; @@ -5241,10 +5381,11 @@ void HistoryWidget::onKbToggle(bool manual) { _field.setMaxHeight(st::maxFieldHeight - maxh); _kbReplyTo = (_peer->isChat() || _peer->isChannel() || _keyboard.forceReply()) ? App::histItemById(_keyboard.forMsgId()) : 0; - if (_kbReplyTo && !_replyToId) { + if (_kbReplyTo && !_editMsgId && !_replyToId) { updateReplyToName(); - _replyToText.setText(st::msgFont, _kbReplyTo->inDialogsText(), _textDlgOptions); - _replyForwardPreviewCancel.show(); + _replyEditMsgText.setText(st::msgFont, _kbReplyTo->inDialogsText(), _textDlgOptions); + _fieldBarCancel.show(); + updateMouseTracking(); } if (manual && _history) { _history->lastKeyboardHiddenId = 0; @@ -5414,7 +5555,7 @@ void HistoryWidget::onFieldResize() { _kbScroll.setGeometry(0, height() - kbh, width(), kbh); } _field.move(_attachDocument.x() + _attachDocument.width(), height() - kbh - _field.height() - st::sendPadding); - _replyForwardPreviewCancel.move(width() - _replyForwardPreviewCancel.width(), _field.y() - st::sendPadding - _replyForwardPreviewCancel.height()); + _fieldBarCancel.move(width() - _fieldBarCancel.width(), _field.y() - st::sendPadding - _fieldBarCancel.height()); _attachDocument.move(0, height() - kbh - _attachDocument.height()); _attachPhoto.move(_attachDocument.x(), _attachDocument.y()); @@ -5454,12 +5595,18 @@ void HistoryWidget::onCheckMentionDropdown() { } void HistoryWidget::updateFieldPlaceholder() { - if (_inlineBot && _inlineBot != InlineBotLookingUpData) { - _field.setPlaceholder(_inlineBot->botInfo->inlinePlaceholder.mid(1), _inlineBot->username.size() + 2); - } else if (hasBroadcastToggle()) { - _field.setPlaceholder(lang(_broadcast.checked() ? lng_broadcast_ph : lng_comment_ph)); + if (_editMsgId) { + _field.setPlaceholder(lang(lng_edit_message_text)); + _send.setText(lang(lng_settings_save)); } else { - _field.setPlaceholder(lang((_history && _history->isChannel() && !_history->isMegagroup()) ? (_peer->asChannel()->canPublish() ? lng_broadcast_ph : lng_comment_ph) : lng_message_ph)); + if (_inlineBot && _inlineBot != InlineBotLookingUpData) { + _field.setPlaceholder(_inlineBot->botInfo->inlinePlaceholder.mid(1), _inlineBot->username.size() + 2); + } else if (hasBroadcastToggle()) { + _field.setPlaceholder(lang(_broadcast.checked() ? lng_broadcast_ph : lng_comment_ph)); + } else { + _field.setPlaceholder(lang((_history && _history->isChannel() && !_history->isMegagroup()) ? (_peer->asChannel()->canPublish() ? lng_broadcast_ph : lng_comment_ph) : lng_message_ph)); + } + _send.setText(lang(lng_send_button)); } } @@ -5896,7 +6043,7 @@ void HistoryWidget::resizeEvent(QResizeEvent *e) { _attachDocument.move(0, height() - kbh - _attachDocument.height()); _attachPhoto.move(_attachDocument.x(), _attachDocument.y()); - _replyForwardPreviewCancel.move(width() - _replyForwardPreviewCancel.width(), _field.y() - st::sendPadding - _replyForwardPreviewCancel.height()); + _fieldBarCancel.move(width() - _fieldBarCancel.width(), _field.y() - st::sendPadding - _fieldBarCancel.height()); updateListSize(App::main() ? App::main()->contentScrollAddToY() : 0); bool kbShowShown = _history && !_kbShown && _keyboard.hasMarkup(); @@ -5945,8 +6092,12 @@ void HistoryWidget::resizeEvent(QResizeEvent *e) { void HistoryWidget::itemRemoved(HistoryItem *item) { if (_list) _list->itemRemoved(item); - if (item == _replyTo) { - cancelReply(); + if (item == _replyEditMsg) { + if (_editMsgId) { + cancelEdit(); + } else { + cancelReply(); + } } if (item == _replyReturn) { calcNextReplyReturn(); @@ -5980,7 +6131,7 @@ void HistoryWidget::updateListSize(int32 addToY, bool initial, bool loadedDown, if (_canSendMessages) { newScrollHeight -= (_field.height() + 2 * st::sendPadding); } - if (replyToId() || readyToForward() || (_previewData && _previewData->pendingTill >= 0)) { + if (_editMsgId || replyToId() || readyToForward() || (_previewData && _previewData->pendingTill >= 0)) { newScrollHeight -= st::replyHeight; } if (_kbShown) { @@ -6163,22 +6314,22 @@ void HistoryWidget::updateBotKeyboard(History *h) { bool changed = false; bool wasVisible = _kbShown || _kbReplyTo; - if ((_replyToId && !_replyTo) || !_history) { + if ((_replyToId && !_replyEditMsg) || _editMsgId || !_history) { changed = _keyboard.updateMarkup(0); - } else if (_replyTo) { - changed = _keyboard.updateMarkup(_replyTo); + } else if (_replyToId && _replyEditMsg) { + changed = _keyboard.updateMarkup(_replyEditMsg); } else { changed = _keyboard.updateMarkup(_history->lastKeyboardId ? App::histItemById(_channel, _history->lastKeyboardId) : 0); } updateCmdStartShown(); if (!changed) return; - bool hasMarkup = _keyboard.hasMarkup(), forceReply = _keyboard.forceReply() && !_replyTo; + bool hasMarkup = _keyboard.hasMarkup(), forceReply = _keyboard.forceReply() && (!_replyToId || !_replyEditMsg); if (hasMarkup || forceReply) { if (_keyboard.singleUse() && _keyboard.hasMarkup() && _keyboard.forMsgId() == FullMsgId(_channel, _history->lastKeyboardId) && _history->lastKeyboardUsed) { _history->lastKeyboardHiddenId = _history->lastKeyboardId; } - if (!isBotStart() && !isBlocked() && _canSendMessages && (wasVisible || _replyTo || (!_field.hasSendText() && !kbWasHidden()))) { + if (!isBotStart() && !isBlocked() && _canSendMessages && (wasVisible || (_replyToId && _replyEditMsg) || (!_field.hasSendText() && !kbWasHidden()))) { if (!_a_show.animating()) { if (hasMarkup) { _kbScroll.show(); @@ -6198,8 +6349,9 @@ void HistoryWidget::updateBotKeyboard(History *h) { _kbReplyTo = (_peer->isChat() || _peer->isChannel() || _keyboard.forceReply()) ? App::histItemById(_keyboard.forMsgId()) : 0; if (_kbReplyTo && !_replyToId) { updateReplyToName(); - _replyToText.setText(st::msgFont, _kbReplyTo->inDialogsText(), _textDlgOptions); - _replyForwardPreviewCancel.show(); + _replyEditMsgText.setText(st::msgFont, _kbReplyTo->inDialogsText(), _textDlgOptions); + _fieldBarCancel.show(); + updateMouseTracking(); } } else { if (!_a_show.animating()) { @@ -6213,7 +6365,8 @@ void HistoryWidget::updateBotKeyboard(History *h) { _kbShown = false; _kbReplyTo = 0; if (!readyToForward() && (!_previewData || _previewData->pendingTill < 0) && !_replyToId) { - _replyForwardPreviewCancel.hide(); + _fieldBarCancel.hide(); + updateMouseTracking(); } } } else { @@ -6227,8 +6380,9 @@ void HistoryWidget::updateBotKeyboard(History *h) { _field.setMaxHeight(st::maxFieldHeight); _kbShown = false; _kbReplyTo = 0; - if (!readyToForward() && (!_previewData || _previewData->pendingTill < 0) && !_replyToId) { - _replyForwardPreviewCancel.hide(); + if (!readyToForward() && (!_previewData || _previewData->pendingTill < 0) && !_replyToId && !_editMsgId) { + _fieldBarCancel.hide(); + updateMouseTracking(); } } resizeEvent(0); @@ -6271,7 +6425,7 @@ void HistoryWidget::updateCollapseCommentsVisibility() { void HistoryWidget::mousePressEvent(QMouseEvent *e) { _replyForwardPressed = QRect(0, _field.y() - st::sendPadding - st::replyHeight, st::replySkip, st::replyHeight).contains(e->pos()); - if (_replyForwardPressed && !_replyForwardPreviewCancel.isHidden()) { + if (_replyForwardPressed && !_fieldBarCancel.isHidden()) { updateField(); } else if (_inRecord && cHasAudioCapture()) { audioCapture()->start(); @@ -6285,8 +6439,8 @@ void HistoryWidget::mousePressEvent(QMouseEvent *e) { a_recordDown.start(1); a_recordOver.restart(); _a_record.start(); - } else if (_inReply) { - Ui::showPeerHistory(_peer, replyToId()); + } else if (_inReplyEdit) { + Ui::showPeerHistory(_peer, _editMsgId ? _editMsgId : replyToId()); } } @@ -6615,16 +6769,25 @@ void HistoryWidget::onReplyToMessage() { App::main()->cancelForwarding(); - _replyTo = to; - _replyToId = to->id; - _replyToText.setText(st::msgFont, _replyTo->inDialogsText(), _textDlgOptions); + if (_editMsgId) { + if (!_history->msgDraft) { + _history->setMsgDraft(new HistoryDraft(QString(), to->id, MessageCursor(), false)); + } else { + _history->msgDraft->msgId = to->id; + } + } else { + _replyEditMsg = to; + _replyToId = to->id; + _replyEditMsgText.setText(st::msgFont, _replyEditMsg->inDialogsText(), _textDlgOptions); - updateBotKeyboard(); + updateBotKeyboard(); - if (!_field.isHidden()) _replyForwardPreviewCancel.show(); - updateReplyToName(); - resizeEvent(0); - updateField(); + if (!_field.isHidden()) _fieldBarCancel.show(); + updateMouseTracking(); + updateReplyToName(); + resizeEvent(0); + updateField(); + } _saveDraftText = true; _saveDraftStart = getms(); @@ -6642,7 +6805,42 @@ void HistoryWidget::onEditMessage() { Ui::showLayer(box); } else { delete box; - // edit post + + if (_replyToId || !_field.getLastText().isEmpty()) { + _history->setMsgDraft(new HistoryDraft(_field, _replyToId, _previewCancelled)); + } else { + _history->setMsgDraft(Nil); + } + + QString text(textApplyEntities(to->originalText(), to->originalEntities())); + _history->setEditDraft(new HistoryEditDraft(text, to->id, MessageCursor(text.size(), text.size(), QFIXED_MAX), false)); + applyDraft(false); + + _previewData = 0; + if (HistoryMedia *media = to->getMedia()) { + if (media->type() == MediaTypeWebPage) { + _previewData = static_cast(media)->webpage(); + updatePreview(); + } + } + if (!_previewData) { + onPreviewParse(); + } + + updateBotKeyboard(); + + if (!_field.isHidden()) _fieldBarCancel.show(); + updateFieldPlaceholder(); + updateMouseTracking(); + updateReplyToName(); + resizeEvent(0); + updateField(); + + _saveDraftText = true; + _saveDraftStart = getms(); + onDraftSave(); + + _field.setFocus(); } } @@ -6652,37 +6850,77 @@ bool HistoryWidget::lastForceReplyReplied(const FullMsgId &replyTo) const { } void HistoryWidget::cancelReply(bool lastKeyboardUsed) { + bool wasReply = _replyToId || (_history && _history->msgDraft && _history->msgDraft->msgId); if (_replyToId) { - _replyTo = 0; + _replyEditMsg = 0; _replyToId = 0; mouseMoveEvent(0); if (!readyToForward() && (!_previewData || _previewData->pendingTill < 0) && !_kbReplyTo) { - _replyForwardPreviewCancel.hide(); + _fieldBarCancel.hide(); + updateMouseTracking(); } updateBotKeyboard(); resizeEvent(0); update(); - + } else if (wasReply) { + if (_history->msgDraft->text.isEmpty()) { + _history->setMsgDraft(Nil); + } else { + _history->msgDraft->msgId = 0; + } + } + if (wasReply) { _saveDraftText = true; _saveDraftStart = getms(); onDraftSave(); } - if (_keyboard.singleUse() && _keyboard.forceReply() && lastKeyboardUsed) { + if (!_editMsgId && _keyboard.singleUse() && _keyboard.forceReply() && lastKeyboardUsed) { if (_kbReplyTo) { onKbToggle(false); } } } +void HistoryWidget::cancelEdit() { + if (!_editMsgId) return; + + _editMsgId = 0; + _replyEditMsg = 0; + _history->setEditDraft(Nil); + applyDraft(); + + if (_saveEditMsgRequestId) { + MTP::cancel(_saveEditMsgRequestId); + _saveEditMsgRequestId = 0; + } + + _saveDraftText = true; + _saveDraftStart = getms(); + onDraftSave(); + + mouseMoveEvent(0); + if (!readyToForward() && (!_previewData || _previewData->pendingTill < 0) && !replyToId()) { + _fieldBarCancel.hide(); + updateMouseTracking(); + } + + onTextChange(); + updateBotKeyboard(); + updateFieldPlaceholder(); + + resizeEvent(0); + update(); +} + void HistoryWidget::cancelForwarding() { updateControlsVisibility(); resizeEvent(0); update(); } -void HistoryWidget::onReplyForwardPreviewCancel() { +void HistoryWidget::onFieldBarCancel() { _replyForwardPressed = false; if (_previewData && _previewData->pendingTill >= 0) { _previewCancelled = true; @@ -6691,6 +6929,8 @@ void HistoryWidget::onReplyForwardPreviewCancel() { _saveDraftText = true; _saveDraftStart = getms(); onDraftSave(); + } else if (_editMsgId) { + cancelEdit(); } else if (readyToForward()) { App::main()->cancelForwarding(); } else if (_replyToId) { @@ -6717,7 +6957,10 @@ void HistoryWidget::previewCancel() { _previewData = 0; _previewLinks.clear(); updatePreview(); - if (!_replyToId && !readyToForward() && !_kbReplyTo) _replyForwardPreviewCancel.hide(); + if (!_editMsgId && !_replyToId && !readyToForward() && !_kbReplyTo) { + _fieldBarCancel.hide(); + updateMouseTracking(); + } } void HistoryWidget::onPreviewParse() { @@ -6781,7 +7024,8 @@ void HistoryWidget::gotPreview(QString links, const MTPMessageMedia &result, mtp void HistoryWidget::updatePreview() { _previewTimer.stop(); if (_previewData && _previewData->pendingTill >= 0) { - _replyForwardPreviewCancel.show(); + _fieldBarCancel.show(); + updateMouseTracking(); if (_previewData->pendingTill) { _previewTitle.setText(st::msgServiceNameFont, lang(lng_preview_loading), _textNameOptions); _previewDescription.setText(st::msgFont, _previewLinks.splitRef(' ').at(0).toString(), _textDlgOptions); @@ -6818,8 +7062,9 @@ void HistoryWidget::updatePreview() { _previewTitle.setText(st::msgServiceNameFont, title, _textNameOptions); _previewDescription.setText(st::msgFont, desc, _textDlgOptions); } - } else if (!readyToForward() && !replyToId()) { - _replyForwardPreviewCancel.hide(); + } else if (!readyToForward() && !replyToId() && !_editMsgId) { + _fieldBarCancel.hide(); + updateMouseTracking(); } resizeEvent(0); update(); @@ -7035,19 +7280,28 @@ void HistoryWidget::updateTopBarSelection() { update(); } -void HistoryWidget::updateReplyTo(bool force) { - if (!_replyToId || _replyTo) return; - _replyTo = App::histItemById(_channel, _replyToId); - if (_replyTo) { - _replyToText.setText(st::msgFont, _replyTo->inDialogsText(), _textDlgOptions); +void HistoryWidget::updateReplyEditTexts(bool force) { + if (_replyEditMsg || (!_editMsgId && !_replyToId)) { + return; + } + _replyEditMsg = App::histItemById(_channel, _editMsgId ? _editMsgId : _replyToId); + if (_replyEditMsg) { + _replyEditMsgText.setText(st::msgFont, _replyEditMsg->inDialogsText(), _textDlgOptions); updateBotKeyboard(); - if (!_field.isHidden() || _recording) _replyForwardPreviewCancel.show(); + if (!_field.isHidden() || _recording) { + _fieldBarCancel.show(); + updateMouseTracking(); + } updateReplyToName(); updateField(); } else if (force) { - cancelReply(); + if (_editMsgId) { + cancelEdit(); + } else { + cancelReply(); + } } } @@ -7061,9 +7315,10 @@ void HistoryWidget::updateForwarding(bool force) { } void HistoryWidget::updateReplyToName() { - if (!_replyTo && (_replyToId || !_kbReplyTo)) return; - _replyToName.setText(st::msgServiceNameFont, App::peerName((_replyTo ? _replyTo : _kbReplyTo)->author()), _textNameOptions); - _replyToNameVersion = (_replyTo ? _replyTo : _kbReplyTo)->author()->nameVersion; + if (_editMsgId) return; + if (!_replyEditMsg && (_replyToId || !_kbReplyTo)) return; + _replyToName.setText(st::msgServiceNameFont, App::peerName((_replyEditMsg ? _replyEditMsg : _kbReplyTo)->author()), _textNameOptions); + _replyToNameVersion = (_replyEditMsg ? _replyEditMsg : _kbReplyTo)->author()->nameVersion; } void HistoryWidget::updateField() { @@ -7076,9 +7331,9 @@ void HistoryWidget::drawField(Painter &p) { Text *from = 0, *text = 0; bool serviceColor = false, hasForward = readyToForward(); ImagePtr preview; - HistoryItem *drawReplyTo = _replyToId ? _replyTo : _kbReplyTo; - if (_replyToId || (!hasForward && _kbReplyTo)) { - if (drawReplyTo && drawReplyTo->author()->nameVersion > _replyToNameVersion) { + HistoryItem *drawMsgText = (_editMsgId || _replyToId) ? _replyEditMsg : _kbReplyTo; + if (_editMsgId || _replyToId || (!hasForward && _kbReplyTo)) { + if (!_editMsgId && drawMsgText && drawMsgText->author()->nameVersion > _replyToNameVersion) { updateReplyToName(); } backy -= st::replyHeight; @@ -7093,27 +7348,32 @@ void HistoryWidget::drawField(Painter &p) { } bool drawPreview = (_previewData && _previewData->pendingTill >= 0) && !_replyForwardPressed; p.fillRect(0, backy, width(), backh, st::taMsgField.bgColor->b); - if (_replyToId || (!hasForward && _kbReplyTo)) { + if (_editMsgId || _replyToId || (!hasForward && _kbReplyTo)) { int32 replyLeft = st::replySkip; - p.drawPixmap(QPoint(st::replyIconPos.x(), backy + st::replyIconPos.y()), App::sprite(), st::replyIcon); + p.drawPixmap(QPoint(st::replyIconPos.x(), backy + st::replyIconPos.y()), App::sprite(), _editMsgId ? st::editIcon : st::replyIcon); if (!drawPreview) { - if (drawReplyTo) { - if (drawReplyTo->getMedia() && drawReplyTo->getMedia()->hasReplyPreview()) { - ImagePtr replyPreview = drawReplyTo->getMedia()->replyPreview(); + if (drawMsgText) { + if (drawMsgText->getMedia() && drawMsgText->getMedia()->hasReplyPreview()) { + ImagePtr replyPreview = drawMsgText->getMedia()->replyPreview(); if (!replyPreview->isNull()) { QRect to(replyLeft, backy + st::msgReplyPadding.top(), st::msgReplyBarSize.height(), st::msgReplyBarSize.height()); p.drawPixmap(to.x(), to.y(), replyPreview->pixSingle(replyPreview->width() / cIntRetinaFactor(), replyPreview->height() / cIntRetinaFactor(), to.width(), to.height())); } replyLeft += st::msgReplyBarSize.height() + st::msgReplyBarSkip - st::msgReplyBarSize.width() - st::msgReplyBarPos.x(); } - p.setPen(st::replyColor->p); - _replyToName.drawElided(p, replyLeft, backy + st::msgReplyPadding.top(), width() - replyLeft - _replyForwardPreviewCancel.width() - st::msgReplyPadding.right()); - p.setPen((((drawReplyTo->toHistoryMessage() && drawReplyTo->toHistoryMessage()->emptyText()) || drawReplyTo->serviceMsg()) ? st::msgInDateFg : st::msgColor)->p); - _replyToText.drawElided(p, replyLeft, backy + st::msgReplyPadding.top() + st::msgServiceNameFont->height, width() - replyLeft - _replyForwardPreviewCancel.width() - st::msgReplyPadding.right()); + p.setPen(st::replyColor); + if (_editMsgId) { + p.setFont(st::msgServiceNameFont); + p.drawText(replyLeft, backy + st::msgReplyPadding.top() + st::msgServiceNameFont->ascent, lang(lng_edit_message)); + } else { + _replyToName.drawElided(p, replyLeft, backy + st::msgReplyPadding.top(), width() - replyLeft - _fieldBarCancel.width() - st::msgReplyPadding.right()); + } + p.setPen((((drawMsgText->toHistoryMessage() && drawMsgText->toHistoryMessage()->emptyText()) || drawMsgText->serviceMsg()) ? st::msgInDateFg : st::msgColor)->p); + _replyEditMsgText.drawElided(p, replyLeft, backy + st::msgReplyPadding.top() + st::msgServiceNameFont->height, width() - replyLeft - _fieldBarCancel.width() - st::msgReplyPadding.right()); } else { p.setFont(st::msgDateFont->f); p.setPen(st::msgInDateFg->p); - p.drawText(replyLeft, backy + st::msgReplyPadding.top() + (st::msgReplyBarSize.height() - st::msgDateFont->height) / 2 + st::msgDateFont->ascent, st::msgDateFont->elided(lang(lng_profile_loading), width() - replyLeft - _replyForwardPreviewCancel.width() - st::msgReplyPadding.right())); + p.drawText(replyLeft, backy + st::msgReplyPadding.top() + (st::msgReplyBarSize.height() - st::msgDateFont->height) / 2 + st::msgDateFont->ascent, st::msgDateFont->elided(lang(lng_profile_loading), width() - replyLeft - _fieldBarCancel.width() - st::msgReplyPadding.right())); } } } else if (from && text) { @@ -7131,9 +7391,9 @@ void HistoryWidget::drawField(Painter &p) { forwardLeft += st::msgReplyBarSize.height() + st::msgReplyBarSkip - st::msgReplyBarSize.width() - st::msgReplyBarPos.x(); } p.setPen(st::replyColor->p); - from->drawElided(p, forwardLeft, backy + st::msgReplyPadding.top(), width() - forwardLeft - _replyForwardPreviewCancel.width() - st::msgReplyPadding.right()); + from->drawElided(p, forwardLeft, backy + st::msgReplyPadding.top(), width() - forwardLeft - _fieldBarCancel.width() - st::msgReplyPadding.right()); p.setPen((serviceColor ? st::msgInDateFg : st::msgColor)->p); - text->drawElided(p, forwardLeft, backy + st::msgReplyPadding.top() + st::msgServiceNameFont->height, width() - forwardLeft - _replyForwardPreviewCancel.width() - st::msgReplyPadding.right()); + text->drawElided(p, forwardLeft, backy + st::msgReplyPadding.top() + st::msgServiceNameFont->height, width() - forwardLeft - _fieldBarCancel.width() - st::msgReplyPadding.right()); } } if (drawPreview) { @@ -7153,9 +7413,9 @@ void HistoryWidget::drawField(Painter &p) { previewLeft += st::msgReplyBarSize.height() + st::msgReplyBarSkip - st::msgReplyBarSize.width() - st::msgReplyBarPos.x(); } p.setPen(st::replyColor->p); - _previewTitle.drawElided(p, previewLeft, backy + st::msgReplyPadding.top(), width() - previewLeft - _replyForwardPreviewCancel.width() - st::msgReplyPadding.right()); + _previewTitle.drawElided(p, previewLeft, backy + st::msgReplyPadding.top(), width() - previewLeft - _fieldBarCancel.width() - st::msgReplyPadding.right()); p.setPen(st::msgColor->p); - _previewDescription.drawElided(p, previewLeft, backy + st::msgReplyPadding.top() + st::msgServiceNameFont->height, width() - previewLeft - _replyForwardPreviewCancel.width() - st::msgReplyPadding.right()); + _previewDescription.drawElided(p, previewLeft, backy + st::msgReplyPadding.top() + st::msgServiceNameFont->height, width() - previewLeft - _fieldBarCancel.width() - st::msgReplyPadding.right()); } } diff --git a/Telegram/SourceFiles/historywidget.h b/Telegram/SourceFiles/historywidget.h index d18f081035..4c82a86312 100644 --- a/Telegram/SourceFiles/historywidget.h +++ b/Telegram/SourceFiles/historywidget.h @@ -505,9 +505,10 @@ public: void updateScrollColors(); MsgId replyToId() const; - void updateReplyTo(bool force = false); + void updateReplyEditTexts(bool force = false); bool lastForceReplyReplied(const FullMsgId &replyTo = FullMsgId(NoChannel, -1)) const; void cancelReply(bool lastKeyboardUsed = false); + void cancelEdit(); void updateForwarding(bool force = false); void cancelForwarding(); // called by MainWidget @@ -595,7 +596,7 @@ public slots: void onCancel(); void onReplyToMessage(); void onEditMessage(); - void onReplyForwardPreviewCancel(); + void onFieldBarCancel(); void onCancelSendAction(); @@ -689,12 +690,17 @@ public slots: private: MsgId _replyToId; - HistoryItem *_replyTo; - Text _replyToName, _replyToText; + Text _replyToName; int32 _replyToNameVersion; - IconedButton _replyForwardPreviewCancel; void updateReplyToName(); + MsgId _editMsgId; + + HistoryItem *_replyEditMsg; + Text _replyEditMsgText; + + IconedButton _fieldBarCancel; + void sendExistingDocument(DocumentData *doc, const QString &caption); void sendExistingPhoto(PhotoData *photo, const QString &caption); @@ -702,6 +708,13 @@ private: void drawRecordButton(Painter &p); void drawRecording(Painter &p); + void updateMouseTracking(); + + mtpRequestId _saveEditMsgRequestId; + void saveEditMsg(); + void saveEditMsgDone(History *history, const MTPUpdates &updates, mtpRequestId req); + bool saveEditMsgFail(History *history, const RPCError &error, mtpRequestId req); + DBIPeerReportSpamStatus _reportSpamStatus; void updateReportSpamStatus(); @@ -747,7 +760,8 @@ private: void savedGifsGot(const MTPmessages_SavedGifs &gifs); bool savedGifsFailed(const RPCError &error); - void writeDraft(MsgId *replyTo = 0, const QString *text = 0, const MessageCursor *cursor = 0, bool *previewCancelled = 0); + void writeDrafts(HistoryDraft **msgDraft, HistoryEditDraft **editDraft); + void writeDrafts(History *history); void setFieldText(const QString &text, int32 textUpdateEventsFlags = 0, bool clearUndoHistory = true); QStringList getMediasFromMime(const QMimeData *d); @@ -806,7 +820,7 @@ private: bool _cmdStartShown; MessageField _field; Animation _a_record, _a_recording; - bool _recording, _inRecord, _inField, _inReply; + bool _recording, _inRecord, _inField, _inReplyEdit; anim::ivalue a_recordingLevel; int32 _recordingSamples; anim::fvalue a_recordOver, a_recordDown; diff --git a/Telegram/SourceFiles/localstorage.cpp b/Telegram/SourceFiles/localstorage.cpp index 1c0c7f5540..fb5ed2fbda 100644 --- a/Telegram/SourceFiles/localstorage.cpp +++ b/Telegram/SourceFiles/localstorage.cpp @@ -557,7 +557,7 @@ namespace { }; typedef QMap DraftsMap; - DraftsMap _draftsMap, _draftsPositionsMap; + DraftsMap _draftsMap, _draftCursorsMap; typedef QMap DraftsNotReadMap; DraftsNotReadMap _draftsNotReadMap; @@ -1672,7 +1672,7 @@ namespace { } LOG(("App Info: reading encrypted map..")); - DraftsMap draftsMap, draftsPositionsMap; + DraftsMap draftsMap, draftCursorsMap; DraftsNotReadMap draftsNotReadMap; StorageMap imagesMap, stickerImagesMap, audiosMap; qint64 storageImagesSize = 0, storageStickersSize = 0, storageAudiosSize = 0; @@ -1701,7 +1701,7 @@ namespace { FileKey key; quint64 p; map.stream >> key >> p; - draftsPositionsMap.insert(p, key); + draftCursorsMap.insert(p, key); } } break; case lskImages: { @@ -1781,7 +1781,7 @@ namespace { } _draftsMap = draftsMap; - _draftsPositionsMap = draftsPositionsMap; + _draftCursorsMap = draftCursorsMap; _draftsNotReadMap = draftsNotReadMap; _imagesMap = imagesMap; @@ -1860,7 +1860,7 @@ namespace { uint32 mapSize = 0; if (!_draftsMap.isEmpty()) mapSize += sizeof(quint32) * 2 + _draftsMap.size() * sizeof(quint64) * 2; - if (!_draftsPositionsMap.isEmpty()) mapSize += sizeof(quint32) * 2 + _draftsPositionsMap.size() * sizeof(quint64) * 2; + if (!_draftCursorsMap.isEmpty()) mapSize += sizeof(quint32) * 2 + _draftCursorsMap.size() * sizeof(quint64) * 2; if (!_imagesMap.isEmpty()) mapSize += sizeof(quint32) * 2 + _imagesMap.size() * (sizeof(quint64) * 3 + sizeof(qint32)); if (!_stickerImagesMap.isEmpty()) mapSize += sizeof(quint32) * 2 + _stickerImagesMap.size() * (sizeof(quint64) * 3 + sizeof(qint32)); if (!_audiosMap.isEmpty()) mapSize += sizeof(quint32) * 2 + _audiosMap.size() * (sizeof(quint64) * 3 + sizeof(qint32)); @@ -1880,9 +1880,9 @@ namespace { mapData.stream << quint64(i.value()) << quint64(i.key()); } } - if (!_draftsPositionsMap.isEmpty()) { - mapData.stream << quint32(lskDraftPosition) << quint32(_draftsPositionsMap.size()); - for (DraftsMap::const_iterator i = _draftsPositionsMap.cbegin(), e = _draftsPositionsMap.cend(); i != e; ++i) { + if (!_draftCursorsMap.isEmpty()) { + mapData.stream << quint32(lskDraftPosition) << quint32(_draftCursorsMap.size()); + for (DraftsMap::const_iterator i = _draftCursorsMap.cbegin(), e = _draftCursorsMap.cend(); i != e; ++i) { mapData.stream << quint64(i.value()) << quint64(i.key()); } } @@ -2180,7 +2180,7 @@ namespace Local { _passKeySalt.clear(); // reset passcode, local key _draftsMap.clear(); - _draftsPositionsMap.clear(); + _draftCursorsMap.clear(); _fileLocations.clear(); _fileLocationPairs.clear(); _fileLocationAliases.clear(); @@ -2237,10 +2237,10 @@ namespace Local { return _oldSettingsVersion; } - void writeDraft(const PeerId &peer, const MessageDraft &draft) { + void writeDrafts(const PeerId &peer, const MessageDraft &msgDraft, const MessageDraft &editDraft) { if (!_working()) return; - if (draft.replyTo <= 0 && draft.text.isEmpty()) { + if (msgDraft.msgId <= 0 && msgDraft.text.isEmpty() && editDraft.msgId <= 0) { DraftsMap::iterator i = _draftsMap.find(peer); if (i != _draftsMap.cend()) { clearKey(i.value()); @@ -2257,8 +2257,12 @@ namespace Local { _mapChanged = true; _writeMap(WriteMapFast); } - EncryptedDescriptor data(sizeof(quint64) + _stringSize(draft.text) + sizeof(qint32)); - data.stream << quint64(peer) << draft.text << qint32(draft.replyTo) << qint32(draft.previewCancelled ? 1 : 0); + + EncryptedDescriptor data(sizeof(quint64) + _stringSize(msgDraft.text) + 2 * sizeof(qint32) + _stringSize(editDraft.text) + 2 * sizeof(qint32)); + data.stream << quint64(peer); + data.stream << msgDraft.text << qint32(msgDraft.msgId) << qint32(msgDraft.previewCancelled ? 1 : 0); + data.stream << editDraft.text << qint32(editDraft.msgId) << qint32(editDraft.previewCancelled ? 1 : 0); + FileWriteDescriptor file(i.value()); file.writeEncrypted(data); @@ -2266,75 +2270,123 @@ namespace Local { } } - MessageDraft readDraft(const PeerId &peer) { - if (!_draftsNotReadMap.remove(peer)) return MessageDraft(); + void clearDraftCursors(const PeerId &peer) { + DraftsMap::iterator i = _draftCursorsMap.find(peer); + if (i != _draftCursorsMap.cend()) { + clearKey(i.value()); + _draftCursorsMap.erase(i); + _mapChanged = true; + _writeMap(); + } + } + + void _readDraftCursors(const PeerId &peer, MessageCursor &msgCursor, MessageCursor &editCursor) { + DraftsMap::iterator j = _draftCursorsMap.find(peer); + if (j == _draftCursorsMap.cend()) { + return; + } + + FileReadDescriptor draft; + if (!readEncryptedFile(draft, j.value())) { + clearDraftCursors(peer); + return; + } + quint64 draftPeer; + qint32 msgPosition = 0, msgAnchor = 0, msgScroll = QFIXED_MAX; + qint32 editPosition = 0, editAnchor = 0, editScroll = QFIXED_MAX; + draft.stream >> draftPeer >> msgPosition >> msgAnchor >> msgScroll; + if (!draft.stream.atEnd()) { + draft.stream >> editPosition >> editAnchor >> editScroll; + } + + if (draftPeer != peer) { + clearDraftCursors(peer); + return; + } + + msgCursor = MessageCursor(msgPosition, msgAnchor, msgScroll); + editCursor = MessageCursor(editPosition, editAnchor, editScroll); + } + + void readDraftsWithCursors(History *h) { + PeerId peer = h->peer->id; + if (!_draftsNotReadMap.remove(peer)) { + clearDraftCursors(peer); + return; + } DraftsMap::iterator j = _draftsMap.find(peer); if (j == _draftsMap.cend()) { - return MessageDraft(); + clearDraftCursors(peer); + return; } FileReadDescriptor draft; if (!readEncryptedFile(draft, j.value())) { clearKey(j.value()); _draftsMap.erase(j); - return MessageDraft(); + clearDraftCursors(peer); + return; } - quint64 draftPeer; - QString draftText; - qint32 draftReplyTo = 0, draftPreviewCancelled = 0; - draft.stream >> draftPeer >> draftText; - if (draft.version >= 7021) draft.stream >> draftReplyTo; - if (draft.version >= 8001) draft.stream >> draftPreviewCancelled; - return (draftPeer == peer) ? MessageDraft(MsgId(draftReplyTo), draftText, (draftPreviewCancelled == 1)) : MessageDraft(); + quint64 draftPeer = 0; + QString msgText, editText; + qint32 msgReplyTo = 0, msgPreviewCancelled = 0, editMsgId = 0, editPreviewCancelled = 0; + draft.stream >> draftPeer >> msgText; + if (draft.version >= 7021) { + draft.stream >> msgReplyTo; + if (draft.version >= 8001) { + draft.stream >> msgPreviewCancelled; + if (!draft.stream.atEnd()) { + draft.stream >> editText >> editMsgId >> editPreviewCancelled; + } + } + } + if (draftPeer != peer) { + clearKey(j.value()); + _draftsMap.erase(j); + clearDraftCursors(peer); + return; + } + + MessageCursor msgCursor, editCursor; + _readDraftCursors(peer, msgCursor, editCursor); + + if (msgText.isEmpty() && !msgReplyTo) { + h->setMsgDraft(Nil); + } else { + h->setMsgDraft(new HistoryDraft(msgText, msgReplyTo, msgCursor, msgPreviewCancelled)); + } + if (!editMsgId) { + h->setEditDraft(Nil); + } else { + h->setEditDraft(new HistoryEditDraft(editText, editMsgId, editCursor, editPreviewCancelled)); + } } - void writeDraftPositions(const PeerId &peer, const MessageCursor &cur) { + void writeDraftCursors(const PeerId &peer, const MessageCursor &msgCursor, const MessageCursor &editCursor) { if (!_working()) return; - if (cur.position == 0 && cur.anchor == 0 && cur.scroll == QFIXED_MAX) { - DraftsMap::iterator i = _draftsPositionsMap.find(peer); - if (i != _draftsPositionsMap.cend()) { - clearKey(i.value()); - _draftsPositionsMap.erase(i); - _mapChanged = true; - _writeMap(); - } + if (msgCursor == MessageCursor() && editCursor == MessageCursor()) { + clearDraftCursors(peer); } else { - DraftsMap::const_iterator i = _draftsPositionsMap.constFind(peer); - if (i == _draftsPositionsMap.cend()) { - i = _draftsPositionsMap.insert(peer, genKey()); + DraftsMap::const_iterator i = _draftCursorsMap.constFind(peer); + if (i == _draftCursorsMap.cend()) { + i = _draftCursorsMap.insert(peer, genKey()); _mapChanged = true; _writeMap(WriteMapFast); } + EncryptedDescriptor data(sizeof(quint64) + sizeof(qint32) * 3); - data.stream << quint64(peer) << qint32(cur.position) << qint32(cur.anchor) << qint32(cur.scroll); + data.stream << quint64(peer) << qint32(msgCursor.position) << qint32(msgCursor.anchor) << qint32(msgCursor.scroll); + data.stream << qint32(editCursor.position) << qint32(editCursor.anchor) << qint32(editCursor.scroll); + FileWriteDescriptor file(i.value()); file.writeEncrypted(data); } } - MessageCursor readDraftPositions(const PeerId &peer) { - DraftsMap::iterator j = _draftsPositionsMap.find(peer); - if (j == _draftsPositionsMap.cend()) { - return MessageCursor(); - } - FileReadDescriptor draft; - if (!readEncryptedFile(draft, j.value())) { - clearKey(j.value()); - _draftsPositionsMap.erase(j); - return MessageCursor(); - } - - quint64 draftPeer; - qint32 curPosition, curAnchor, curScroll; - draft.stream >> draftPeer >> curPosition >> curAnchor >> curScroll; - - return (draftPeer == peer) ? MessageCursor(curPosition, curAnchor, curScroll) : MessageCursor(); - } - - bool hasDraftPositions(const PeerId &peer) { - return (_draftsPositionsMap.constFind(peer) != _draftsPositionsMap.cend()); + bool hasDraftCursors(const PeerId &peer) { + return (_draftCursorsMap.constFind(peer) != _draftCursorsMap.cend()); } void writeFileLocation(MediaKey location, const FileLocation &local) { @@ -3795,8 +3847,8 @@ namespace Local { _draftsMap.clear(); _mapChanged = true; } - if (!_draftsPositionsMap.isEmpty()) { - _draftsPositionsMap.clear(); + if (!_draftCursorsMap.isEmpty()) { + _draftCursorsMap.clear(); _mapChanged = true; } if (_locationsKey) { diff --git a/Telegram/SourceFiles/localstorage.h b/Telegram/SourceFiles/localstorage.h index 607ec9d0ff..58df7dc7df 100644 --- a/Telegram/SourceFiles/localstorage.h +++ b/Telegram/SourceFiles/localstorage.h @@ -106,17 +106,16 @@ namespace Local { int32 oldSettingsVersion(); struct MessageDraft { - MessageDraft(MsgId replyTo = 0, QString text = QString(), bool previewCancelled = false) : replyTo(replyTo), text(text), previewCancelled(previewCancelled) { + MessageDraft(MsgId msgId = 0, QString text = QString(), bool previewCancelled = false) : msgId(msgId), text(text), previewCancelled(previewCancelled) { } - MsgId replyTo; + MsgId msgId; QString text; bool previewCancelled; }; - void writeDraft(const PeerId &peer, const MessageDraft &draft); - MessageDraft readDraft(const PeerId &peer); - void writeDraftPositions(const PeerId &peer, const MessageCursor &cur); - MessageCursor readDraftPositions(const PeerId &peer); - bool hasDraftPositions(const PeerId &peer); + void writeDrafts(const PeerId &peer, const MessageDraft &msgDraft, const MessageDraft &editDraft); + void readDraftsWithCursors(History *h); + void writeDraftCursors(const PeerId &peer, const MessageCursor &msgCursor, const MessageCursor &editCursor); + bool hasDraftCursors(const PeerId &peer); void writeFileLocation(MediaKey location, const FileLocation &local); FileLocation readFileLocation(MediaKey location, bool check = true); diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 05d65d9a72..349568c2ba 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -516,10 +516,8 @@ bool MainWidget::onShareUrl(const PeerId &peer, const QString &url, const QStrin return false; } History *h = App::history(peer); - h->draft = url + '\n' + text; - h->draftCursor.anchor = url.size() + 1; - h->draftCursor.position = h->draftCursor.anchor + text.size(); - h->draftPreviewCancelled = false; + h->setMsgDraft(new HistoryDraft(url + '\n' + text, 0, MessageCursor(url.size() + 1, url.size() + 1 + text.size(), QFIXED_MAX), false)); + h->setEditDraft(Nil); bool opened = history.peer() && (history.peer()->id == peer); if (opened) { history.applyDraft(); @@ -2039,7 +2037,7 @@ ApiWrap *MainWidget::api() { } void MainWidget::updateReplyTo() { - history.updateReplyTo(true); + history.updateReplyEditTexts(true); } void MainWidget::updateBotKeyboard(History *h) { diff --git a/Telegram/SourceFiles/structs.h b/Telegram/SourceFiles/structs.h index 16df19fcd5..86dd227bd0 100644 --- a/Telegram/SourceFiles/structs.h +++ b/Telegram/SourceFiles/structs.h @@ -1217,3 +1217,7 @@ struct MessageCursor { } int position, anchor, scroll; }; + +inline bool operator==(const MessageCursor &a, const MessageCursor &b) { + return (a.position == b.position) && (a.anchor == b.anchor) && (a.scroll == b.scroll); +} diff --git a/Telegram/SourceFiles/types.cpp b/Telegram/SourceFiles/types.cpp index ce77262ae4..0b16ead7f2 100644 --- a/Telegram/SourceFiles/types.cpp +++ b/Telegram/SourceFiles/types.cpp @@ -35,6 +35,8 @@ uint64 _SharedMemoryLocation[4] = { 0x00, 0x01, 0x02, 0x03 }; // Base types compile-time check +NilPointer Nil; + namespace { template class _TypeSizeCheckerHelper { diff --git a/Telegram/SourceFiles/types.h b/Telegram/SourceFiles/types.h index 97a1fe7423..00ef2c51f0 100644 --- a/Telegram/SourceFiles/types.h +++ b/Telegram/SourceFiles/types.h @@ -36,6 +36,22 @@ T *exchange(T *&ptr) { struct NullType { }; +class NilPointer { +public: + template + operator T*() const { + return 0; + } + template + operator T C::*() const { + return 0; + } + +private: + void operator&() const; +}; +extern NilPointer Nil; + template class OrderedSet : public QMap { public: diff --git a/Telegram/Telegram.rc b/Telegram/Telegram.rc index af8188834c..878e146e64 100644 --- a/Telegram/Telegram.rc +++ b/Telegram/Telegram.rc @@ -34,8 +34,8 @@ IDI_ICON1 ICON "SourceFiles\\art\\icon256.ico" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,9,26,0 - PRODUCTVERSION 0,9,26,0 + FILEVERSION 0,9,26,1 + PRODUCTVERSION 0,9,26,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -51,10 +51,10 @@ BEGIN BLOCK "040904b0" BEGIN VALUE "CompanyName", "Telegram Messenger LLP" - VALUE "FileVersion", "0.9.26.0" + VALUE "FileVersion", "0.9.26.1" VALUE "LegalCopyright", "Copyright (C) 2014-2016" VALUE "ProductName", "Telegram Desktop" - VALUE "ProductVersion", "0.9.26.0" + VALUE "ProductVersion", "0.9.26.1" END END BLOCK "VarFileInfo" diff --git a/Telegram/Telegram.xcodeproj/project.pbxproj b/Telegram/Telegram.xcodeproj/project.pbxproj index 30dc689c9b..c7f7c5580f 100644 --- a/Telegram/Telegram.xcodeproj/project.pbxproj +++ b/Telegram/Telegram.xcodeproj/project.pbxproj @@ -1739,7 +1739,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 0.9.25; + CURRENT_PROJECT_VERSION = 0.9.26; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_OPTIMIZATION_LEVEL = fast; GCC_PREFIX_HEADER = ./SourceFiles/stdafx.h; @@ -1768,10 +1768,10 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = ""; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.9.25; + CURRENT_PROJECT_VERSION = 0.9.26; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DYLIB_COMPATIBILITY_VERSION = 0.9; - DYLIB_CURRENT_VERSION = 0.9.25; + DYLIB_CURRENT_VERSION = 0.9.26; ENABLE_STRICT_OBJC_MSGSEND = YES; FRAMEWORK_SEARCH_PATHS = ""; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; @@ -1909,10 +1909,10 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = ""; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.9.25; + CURRENT_PROJECT_VERSION = 0.9.26; DEBUG_INFORMATION_FORMAT = dwarf; DYLIB_COMPATIBILITY_VERSION = 0.9; - DYLIB_CURRENT_VERSION = 0.9.25; + DYLIB_CURRENT_VERSION = 0.9.26; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ""; diff --git a/Telegram/Version b/Telegram/Version index bc8bffbaf8..7e97206f14 100644 --- a/Telegram/Version +++ b/Telegram/Version @@ -3,4 +3,4 @@ AppVersionStrMajor 0.9 AppVersionStrSmall 0.9.26 AppVersionStr 0.9.26 DevChannel 0 -BetaVersion 0 9019002 +BetaVersion 9026001