From 570e6936b655aef2877d2d63c9892f1df05df312 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sat, 10 Sep 2016 10:00:51 +1000 Subject: [PATCH 1/4] Add a bunch of tests for legend grouping into columns --- tests/src/core/testqgslegendrenderer.cpp | 62 ++++++++++++++++++ .../expected_legend_2_by_2.png | Bin 0 -> 4515 bytes .../expected_legend_3_by_2.png | Bin 0 -> 5364 bytes .../expected_legend_3_by_3.png | Bin 0 -> 5800 bytes .../expected_legend_4_by_2.png | Bin 0 -> 5472 bytes .../expected_legend_4_by_3.png | Bin 0 -> 6529 bytes .../expected_legend_5_by_2.png | Bin 0 -> 6661 bytes .../expected_legend_5_by_3.png | Bin 0 -> 6870 bytes .../expected_legend_6_by_3.png | Bin 0 -> 7470 bytes .../expected_legend_7_by_3.png | Bin 0 -> 8244 bytes 10 files changed, 62 insertions(+) create mode 100644 tests/testdata/control_images/legend/expected_legend_2_by_2/expected_legend_2_by_2.png create mode 100644 tests/testdata/control_images/legend/expected_legend_3_by_2/expected_legend_3_by_2.png create mode 100644 tests/testdata/control_images/legend/expected_legend_3_by_3/expected_legend_3_by_3.png create mode 100644 tests/testdata/control_images/legend/expected_legend_4_by_2/expected_legend_4_by_2.png create mode 100644 tests/testdata/control_images/legend/expected_legend_4_by_3/expected_legend_4_by_3.png create mode 100644 tests/testdata/control_images/legend/expected_legend_5_by_2/expected_legend_5_by_2.png create mode 100644 tests/testdata/control_images/legend/expected_legend_5_by_3/expected_legend_5_by_3.png create mode 100644 tests/testdata/control_images/legend/expected_legend_6_by_3/expected_legend_6_by_3.png create mode 100644 tests/testdata/control_images/legend/expected_legend_7_by_3/expected_legend_7_by_3.png diff --git a/tests/src/core/testqgslegendrenderer.cpp b/tests/src/core/testqgslegendrenderer.cpp index d968fdef17f..78457e67a15 100644 --- a/tests/src/core/testqgslegendrenderer.cpp +++ b/tests/src/core/testqgslegendrenderer.cpp @@ -118,6 +118,8 @@ class TestQgsLegendRenderer : public QObject void testThreeColumns(); void testFilterByMap(); void testFilterByMapSameSymbol(); + void testColumns_data(); + void testColumns(); void testRasterBorder(); void testFilterByPolygon(); void testFilterByExpression(); @@ -131,6 +133,7 @@ class TestQgsLegendRenderer : public QObject QgsVectorLayer* mVL3; // point QgsRasterLayer* mRL; QString mReport; + bool _testLegendColumns( int itemCount, int columnCount, const QString& testName ); }; @@ -459,6 +462,65 @@ void TestQgsLegendRenderer::testFilterByMapSameSymbol() QgsMapLayerRegistry::instance()->removeMapLayer( vl4 ); } +bool TestQgsLegendRenderer::_testLegendColumns( int itemCount, int columnCount, const QString& testName ) +{ + QgsFillSymbol* sym = new QgsFillSymbol(); + sym->setColor( Qt::cyan ); + + QgsLayerTreeGroup* root = new QgsLayerTreeGroup(); + + QList< QgsVectorLayer* > layers; + for ( int i = 1; i <= itemCount; ++i ) + { + QgsVectorLayer* vl = new QgsVectorLayer( "Polygon", QString( "Layer %1" ).arg( i ), "memory" ); + QgsMapLayerRegistry::instance()->addMapLayer( vl ); + vl->setRenderer( new QgsSingleSymbolRenderer( sym->clone() ) ); + root->addLayer( vl ); + layers << vl; + } + delete sym; + + QgsLayerTreeModel legendModel( root ); + QgsLegendSettings settings; + settings.setColumnCount( columnCount ); + _setStandardTestFont( settings, "Bold" ); + _renderLegend( testName, &legendModel, settings ); + bool result = _verifyImage( testName, mReport ); + + Q_FOREACH ( QgsVectorLayer* l, layers ) + { + QgsMapLayerRegistry::instance()->removeMapLayer( l ); + } + return result; +} + +void TestQgsLegendRenderer::testColumns_data() +{ + QTest::addColumn( "testName" ); + QTest::addColumn( "items" ); + QTest::addColumn( "columns" ); + + QTest::newRow( "2 items, 2 columns" ) << "legend_2_by_2" << 2 << 2; + QTest::newRow( "3 items, 2 columns" ) << "legend_3_by_2" << 3 << 2; + QTest::newRow( "4 items, 2 columns" ) << "legend_4_by_2" << 4 << 2; + QTest::newRow( "5 items, 2 columns" ) << "legend_5_by_2" << 5 << 2; + QTest::newRow( "3 items, 3 columns" ) << "legend_3_by_3" << 3 << 3; + QTest::newRow( "4 items, 3 columns" ) << "legend_4_by_3" << 4 << 3; + QTest::newRow( "5 items, 3 columns" ) << "legend_5_by_3" << 5 << 3; + QTest::newRow( "6 items, 3 columns" ) << "legend_6_by_3" << 6 << 3; + QTest::newRow( "7 items, 3 columns" ) << "legend_7_by_3" << 7 << 3; +} + +void TestQgsLegendRenderer::testColumns() +{ + //test rendering legend with different combinations of columns and items + + QFETCH( QString, testName ); + QFETCH( int, items ); + QFETCH( int, columns ); + QVERIFY( _testLegendColumns( items, columns, testName ) ); +} + void TestQgsLegendRenderer::testRasterBorder() { QString testName = "legend_raster_border"; diff --git a/tests/testdata/control_images/legend/expected_legend_2_by_2/expected_legend_2_by_2.png b/tests/testdata/control_images/legend/expected_legend_2_by_2/expected_legend_2_by_2.png new file mode 100644 index 0000000000000000000000000000000000000000..33fce227f591f9564ae292d5e80a25e4f7abf40d GIT binary patch literal 4515 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

