From 8872c0716fb33e33311a78e693b61d3dd6b656c1 Mon Sep 17 00:00:00 2001 From: Yann Bodson Date: Mon, 28 Nov 2011 11:26:40 +1000 Subject: [PATCH] Support inline images with tag in StyledText Task-number: QTBUG-21793 Change-Id: Ie7b9f293c6c9a949c1899152c38b61251b0069d3 Reviewed-by: Yann Bodson --- examples/declarative/text/imgtag/TextWithImage.qml | 55 ++++++++ .../declarative/text/imgtag/images/face-sad.png | Bin 0 -> 6148 bytes .../text/imgtag/images/face-smile-big.png | Bin 0 -> 6058 bytes .../declarative/text/imgtag/images/face-smile.png | Bin 0 -> 6446 bytes .../declarative/text/imgtag/images/heart200.png | Bin 0 -> 8248 bytes examples/declarative/text/imgtag/images/qtlogo.png | Bin 0 -> 6450 bytes .../declarative/text/imgtag/images/starfish_2.png | Bin 0 -> 18243 bytes examples/declarative/text/imgtag/imgtag.qml | 101 ++++++++++++++ examples/declarative/text/styledtext-layout.qml | 55 ++++---- src/quick/items/qquicktext.cpp | 151 +++++++++++++++++++-- src/quick/items/qquicktext_p.h | 3 +- src/quick/items/qquicktext_p_p.h | 7 + src/quick/util/qdeclarativestyledtext.cpp | 98 ++++++++++++- src/quick/util/qdeclarativestyledtext_p.h | 46 ++++++- .../tst_qdeclarativestyledtext.cpp | 7 +- .../qtquick2/qquicktext/data/images/face-sad.png | Bin 0 -> 6148 bytes .../qtquick2/qquicktext/data/images/heart200.png | Bin 0 -> 8248 bytes .../qtquick2/qquicktext/data/images/starfish_2.png | Bin 0 -> 18243 bytes .../auto/qtquick2/qquicktext/data/imgTagsElide.qml | 24 ++++ .../qtquick2/qquicktext/data/imgTagsUpdates.qml | 12 ++ tests/auto/qtquick2/qquicktext/tst_qquicktext.cpp | 120 ++++++++++++++++ 21 files changed, 620 insertions(+), 59 deletions(-) create mode 100644 examples/declarative/text/imgtag/TextWithImage.qml create mode 100644 examples/declarative/text/imgtag/images/face-sad.png create mode 100644 examples/declarative/text/imgtag/images/face-smile-big.png create mode 100644 examples/declarative/text/imgtag/images/face-smile.png create mode 100644 examples/declarative/text/imgtag/images/heart200.png create mode 100644 examples/declarative/text/imgtag/images/qtlogo.png create mode 100644 examples/declarative/text/imgtag/images/starfish_2.png create mode 100644 examples/declarative/text/imgtag/imgtag.qml create mode 100644 tests/auto/qtquick2/qquicktext/data/images/face-sad.png create mode 100644 tests/auto/qtquick2/qquicktext/data/images/heart200.png create mode 100644 tests/auto/qtquick2/qquicktext/data/images/starfish_2.png create mode 100644 tests/auto/qtquick2/qquicktext/data/imgTagsElide.qml create mode 100644 tests/auto/qtquick2/qquicktext/data/imgTagsUpdates.qml diff --git a/examples/declarative/text/imgtag/TextWithImage.qml b/examples/declarative/text/imgtag/TextWithImage.qml new file mode 100644 index 0000000..bc09aa2 --- /dev/null +++ b/examples/declarative/text/imgtag/TextWithImage.qml @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Text { + width: parent.width + font.pointSize: 14 + wrapMode: Text.WordWrap + textFormat: Text.StyledText + horizontalAlignment: main.hAlign + + Rectangle { + border.color: "#efefef" + color: "transparent" + anchors.fill: parent + } +} diff --git a/examples/declarative/text/imgtag/images/face-sad.png b/examples/declarative/text/imgtag/images/face-sad.png new file mode 100644 index 0000000000000000000000000000000000000000..24188b7985f9e680a434394dd47c131bae0a977d GIT binary patch literal 6148 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 JRSJ;s{{b1Oo^t>I literal 0 HcmV?d00001 diff --git a/examples/declarative/text/imgtag/images/face-smile-big.png b/examples/declarative/text/imgtag/images/face-smile-big.png new file mode 100644 index 0000000000000000000000000000000000000000..d05e0bf21e7e0b439f731895cd04768a9063a645 GIT binary patch literal 6058 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 literal 0 HcmV?d00001 diff --git a/examples/declarative/text/imgtag/images/heart200.png b/examples/declarative/text/imgtag/images/heart200.png new file mode 100644 index 0000000000000000000000000000000000000000..cedd3ea608e3dab1a62dc29aa3e455b62b536309 GIT binary patch literal 8248 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%0Ac|r82b9UDb{NTuxI~pI>(R32Hi3ng+^K8`s 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 LbzoJ>7NP$K;5bYb literal 0 HcmV?d00001 diff --git a/examples/declarative/text/imgtag/images/qtlogo.png b/examples/declarative/text/imgtag/images/qtlogo.png new file mode 100644 index 0000000000000000000000000000000000000000..996719a4c606fc81ceb38a154e622ab5a22c7f0c GIT binary patch literal 6450 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 literal 0 HcmV?d00001 diff --git a/examples/declarative/text/imgtag/images/starfish_2.png b/examples/declarative/text/imgtag/images/starfish_2.png new file mode 100644 index 0000000000000000000000000000000000000000..132c20ffd0234a590411c6ba1936249335664ac8 GIT binary patch literal 18243 zcmZU)19T@r(=QxtY}>YNTN~T9ZF6JWww?TA+qUgZ^6m4y-+j+L=gv7j)6-M^tLpBl zu4+Xp%1gjOV?zT00l`U0iYotmF8vGZkl_FB8iM#EKtRw!mLejGQX(RRica=smNuq9 zKpwz3sqQMj*U`ggdpLULkckP&p0K^32p4!H(ZG}0N4r0r8A zcV7ANPax(HAq5A57F%ZL^&`hP21)+iG>pak12*xLLd6`$#Ef15Rai}Y2&l7pDLbL* z8c$CnKPtf1oWbg5&5h|&+{q-{FNy&x&`BrTGcWRiFzr#1$^<%orCeNm%a#RVM9t8j zIwdc#iDVW-#kz@n00Dwb25@yd!AHMyS>ytFl$sw!fkjFgl_IUCTOOZ{nSIsPz-UK?te|g^@lbr$r%P+?o)xuRD z$TyTrv0Vyc%$^TOgank-PQVMq_fi{?33{xz+oC3+&N-gh>-+SB07fUuZeLc2`1i>R zY`lpRSs^V}(Qb&%00{CQ2$y_l)cdckN`3#lbL8ci)WMYnB8q%ZBre#Ukh;Mi`4Dr2tl(e3 zz9C5IAd7}@Ye205>-9XikP?HFd!im_*$^20oBPu3==|_)gBbfbcR;kE`h!W3f@6@N z^WqwiIQOE$e>6yek%+7lh>Jlg#4`WD7vprqN+viSfr5t@7^Y*Qk6;~!YsTywsTr;q zNi!~|8>g$uVw|v>A+iL%2bCBtHArPe!lG>1}AYwzFLVkrH4YDc)mMgdrhaq|bbd0DP;?{(^rEtmRlTf9?NHLU2 zsWO@aRivzlb;tCM17@w86=We(jLjB<>rMCIwxjk*Ax<$%0ZxgplvTA~MqSRSw5?QF zVzeT+GPGK^`dp^3ik&T+bx-x=xE{$cezbisF#gq?}qi;ab?ik-$f z!iJS;mpPt!oO#MR+H9c((*mY-taaL=$C#3FGo@li))dWEP*ZzdMmNu2yj{gtV_e>( zVO}KPG=rj>NUzNy)TYz++g(^ehCzctzfS44fL|%ECa<_pqEFj@qJNHX!ysBHYoNR! zs-Vv>*RW{cn4~hHYM#1CtB7ZW)40_!>Yo2lo4h_UM=DV&c3kfF+R~1SLFa7qEUfj3 z1vzUKTi0k|{g$R?wfIUt*AVZRPmyQVI}Hq9v_^Ce`Zl^g?KSOhx=UIDO)AY_8n(?B z^&dkUfJ|#$W8cv*t3%_anbPf(mYNE>UAMk#U!F|e`fcltZn{k14s;*i$!vEns_%Z~d$NlLkQsAweQ~G`TG46nhp%FCwi@ zJwd&$E%DXp*6Oy5pPN6DKb9Y**R8k8m*LIu3*^h~WBYOS?(}2zQvr++UI*9OJ5w}oYC^lGKv=3)YdRo?M@+;4FRS!Q8 zcQ865F;Njfmt_3d!k9#KEV>N3yZE@ou-LMMoS3&*nwU(Q2CZh(k$8+&3}GoBIsp!v zH>sOb#p}YhO!(o|0rcSwJ&R6i)76Gk%W=izZ0#TY0Zm70d>jJ2UBsVAl);K)+1e-l z4)<>tVN6>ofDSJH>xOwg7XQol+K!FUFmV( zvd@w+q*-LanlMdPjXUNNrg;-eQ%EOIN0~=U#|=nr=@=%u5&gJ2ZWz9@fP5{_;Kj(EViCdFk{$j{C{M0gVR# zxS{X${?XgwJNMoBnun-B&=Z*Q;{3AsGQK)2q<~hS&aD)v`C5KkHLK`(y2@WQm~DzM zj}L1XVfaaTuTvQMHCr)DBi<~2AyFeS8}lBs?bYx!d^Z`Bws;uYNA=zMnlfLN=jZ;} zV{SAKxU-(W%n*>?DevX_Sb4EMH90$4bho@MEsNTz>J@ki{3`e~ei}_UzfyQpNXd&8 zaQA`w``|%tYj(2x8uIvA@<2}f&!>cPkkoVr0)j#LPXGqW%*F%)0=BbM(Qwg_ljSzH zx1~2Uu{ScM_po*NM-2qT>%sjmYHR9ZNa$f}W9Q86!AJaG3hsaL|0FXI6aJUP#hQ;; zLr#%U#NNr2kd>a5o{^Xznvjr?*U7|;TUk{6|IhyKjgQ#E#l?Y}fx+F~o!*^=-rmWa zfr*QYi-D1ufti`^9|fJWr=5$T2c4ZW$^U@-9~@CrXJaQz2Nz3wJHr3q8XDQVy6_Pb z|A*24UjHMfiShsPad36A`7aj}V+K} za{n*fe+wXNXwL9|CG#@;ztp@8|B>kblJI|u|KHSq<>!ayW%%E^Zjvu#; zk-a|uHQVv^-t~Q**?RZlY2txMe>J<=s^elg&2^sTdfk$5+f=2qL4?h|x>Cb)_1LrQ zvJ%3(*29vtW^gjjUqn{1+gdK#i=2^wh$t>PSuX3G<>7H}d{j^5msB*lswBA>ziG=h z-2lj9T0l{wbXp~2313tmTFJ`sc(KvwoVp~}b|`a9xKAXgSD>|&=U(t%b+3|}4fdDH zc5F^P_xF#_pbVzSkMD<}v6acYz)yZ*jXP*S)`cP&<{vAP2)kHL_d6zQQP=dg7m^Y6 zlISTl9F43vyBc4<@2?y;xsufWekqcJ!r&p%x%M?x@1DP~hN`r*-&$EnS@n;&@bFx= zoyyb-vfA(tPg411Jox3;_xN2|xeNK+3f6+O|MH@_PL3>YW%7 zn3|6~|2rv*KaHr%`_rBB83sL=i$ZO?%?s;xN9|&S%#jUQcoL+>TA8tRgG+_6a)t8H zIj2r)G8{#Fmy~$trRPAn8G@rwb+5ZiwPM`%zCrHh*0)R97>n#nEvGkXF}W!wU9O_0 zM;8{fy!y666X`lmQjDoe3j2ZE$$1qR={|(TvYphqbR1uG8yTtI`kf+H0brV{w@kM1 zvnV?Kgv~A+mzsa^P^sX;PlC;xts8DQda~T?ElfKVxyRgvK*eUbMY5_bEQ%`yG+OvK zijq!?5)G72C?#qpJ7pNV`*3CfAu_$y{&TNp)h_ZyUgu-PD};qev{fd;#yXzmd~5aS zJ0*8Sq3ryprt9E6xmW&U6sISY5Vn0}C_l)y6qzZ&xDsY=V;vyc%O`9=&UB4o8Z0M! zv`KZao6D082YO&c>9W)?SB=A`4_9t6@>k4-QSvo4h|c>%BqAAeB+nF zPN2hho9T(iM6LEHDCM-{GR))lFPoy;#v0AQGcXnFhh3kk%FaW zj0^t+4+=6^x-ZlKwiyg9rZSPa@uM|s4+p{>I{&{i?iXRD zL#k=I6PO#twHIpR%lNv6)j{G>f0})5EJZ?8RUj;#5L|xIL3D}*aDfC$!ZZjm3es38dtuAy5lX0|nDs&SBi?RR6Pj;GH zCO^VpAP;Jjwj|gy-c?=`NZuSor!G{QaSmC9%)(U#`}2~^P7>Lf0%u}r14(-j40eD{ zB`6TRDJ6fok~I#)4t&p=4q> z^`C9GQ{clqgIdY$vUPHUt@dE`bdz%^Vb*(9^#XylI&m6_io*RY`V1h6vTU zTWJ;JC0;m@-x=(|*#tc9|FJm5zruT+^kZwsFb!>HQ#bQ2%x6KpEl%c-FEM*3H8yJxho%eIIc3=bCZmfx@Q!e=Y=uBwG<*5c|%X3BfCa7%0BVo z>yolR0oH@3Q6?)P`y4W~y;*5wM{8MTaQE-?jn$(=s&%KyYDY9b*PS^A({7D+E@6X2 zA?X$*CXYZ(44SOIW*skEk^d}Gw#9e`CIl-MIi)uny?ljcfLLfj{&uqPqkDA;UcvE( zk34L%GbM$V6S>`k#cMrJLja-(HBbGf%yv?yh*)murOCKV*Zz%!RFBQ=GvmL0jalHA zI%`n`&$HSg@)N?Z(B2_3S{&8KZvaI8m}u@ojvZE-<%3L1y}= zj>KLd_Q-uR7~P4~b~@12C({<;2hRQgAP68K9L#^3TU&*gBT1z0-IqAUP)c@ThBjv!C6J_QcO$ zr=h+%hi}-1`@9MZ5-7&3a*c=d>qFC87N1$A4H5=4b_`x@lDKW{DF?I8+DBYe+(3M& z=6|n%%e6W>(p5epp;+fM&ZK<6O+sbzspImqD5N?E8JexTV?6gF*zmqTw4B2&JRtEd zD9CnC9D?4m!2A1H5l;6qlAsQ6>eEkH@Dkvm2rJIIe(TsUb$t#KlD8L3XCOXDA)>$~ z4`;ZT-;2sgKG zCgg0*SGq`2(&>z|c)H?cZCyn9V!M#+N0?-3J!SkRSItp%y{WU70#D%jxqgX@3~Zq& z=LCO~?fX3?$G_~`>z{Ldl-&Inb1=eEXgE8DdC_s8U^ipTIRDUbc->LI!4qXVWjd#v zZfnxP`VR*V0{Q`T1PwhEElyhIY_JWyW&t(`+d*)1`?-uUbc) zST%AP*jH*)Hexk0P7>T?qe{;v%C4}Hgvvn9844&^R2=O+*_64IQwj59%PHu8FtE>} z9GOlaos72h9)IuFVj(UbtE+X5?kM~YSF5{b5e`zd1Potxk1fHT_nXJn=auxtG4^w| zvLkw1Fx1E${?ZbgdbAZP;!3LZ6T6b;r@R2VtXh>d4}Vj1cz^6bmknEK6MBqYfk&&# zkB^Y#AR!*NDRP)8_6?8lNZL&7^4%{Zet70T%7Hj2xvfQZC?m!{uI0XN?jojW@|J*n zDE%qggL)rLTfC$;oC38z|dtQ62rw|&g^n( zwLD1LTJ|~tS@WoUWTO}jEDtC|(aDx|WIQ%*!;`bud8*?$DBAg%DTfgeSfwB9ZQ_ee z^7$++$rI)+3Yf$6Hhns-+`Fl4CkpK^NrO;5HN#puYj-$ivSiGUd){j9v?{0@V7t_( zI6X#O8lTaJ;)hQQL*c)hW-iD>yoV;1hOW&MRpdVoyrERm0lrYMBAHR0VYnZ?MRBxO zagYG?a)1o;w_h%-3(eTRq6}U{G~jp}jqIdgAqE3 z=}2-ap(DW*YIwP}lU-zaIk@PUw?hn3t%bczO3)k*OYR5l1TJ}`5OrkN8!MYHn-wY3X z2A1bWVx>c1JUve2tc7HsY_lAO6@!czH%UN|K+!l|NBQFOIA21uk&L4Di?any$YZ?j z7&rBTAANAGT%`au`}`Qs3-nuoNGkPe+2cOVkHVCmG2N6jcF~E)HC5m5DeLlU??H$= ziHOA6u|MzS8oBRSztkaK$}@Ln3$;?cbZNk+bjb3|Ny^hh36l67AYsOUDADIK*GYD~ zC@6KJA=NroNZ5GBn$BI32)$4W39%P=9teoh&FmG{j6@9@Ff+tWUT|&e`7W?4!kDx3 zHTV<4|0u#TavV5Rm_^f1;D{Rd)<&EMJQP%;wVU#;XC)0ABN`(-Rm4Ko*`s7%SvO0tBru>B%x5FcB~CCa)? zfQvJ&8em~l9-2a2kl&Y9eLq98VU~g$uMMc8L z>~d9;>wVW>PF?+$we9@o$kpjFK^1!8SrJ8dWVHNwi8WdFae|4MT}(9P)`-DJsbwd= zb1v5aWWn4(w33{N@ZSdfiCT-uNP{{O;S=w8%R_*dAC z&*SOqMr4=JAg<2zy|+=boHpVxMZzW^)uGXKta(Q3GDJ>S?O|u#!2@umX>g1Px-#w# zda~DiG+HhWr3=ukjEDsYC<$!f*cZCG4sXl5m=kw9Zu81-N_XV3pOj7{jNScfN7801 zBefaIXL_ov7IS`vayAC0d-CW+B|if9Ow@P3R9l{}EL&{vch8Tme#j|UAPi4Ta5J;S zet^U7YK*e;kk298X#k!=tVx0#iS-AMNPpcrXQ|x5^5#Z#!Bs>#P7t+xis(7v=^3TK zj5?1@;Fys&c46P`V1Rp`_fV`nX9ZyCmpk0W>@vQ*eJY3OR;$1=uYB?Iem2j|HcZNDmo%} z_GR9}$L=@}@BMstD}+qvH^q^TUcw6B)`PrB5eloCBYnAD4Sp7ve6IEnLaxXA0%|lU zeTwBTky#AowrRcHW+ATb54V*x2;Wk6_w+~mJd^6nH=(=IdD@{W=$Q~8#`q%-m^Hor z;gtQX;f44~`7S+I76RxM^L1y%jXy+`?@>-c)}A215-$|>XUr;Xz?s?y~B%^m!Az1>!OZSH%{uG(syzVkM|T7owx zQCZ&6KK>6V2Bvug$m_*Kh(Q{V?MU5(#zINFnMO&}Zjsf~5fHfuInWojDZ0Z0-T1=b z`nAteQ#)5daOL2;gTKzgvO^axLBME0ou0Jno=e$Y@4=eD2)}q*fisalB?#arB;qZ` z2Ey}9+j_MZ!b*j{l?<*DymrW43t`9e2i>MwaZ$*Eq6W-7qh4#Z# z2Od`RmD~X%Ui!-dCj0c;o9{9gCr^D;IUYR@ zp>e`Qbbi|>4Rn=3#n3n)&HD7+;8GY5?#NHhCuA(`PaU^x6Czi^$~!ATj*?Q#$!=W# zk_Vy6>X$@?9-FBaHPr+Wg;qLYEGIr$PjVA?&GR_A+~MfEcipWiZ~-tzR8qHhygDl_ zBYK|Y3kKf$-|~cZpgwOQ*HDHXEc7$6BP?D2)*0w{3W#kEItm)VQt;Z^hRinxm5vT# z+EN#| zJmnVii1T^+k>r+>osv#D8V*Ag268|U72gPaQ@ngA@D}~Pbdl%xVd;7RfExaRS5o%* z>DrZ|OG*WvzkLDi%T1;G%P-#}mKc3vwk8uPKHQkMTrrsl`|wy>*;u^Z zqYFvjtqpmSLtM5olUGVkUct;M)6A>AbV!ND`)w+v>S1~b5Wb(@+!Vl!6n9&}SzQ$C zks$C@@jaK(kKz}f3H;+^rfq?ugr5wxY8o(SVD;pZ`Tnzy;IH9(L_(kx&-bG7^qmtm=z00c^=+%)%c3li ze&$}kHwsiJY>d~APpfQYf{0SXy(jOvf2psJc5h~8wiNIG_i#$JAaxYZVzZ>qg#MDc zUq_KfRp<4(8AIPkDTl{h9*>)pq^18kAP`VHv!FkVk`qF;6PqCsmuqS zNqPEe=gi`Qn}6PGa6J3gxJN3>QTBgtwS0cn_Z2rEf3Qbca-{N+jjLFaZiNbW9Kg#u z?_f^(gFXR;CpVDeBfjb0&2qvSXY^HUy;@t5!vk@xaQim=5q3e?{y#B6poCKLhp8=P%ryY7SYD{3Llinn-}cTFp2ymA#NpktK3*G?D2S} z7-ag)X^pykg!M8(#XQVyPJy;DWbw0vm(=!ULit=AlwEIe1aMR&Qx{4^heSxw`aUlq zUbp+B!c7QAS>4~dEth}$uq7v*?@vhn+59kFC>)iAegkv^#P<>ZOpc_WnR9`-fp$$( zH&`<}Fvo#`wce#sp&&11LKJKv8(kpZk9XVs2z$Wli@gLSwISL)VR)f~x*UvH>Ck!! z=WIJ67^lCg*~tPGFoh5z40n)j_Z< z&VI$qqrL|>2b0nc`m*FCboq~Mf5};efSuHaTq6wg;l8^%o{`!XAlD7LSzCqYIE<{x!1l=+gph7i0@&BJjL6; z!yfR7O)yFg+vY!>L=ajZe#b&>Yw1t0tTWDn9&hBG1~%`fm9wEC0pjQJn9t!I7zEy_ zw}a1wnu~V`-R+dH;9M;T71mWcV8;ezU(iDeIs@v2)b}TGK*C17p?H%g%xks61pv%_ zi;4O}#=7|zTweG$O1YM|KnQp*f&MwWtarDFc>M%V6=b3L8GVNC^4@oIeFBFEF-ylI z4t{*TaIT-GQ=vom*-TyCPiIkPNZHxp%Ixq4m7|TzkBs$kM{-+^#0$tMyY?07^P6-3 ztb9zw8JNlGAj&RyUH1Y1=0FF=2%2bVZtJE^dcTf8AH1>oi65ZA4R$oIyp$CWN?Swd zDa8Xc3lLc{>zgCo-HYL;iqsp)9qD6b1VNCT^>VZey`0F^-WxU%ww}!b7BEDWu>3xq z(NaHI_C5-ZKw7*yJLJ7ig9A4Aj1{?+x2C#d5gJz>bJx zpdPR3W|${VKH+QScVCMIw~#`%K_)2a35UknK+DLebcDgk)EShLVD<$`v+UEHVCQh$%PJg|qGDZN~Fgj|r=s*)p>OF1;-u;frq(xMG9UNHqhz7O0W~Es(-v z2ZLdSQ?Juo=)}hPqom|wN&$-&u|!cJ8X?hQ9UIfZQT)|) zyw3Moy;*TC2jm~c*cS)iwu^$twQeJid)zybh}aYZA@&Nvse&e0>sgcrG>U~ zV@YOJ7Z^7=h%kha+UxHfBRj=VqBP7p?~=jg^poX{#1V6q8u~kli-(?L2t`^-)1y&v zj%q1f=?Z*xU5xaBdQl*c^&>O?_;=IClOqbg5BFCJ(J#ZjFUggG_R?r$l|Ekn9DM?Q z=^$crl{P&JR3|gulIM(q8$?{FD6`-4b^9OzYgQeA;$y3NBPb}b1BMXe%&;$gp5rNX ztr19mg^Td@y_WUydbvJD--DZaAb zp`=$G8h=mOg_bdNRcs=eRqVE8^G~kO658fD&?FJM_O0F#+#?{AIZmHxo*e2TmxSgTha#e~*Ecce*Hz9;Z{Hj6n6vg889f@$Rtv(1&X_7*@SSbQO;KUU9lqQgx+GwbG!m&!EJ zn=_RsUEizcaW8Mfav!eqI~EZi@b+Om)NPdb*H9z9^VsY$P8H2;KmLlIvIv_vJ7J+@ z$SZuBhr?@I8e#`OhM|jO{ch|3vTV1wEi(pUnk6UKoyhi1I{9#m;5+y&ZDIFvG8=*k zr+}|3@Z%Ws{M+bGccEdiiii?B`t=VtSrGs>ErU=Bc1k57r9-q1y6WV`X$iAGKib(9 z9RjE;Udz*vnt)LGLX6u;znbRsTKVR(mhwLL%CD6>Xkq%~SdEfS$0)y+<5pn6Ko(AM z$7{pMIvAM$ZSrA&WCkOU62w*kWvp%FLf08TJ`L;>&U`c1yw)q|pdi|TCJj>qEFrlj z0lfaK$R_;(5!sm}uCU%^#86l4Nev|I6hCR^a&LJI9>0>UBw&t8BAczX!Qag|{6>#mv} z7CiGLNNQ^yGe4sbzU8l@4MbEt&wo=_?>YY_j;+2Jr7{8{Nkvt`+o&_j{q6=6Kj!1Z zh7#oD-G~dl(tM6g2X~?Od*2RJBXv+w>U3YbcIj|HA(>W@3qyk+=qGgqEogFW%mZKq z(C(2m8&M5%P=T3Ay#K90CBM^N1q5s`#bau$Y*msL9vu38zfYbl!sUo)+2+yotb9S-U?}*arD*jGe0*;Vou;lQ4 zo7-uK?0@D+lK#9M-aXIo3#)y5#1hiJ5K?@C-|b(!JkaQCDxlCpiTLY%xNs4IOrL6+ zrF>9iEwMG%8tdb8=KnNWh&KU*xcVfbz1-`I;`A1Ic`(d#aWH%w@y92dvSvO0=L8h_ zTNY5!0>p_pqWXA&<|yOTn+bSON$6%N>SsoErbm|>jB7Wt13f}k&?wELy# zsV|=$TTxQbk0$JiFs9JKH5o~-wC($5+H3;9fIn5bF=v!|?$a5`=F-&E&cr5`#Xmy{ z|C@{h+d`3^Ft@94dNHeE{k2JVHfnaKI}=s7vj}~;tc!sHt&Tuwelxv%<_H;BSK%_s zet$v&+fMolmUvf4jnnmGxmTFbdR^%#9A}1~D0q@GpBB_cOMhSR%B-EXkO3D`nA+Me z#CrbscKBka!Hz!3x4qi{cX&ECGqDTv2e8)iQ7>RcXv@{-hdF4a)|8gL@rvX!uR@jP z@_cH#nkYR2#?)Uz+pz?fpb|a9kbKKF6Gys zM<#IebOlpOyX_;>4p8>IxquW*O}QB(;z6>`tk>vVgj!Q>I%f~7>>JfC${%yl?yiL{ z`0pwLp$1se@b;89Kya1~nc4O3(GcO0=DP1WNBxYva0jwmein0ExWNSSbYl_n@gO1M zM*&#*;b~*~oes=kDZ=DeXb5j`+uRe8w)rnnfe32QD?|~ioPxyf0&t3SDJ@(_QPx!9 zy^?L(qrb_x z5=WBYdRuHtriVo-Xd2s*Yv!G=6ibe0dna1f?`QfI0p5sAybImfc2TL$CL{yc)TeC;&j?BWbwmi6pGqda7XhTKufBFeg36BXfQ) zYjy!Y)iY_i;@^-PRAJu;zkj1|`D78=$6sF#Pmgj;{eHLJ7(I4^al|PUL>Iny!Jkf^ zrkp(CwopdWAS*b!7e{l`Tt{o{WThN6e{5+EFs zpult@{SH?V%6+|?ru#suX0zdpZz%Zv>UoWVSeVSELGVy`bJ8J)U8Rc?jFq=lOddTe zKY_UfSQNjcj|v$7sH{eROcyj7KtpJ=xEW|^l8;CkPWl`x6`*9WBHmH{+=ahZ-TIsc zb$X0PAYf?pR@;>D3>OASqCB!PmGFTP_xO)KYZ9@Fc3XP($rvF7?O_AUVY~xsh(PoC zcOMPHK*U#Y>7^q4XJ_^Cxs;gnGd+Lw*!bvXwaL%=$$Gh&diA`>RHm}9Gf_S-Y!$tl zxRxl9VjJ9+U~fMw$ioStIz^^NljaW9Y6|$pA+j2Gyx( z91bCxjhEzutVYXZ6XiLPxWs<&C36*mVt~m4lep5#+hSp&_@&%r2-cH6ijn&b)}Ip8MSjX!s@yro+{<-Y!pgehSpr(XkWK4Ajz z*Q<_3EjCZ@Hr`S||1lZ4Z`afR3GvDndp0X>%(d|%n~?sM&ql!e#hNF;=mk4d`@kkD z0keo6C;4+fW-C*-?uFuOZF*l(G&?84r`zZNYG3+;YVtrHkhK+#O5ZX)S7nV9kz}+Y$cy^znu=y`B}H7Dy$Qss`;&Hc-U^Mu*(aCSQ5) z1fG{2QwA+OtZykg#||b+WCf(4M;Q~!C2bJa-FJ^!fD6IVvroNL6CLP53N_5thZ19I zBy!!}6Qi*f*f@*!cCRfR;KRVI*OJ~|%-_Rt`-9xlZbAb4kja_FU-;<26B0_AB-iZ= zOcPSB0FHp^Zq6Hd2rzeWAc<~Md zSADEo+edYv{rOo=Hdm;cLVmiz(n$P|FOO!{LcRzW-3Gn->_%{-QgZH@&uwl+qP@+i z+L1E(d_w@~1`^$BL*_>FzWm+1|=;Kjm2=SGb?jVmF9a|Fz%A z?*q4FaC%3EnwU%ei3n-|HTA4wT@+$3{cFhNOpA3a;2qaXL>3lsB3h6{nyZky^Uu+yJs46ec>X6=yfAmFZ|S& z^m?GEcPg1Si_(a0TBe8m%#gvd3pjfP>RaT5dvyCF9hwZ5DCjyIeIX?7K^5h%= zE=xwG(sPU*;$yTa2CEelf2ul=FYag`6KTIV9v4Qm%9m{A^tUM7O0y$*XB6CW*}FP& zXD;OwHCJboks?Z{+1@GJ6E7zL^26j?MIp^Xws=(w|2}(&*MkwFM$P1D9O$vTW3#C{ z?L)KiM#U>lS8U-yE)xTPwT>nv zUrd9=Ss-`0=EKAg8?t@~q!7}SVO>*zhSOVc%aHmizrfFq^1H6l2)3+?X3h)ed@`m2 zEz0OKJbk91Jh+J+PXIsp3pGDYNoiRP;FT=l96|~T}yk|L^d)&K|NDiZ9C_eTe z>lc)X7J2BBdc#g<|0TxH`5RIevrDTV%i(aoe{?2X@0Z2UmFN6c1Bq8ELS58%$P!kh z|6qmi0DiXcL<6!HW?a=;E2ocnPBEswu3VnQ)Q0`?vRqnc_B)6uU|G<%km!h0K5I}9}!VzmOXM^5`54LGaJiqDc=u~ zwP)qQ6tk6(wTtLYzeTFfjFRnBqJ-itGMpSO{UD>?0Z?oNhU(x_4DBZhJ5$y!!Gf7n zmOGs%w}Qpvsh_L6sDsE#HkbHZUPQ%TB@PB0t zD}Y+5{c^o8lBY5jh^8ab^+Z~@h>!bAY-|x@k`U*Ux7o?WEs1CsM^aU?CS{03NyV#; zm=NM{F=9VNxcyUT zH^mS?fFkG08yt6&3fXEjXxm#t1+7r`P8PKAnE3=U!XFukVfgftOrx;l6#S=tj1}yW zk)sFa8k@y|kGc;?4p(Uizd&ekYN6E+4hg>hM76m{pkm9I4_o-Qc<2(b?GYKGBx%C? zP|yLEf^#&%$BprD+%KmJ%#Qi8nRkchxJU@G8?J>3dkY3++s;Q(;linB6C56$8V`sh zQbfcERZi3=jqEoX^mBR2(Cx~NB!ndcu)!(vdS=a|GZmv7_Z*~R&R`ZU3cI_EFUd|q z-aEJ$JHw32GS6(X@J?7YgQ zwTYOLg^*?Q_`7Q~<$=v7jKAEM6|e!x#mKA2PcQVfcvNe!z;#}3*oNaCxRYNI^cR06 za6B|4tZp}}j#XwxydzHnOivdg`K@i-%iWWtwsb3JM<&F|c&wubJ?q2JmW}8i=MmyJzgeepT7H_hG z%{&YY8uqV2{#y8D@=fx)o}KInB}0Z8DAPEqQ&5ISyP?E8B-Y{=GUU{(0WzlmN*he0 zSotGv(;KM!fZy=E)WWtNM2`HOpdJ&;!=0!XE?s;aNu5t)%kfE=nY4nz&8I>%j$mnP z0dE#x4&rvxYNg=h)l8LU4fW&u;dDIP;ChRSFc{&WDSUO!-k}G8mSoUr@+!!^{!1_u zjXEwyCilSU0v*o@dE*)-W~ONiBkHA++%Ndv`#V;?GQ#5(d*Ctr%IE)1v1N}ty z_41pbZ#+Q}93qwsm(IVv{pjuhLyK}-g|v|$l!JA!yA-G$mpDxPIef_g&4$00rh4zZNN&m{T_pnt zRk>&j)kdiow-y#z+L;+aMz&3eACN(?$O0SaBZPIULn^SMWriSCS*zAQIaTS)JxsaU zgdX;D?AP>8I27j;o`Y!I)IdeO4;-r>JPqhm+H^9vycuY(*BWh2Q=mUoEM5zrY%u*h zt^tAb5KIE#2Lh$1iM|eu^Q0gwo|q`je)FAgIoM{84F@=|t3vy)#| z*5z8mHZpSOpVj4lWjo_So4o*8;au9L=}dQ@1z39SZZ(L*Dbdrz~1Jh_Zn9 z$P;|)tl3$E3ibd}~wba@{kV$mIFn0KSS zM_k~G;r*c)>ClDSpa089(Z*?ZY(csdp3lGS+rh!5iz8Y%PtrNZNIMqNnL!Mhdm+(9 zkmR|0zdw3WLbxGL?P{zy)QBO44^$iNL`e-88a6*7BUa`Z>gS#t@Y4B*(=V~(8|?4~ zKsf+rB6PCbOk8ltxhgs(*k8P;nfy{!{r>_}2CVtJyGIZe#%sLj0p>icY{tZ(H(cOa zYe3^%`G0*L=q!gvsS?MU$Y1{&maLbS4@97;Vnj`f%V&F<<4$A_4UDENGcXOfJ|z1! zdaEU3ujnJSR!FS&)_>;m+P8CusMXQh?GcTg76C)?jS_@V)C8DG4;e5e+||&n+a0av zwfPy=qlY+{Vx$b+29#dgPr)@|#nQA=ykNhN-YPyIZel((AJVxkANr-2V{NDJdGUqR z#6%wOofJ+?*Mn$@w|+V?ooOO5X;kRPZSKEIw&x`$MMHv^c)_l4!7fa612ku@a&<~$ zKGjh(A^|WsEP1oiHUrj^%KQZKeqEf-g|3a z?zxG{EX16LMTCSZ)4qB>g^$N3Y*v?YJ{5&(#*ETHu*d#7Jp!7(8R?Mwg}X!uh)5r< zCt=Ry<4ojVb<%W|USDbBYEB-=ja%1~`sP*k0!{F*MR5H8bTq0EFLd4Rq?*>JP5ZAi zK_$Oz*UC^I_9F#^EV8pjMLU12&0CPT+fUoK*5UPZ=4V0#!~-9X5@4J7{2gSj#GFZv z=v=N*P@EO-bDU{4C&Tu%=k4N=F2Q4xLo|!hBN|BKHX8O@XM$Qv#3hqv7XPII9?od2 zTrNfavUC1h>*S74ln!}3JW8Sv(1KeV@G6J6AT}Ei(V2^_MYJlrFBM(am!NzrQ%yv$ z_|K=>B_Ec5h$&PxZq~j2&*uw0Vn>K33CwMT?0j|J;K1%{#_ReL6z($EOwt@BG0fsR zWCE(*H-9FgheZ8BOvws^0V=bWZbtrYG>39a0XPFMNAs8k@579zd^+4Vl|*JmI!cn6 zW}dIed&grYYv^jTjx{>3pX-qe5hpu1nN7KFm6C?5Q>SO>#DLq0yvrNs_L3PF1kLP3 z5pEC5e~e$8Q*}7Bw4j;Rxo}Q5p=(82o zUGHjRTif%}NseJ4)}SV|;k%-ESW;?wuj>vPQ#Uc8Ai|$76fm7AbviWrTIXvDL7fpq zRYOqA4PBZsiZ2HjrA|UamqgUQE?T{V5=&yz`joDEjJbB`v4rZQTd{gSEmv*sTUe+~ zzXm(9EY^H+hNuAMR6`Aj72qOYm3M^Wyxd#%Vb{RQY8DjgZHM4Y>5j2*xA~~5F%i8R z7O*ab}blJ?)~@j;0hx*TDKVRb37)e9CL9}1;6p~{R%3s zzRG%YsL@%>4-2Y~$kCX|Z}p!>uZ1|4#xquX&j@E<5DtGz(x*es2m2VZjBYmD^(oHRSk2g2CC1SO;Efk zpPygspEnn&!Xdn2H=3B!<$Bv~p5Uez4n3n{P)O>>CDPr*=eo4_&iMY_fmqFJz9K>4~ p9hc{xik=-&uM=^nZ#5AY{~r)#Bl`(kSm6Kw002ovPDHLkV1ma%RCoXY literal 0 HcmV?d00001 diff --git a/examples/declarative/text/imgtag/imgtag.qml b/examples/declarative/text/imgtag/imgtag.qml new file mode 100644 index 0000000..7f0d1dc --- /dev/null +++ b/examples/declarative/text/imgtag/imgtag.qml @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 + +Rectangle { + id: main + width: 640; height: 800 + focus: true + + property var hAlign: Text.AlignLeft + + Flickable { + anchors.fill: parent + contentWidth: parent.width + contentHeight: col.height + 20 + + Column { + id: col + x: 10; y: 10 + spacing: 20 + width: parent.width - 20 + + TextWithImage { + text: "This is a happy face" + } + TextWithImage { + text: "This is a veryhappy face aligned in the middle." + } + TextWithImage { + elide: Text.ElideRight + maximumLineCount: 2 + text: "This is a sad face aligned to the top. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc rutrum dui pretium ipsum malesuada venenatis. Nulla sed turpis risus. Integer sit amet odio quis mauris varius venenatisLorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc rutrum dui pretium ipsum malesuada venenatis. Nulla sed turpis risus. Integer sit amet odio quis mauris varius venenatis." + } + TextWithImage { + text: "This is a tinyhappy face." + } + TextWithImage { + text: "This is a starfishaligned to the top and another onealigned to the bottom." + } + TextWithImage { + text: "Qt logosaligned in the middle with different sizes." + } + TextWithImage { + text: "Some hearts with different sizes." + } + TextWithImage { + text: "Resized imagefrom the internet." + } + TextWithImage { + text: "Imagefrom the internet." + } + TextWithImage { + height: 120 + verticalAlignment: Text.AlignVCenter + text: "This is a happy face with an explicit height." + } + } + } + + Keys.onUpPressed: main.hAlign = Text.AlignHCenter + Keys.onLeftPressed: main.hAlign = Text.AlignLeft + Keys.onRightPressed: main.hAlign = Text.AlignRight +} diff --git a/examples/declarative/text/styledtext-layout.qml b/examples/declarative/text/styledtext-layout.qml index c76dd44..291d75f 100644 --- a/examples/declarative/text/styledtext-layout.qml +++ b/examples/declarative/text/styledtext-layout.qml @@ -3,37 +3,36 @@ ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/ ** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** +** This file is part of the examples of the Qt Toolkit. ** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: ** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. ** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index 16fbc85..e767347 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -58,12 +58,13 @@ #include #include -#include #include #include #include +DEFINE_BOOL_CONFIG_OPTION(qmlTextDebug, QML_TEXT_DEBUG) + QT_BEGIN_NAMESPACE extern Q_GUI_EXPORT bool qt_applefontsmoothing_enabled; @@ -85,12 +86,12 @@ QQuickTextPrivate::QQuickTextPrivate() disableDistanceField(false), internalWidthUpdate(false), requireImplicitWidth(false), truncated(false), hAlignImplicit(true), rightToLeftText(false), layoutTextElided(false), richTextAsImage(false), textureImageCacheDirty(false), textHasChanged(true), - naturalWidth(0), doc(0), elipsisLayout(0), textLine(0), nodeType(NodeIsNull), updateType(UpdatePaintNode) + needToUpdateLayout(false), naturalWidth(0), doc(0), elipsisLayout(0), textLine(0), nodeType(NodeIsNull), + updateType(UpdatePaintNode), nbActiveDownloads(0) #if defined(Q_OS_MAC) , layoutThread(0), paintingThread(0) #endif - { cacheAllTextAsImage = enableImageCache(); disableDistanceField = qmlDisableDistanceField(); @@ -266,6 +267,8 @@ QQuickTextPrivate::~QQuickTextPrivate() delete elipsisLayout; delete textLine; textLine = 0; delete imageCache; + qDeleteAll(imgTags); + imgTags.clear(); } qreal QQuickTextPrivate::getImplicitWidth() const @@ -295,6 +298,11 @@ void QQuickTextPrivate::updateLayout() } updateOnComponentComplete = false; layoutTextElided = false; + + if (!visibleImgTags.isEmpty()) + visibleImgTags.clear(); + needToUpdateLayout = false; + // Setup instance of QTextLayout for all cases other than richtext if (!richText) { if (elipsisLayout) { @@ -329,7 +337,7 @@ void QQuickTextPrivate::updateLayout() } else { singleline = false; if (textHasChanged) { - QDeclarativeStyledText::parse(text, layout); + QDeclarativeStyledText::parse(text, layout, imgTags, qmlContext(q), !maximumLineCountValid); textHasChanged = false; } } @@ -346,6 +354,41 @@ void QQuickTextPrivate::updateLayout() } updateSize(); + + if (needToUpdateLayout) { + needToUpdateLayout = false; + textHasChanged = true; + updateLayout(); + } +} + +void QQuickText::imageDownloadFinished() +{ + Q_D(QQuickText); + + (d->nbActiveDownloads)--; + + // when all the remote images have been downloaded, + // if one of the sizes was not specified at parsing time + // we use the implicit size from pixmapcache and re-layout. + + if (d->nbActiveDownloads == 0) { + bool needToUpdateLayout = false; + foreach (QDeclarativeStyledTextImgTag *img, d->visibleImgTags) { + if (!img->size.isValid()) { + img->size = img->pix->implicitSize(); + needToUpdateLayout = true; + } + } + + if (needToUpdateLayout) { + d->textHasChanged = true; + d->updateLayout(); + } else { + d->updateType = QQuickTextPrivate::UpdatePaintNode; + update(); + } + } } void QQuickTextPrivate::updateSize() @@ -659,6 +702,7 @@ QRect QQuickTextPrivate::setupTextLayout() lineWidth = INT_MAX; int linesLeft = maximumLineCount; int visibleTextLength = 0; + forever { QTextLine line = layout.createLine(); if (!line.isValid()) @@ -667,13 +711,10 @@ QRect QQuickTextPrivate::setupTextLayout() visibleCount++; qreal preLayoutHeight = height; - if (customLayout) { + if (customLayout) setupCustomLineGeometry(line, height); - } else if (lineWidth) { - line.setLineWidth(lineWidth); - line.setPosition(QPointF(line.position().x(), height)); - height += (lineHeightMode == QQuickText::FixedHeight) ? lineHeight : line.height() * lineHeight; - } + else if (lineWidth) + setLineGeometry(line, lineWidth, height); bool elide = false; if (multilineElideEnabled && q->heightValid() && height > q->height()) { @@ -682,7 +723,7 @@ QRect QQuickTextPrivate::setupTextLayout() if (visibleCount > 1) { --visibleCount; height = preLayoutHeight; - line.setLineWidth(0.0); + setLineGeometry(line, 0.0, height); line.setPosition(QPointF(FLT_MAX,FLT_MAX)); line = layout.lineAt(visibleCount-1); } @@ -693,13 +734,14 @@ QRect QQuickTextPrivate::setupTextLayout() if (elide || (maximumLineCountValid && --linesLeft == 0)) { if (visibleTextLength < text.length()) { truncate = true; + height = preLayoutHeight; if (multilineElideEnabled) { qreal elideWidth = fm.width(elideChar); // Need to correct for alignment if (customLayout) setupCustomLineGeometry(line, height, elideWidth); else - line.setLineWidth(lineWidth - elideWidth); + setLineGeometry(line, lineWidth - elideWidth, height); if (layout.text().mid(line.textStart(), line.textLength()).isRightToLeft()) { line.setPosition(QPointF(line.position().x() + elideWidth, line.position().y())); elidePos.setX(line.naturalTextRect().left() - elideWidth); @@ -722,6 +764,7 @@ QRect QQuickTextPrivate::setupTextLayout() br = br.united(line.naturalTextRect()); } layout.endLayout(); + br.moveTop(0); //Update truncated if (truncated != truncate) { @@ -740,10 +783,71 @@ QRect QQuickTextPrivate::setupTextLayout() lineCount = visibleCount; emit q->lineCountChanged(); } - return QRect(qRound(br.x()), qRound(br.y()), qCeil(br.width()), qCeil(br.height())); } +void QQuickTextPrivate::setLineGeometry(QTextLine &line, qreal lineWidth, qreal &height) +{ + Q_Q(QQuickText); + line.setLineWidth(lineWidth); + + if (imgTags.isEmpty()) { + line.setPosition(QPointF(line.position().x(), height)); + height += (lineHeightMode == QQuickText::FixedHeight) ? lineHeight : line.height() * lineHeight; + return; + } + + qreal textTop = 0; + qreal textHeight = line.height(); + qreal totalLineHeight = textHeight; + + QList imagesInLine; + + foreach (QDeclarativeStyledTextImgTag *image, imgTags) { + if (image->position >= line.textStart() && + image->position < line.textStart() + line.textLength()) { + + if (!image->pix) { + QUrl url = qmlContext(q)->resolvedUrl(image->url); + image->pix = new QDeclarativePixmap(qmlEngine(q), url, image->size); + if (image->pix->isLoading()) { + image->pix->connectFinished(q, SLOT(imageDownloadFinished())); + nbActiveDownloads++; + } else if (image->pix->isReady()) { + if (!image->size.isValid()) { + image->size = image->pix->implicitSize(); + // if the size of the image was not explicitly set, we need to + // call updateLayout() once again. + needToUpdateLayout = true; + } + } else if (image->pix->isError()) { + qmlInfo(q) << image->pix->error(); + } + } + + qreal ih = qreal(image->size.height()); + if (image->align == QDeclarativeStyledTextImgTag::Top) + image->pos.setY(0); + else if (image->align == QDeclarativeStyledTextImgTag::Middle) + image->pos.setY((textHeight / 2.0) - (ih / 2.0)); + else + image->pos.setY(textHeight - ih); + imagesInLine << image; + textTop = qMax(textTop, qAbs(image->pos.y())); + } + } + + foreach (QDeclarativeStyledTextImgTag *image, imagesInLine) { + totalLineHeight = qMax(totalLineHeight, textTop + image->pos.y() + image->size.height()); + image->pos.setX(line.cursorToX(image->position)); + image->pos.setY(image->pos.y() + height + textTop); + visibleImgTags << image; + } + + line.setPosition(QPointF(line.position().x(), height + textTop)); + height += (lineHeightMode == QQuickText::FixedHeight) ? lineHeight : totalLineHeight * lineHeight; +} + /*! Returns a painted version of the QQuickTextPrivate::layout QTextLayout. If \a drawStyle is true, the style color overrides all colors in the document. @@ -1251,6 +1355,8 @@ void QQuickText::setText(const QString &n) d->determineHorizontalAlignment(); } d->textHasChanged = true; + qDeleteAll(d->imgTags); + d->imgTags.clear(); d->updateLayout(); emit textChanged(d->text); } @@ -1629,6 +1735,7 @@ void QQuickText::resetMaximumLineCount()

to

- headers - anchor + - inline images
    ,