From aa65b89e928407cba339b59c38804273ad90b890 Mon Sep 17 00:00:00 2001 From: shun-iwasawa Date: Mon, 25 Sep 2017 17:15:29 +0900 Subject: [PATCH] Reframe with Empty Inbetweens command (#1485) * reframe with empty inbetweens --- stuff/config/loc/日本語/toonz.qm | Bin 208928 -> 209629 bytes toonz/sources/include/toonz/txsheet.h | 4 +- toonz/sources/toonz/CMakeLists.txt | 2 + toonz/sources/toonz/cellselection.cpp | 46 +++++++-- toonz/sources/toonz/cellselection.h | 4 + toonz/sources/toonz/cellselectioncommand.cpp | 99 ++++++++++++++++++- toonz/sources/toonz/columnselection.cpp | 4 +- toonz/sources/toonz/columnselection.h | 5 + toonz/sources/toonz/mainwindow.cpp | 2 + toonz/sources/toonz/menubarcommandids.h | 1 + toonz/sources/toonz/reframepopup.cpp | 83 ++++++++++++++++ toonz/sources/toonz/reframepopup.h | 39 ++++++++ toonz/sources/toonz/xshcellviewer.cpp | 4 +- toonz/sources/toonz/xshcolumnviewer.cpp | 2 + toonz/sources/toonzlib/txsheet.cpp | 24 ++++- toonz/sources/translations/japanese/toonz.ts | 43 ++++++++ 16 files changed, 343 insertions(+), 19 deletions(-) create mode 100644 toonz/sources/toonz/reframepopup.cpp create mode 100644 toonz/sources/toonz/reframepopup.h diff --git a/stuff/config/loc/日本語/toonz.qm b/stuff/config/loc/日本語/toonz.qm index 114ccaaf7c298a8edcef41c51f84d2ad3c902146..9fd4950b46e1c429e8b21c837997bdbfe7fba9a4 100644 GIT binary patch delta 16423 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 xY#fM1t=BJXuR~m|q+hJ}ME|Fce(AL*Xh(YM zm%hh*^zl+SrC7hJ{ymuLB>kqwq1YQcVA)#F!Jw_RrLD@A`FB& z==VRy=Z*I24Aw^MCng9 zUj@6?=uh1-q8)QwpFawRLJIfk^A|NmvhAnOzlc%we67%P@=N`>+rNoD8=x;dj|;zj ztG^uShHSh`e{K9uEVG0D`XO)V`&`SU`ZY@(*S~)1foOG3|L*4??EXYq4%heh%yyDh zZLpLhFUw*qLi)`|viPkGR7-DJJ-rt8!J}nO4_qX;x219ehwz~;vT@*0^^6zKMiUuC$m$Fy+GT5q&mAyS+F)jn-nw8RsjejoJtck&F-67Wu z_Qo!E6}jfuZ3tPCT&p0H_;v@`*BvqE{Z83$PZmnHd9wc+-x|4+YfuWMX%0iK;M;HEc}F2 zlP|Zz*+y1%k=&~FE+`8x%g~0lrIO{29gqlSl*qjrHN`pA(U#PPj^-h9cwL-t?CU9q zXQ!YGcv0by=5q89c;&&{a&$@=n7M;IupDH}QrSw@%~Ot@19h~fibsAq^3KQ!srdBF1vz2cBBDu?<%B<3L_NmK(`7fDqgZSufA~>O z{MDG4ah*K3E^a^Ko;-KiNUVjMoYE4vFTF{g7ZE^IctoCms|B&ePV&OPQDBpUoElgT zntrdG+N3k~0Nmu%1(mV4+48QX7{hoYFW;SnPQ8!3!hmQjRq(H z+IeMh((<#sDI80_sJy)CQa79i&)Y6%tw9#7eP7C*C>A82Nji!7t!60> za5s-J$`?O`q2-+>UvlhERDPs<_q3znfmhT=@p|j~AKVE=;y3?mnewk(oe)T@zT;u$l@-%r;b-djbM?p26Ac8uTU^T$~Z;&$TnSdVV1q+t1+E z9;UVRi@`0i3>p*%4Au6pB{MC&ZGFKP#y}$xB5WYWpw5(f%KXx(i~V2+J87)`DZPE`~<)UZTPN*bp!jb9}s}p;^!e6r|~f z7FD6=uO}H=cY-kTZD(lR9lKiXQVp$p-tL6LakHWAOZ04PRv9{$hZwok+t6hO-dh$L zdgVisxlK3pneRa49%YE!0CBQsv>~e7HsTc;8lu9NqRMJ(h`ull74c^)*}X27UyW_G zNrr*b5X>ysER~zsRw*#V{#D(31jC4t1!x4i8Ahb#5Us9mh--M0*eH{wa}#fKD|^H2 z_O`_R{}|@PXQ0iu$}ry-Y2s^n@Eg&WJVUAnCVkc}L)!hL#BY0p$H3_zRKx9CAXLH~ zA4A4Jn8WHWhLwdf_F`Td)(=EhJ>SQ$etH28ZZtEjfBXr@2=5s-{J{4$-3*&Qzs2Tx z&6n6%MMU zaBQ(*-#$lJ_9?^uFR-GXNeZLv6%NWYIb<5PIF8^#aU2HhEX*!Wz6T^wq4KeFy4d-@kBNjH^Qq99~@;mwS;jgSFGo;TXA+DbH|v9W@L zkkV+0u~NH89MpF;I#xv}jy!I3sevqW@u|_}WCHOOO^oi_dm#(0FuE6Fg_|YZ%yq0Y#7wl-B zWE_B2Gap^qIHK}z;wRILqn=@&`*Gvwq#*R)1{xu$yD_0Jv`?S$#_6lx!f@=3(_ehWwx!xQd(LjuRrif^UOFQeNyg;e zxc=j_#*}lBD9A7NG0xk49TogjEBV3!#?)O=L=`(2)8pwxy~VGaR1~g}NHEY!RT13yoQKO5sN3jhpYo%p#4( zJ*$zMk2@RpbwRK%r86GbbAt5j$SUK()wogVx0XiDy`8rv7;}HsM=$?{F|Q-S*~5R0 zM|~q8c>5ZUUx~o+sdJXO&27yqjb~IyIr(FaXWB0!=G4`A!Mz;XF|o!A;r2)el9g=x zYU5?>HL>{@jMvPZSe0_dn-Lgop@1B~x0K&Kl=7~jWapw;BkqH%}XV@=Yp(+J(KOuF6mAR7`)y1j6= z`>##%mFdu(pG~D|y5f*&fvId==zu#jOtxC+(APeu$|Eo(!*810Hi?iG@g}#N+GyF7 zwd`r(Zf@D$RQp>dH18UdzuW@%^01OQw=&fck(~qETgmsnG6hsRfDYGlQ^2~bu;8_( zpr2ZjzVd5%hdg^g+Fg<>b2$}4(&&n`fa>T^uf*)UIixLU^IpI ze1q0glqm}0&di5RvA*CVo|vM3qsWs=Owni1Qgc3T8aNcD@+rm?gH|-F@X{317p9_} zY#L&lfq$M5WEz^+0ZpPPQ|zHZ_(v*7tYq1JOmWl7p=o=<6qo)H0(qlp^mLer{T$PH zFHE}L+ccq7A7Wn1OjFk$F{3I9GbOCNK&<~$Q)0j$oOd>uX4r=ioBqr+W71iodJPqZ zWD1U^7L|8-m8)+BmV+%VTEZ;DdbjL56jS2j^;n6E$@$DFW|drH}gaD zCo6@47Zl)Q05aHR1!^x@=(psY;HPYxquTI z8%(*=M?#jFO}WS5N*>Kjd3W9t@0MlCFTV%H^HtLs<4treYM2V|AqG6zY`S=TG*O4C zM@*OhU;s7MrmH=X?vlruuFfk&lQ!2>WQ1>Y4KrQqiwiYvYr1zd1!b0<>0usxX-Wmt zQ$rQ#!nUTTxBkY$Xw!=efy6@oSbB%p+Lf5ztad>wa*vh#+)C4%gYbbz?JRRcs`F=8 z5^_TJ<%F=AHo*?#$NTK^x#zPmEXpU@C)($wPm#}SpPxPt$oudA65+qU|K7=|LsWEJ z|DjP%V`4@PbP66ieAGCnR4XCvu~I$m#Db z$SJgj^?j}XUew`#E;?$MliNQYBbAH0)p80S(m!_a$h6gdyiD4-8r)`Icn|Je-Rxi; zYV3c8+$JIrgYJxBPxk5V!>QVTuj{B>z$qeX$dJDm9WulzJjy91c4SoCsHjNqYRE<; z|L5NAhYcS+oS`g(BCPt~E3m5nm+z!ih+{5l<#(3GgYD9?J8(^(|L=t={Qu4Ae=lG8 ze;)k*Hk%{=_pKLpD__|r$~xUK|1;hH#~0E9o^iXnBS%FI|35zdUyl`9zcQBDhW&J;&2=MR# delta 15656 zcmXY&cR)?=AICq>bI-Z=+;f*5QBf(9M9R*{43WJ@2^k^E%tcm7#uZtS%&a0SQc7m_ zPPVMCy=DF0?)m-oy7zYPInQ~X&v<`6&(pnP{lP&^wOt3lem8-!% z#8O2odD^vQZCo5{9w8E&5E~V*aK$Bs`x30=ny1SWT!*^jO&8*Pkiz+=6mC2N_9v>j zUSaLQRkC%$v~NV3X2f<5w34S!x7aaX$A)P{?KTtNzLcoF zJF!Ml3McillJA>hiDEW2OA~e5My&60q8_Jl@lHfNPZ2-3h^Y5T;+?b#yI!?qG5az@ zwiEStBOZbW`^O_CmN(4Bt$~?na31jm8x(H*L>zynw9>>=PZFK3L_+I+#N!rNnsHaN zJqat$5#RBLgza01PiRQOjv+)2aU|?}MJzmrgoEdZx|S#5P$Kb7y%gSRM#A9*cwdWz zqXJRzL50)OtYp#EtmOSxD;)G*;jnTFqq-}U*JUU#HpN)paGSoIgp<>VpH3m+^cG^{ z$CGfmIo+ODNMNpx)Wb7lW+~I-eeUCFI&uOELnq;OZ$Pw!tXWcdg{-nv&Sw z8`jd8#9sJbvldn|zc7Vqlda^MH3|<7C2{0-;zoQP9z)D**iK?3?BD@z7$*?RY((P9 zfyCSHA~7+asJypA-%u-gxxEUbe<+-b3*vix?jwcsIw)LF|NlIvaN++yUzo1Ek8!us z%wrOj502-NxOyh>3I`Q#xkh5LNZi(j#7&q_k02{qXAEHTEMm5QNleWlwrPQteCu?D zw-=MRa|rRH@d~psz?=|b4p*$?-f9vr!IbM3|D&1shH=&p_%Rr1Z#0`E_&FwzX$24+;Td)Qf$w}%@d|<5Q zjp$-~;t;uP{zTN!-AaDmlWNA)B-ZShrMB9|Eo&#$I=PqVttZv4Wh9CXBhM~nh&3)v zJ|kpe(|%CH7e-=}D_f$}Hs)s3w5%`Di}})FLhV+rAe#HjO5SWHwfA{MWHa7MHtqqn z52#K&-=Eq~ZbZb6DzucxYuP|b$ z!dXW04-O(~e8oyOzMaCoWvSzs9OAKUsnfJrqHQq>cV4H?9MLT04|R4rPG#xxNb2m_ z7;*nCbzTTxyg$v-S#t3o>`a|k%EX7IE6nIj0VU&!FBwc-Lp+EjOr>rMZxCzM-b#L8 zGWvg`?r+JGe0l6t%WtWH*_(Pq$08t~P`JxY;gK*a`GKF*t0L0N z;BnL|7Qs_L6-08{v`J4k)b zA~f@k3Y-0+zF(ITueaA3#!t92YVy%n0 z-7)I7t1qF|lU@h^yLh66TpV+SbG(e5XPufTW zx=tgimTo26Jcb5DA3!pwLj(TIBfiUp20P{vD>t2jTEmAX_om=VZ;73HOTiH#q~g)3 zmc_EYdBtxE9ng>Xp$atSmou{DcPn|iJ%yzQ6Z=z}#*KkfA2>)8oZ-~TqiE8mFrr5_ zDdOjO;)TCxvhf&#!$K>0`X-uuJD1qVQ8cyj6XL6KXu2v7!D24WTsV_hzil*YRy48e zA8EGcK8@x9?zHgeRpJdJY2is&ZKDgc@X2SQ@3|D~yo>0_QCgCLl>I4SlN|O?>Ql`hEo3Cao=%q#Ypo;zGYJaboAbG7;RAA+cHKn2oj!?8=)}y4syAxq4f3 zd*-sn52LdseH{ek6Ej=HADiSeLWRYs6H9<=L$M z%8Nt~16hNG^@+_7W6cHx5FHF)tr|~&>GflNJ%WjjM=-x$SmIM1SZiT1QQ2OsT@XTP zjmoUU9HeB&wZ6>Xc0AFi7p&_wd{8-sb@Tl|d}#;Py_W;Ae1A)n!QRp58teONE-|eq z>wg3$b$=5Z&>it(@oqNYHRiI8t0l`|Q%TE$Vnc}TG-n|_kZpe6VIiNBh&lOL-WY7m zqgd$YtHdt!Vq>G{5$PMVvB{vckA?k2C_Vp)h08KA-*h%ng2sw#%_1wmA=a}on~ZSI z8a`n0rddQat||Ah zH~SH6jVIRoSPENL3rSB3WGOf2Ac*c_J4coxo^*ljy#xI+t+r*i(Z(#ZBhJV|&i}Ea zO?ndRk;jhhgca->$g*p|TpbeF*-H74euvrR!a78So7m-|OT;ELW>*g#!;Cg!H_sqS zv~{(TADY5$3!HfFRCZe*Onl5lb|=b>C?$y9Nxw#H%Xd~dd@)Z#et@D}XH)}KU|U$DRBJ`-Ekll@)soLF!Y7q=7<&5^BS+fuDGbMIuXJ&lPC zImmVHPl@spxzVdJv6TZQSFzVSX0Ma1l*EeA^Zm=m}0F#(tszmI&(d$`hxD}3Ui=ETc3 zb;2qLwR&=RixxLd|pdT_t58jUUpBS(BC|! z{c&P%HuIP+TZpRy_>zXP#P@gMOXmEClzEXaUGocNN-oeVnMn&-T*-pf7xbrPph@*ume0zEd3~MS+^=U(Nasc16G6&l4Cf}32#qzRry;fP1 zc_uO)y^iEZwIVT_aDKGwD`Jc9@)NljTIt3-e;4M)Hh`b{?tlnbnV6P8j3)Um! zKDlKXSjMJid0vo>cPlLXV!}jX&d>SvuV0Dvzss-x-bif27k={s2I`k&SzpGc^h924 z!n~KW8p1!@Hq)x-*hsmf>&SZsf&$~}TTKAx$vnG8?dHdN(! zsVDMbuFA=jNz^q%<@|am@iJ3Yt_}WR#rCQ^-0-{YK~}P#%Pi~5y4JN*`ApXnBQI5h z2>kW$DOK|a2&smjs+Q$P5u4$oYUyuJ?8Gxw%N#`cDKVDcWgVExVpq<_++Njbh#xW4 zOjW0I{>0~hRCTTd6}H??6_^79-czg!yrac67N~l)#Rz9rQ1x2$kZ5veRqr$#tiv`{ z?_c;{ZEsbd_x1>36IFc|)k7kVQ4NHtFuqvfLpxP)k|Wl`K^0u|mUzKcRfrvI(z3r? z>C&F6&>XC>`iW}n)&s=4PqEx6=TgSvu9{k{4zU}qs%b;76YCRWF_d@d7xqiF&;f5_ zV^oWt!54kwRZA-jCSLQQYWY8nv+0qQY``BY`R;P6##^=iHJwJoS<6gWsBcm zQ*F##LOip-D!KF*;zef5;_|lYd}re2XIT!E_bFpjs46(7B3?gARdB)=BHU>CUEan# zO?Ar-lH+i$>R$6n#42@HJ@P_SJvmtQs0g_+bAXYW?M+8aR3=dbF6b1@3_IjYZLmx=d$ulhU}&J};dO8(GSRiekZ=1o!k`PXXL z=db$n0twT0=q`cg!4N&y3i3uQ!Jl1%F**zvY+%`4!N%+)RCdsyJ5kw6p0HYQ3XdmN z(oJw4frYFm3NEU3#7tcU*Xbxh!j}j&Zk8uD;;i6S71Oe+ir{{uKGBLyE7_dsLY+b^ zm{U8UUI-komneActWL;0LK782Xh~zCO*SOq5eK0|VG}P7%6PsX{Cz zQRuqQNbKthA#n8*|Fxx8E&H&a6Xxt-UZcGz0yFmBRE!Ws%dGj2EKA zFq@S$!rTq0YwTYN^9?&t**_N+jA>1@J41+do=JS~Y9V%756s^qA$9>CYrzj;5eCjA z65>?H@Yq9zxV=Hd$7cvjCX^8KiV~KtdrNHKd12W+q>@`(gyrLKG{!tC1$bB|dJw)Sqxxx$9w2{3CXA=v|^%-Qq8mXY>ESN;>WY|18H{e!U8)eXtb z&C=7h!O+^mE_bA^9`?enAgsndiASKhg5x!ciHsf2%||-VfI8+etW)?S=v?+49D=j(LM{DKY{1sflo9 zcsC@(sS2a23Rm;q5s!Q*TzgOs`ovzi@eM9&(?+=6a1F|IFX6VIKe6T)h1)1IXevVL~Tx5$yW>!ZXaKQGN-3dST&QlZG3Z~s1k-xUP4h#IM?AU zp=je?SZku?KxGGWxbS3|k@&>H!jr^5kWGJu=lkKZ!(Rw5`ynv=DHL92_CsdM6#gs0 zZDZC8?-G%zvbP97#y}chauiCMBb~2t5`GqV5DSVDezic+88blmJNi6yVhxcGfiIj& z7KKQJh|GOfvIlQO;Z7QSq-h;dT!%ksk1AZ5qHw#XmF!W0C>E?BCIpD;65J@@izv^B zKJ48Q1#&xxWb_z7asK(SQfY?RAA#qthkiOJz&`JWc}OdYX8VmyROIk7^C2hqaI zqWzjb#HxQ1tF_6Xj(ouo(Q!VU>DwC7i8&EpG*hhEe?PKH1JV6FvQyw5D_O}Ku!QJn zYtg*`#V%u3zdk3Ax zc0YR%-FzT+$bhZ&tRr^#96+q2tJwL$JTyG^iUC9L)a%^EK<{ltBa+4LJ!wfaXc4*Uu$omyQSe;W~{#al3#oLEaYapGrWoKoM! zh$_&9_aeo}&aj8WFU9FU=M$^a#nQ~)#@t1mxdO%*e@UG4%M0Rtsu;~|iRT!^=t>`m z-F6nE>%7AIw&H>YGohWoiVHiUwP|t{7mh{XcZ(F`+UBFjrI4>_Ykkjmy;OL#k;3Dv z#W?g>X=Z0Dd6N<`&L37Nw|QfI!M7w??%BJT%bXPBU^IM88--y{#U&4>p`nu|F7-q_ zJZ>j0yAeY4rE5LeHE6OKz1 zSD!=%7@aGwEeRuXzay?Ii(278mbl&z-xpKF^;_(zGOx8tObSQjnRZ*;h~^t>=VT>6 zT*|WE!Nt*Tx43!ub~GX{id$+hc$YKy7#t^VEtf>>eF6R8n;_=J~qAmeqj%hqG@8@E^ZWQsf>0-Y3TB6zUR`LPC3Mc0% zoZec@kB2G9yTw!gb_M1ni>E#vAnx@}Je`M7;yFS*SLF^&x}12v1kZk|vRDuvhDO&{ z@zRA{;@*Yg)qt~9nME`Zuj7WSb*OlK1%B9Rj>15VrE@i(#yf6`4>B_`p6%k(?@7e3 zhl$0w9%bDXpU?6o>TpE-@8(3}oeRYG$!-Wu7sU@gpl?S@RyCUrJ;g7o>uCE762IJN zimH68_^l8dGMgR5AGRLE-tH8C{C5&d{77MHZ7X?$K!qFrDBL#IV&`aMM)$*|9I-N2 z)ZA|#wiJ3OY_q~jzM`s{zl7RT>D4L$(MA5I77M^y32L>v0MRQ`t)BN!7&cXFSKfyd zE~7RCU=Ew?QI~RrqZ}TpE*%;`^ueSqlL_Ty?xHR`8;+8)O>NVN5f3sgS66aP*sIj1~`34eg!dtbQO-JJQN~_&Y zlp>nmLtU#;SJXDg)%Bv`Nk8gX$qGCz<()jtp;y!`h9ZORT&4CqQApfBTVcQ>h238$ z>=&YN&_0F1R}@B7P`9aZk$B56b^A2L6S1bceL+5yOupJ*`w8jdjk?RP15iFL>K+oJ z@r@(uUMI`K1YFg-*V~k8w16q#m#r!)s|!xWC9scI2XZV2|rWzbdE)CeB1w z{iYr)A|C$Ss~+4HtL-#VJ=EPubZ(?NDAY`>$X`8755=@9T|KOC4nF^(9`?}}y}pI& zkUhx8`3KcwgYD623Q$MN10Xbisv}DkVH{N!St6WWTKT`X}}J`_3LW0 z4)@Lap`H~u3sp9$XGQuEOZHXI_RAx>{zX0KY-r;S*(IoxO1(yOUaj76_AarFZPc4e!B$_7QEzQ(kKEo!z5ODrrSll| zj$=_MX8x*E?>fSRhN}16!z|l2Q>S$WowL*jE9@bjXi#UO7eo)&sk4Uffz?e`=N61X zl0B+YpIUnw&86k)GoElE|6l5J#mSH`|EbS=Vz@o>tmNlLsn5@VbUAofedWP0DCYO- z>p$?g<&LOtLF=c04_ z)WwU#$cbv0)Xys8gCdps+4=zD?e3|cCk!QiH&p$yG`w-?ZcBL=2Xk}v*G?fwu`|@) z-(r3$Z&LrTAlGLXt4j>HeZ&}bNh9=b@*~tGE%n4ZaP_bAoalX#`uC%sNJeEeJTL{l zgxMONoPysMYQ*)Jhun0H=3xl23gtBNAb(<^H8k?w>d;(?8l7em!mvqWN(sX}x%|kD*j?lCCx5CsyO$B{1)JuI$#gzA`exo!MOVHhD*;Z4@y#aFn3r(dfgV6fj zt8wUnd|}AdRLu(@_FK|aeTm4c`>b)HKg7ixjZ2Ns#I{b*xP+s=Oqi&t{k$#Flr(TS zdC`({1*1|H@)uv{orsej} z#Otosv=2l1(@C%CjH{5jil$4Th#f&^P1iDAv5j-yvfI_h+*Z>w5k6OgG(9iGqea(H z)4K;W!91g;cPvP!H3NisNV3nY57tcV3}>I3tC=(^3(i+f6IoM5wDp~4s`DfC z5ehU@F>osWu9>laGd9kfXco*jLL9Bu#A>ls9^c2ZyM~K-%@0l7rB!IyoYpL6Uc?*! z*2McGf3zB|S#lU(KhavVbWd~Q729i;9s2@hI6||$c`GQ)shR|HU&QFLnss|yqg`}Q zv%wwdwcJ!q^1qFn@1Ha&GmVImUo=~acA)sLsoD1FFtN^!HQU*4VuOsD?f3Gj3A3-I zNqzo<*!oCK#{4$KE^g7}=>8DRI-tqzB%^9qYfi=?NKId?$#0f~vUs%S)UEvpiu)~# zYuad&H0P>$6C3;8vb&~@d4uLgCoHKtRdcJ-RH#!gE7^l%n!-j%7}pMJ?oK+6K3xyZ zy_)eDWP8oyTv*(`?wY65M?iPJv65fdqIl+>ky(eMkAG;w>-8(%DG zZkC4dT`0*vF}w0}N$sZDq%qTBa zamh!cxr=1C>J}1Lgk)c>C(+u=lCxAoW*(O*ReyaE&HRp%%T&mg%ng#uc6(wKD@v{t zUn1kBOYYgPa5&Wr?cgV(ynG1!O=gN6nYI?5#ocYLFE80OnV3rPTdf0Ga`v zrQR*Ef-ZBV-uL4n@y*iUA7RA4L`xyVZlL4VQ5xQS7LoTbX?Xfu;!{W(IsYQ@(1qYt zXxZ6P*!+Jf=z}y)izdR~ThcfSG%&`~DlGdovK{-=d zTJzcobwHrBVS*p_?8Zu)vSJ}AFG(raXJb!0QQEvQ1RM3Wq;01zLbO$pc0{@pjee{! z?v9mg_f9K$)0t9gwl`6&_0rDAP(RcEO6imRAOa_+Nc+Egz&GznnRk+i4{0qOD}_uj zrk9kp5I5K|O5v?Eg+(`|thh5o!~R&wN<}Lia8}BRt%ovgn{+~jOm3fV*!ozs?-)YGE$MW}Sfcf9tz-ke6^@=|CEwlEB6_$4)lQR6kB&uS>7aCa z>@lLJo29cCZ4m%IN@p)$Cw`&4bbb*6MnVgz;4E%aroB{fzB=}Prb?I2VcY8XD(Tv+ zPpIyiN!MPlfU};KZfqKYJ*IBb&GF%gL^mvpJzUJ63#BKWCt!;(ReG`Q85>~<(%(7L(A)f=Rae4fk9nk3C!8g=Ym8P($%pISNYQG$Afi@w)5;Ss z6P?v*<$qfsy^6H@DNs+N4r+}8mg{f>tuZEm*sx4(ncI*dXSZr?YwbZEAFZwY9iB9C zqt>q9E@JyVw2m1mI4ZG2;jCs_r@@1Wy=$y>d+iS+%+tF4-Ger13$5p|BnYchv$S=~ zBT7DNsPzs`AXf9Cwt+`Y*zvJ;!ExAHuAMff3F3B)n>H>SVQ2Jb zZQLXb(su)R4JGvtZQN=Eg7$y3iw`4FR1DO{$Kte^d!%+rtsFG#M`)LKZHzd-sBXic zgb?kz_84NZO1t6w6MQ*WyYX2S>@w8XCU;(k{=p~h)}hrAA7*NIRK*tk!z69$(XK>q zo@#eR-$6ffk#^U?JP6$P+Pw^Q^Xz)sv;(*)tE)}>kwUC)h^2Zx5A)Jb+LINLvAx~3 zr@A9qzS^ce69EVK)n0qH0Ezd|LG9UxHaH^CNqhdJFH!kK?L{3&5mi=u=~Ni8;i1|~ z&++#LpRMFuytS7f5L!f8+M6x$EcFt#g)nS>v$XcneN-U>blS&ZaH!R#wU5oM$%|F1 zt$os|Jh5tHwNH~TV;Es*ZvSP(Re&(C2RZEN`9zV`y(BXwKY{+QVRZ=d`|l-3~q2PS^N8aCt?mmWLki` ztUoHVziWssh?Z4vu3_iMSK*#Eve2juvAhwodJ){}^m1AH*DgK3QSUI^**s<4`rKwJvdEs*{;h{Y)|CK zc2N-!c%x+dp$NzQ8_V{?zM#zbBs(m^k&&7rGCExW!SOx&HxZb-RoSS?GN`gP3h<=WYGQ3Qs_9+i>lY?{dR zntNb-;kv?tiE{lu2p2WG$v&UapqSc7;q>2fqoMe`#thl_-XCJ`JIKusRfO0Utz@3d zmY|<ZnToMTc|MYt~~c4q*Kl)dC|yzL>nw}d<+8K>aB7@BHVMwQ8_UM3MhMl zyyg-nbW%r4bsrzw)t}_;#~P!lv0P3KJ&yB&i{)L8SBO_`X^HT0aV&l!?{AJEd*+Rt z5qyIv@`#)<6^|J@M?Sa+-jw{wlI7!KK4FrN428hlbXd-uQ3@Nu{pB;O^3lA%C!gB~ z8)!I5VRnRk?f?SQ%vbXH!>A5^f0Zv}lqc%=*-D=OS-x1|8WeD@d?_-6=zJUbay=Nc z=Xv>BwgYj8rSg*jgNUE_E&5v@zT2M!F6`cuCfc3V(va^ph^U(-R_96NO`!>%zz7 zVP8L07r~v-^zNjKOiDuC#dK3Qoxq08c-?fvCv3}A(oJ6jmDXptZia0HwvRUH=G(L+ zo?1({up_)tS^PDfn~YAaeXPZ!q~k3Z^IiZ0IoG5Rg#b#c3pk59DG#htxR zY>1<7agmbF$FwikwclZfD zZ+1|3WFB}tQMVuY8m!B6>`T1+7~RP?bC6WO>+;)fgk5WN zr;3c|iVWACo^%&#(_eRbMJpuRA-dC-F{-|1g>EyVbm#B>A@*F>UAlk^zkRE_I;=Xf zaa-NZY5TCLenNNamWX9de=11lD=NS7MzYs*L%4j=Dgph_dbw{J-d2(pCZ&R`!?u(UPI5QXX=|euOpVz zPT%|oLP?od`WF5(F!~w#Ry|;e^CI-E-k}@oW-QXT9*^KwlBI7qpeOpk_w? zl)eK_1F{+o^c_0xhpT2=vYOhIuA}eX4T)gxV*P+-tuR-TrMRhs*`yC@h!cT>-Sk0e z@x;3ZD-6A(A3g?Nd32_JczjuyxxId5dB~VGdMjD)3;M7{P)D13S;>uS^^tW?pb81m zNB-Lw%e$qY>+o*Ywjz1QEaJrH=|h*h#CPpLrV(U#8Uyy}1n}rEPb; zISTgRYG+Ak=3p+XpZ)F=YPd1_=mdOvc7i^7&kCZbnfmCzsYLyz>F4UJM!po*@a#kyf%!3088M6drt{-&7Wc8P-C-Y3D>7n-%maLy^Rf z_0gv+DTlL(U-UbIu;j~j=yzP{Lll&=SD(5GS+Kr~K7HLNL~Tzi`TkP+Lx)@9+|VNZ zQHBd`?W8~I8;=Vw(jPwt`M%?z{$vPjNSCfZ-3R@P7URKaaIgM!36|yNGyU1veB#;y zi+6Ju^Q2_`<&S~rJU7-~aTrQeVWR%p_vXZ1=j*S(Mphb9tZ;Z~{f&B<&N=7wx2D77 zCwAB0UW;Y$`=!4Z32oQ;wfz^dtKyUGk{zXI@(N!P)f34vH zh4K1t-o+5BpY`8{P9#fV^J?aMnFjGI?DM2x&_*93x}R*&7H%PGa@tC^H`buDLr2lM zmO&qVg;@SIL+N6B;^|inm0H50#^fp-SH)0e@kvO4dIm@Lo6wtNaB@VTKl9k&?DiFH z(; zGDL=V!GN8_i1Zb6q$qu-E+fIFQkcY6~OOAUvmrzu9)=sZ4Ij)oPaDj0p=3FV*^4p z+!+f(CEUp~B-OY-q^**AN@I!H~J|mgPz-r@9>t*{K3r zV2unXs$R#xb2L|Iu4%~KF_)-POT)=CO;Ov9HJsnShghJUrMjPs`RZQ7tv+RNp648h z6xB*=xc#pc`QHn}9h|J=m46!Ue(p|mCf!hESb@Y^#!&R=Efi%r!#&4k#IBAuJZOP< zxbv9d(XpY#o^3XK)*w(WwlS2jndsm>GL-0Vpc@fu_^rZ%Z7yf{Yh9UK@H<(~`N@@R zjlAN0M3+RPaBx3Zpm19w%Nsu%^CqJX^(n7>!dUt|{L5*Ou}ok9v7yh6HqGKuPz*8J zY}`#WzlE`)gpks#sj*6zVK`9dY;>rBP&{n7(Wy4F%;gxPQ+_nzz@^b;?*N=+Zeet} zgcWMJMq&C!E7{?_R`MptjkQi8$(joe89hx0P~Yw}dit2Kh49Ac`A_j57L4`$t`fa- zH+oIR%xphw^p@c#L;e_Bm_3MJo?&eL3bAYaJ!89i7^rTZ(LWI1(_Jz8hi-&>q#L`u zorr=k%StwBt}$>Pf^*gyW4DP2Qfn6)d#8M%U|MIkzF_@Z82cp|AvUfU`==se{OxP( zU+9Z{)B45%4WV&b`zuWKw307RH4cdJK)0iaGLDK_>U#n&uavjmE$ynpi zI=JD@?v{`?4(6)H5&v4j;c3PRc7KTHxfv%t$26r$hnH##9>wXrs3=wWu_) z$487iAHd9pCL0eVBRA(c8V~hCurIaSc;vuI(y`-y#-qu&QJH0y#ce$tcUCZF|87hy zJkFTY9pUWJ3gZc{U)`#)^y1S3u}6RUdIcqbU6wQFj;YsO-XI%#~KwIBZEZhXBV34XH9 z_@)fXktasun^9q?`23CUa`63|vhjUI=yc-*fWRnz6TV`|?uj9Ac5Q^58~sC1%Ceg9eb^J3G0O^EFZj60rjS1<@}v^e@Uv*CIm)JyV__dB zO`(HfD%zQ*F*Zral{ZaebGl(MBvaV2QAACTTglRxDSS?OY%`58g(rT3K<;RYm;o*Akk^t?AcD?}{RYfUdNHYeu4$+Fwurcz7On`9@nA`e)}&(<@&ISLf4{!ueGYzIqq<1$U+{K`agve9;E;P diff --git a/toonz/sources/include/toonz/txsheet.h b/toonz/sources/include/toonz/txsheet.h index 1427371e..b7ee655e 100644 --- a/toonz/sources/include/toonz/txsheet.h +++ b/toonz/sources/include/toonz/txsheet.h @@ -418,7 +418,9 @@ frame duplication. void timeStretch(int r0, int c0, int r1, int c1, int nr); // force cells order in n-steps. returns the row amount after process - int reframeCells(int r0, int r1, int col, int type); + // if withBlank is greater than -1, remove empty cell from its order and + // insert blank frames with type*withBlank length at each n-step. + int reframeCells(int r0, int r1, int col, int type, int withBlank = -1); /*! Exposes level \b \e xl in xsheet starting from cell identified by \b \e row and \b \e col. diff --git a/toonz/sources/toonz/CMakeLists.txt b/toonz/sources/toonz/CMakeLists.txt index 315bf712..5de78c02 100644 --- a/toonz/sources/toonz/CMakeLists.txt +++ b/toonz/sources/toonz/CMakeLists.txt @@ -151,6 +151,7 @@ set(MOC_HEADERS locatorpopup.h styleshortcutswitchablepanel.h cameracapturelevelcontrol.h + reframepopup.h autoinputcellnumberpopup.h # Tracker file dummyprocessor.h @@ -318,6 +319,7 @@ set(SOURCES locatorpopup.cpp styleshortcutswitchablepanel.cpp cameracapturelevelcontrol.cpp + reframepopup.cpp autoinputcellnumberpopup.cpp # Tracker file dummyprocessor.cpp diff --git a/toonz/sources/toonz/cellselection.cpp b/toonz/sources/toonz/cellselection.cpp index 7d0b6451..74ca928e 100644 --- a/toonz/sources/toonz/cellselection.cpp +++ b/toonz/sources/toonz/cellselection.cpp @@ -1154,7 +1154,7 @@ int TCellSelection::Range::getColCount() const { return m_c1 - m_c0 + 1; } // TCellSelection //----------------------------------------------------------------------------- -TCellSelection::TCellSelection() : m_timeStretchPopup(0) {} +TCellSelection::TCellSelection() : m_timeStretchPopup(0), m_reframePopup(0) {} //----------------------------------------------------------------------------- @@ -1204,21 +1204,47 @@ void TCellSelection::enableCommands() { enableCommand(this, MI_Reframe2, &TCellSelection::reframe2Cells); enableCommand(this, MI_Reframe3, &TCellSelection::reframe3Cells); enableCommand(this, MI_Reframe4, &TCellSelection::reframe4Cells); + enableCommand(this, MI_ReframeWithEmptyInbetweens, + &TCellSelection::reframeWithEmptyInbetweens); } //----------------------------------------------------------------------------- // Used in RenameCellField::eventFilter() bool TCellSelection::isEnabledCommand( std::string commandId) { // static function - static QList commands = { - MI_Autorenumber, MI_Reverse, MI_Swing, MI_Random, - MI_Increment, MI_ResetStep, MI_IncreaseStep, MI_DecreaseStep, - MI_Step2, MI_Step3, MI_Step4, MI_Each2, - MI_Each3, MI_Each4, MI_Rollup, MI_Rolldown, - MI_TimeStretch, MI_CloneLevel, MI_SetKeyframes, MI_Copy, - MI_Paste, MI_PasteInto, MI_Cut, MI_Clear, - MI_Insert, MI_PasteInto, MI_Reframe1, MI_Reframe2, - MI_Reframe3, MI_Reframe4, MI_Undo, MI_Redo}; + static QList commands = {MI_Autorenumber, + MI_Reverse, + MI_Swing, + MI_Random, + MI_Increment, + MI_ResetStep, + MI_IncreaseStep, + MI_DecreaseStep, + MI_Step2, + MI_Step3, + MI_Step4, + MI_Each2, + MI_Each3, + MI_Each4, + MI_Rollup, + MI_Rolldown, + MI_TimeStretch, + MI_CloneLevel, + MI_SetKeyframes, + MI_Copy, + MI_Paste, + MI_PasteInto, + MI_Cut, + MI_Clear, + MI_Insert, + MI_PasteInto, + MI_Reframe1, + MI_Reframe2, + MI_Reframe3, + MI_Reframe4, + MI_ReframeWithEmptyInbetweens, + MI_Undo, + MI_Redo}; return commands.contains(commandId); } diff --git a/toonz/sources/toonz/cellselection.h b/toonz/sources/toonz/cellselection.h index a2df65f4..10bffb10 100644 --- a/toonz/sources/toonz/cellselection.h +++ b/toonz/sources/toonz/cellselection.h @@ -8,6 +8,7 @@ #include class TimeStretchPopup; +class ReframePopup; class TXshCell; //============================================================================= @@ -16,6 +17,7 @@ class TXshCell; class TCellSelection final : public TSelection { TimeStretchPopup *m_timeStretchPopup; + ReframePopup *m_reframePopup; public: class Range { @@ -99,6 +101,8 @@ public: void reframe3Cells() { reframeCells(3); } void reframe4Cells() { reframeCells(4); } + void reframeWithEmptyInbetweens(); + void renameCells(TXshCell &cell); // rename cells for each columns with correspondent item in the list void renameMultiCells(QList &cells); diff --git a/toonz/sources/toonz/cellselectioncommand.cpp b/toonz/sources/toonz/cellselectioncommand.cpp index fa3c108e..e91fa6c5 100644 --- a/toonz/sources/toonz/cellselectioncommand.cpp +++ b/toonz/sources/toonz/cellselectioncommand.cpp @@ -8,6 +8,7 @@ #include "overwritepopup.h" #include "selectionutils.h" #include "columnselection.h" +#include "reframepopup.h" // TnzQt includes #include "toonzqt/tselectionhandle.h" @@ -553,6 +554,7 @@ class ReframeUndo final : public TUndo { int m_r0, m_r1; int m_type; int m_nr; + int m_withBlank; std::unique_ptr m_cells; public: @@ -560,7 +562,8 @@ public: std::vector m_columnIndeces; - ReframeUndo(int r0, int r1, std::vector columnIndeces, int type); + ReframeUndo(int r0, int r1, std::vector columnIndeces, int type, + int withBlank = -1); ~ReframeUndo(); void undo() const override; void redo() const override; @@ -569,7 +572,12 @@ public: int getSize() const override { return sizeof(*this); } QString getHistoryString() override { - return QObject::tr("Reframe to %1's").arg(QString::number(m_type)); + if (m_withBlank == -1) + return QObject::tr("Reframe to %1's").arg(QString::number(m_type)); + else + return QObject::tr("Reframe to %1's with %2 blanks") + .arg(QString::number(m_type)) + .arg(QString::number(m_withBlank)); } int getHistoryType() override { return HistoryType::Xsheet; } }; @@ -577,12 +585,13 @@ public: //----------------------------------------------------------------------------- ReframeUndo::ReframeUndo(int r0, int r1, std::vector columnIndeces, - int type) + int type, int withBlank) : m_r0(r0) , m_r1(r1) , m_type(type) , m_nr(0) - , m_columnIndeces(columnIndeces) { + , m_columnIndeces(columnIndeces) + , m_withBlank(withBlank) { m_nr = m_r1 - m_r0 + 1; assert(m_nr > 0); m_cells.reset(new TXshCell[m_nr * (int)m_columnIndeces.size()]); @@ -641,7 +650,7 @@ void ReframeUndo::redo() const { for (int c = 0; c < m_columnIndeces.size(); c++) app->getCurrentXsheet()->getXsheet()->reframeCells( - m_r0, m_r1, m_columnIndeces[c], m_type); + m_r0, m_r1, m_columnIndeces[c], m_type, m_withBlank); app->getCurrentXsheet()->notifyXsheetChanged(); } @@ -699,6 +708,86 @@ void TColumnSelection::reframeCells(int count) { TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); } +//============================================================================= + +void TCellSelection::reframeWithEmptyInbetweens() { + if (isEmpty() || areAllColSelectedLocked()) return; + + std::vector colIndeces; + for (int c = m_range.m_c0; c <= m_range.m_c1; c++) colIndeces.push_back(c); + + // destruction of m_reframePopup will be done along with the main window + if (!m_reframePopup) m_reframePopup = new ReframePopup(); + int ret = m_reframePopup->exec(); + if (ret == QDialog::Rejected) return; + + int step, blank; + m_reframePopup->getValues(step, blank); + + ReframeUndo *undo = + new ReframeUndo(m_range.m_r0, m_range.m_r1, colIndeces, step, blank); + + int maximumRow = 0; + for (int c = m_range.m_c0; c <= m_range.m_c1; c++) { + int nrows = TApp::instance()->getCurrentXsheet()->getXsheet()->reframeCells( + m_range.m_r0, m_range.m_r1, c, step, blank); + undo->m_newRows.push_back(nrows); + if (maximumRow < nrows) maximumRow = nrows; + } + + if (maximumRow == 0) { + delete undo; + return; + } + + TUndoManager::manager()->add(undo); + + // select reframed range + selectCells(m_range.m_r0, m_range.m_c0, m_range.m_r0 + maximumRow - 1, + m_range.m_c1); + + TApp::instance()->getCurrentScene()->setDirtyFlag(true); + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); +} + +void TColumnSelection::reframeWithEmptyInbetweens() { + if (isEmpty()) return; + + int rowCount = + TApp::instance()->getCurrentXsheet()->getXsheet()->getFrameCount(); + std::vector colIndeces; + std::set::const_iterator it; + for (it = m_indices.begin(); it != m_indices.end(); it++) + colIndeces.push_back(*it); + + if (!m_reframePopup) m_reframePopup = new ReframePopup(); + int ret = m_reframePopup->exec(); + if (ret == QDialog::Rejected) return; + + int step, blank; + m_reframePopup->getValues(step, blank); + + ReframeUndo *undo = new ReframeUndo(0, rowCount - 1, colIndeces, step, blank); + + bool commandExecuted = false; + for (int c = 0; c < (int)colIndeces.size(); c++) { + int nrows = TApp::instance()->getCurrentXsheet()->getXsheet()->reframeCells( + 0, rowCount - 1, colIndeces[c], step, blank); + undo->m_newRows.push_back(nrows); + if (nrows > 0) commandExecuted = true; + } + + if (!commandExecuted) { + delete undo; + return; + } + + TUndoManager::manager()->add(undo); + + TApp::instance()->getCurrentScene()->setDirtyFlag(true); + TApp::instance()->getCurrentXsheet()->notifyXsheetChanged(); +} + //********************************************************************************* // Reset Step Cells command //********************************************************************************* diff --git a/toonz/sources/toonz/columnselection.cpp b/toonz/sources/toonz/columnselection.cpp index ad905e05..cf1394af 100644 --- a/toonz/sources/toonz/columnselection.cpp +++ b/toonz/sources/toonz/columnselection.cpp @@ -26,7 +26,7 @@ // TColumnSelection //----------------------------------------------------------------------------- -TColumnSelection::TColumnSelection() {} +TColumnSelection::TColumnSelection() : m_reframePopup(0) {} //----------------------------------------------------------------------------- @@ -50,6 +50,8 @@ void TColumnSelection::enableCommands() { enableCommand(this, MI_Reframe2, &TColumnSelection::reframe2Cells); enableCommand(this, MI_Reframe3, &TColumnSelection::reframe3Cells); enableCommand(this, MI_Reframe4, &TColumnSelection::reframe4Cells); + enableCommand(this, MI_ReframeWithEmptyInbetweens, + &TColumnSelection::reframeWithEmptyInbetweens); } //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonz/columnselection.h b/toonz/sources/toonz/columnselection.h index ab4aa71b..4f32bd22 100644 --- a/toonz/sources/toonz/columnselection.h +++ b/toonz/sources/toonz/columnselection.h @@ -7,12 +7,15 @@ #include "tgeometry.h" #include +class ReframePopup; + //============================================================================= // TColumnSelection //----------------------------------------------------------------------------- class TColumnSelection final : public TSelection { std::set m_indices; + ReframePopup *m_reframePopup; public: TColumnSelection(); @@ -46,6 +49,8 @@ public: void reframe2Cells() { reframeCells(2); } void reframe3Cells() { reframeCells(3); } void reframe4Cells() { reframeCells(4); } + + void reframeWithEmptyInbetweens(); }; #endif // TCELLSELECTION_H diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index c61f1c0d..95f3be55 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -1855,6 +1855,8 @@ void MainWindow::defineActions() { createMenuCellsAction(MI_Reframe4, tr("4's"), ""); + createMenuCellsAction(MI_ReframeWithEmptyInbetweens, + tr("Reframe with Empty Inbetweens..."), ""); createMenuCellsAction(MI_AutoInputCellNumber, tr("Auto Input Cell Number..."), ""); diff --git a/toonz/sources/toonz/menubarcommandids.h b/toonz/sources/toonz/menubarcommandids.h index 6b02bce2..45c6edca 100644 --- a/toonz/sources/toonz/menubarcommandids.h +++ b/toonz/sources/toonz/menubarcommandids.h @@ -305,6 +305,7 @@ #define MI_Reframe2 "MI_Reframe2" #define MI_Reframe3 "MI_Reframe3" #define MI_Reframe4 "MI_Reframe4" +#define MI_ReframeWithEmptyInbetweens "MI_ReframeWithEmptyInbetweens" #define MI_FillAreas "MI_FillAreas" #define MI_FillLines "MI_FillLines" diff --git a/toonz/sources/toonz/reframepopup.cpp b/toonz/sources/toonz/reframepopup.cpp new file mode 100644 index 00000000..7c23ef78 --- /dev/null +++ b/toonz/sources/toonz/reframepopup.cpp @@ -0,0 +1,83 @@ +#include "reframepopup.h" + +// Tnz includes +#include "tapp.h" +#include "menubarcommandids.h" +// TnzQt includes +#include "toonzqt/intfield.h" +#include "toonzqt/dvdialog.h" +#include "toonzqt/menubarcommand.h" + +#include +#include +#include +#include + +#include +//----------------------------------------------------------------------------- + +ReframePopup::ReframePopup() + : Dialog(TApp::instance()->getMainWindow(), true, true, "ReframePopup") { + setWindowTitle(tr("Reframe with Empty Inbetweens")); + m_step = new DVGui::IntLineEdit(this, 1, 1); + m_blank = new DVGui::IntLineEdit(this, 0, 0); + + m_blankCellCountLbl = new QLabel("0", this); + + QPushButton* okBtn = new QPushButton(tr("OK"), this); + QPushButton* cancelBtn = new QPushButton(tr("Cancel"), this); + + m_step->setObjectName("LargeSizedText"); + m_blank->setObjectName("LargeSizedText"); + // layout + QHBoxLayout* mainLay = new QHBoxLayout(); + mainLay->setMargin(0); + mainLay->setSpacing(5); + { + mainLay->addWidget(m_step); + mainLay->addWidget(new QLabel(tr("steps"), this)); + mainLay->addSpacing(10); + mainLay->addWidget(new QLabel(tr("with"), this)); + mainLay->addWidget(m_blank); + mainLay->addWidget(new QLabel(tr("empty inbetweens"), this)); + } + m_topLayout->addLayout(mainLay); + + QHBoxLayout* textLay = new QHBoxLayout(); + textLay->setMargin(0); + { + textLay->addStretch(1); + textLay->addWidget(new QLabel(tr("("), this)); + textLay->addWidget(m_blankCellCountLbl); + textLay->addWidget(new QLabel(tr(" blank cells will be inserted.)"), this)); + } + m_topLayout->addLayout(textLay); + + // buttons + m_buttonLayout->addWidget(okBtn); + m_buttonLayout->addWidget(cancelBtn); + + // signal-slot connections + bool ret = true; + ret = ret && connect(m_step, SIGNAL(editingFinished()), this, + SLOT(updateBlankCellCount())); + ret = ret && connect(m_blank, SIGNAL(editingFinished()), this, + SLOT(updateBlankCellCount())); + ret = ret && connect(okBtn, SIGNAL(clicked()), this, SLOT(accept())); + ret = ret && connect(cancelBtn, SIGNAL(clicked()), this, SLOT(reject())); + assert(ret); +} + +//----------------------------------------------------------------------------- + +void ReframePopup::updateBlankCellCount() { + int blankCellCount = m_step->getValue() * m_blank->getValue(); + m_blankCellCountLbl->setText(QString::number(blankCellCount)); +} + +//----------------------------------------------------------------------------- + +void ReframePopup::getValues(int& step, int& blank) { + step = m_step->getValue(); + blank = m_blank->getValue(); +} diff --git a/toonz/sources/toonz/reframepopup.h b/toonz/sources/toonz/reframepopup.h new file mode 100644 index 00000000..e02c1bc1 --- /dev/null +++ b/toonz/sources/toonz/reframepopup.h @@ -0,0 +1,39 @@ +#pragma once + +#ifndef REFRAMEPOPUP_H +#define REFRAMEPOPUP_H + +#include "toonzqt/dvdialog.h" + +#include + +class QLabel; + +namespace DVGui { +class IntLineEdit; +} + +//============================================================================= +// ReframePopup +// - Enables reframe cells with specified blank frames. +// - The amount of blank frames is specified by the quotient, divided by the +// reframe step, ( e.g. "3 steps - 2 blanks" will insert 6 blank cells.) +// considering that it is common usage in Japanese animation industry. +// - Can be used both to the cell and the column selections. +//----------------------------------------------------------------------------- + +class ReframePopup final : public DVGui::Dialog { + Q_OBJECT + + DVGui::IntLineEdit *m_step, *m_blank; + QLabel* m_blankCellCountLbl; + +public: + ReframePopup(); + void getValues(int& step, int& blank); + +public slots: + void updateBlankCellCount(); +}; + +#endif // REFRAMEPOPUP_H \ No newline at end of file diff --git a/toonz/sources/toonz/xshcellviewer.cpp b/toonz/sources/toonz/xshcellviewer.cpp index b50f5f01..f2a60f7d 100644 --- a/toonz/sources/toonz/xshcellviewer.cpp +++ b/toonz/sources/toonz/xshcellviewer.cpp @@ -1430,7 +1430,7 @@ void CellArea::drawLevelCell(QPainter &p, int row, int col, bool isReference) { #ifdef _WIN32 fontName = "Arial"; #else - fontName = "Helvetica"; + fontName = "Helvetica"; #endif } static QFont font(fontName, -1, QFont::Normal); @@ -2590,6 +2590,8 @@ void CellArea::createCellMenu(QMenu &menu, bool isCellSelected) { reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe2)); reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe3)); reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe4)); + reframeSubMenu->addAction( + cmdManager->getAction(MI_ReframeWithEmptyInbetweens)); } menu.addMenu(reframeSubMenu); diff --git a/toonz/sources/toonz/xshcolumnviewer.cpp b/toonz/sources/toonz/xshcolumnviewer.cpp index acf9d465..7c81e992 100644 --- a/toonz/sources/toonz/xshcolumnviewer.cpp +++ b/toonz/sources/toonz/xshcolumnviewer.cpp @@ -2052,6 +2052,8 @@ void ColumnArea::contextMenuEvent(QContextMenuEvent *event) { reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe2)); reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe3)); reframeSubMenu->addAction(cmdManager->getAction(MI_Reframe4)); + reframeSubMenu->addAction( + cmdManager->getAction(MI_ReframeWithEmptyInbetweens)); } menu.addMenu(reframeSubMenu); menu.addAction(cmdManager->getAction(MI_AutoInputCellNumber)); diff --git a/toonz/sources/toonzlib/txsheet.cpp b/toonz/sources/toonzlib/txsheet.cpp index 54ff5b29..849cea37 100644 --- a/toonz/sources/toonzlib/txsheet.cpp +++ b/toonz/sources/toonzlib/txsheet.cpp @@ -849,7 +849,7 @@ void TXsheet::eachCells(int r0, int c0, int r1, int c1, int type) { //----------------------------------------------------------------------------- /*! force cells order in n-steps. returns the row amount after process */ -int TXsheet::reframeCells(int r0, int r1, int col, int type) { +int TXsheet::reframeCells(int r0, int r1, int col, int type, int withBlank) { // Row amount in the selection int nr = r1 - r0 + 1; @@ -864,11 +864,26 @@ int TXsheet::reframeCells(int r0, int r1, int col, int type) { cells.push_back(getCell(CellPosition(r, col))); } + // if withBlank is greater than -1, remove empty cells from cell order + if (withBlank >= 0) { + auto itr = cells.begin(); + while (itr != cells.end()) { + if ((*itr).isEmpty()) + itr = cells.erase(itr); + else + itr++; + } + } + if (cells.empty()) return 0; // row amount after n-step int nrows = cells.size() * type; + if (withBlank > 0) { + nrows += cells.size() * withBlank * type; + } + // if needed, insert cells if (nr < nrows) { insertCells(r1 + 1, col, nrows - nr); @@ -886,6 +901,13 @@ int TXsheet::reframeCells(int r0, int r1, int col, int type) { setCell(i + i1, col, cells[k]); } i += type; // dipende dal tipo di step (2 o 3 per ora) + + if (withBlank > 0) { + for (int i1 = 0; i1 < withBlank * type; i1++) { + clearCells(i + i1, col); + } + i += withBlank * type; + } } return nrows; // return row amount after process diff --git a/toonz/sources/translations/japanese/toonz.ts b/toonz/sources/translations/japanese/toonz.ts index 33aeea5a..2110cd19 100644 --- a/toonz/sources/translations/japanese/toonz.ts +++ b/toonz/sources/translations/japanese/toonz.ts @@ -4722,6 +4722,10 @@ Do you want to create it? &Command Bar コマンドバー (&C) + + Reframe with Empty Inbetweens... + 空コマを入れてリフレーム... + MatchlinesDialog @@ -8342,6 +8346,45 @@ Are you sure? Command Bar コマンドバー + + Reframe to %1's with %2 blanks + リフレーム: %1 コマ 中 %2 + + + + ReframePopup + + OK + OK + + + Cancel + キャンセル + + + steps + コマ + + + with + + + + ( + ( + + + blank cells will be inserted.) + コマの空コマが挿入されます。) + + + Reframe with Empty Inbetweens + 空コマを入れてリフレーム + + + empty inbetweens + + RenameAsToonzPopup