MIzabI>~a`LlF5znx@+aCVjbBR>E-Q8Ub_BBm) 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 Sw+B|wkj!gE$wG+_-v0+r1uwn; literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/legend/expected_legend_4_by_2/expected_legend_4_by_2.png b/tests/testdata/control_images/legend/expected_legend_4_by_2/expected_legend_4_by_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a3e7fb3617c53f4cfacc53a8ccc286519349e915 GIT binary patch literal 5472 zcmb7|WmJ^iyT%_H=@N$S5Ky|2PGdkRr9Lx_llJgQ%kuJP!8+$?qOU2MH z2U8_**&{Lbs|5e&SCfb*bBMX^>4q1#-pP9T_|U2q;FoXq?^aJpzbYt5`{FY2GeAQF z(o5qi!y;K3Q<$%}Da?jzV;?_$?CbB3bxMPs>U|WOnQ02+Wk_~amXdm@#1%V4G9I3Y z9wh4BgHhdld(e^j>J@WIY3afoI#xtXOxxdI=JaTbQe9oW@pvW-rs(_jmP+M=)VMfe z4wWD(zj_WXF0Q0!&tl%ZVRv+La#P~w=I+hEY1P$SUCrd?=B5~ND(mjy;o$6?z^k3W zBQ8$m;NUQ~7o5AVkL1vFb{4ve`To5XhhyV=Nsd8s#@-QXPon3q@SKpY!EQE%9rFna zl8k+}ON@;rdVeQ7MmL4|X75<1WKa@w_%51^7{Ut(3AsDzJ$v>nsi8pyQ@enfn#w&t zSxCDT)X~vVV%HLRYl(!AV4@DezcSvNEt9#a{%4V~ZRKF3c4KG9=)0p7#<@L#I#-%q z-jj!hhDP)(e1FmKoji+#?Wd~ic6N6A{VF@Y$jr=4x8HcFRF*s?TQ9Hch@hb5@tYUt z2Lh_9xr$0kLry|MLIT3ViMXyMKk4ujUu0f#@)ZOE!5gk-*HyUvr19h=7#>-m7V)Fn z4Ql{uv=VG@&*SFdQ5MhmuezRJzP_b_FEXSx+zFK5JN5n4^me29=`3Rm_>E zG?U03`J>X%(6BJXu`;Xf+qa*MFZuOo{ZLRz}ZbHzMTI53$zq%z_&b2Or5D3lSV8xuAoWbE?;zHx3iVDe` zsQES$Q&Ur*D^BI_sFg1RYVA)6h#<&F?T>&O{?Mex%lYx+!utB`_r*m;_KuEPlM!cI zUzLu7IM0IB{a5-sQdwnq=*T5Q4_)u%$R;n-YZ=?vP(vqYJ1q!s=^O>e@8seStB9f2 zg*`fU_MZF+secB$em%3kf%&~L=62fooV}v5a>&*H_qv(t?_m=T6=?V9Xf$ivz|ioD zaFg%6mbi7DvD2G%n0lnD@Yd?;55t~E($HIV*!n4EVQ+3}DSm(7uf|J?OFh7^^%B}BNC1zwW3geev+c{3vA>4bc zEG<9uHC!NKl}``X+6^tt%|$co5eo_Cfl^%D0Y@AIv$NbS7k^crhGC_Ig@sk|huB+7 zkEB_V97zSEdjZh2O!pSWzF9+3gCLs2VP5K0Hzj}&U zK%INys;@v50c-ayn`>&Wf)0>Q&&as<;6W0w8ppA6o21m#@2$~9^eim;JLR|NfP1vuCPmI;bS|F7R>Q-?|4) ziFH}%d_H{R#tpa_yM%-UJWM~0OOTnFS+qw_R~PZ~i*w(vadUHX1{M~UGTii6AMP5k z(QQM;`bxh$J3IaM2l7<(557BA;^aYre=d+7DMlA!n{qx{eC}+HIGfwp__&|n1$>E@ zm-j)fC+mOp3NKK5K4u$6U0YjQQC%IEmPRWrEnQ)cCWKGeHiaU7g4HNS{Z%b0E_U$n z_*iA9oj|2|=MGgqF#a3JU9O{}qaS^J@hvUtDmoton4@9&4H220+#bBF8S{E`xZ(_AV@-h1lbAoWL9R_xDGQV<)X*F~5p z#wRAweSOqHK|wZbDMH;nJ!`goU_UEaY*|G^9wCo;9yvSzI@w!DN=jB>dzOhJ2)K{P5^`tLfWJW*RrLoF5tFD(z!KSs+a@`4A?V|AUP8eiiRTV>EV4$R& zTs-Lc#>U3Em6hYx;{+-_qautlSFA&Cg`fhdHmxMaN%9c#SN(r}bq!Z3EG#6Dlao{4 ziEC_B%@=wgrvTQWyg*tN-8 z2ZS{TaUMC@lT7(+D)o!wmMld?5qwfANY-{w^oFgDzuDEdPMYSZrkj?QmRSpd(M7); zr=BMhDF1L=B}D6UgKqst$(Cj9r9|6@A|MSQFj6QhI~$>;%}z8jG9n@(qT%4c3w#%v z!d}Uf_sYo+JMvA^;S;m4Giq~p3Jz{ z$?oG?`lZ+~ruSz*@+~U)DP3M<@8+g~iAjc@k}S&f*3#amPoKCn4EiK1YHG~VNmEl( zhjEdHp5mHXG5rIXJo2yfw138Z{w%?%uc;Y5x*$mm3}E<{UP64ln;Dta$R@9%va(}a z+?6aP|M$%eZL7oz3JRYdR1&VOt^MfkZrfk#L4_{?#m5vC6~Q+ovrzAAtE;Q$7Shx^ zGsP@?50>wOym;{NA-cVth?3<-iS*9Fa$oEN@lN1&(LOEsS2zWEdB>y837)uC42De1 z{1XJ3nwjxlyLKfcB!n)dV|DVYgwWlbxOcZ-x8ZO(xD*|}#g!EzsQK@yhv!Tq>)G*6 zVnahiXNCRNP#lt59SH&pHQDky|5i|te67zcvZ_iN2nHzNaA%eqjYdDHdUWMeS=r0H zyytyy6o?>Z3ER}xRt@)p^z<0~*)b8sz`!6GylW3>goY}Yu|TS-s&tHuu`IU1(Ks&U z0CKBZPXb6sUw;8t<6!`Y>)F_F0<5ric79(qU>CkeBFxFa5W^@8p92MgG?vcgiq`yG zlT7+LJN4j@AtNIrJalKKDUMF-)paYqG!|y&`)6B|U$F~-g20ayl$3_x@3lQ-U}$jg z3za9^#%H^`zByxvZ%Ydc#fb1N@bv2DCVfcJCBo>ZGG6R5&Q$kAm`cjak)kO^`KsAY z7l&9QM(EM*99p(*XLI6<(n{k^K8b>X6=H+ws>dna{v=Oj6%?K*cLsr*xgE|%6Ol2X zOmV2^LwDr>1N~Z9xMyiek$oot5FT**HefPwbf+FySy>H9GJvt8BJ}h~pN3J4Y*DiB zG#=1^?zMMwOP-pt2AtqI+sq01uKg7JWZPu<*secMC6QMBoDNXS9s0Y}k&%&#!Mi*F zrxyK`yl0!AuVG7xAPNeK7a18uWMpKgc)*}TZ{M!;=M`I2gA9nlEI1r*PoK;uazoJk z{Cu7N3XQwFJMi5Uz#Tfey7L85fA6hhvSnO$m*4nYVxX8s`DQ@$BIr!tfPlEn%&Uz} zP512V(%!!1SzKB|Pfayq5$w~Z*xp{MOY%j>l2tlkXh4@%*VLf9yD6lzsa{LikwSo- ze$|ZGY6JKL@k#K~fH+=DlmBNzVq*KxpA3K+Wo5Hozh)`9f351vm-)FlNJT|ucx=oG zEZ4xmz<9j}^v8&vnBx?`tSr;YKmi8CnlJETuu1T#ww~7#{ECXOp`jszyLaQY3N_r_ zMa|1Bb)y9SgsUz0W)nf~(WasupjdSD^yoE=*yqL=0Cn!u zJENoKpuzhqi}llfz42*ATi8X6pqhr1W|n$h(=#!Z>|0PnV3l|kWo5SP>}*$0PaV+N z#DoOY-by|*s?hQF7Orbx;PQ$^rY?bja^$?X_IP7rV;fYtoP?#N(`Q;xMfmWL&`>@e z9tfy%{9B-y8o=ZAU?3-1>nE6l-!ox5s83&7%E=YJeGB<7_o4x< z@-QURF)_uxctQ94NN*+BW32ogT$mww7Z{j^2vgg@0PWSQS9v()*NI6<+pt(hz|}f_ ze$vym@_>?0PEQFT;kd&(#KNkq0edLeVNPvnOOS0S>~jt!2GCppqB`?$hVA}6+aZEh z!gcla`6VQ10gj)X9}FM>wm@^%P0IP712;xdRMs-iy|8yqv|;7I2c#m;gLQOt2Ca}L zrEu2Lg=f01Fk90!O4mEdmeKBXQe=N14z9shJ^AGS3(CAo@`s^r~@87 zTpyuiNG1l34t!Ebc-0Vrkh*p2RyC66Bl74PLVv`w-WtyResX*q_9aO?Ec zl;TP^cye1?Tb?)`VPXBpH%;E(iT?OeOjJy4O}+kqW*My>Vq#(*6%}^K-oXKV#g#v! z>qUNkxwOWIT2l)PelamhAdBIyjrDckxmE(p&Y79!gJ-g3jfcZ#cLNImHY3c%rl+S3 zA3T6nR#x%?_zTdj;_vJ0`;JCOf2leeP`~i)77!F13J3a=4qP{t_QJ{T_sR^=L62q{ zL#jP7W_=rDpFKEC^sQ}dBA3KNvYW@}bJg-hIpjP864rknU0t@hV>o zdbEYB$qj8e-@gsNDJ3P9dwzNvD(yPRlcOHA`9RvKlZt_fNypRElN`ElW~NI%U+x}x zfj`beCevx%u=%EAVL(O&(@3CV)r!;NEyD~Ay`1_M_z@eL>TTw~)Sa0n=|Bj*1!LpG zhYv5SJHNeMUey>MPqI8vV1&&OHqx7Ij!=5+=;&AxxM5DkCQI&E32XU#Di*Ybi%(By zI5|0~2&+&0J~TuREO&LfK>=iUh06dJ$YnR{+${AdHQ^vUK1BeGm3onpYVYs9A&u5} z3cAAqOrAfwx}vkQS)F^c3gx|v67>8Np^T#VebaS&y2zz-JY!s2aog)#~o8#w^O z!em{IOP9bJQ?R8*?UR%2BqSv6J%;b@gP}{K(73g$>k1qWw`mr1Ev>AiSMZt9adP6n zQ~)SV4egX!;n1G5u0H=x)CKmBhh}kOQ>C!r(#zR)kO9BCGsRA}8+I;@or+za3QQ?$ zwHXH@N@m7SQ8F%VhXnAy?X4?&zQM=dRIJiErCU>JI((WSCx8l8N&f(oX7y?MJ<7kO z|77n0+4XEW59aCo#~?K}H$7FsfE>DgRr~7F(o(MO%Q3qs&W0yD^5aPjX*CO+YT>ZU zoz2VRv<+PoEL&ct!uziDb6(EwbmYV^4!<_TIgF%3hf9q1E7$GU{h_ig`U}+1?X` zwRJc-CJGXqmKIlXqa9#-_+&7LWY$;4)Q2-h;>`R&#lrAh4KPb>Pu0gp;!n|IV=R=+ z;;W-&0cjLYuZ}kW`k}#I7aEH|kWcd;p>sT5MPax)_FHLlp1tROBshLBZb+G(n8*f2 z4Y1TVic~?5FXELMKqe^Ju`75FcO%Q(kLXU1chatkna_c#%i#9y_6#GnD|0hvb|4#v zeO6$ifAGh%mB0%Vag!dBCU?E0bV6DN2aUxotCRTCv7hbKPeZZslq}zlZ?9{@iW<3n zeJCf-{~S2DyFUv#Se|d#X%4H1_V~uZ_RADIxP-?kh3pH|P}9(CS2q^I<*3bOeEM^h zh@n3NQGc}oF-(|ZVT*W6D=Vcywu7HdyxnItvoyh>p^hUT%xLAji{H4jeQPWL>2|n= zMS1^NANeR1vcFg!E_jnoJLA~H)wLDekrIdypk*S`_i+Hy<;Q*`m>YtBk60j158ZZy zRlj2}{POZg(d&}3RCi~50A<#N90=J){5AvOxVX6ZwyrK~`Sq(;ms2GH0Rf%sc(5b5 z&cFMSU_jM2Fd*;l?&e{lc$t&)?BN$@H!q(g@ZfgfSPQZTelq^mr{MlyUG2e2N9lr=p4C!FV1{~cE(6viQ6Gd(it?~M8w#%E)Mc~ zW-0DfzCPX%W#im2@V-$+%RL$*+zHIV_@;O^dj{BUA?>LgFc&pw@U-TbedMbD#*%R? z!1*BN2ZXW LE?lQv%Rc5mTY!`+ literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/legend/expected_legend_4_by_3/expected_legend_4_by_3.png b/tests/testdata/control_images/legend/expected_legend_4_by_3/expected_legend_4_by_3.png new file mode 100644 index 0000000000000000000000000000000000000000..c1e72c655da120ffe1eb515df25513d0bd96ecc9 GIT binary patch literal 6529 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 literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/legend/expected_legend_5_by_2/expected_legend_5_by_2.png b/tests/testdata/control_images/legend/expected_legend_5_by_2/expected_legend_5_by_2.png new file mode 100644 index 0000000000000000000000000000000000000000..e61cb2f47015593d84d26ef2459a2b07514c34b6 GIT binary patch literal 6661 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 z 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 literal 0 HcmV?d00001 From a673fa8393146d9a8cd1a3bf6f0444bfa23352d7 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sat, 10 Sep 2016 10:02:08 +1000 Subject: [PATCH 2/4] Fix multi column legends with odd number of items would place more items in rightmost columns instead of leftmost columns Eg a 2 column legend with 3 items would put 1 item in the first column and 2 in the second. This was ugly, and now it places 2 in the first column and 1 in the second. The legend column assigner was incorrectly adding padding above the first item in a column during column size calculation (padding which is not present when actually rendering the column) --- src/core/qgslegendrenderer.cpp | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/core/qgslegendrenderer.cpp b/src/core/qgslegendrenderer.cpp index 0d8f9534d8a..98446314f4c 100644 --- a/src/core/qgslegendrenderer.cpp +++ b/src/core/qgslegendrenderer.cpp @@ -265,17 +265,12 @@ void QgsLegendRenderer::setColumns( QList& atomList ) // Divide atoms to columns double totalHeight = 0; - // bool first = true; qreal maxAtomHeight = 0; Q_FOREACH ( const Atom& atom, atomList ) { - //if ( !first ) - //{ totalHeight += spaceAboveAtom( atom ); - //} totalHeight += atom.size.height(); maxAtomHeight = qMax( atom.size.height(), maxAtomHeight ); - // first = false; } // We know height of each atom and we have to split them into columns @@ -283,22 +278,21 @@ void QgsLegendRenderer::setColumns( QList& atomList ) // We are using simple heuristic, brute fore appeared to be to slow, // the number of combinations is N = n!/(k!*(n-k)!) where n = atomsCount-1 // and k = columnsCount-1 - - double avgColumnHeight = totalHeight / mSettings.columnCount(); + double maxColumnHeight = 0; int currentColumn = 0; int currentColumnAtomCount = 0; // number of atoms in current column double currentColumnHeight = 0; - double maxColumnHeight = 0; double closedColumnsHeight = 0; - // first = true; // first in column + for ( int i = 0; i < atomList.size(); i++ ) { - Atom atom = atomList[i]; + // Recalc average height for remaining columns including current + double avgColumnHeight = ( totalHeight - closedColumnsHeight ) / ( mSettings.columnCount() - currentColumn ); + + Atom atom = atomList.at( i ); double currentHeight = currentColumnHeight; - //if ( !first ) - //{ - currentHeight += spaceAboveAtom( atom ); - //} + if ( currentColumnAtomCount > 0 ) + currentHeight += spaceAboveAtom( atom ); currentHeight += atom.size.height(); // Recalc average height for remaining columns including current @@ -322,11 +316,9 @@ void QgsLegendRenderer::setColumns( QList& atomList ) atomList[i].column = currentColumn; currentColumnAtomCount++; maxColumnHeight = qMax( currentColumnHeight, maxColumnHeight ); - - // first = false; } - // Alling labels of symbols for each layr/column to the same labelXOffset + // Align labels of symbols for each layr/column to the same labelXOffset QMap maxSymbolWidth; for ( int i = 0; i < atomList.size(); i++ ) { From 52eef9006183a66d53926f33e73afa1dcd534e59 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sat, 10 Sep 2016 10:05:28 +1000 Subject: [PATCH 3/4] Make sure items in legend always occupy the set number of columns In some cases (eg a legend with 4 items and 3 columns) less columns were being created --- src/core/qgslegendrenderer.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/core/qgslegendrenderer.cpp b/src/core/qgslegendrenderer.cpp index 98446314f4c..48875f229a0 100644 --- a/src/core/qgslegendrenderer.cpp +++ b/src/core/qgslegendrenderer.cpp @@ -295,13 +295,19 @@ void QgsLegendRenderer::setColumns( QList& atomList ) currentHeight += spaceAboveAtom( atom ); currentHeight += atom.size.height(); - // Recalc average height for remaining columns including current - avgColumnHeight = ( totalHeight - closedColumnsHeight ) / ( mSettings.columnCount() - currentColumn ); - if (( currentHeight - avgColumnHeight ) > atom.size.height() / 2 // center of current atom is over average height - && currentColumnAtomCount > 0 // do not leave empty column - && currentHeight > maxAtomHeight // no sense to make smaller columns than max atom height - && currentHeight > maxColumnHeight // no sense to make smaller columns than max column already created - && currentColumn < mSettings.columnCount() - 1 ) // must not exceed max number of columns + bool canCreateNewColumn = ( currentColumnAtomCount > 0 ) // do not leave empty column + && ( currentColumn < mSettings.columnCount() - 1 ); // must not exceed max number of columns + + bool shouldCreateNewColumn = ( currentHeight - avgColumnHeight ) > atom.size.height() / 2 // center of current atom is over average height + && currentColumnAtomCount > 0 // do not leave empty column + && currentHeight > maxAtomHeight // no sense to make smaller columns than max atom height + && currentHeight > maxColumnHeight; // no sense to make smaller columns than max column already created + + // also should create a new column if the number of items left < number of columns left + // in this case we should spread the remaining items out over the remaining columns + shouldCreateNewColumn |= ( atomList.size() - i < mSettings.columnCount() - currentColumn ); + + if ( canCreateNewColumn && shouldCreateNewColumn ) { // New column currentColumn++; From e3313fac95ea143988ea32bf162b01b4df8e6fa1 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Sat, 10 Sep 2016 13:07:00 +1000 Subject: [PATCH 4/4] Test masks --- .../expected_legend_2_by_2_mask.png | Bin 0 -> 1198 bytes .../expected_legend_3_by_2_mask.png | Bin 0 -> 1491 bytes .../expected_legend_3_by_3_mask.png | Bin 0 -> 1526 bytes .../expected_legend_4_by_2_mask.png | Bin 0 -> 1676 bytes .../expected_legend_4_by_3_mask.png | Bin 0 -> 1855 bytes .../expected_legend_5_by_2_mask.png | Bin 0 -> 1964 bytes .../expected_legend_5_by_3_mask.png | Bin 0 -> 2045 bytes .../expected_legend_6_by_3_mask.png | Bin 0 -> 2226 bytes .../expected_legend_7_by_3_mask.png | Bin 0 -> 2539 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/testdata/control_images/legend/expected_legend_2_by_2/expected_legend_2_by_2_mask.png create mode 100644 tests/testdata/control_images/legend/expected_legend_3_by_2/expected_legend_3_by_2_mask.png create mode 100644 tests/testdata/control_images/legend/expected_legend_3_by_3/expected_legend_3_by_3_mask.png create mode 100644 tests/testdata/control_images/legend/expected_legend_4_by_2/expected_legend_4_by_2_mask.png create mode 100644 tests/testdata/control_images/legend/expected_legend_4_by_3/expected_legend_4_by_3_mask.png create mode 100644 tests/testdata/control_images/legend/expected_legend_5_by_2/expected_legend_5_by_2_mask.png create mode 100644 tests/testdata/control_images/legend/expected_legend_5_by_3/expected_legend_5_by_3_mask.png create mode 100644 tests/testdata/control_images/legend/expected_legend_6_by_3/expected_legend_6_by_3_mask.png create mode 100644 tests/testdata/control_images/legend/expected_legend_7_by_3/expected_legend_7_by_3_mask.png diff --git a/tests/testdata/control_images/legend/expected_legend_2_by_2/expected_legend_2_by_2_mask.png b/tests/testdata/control_images/legend/expected_legend_2_by_2/expected_legend_2_by_2_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..b2f5f23fc8089b9a767dae8cafa8199391622a34 GIT binary patch literal 1198 zcmV;f1X25mP)$-MN&$bhR|YImz>-6C$a{lHyvT zLtvoR)m+&BYmxfDH%>Sf|D9f|#f#C>k?yOdxvpz$ye?PZLvZx}LH@c!V?znOv!vJP2`eX-Q)^Yof)Q zFHgGC|DLj`ot%REGVEQ=v{HASigi|6rt;xY!jonLOP3ThZ`ezuJw<7GG{g^Gg=bZ$ zw6X`$cq?ICanratZ>M!lN0BxNQeNp+LKorXyptv%&BJLGH;tR~kZD}W>x>em^}LMf zAZ6GBdb)re7M!I8^<3O^5!_lpm+l?X%%$5SuZ%Il-B>S<<%AMS<7?@LMedSyK5x37 zYfH{s*OcU$z&hSxL0Wh7yg@=BAiPH5dA(4)AWk4GcUnN7-uHDZ&@*EQk6cceA->v~ zRe-Z|N{oiPr6&-a`N)-**N!FUr1NR_apZ96 z{iN2$GJqC8%-~sDJ~PWV&R(_mw1lSd{eGMCV}0}W*1{V#h_>iqu)BD<8Nv+5a*b$j zK}+_kwb`SD7g{52FZG%(gJeuZG-gPlm1#I0dmC^0*VxM12Ef}0KT3GHE}_+e=8O*G z#Aofi6mJ?6Zxb-XR@x`~J?VU&Y}8zzU)p$bOvkApigX literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/legend/expected_legend_3_by_2/expected_legend_3_by_2_mask.png b/tests/testdata/control_images/legend/expected_legend_3_by_2/expected_legend_3_by_2_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..26a6e24be368500f1118de315c47cec0eae4bb3d GIT binary patch literal 1491 zcmV;^1uXiBP)r63SR?auk{#xHjsCQcX{>VkzATq_~zK8mQYDJT%WmSx!%063LzUI75Y z13-8Hfbaki9snRb0E7ns2oC_^0l>0+cm?Cxw%?P3zP`SAF$j->18_@=mkX^XMBx1a zeLMh!2LLAvZ`(F8^v2V!A)TL63QteE2Eebb$71*%Z`-zCeH4pxB`teU6yVyaJfiwE0F)L72y1wbzM#Aw$j{>)hu7>5GgHI zEv_Uw1P0Brs)g-uDQf<2jkEuj|6QKjikH($r*_>|nkl93bfx>R#ns*o;gw;$@LIG4 z;z`>p9*^KtN@}_mQTDt)0>X0_oLZr^TCUN;Yl*2hUCX;cc!V+xajx_@5B4}(TD3l$ zt>zsml88%n5EYzW{SYx5Zl@G5HUdw3!43p6P|TLOwD>owXr3RC2nu6@3k&>&Z~(0vgV`bSnYU9 z>2PZ!q^UVuZ6jqsEB@}mlbRQJ`Nrkfk!HKMDfsjAbDFP$rl!JP3ra*~7!D?z`1aql zN;F!~7ID$XYdDL_m!mE7-cvvj(U>kp>z(eu=T187`;W{kkDy;AJgrG6)u39Y!#MFt zJ1^y%#^l=soSj$RYk%IHsal)Aw(;cX455E_Jl`zwqw~spKi@M8tLNNW#*AEV)oc-V(W@;)_UgN{e@748|gW zp8g}8*J8M`6=F^MGiyfmxSDGjcXd%cIiD zGqB}MvF_zi6K+(dMT{TaDZi|hT5Ct(mhgJhw)PVv`mDEUYFY|*?_}QAv2xc~&BNIm zTPmG1J(G$fCn(>=VPbh6Ew5U;_-b2n*M83@{rBdTbnYXaE71kZdp*lG&v$lktm_&w zgXRf&b@g>4uKnuWf+D<`aBYj|srmIGOA#G;b;12F?2iXHa ziw7{5@XlOitY>YGnP9PBgm>G5IV;+;AwGn6IkWZyJxd(`!h3A9P1*~Q-&9;1wV{LgqO*m0a!KY4$281WFPk_!XoHn~%J695rS8#yvreqgUZ5DrPot1p$ zDrr*ns1GV}tjx*lR~eJU7qO;?$C9O#{#6Rv7uJCA9wV%lbtwzE=gZ_Mi&QRZgy?8$ zK2mg%=Z$XeAv!GHqlmONrKR&0`UsJf_t3k33n08xEn2>r#gX+IYrje3Y!MYeYYmb! zEG{6tFe~R>GOoA3*t=s5;)1Oe&PKWyZ?IgqB&DR@$H;poyeCZU)jZnF9MzWtV3je1 t1sA}Fu!s(@cmP;D06=&E2oC@b@CUu`F%J`&=<)yn002ovPDHLkV1nb<#_s?C literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/legend/expected_legend_3_by_3/expected_legend_3_by_3_mask.png b/tests/testdata/control_images/legend/expected_legend_3_by_3/expected_legend_3_by_3_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..619c13d4824342251c8de53c2296aea708989a56 GIT binary patch literal 1526 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 literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/legend/expected_legend_4_by_3/expected_legend_4_by_3_mask.png b/tests/testdata/control_images/legend/expected_legend_4_by_3/expected_legend_4_by_3_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..eb17139ea9249bbd96ccf7005f5b11a25a9067e4 GIT binary patch literal 1855 zcmZ`)doUaL7XF15uT|98tQ}1VNecstT<54x3l?zGC zMT>rifC6u{3kQDtqzvMqy$y!|EexQ!xWs+9VkMn>lmGpqVQ_*a&JGIRGjPWSOn+P6 z@vXWYGG(HhE!umzky5dd{DhTol(#GTv4qW;e;-M`iIOS<%?6)zz((q>Q?@!jndsU^8q~w3kM2+Pf%>-!0v%Tn-R0yv*wp-V@5L zdY9tr)+}d-7c!lV5S4TEU-NF4@royoBp{{@g1rSim2jM_09}g|6~`pY?}Z<|&I@}T zMn78ZtwW~ng`J=Ny{5!xA-)(I`*1YGtYy8UE}EkJ3`|k(QJ+?--)elU zuar4@5uC>qSmddVJ{KNWyF(!pGZxIM3+uBz72CYwb-jTLHKZhtoo=~9)11pl_gaKZ zw>*)-E_rouD#YkP5*5j5Ov*omQ>-1+zcC(O?sx!)I{;mg0OwcxIhH7px-_zInR z7EiVOE;^Y2nyEWQPKn0ORgM2gjQ^(17y7`A{BP@};4`fL;FerM#Z{A0kk|}*vw2xL zwfEp5emDNDpep2^TTgb(mAju{sTW$?$>UD+aG{&1o9LCenz_TOoEv+=tc)!G^_b*@D zut|LwlX|J-Q8V6%TU^90J&Z6W-Q@-%(gapK>ggW0f~^k-sSeg}X;flI(d#1#4Q~iw z0n0+K$rzDnz;}G1pN|Y`)au@AaO?}F-RF)?|5NQoQmU(+4E2~$3G1j=q>XHEa&@T% zQi{`p$waCvBQwi`Xk19}v$(EKP`sX`!CwE)ee=gur_agPS(B-TXieneB{LzhU6w=C zWL4Sd`$%f+HuNGu_Wfm#C{BfOM+w zFZ2yUWxh_jAys3t7tRbTXGspFYOme-&Y z&%Mw5fZ0yoWqp>VaEHsc8MG^1qL-?W%l&Cw9jODO?ID*ld@h#WS-P=ikW-Y;8?!h$ zB8g~UdXFzeCBw3t7ZXa#@+a+4{Kxz(CVzNbIuyJX0*$uN9o~seBL|EbKA8B5huzxU zoWwvKOfCE%5@|T!O&={59Hx7Sp0V0Kk8GE0v`acYnplJ}Jg(A>ERYZo4woCalME~m zJME+2#U~%F8lLFF`x;(Ze;cN0n>5lh;CmTQ4hU+MC6wu`O!B*lT$c4;U3X5{Mk&2j z$L$Bz>LwFP;G|p-x3zZQ{^^=vMV?pV;DhH7oG@yhY1i~BNG$9zTJ`3VP9KJ7VXSeB zEm8h#0JQqVcS+BR!x0^`t*{H$fyHuB7G$!;HiIHUS98zDr`S*k4efX>cr|w@ekj!N z^+w5awvT~airb1$uedeO4vp|IzEeexV^zo`^Q%9A(betY{l<6K%R~(?PT#QF(~Tj| zk>$5dxICKU&1MW8Pv$V{8G}!5oK(4;({-J!3(Co%_Achx?Xubjdt{2TvyL!Cyu ZkocmR(9SI5N%^Y-7#FNF`_%c2e*sEtZ{Pp` literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/legend/expected_legend_5_by_2/expected_legend_5_by_2_mask.png b/tests/testdata/control_images/legend/expected_legend_5_by_2/expected_legend_5_by_2_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..b7c9aa4ac683e0aeffe1f7dcaca16ff91baa8a4b GIT binary patch literal 1964 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 U56Z}s>NEf#9bMtnQ^7a>1s`nMH2?qr literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/legend/expected_legend_6_by_3/expected_legend_6_by_3_mask.png b/tests/testdata/control_images/legend/expected_legend_6_by_3/expected_legend_6_by_3_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..0228bfca536b7af0cf2b41376f02231f462f4540 GIT binary patch literal 2226 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 d_bN?pDBdZ;(^TJ2?%aOM0JsAJ`occo)<5oQ