From bec2c95158d3f2b3b52dacffae66ac94e7c59ea6 Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Tue, 10 Oct 2023 14:15:18 -0500 Subject: [PATCH] [two_dimensional_scrollables] Fix paint bug when rows/columns are pinned and axes are reversed (#5038) Fixes https://github.com/flutter/flutter/issues/135386 This adds one more golden to verify the painting, but once public mock_canvas rolls to stable in flutter_test, we can remove all of the goldens and just verify using the `paints` method. --- .../two_dimensional_scrollables/CHANGELOG.md | 4 + .../lib/src/table_view/table.dart | 24 +++- .../two_dimensional_scrollables/pubspec.yaml | 2 +- .../goldens/reversed.pinned.painting.png | Bin 0 -> 4867 bytes .../tableSpanDecoration.defaultMainAxis.png | Bin 4914 -> 4914 bytes ...tableSpanDecoration.horizontalMainAxis.png | Bin 4500 -> 4499 bytes .../test/table_view/table_test.dart | 105 ++++++++++++++---- 7 files changed, 108 insertions(+), 27 deletions(-) create mode 100644 packages/two_dimensional_scrollables/test/table_view/goldens/reversed.pinned.painting.png diff --git a/packages/two_dimensional_scrollables/CHANGELOG.md b/packages/two_dimensional_scrollables/CHANGELOG.md index e99a4bd66079..570519e6898e 100644 --- a/packages/two_dimensional_scrollables/CHANGELOG.md +++ b/packages/two_dimensional_scrollables/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.3 + +* Fixes paint issue when axes are reversed and TableView has pinned rows and columns. + ## 0.0.2 * Fixes override of default TwoDimensionalChildBuilderDelegate.addRepaintBoundaries. diff --git a/packages/two_dimensional_scrollables/lib/src/table_view/table.dart b/packages/two_dimensional_scrollables/lib/src/table_view/table.dart index 4b1b5a99cd33..b8829f04ccfa 100644 --- a/packages/two_dimensional_scrollables/lib/src/table_view/table.dart +++ b/packages/two_dimensional_scrollables/lib/src/table_view/table.dart @@ -723,8 +723,12 @@ class RenderTableViewport extends RenderTwoDimensionalViewport { needsCompositing, offset, Rect.fromLTWH( - _pinnedColumnsExtent, - _pinnedRowsExtent, + axisDirectionIsReversed(horizontalAxisDirection) + ? 0.0 + : _pinnedColumnsExtent, + axisDirectionIsReversed(verticalAxisDirection) + ? 0.0 + : _pinnedRowsExtent, viewportDimension.width - _pinnedColumnsExtent, viewportDimension.height - _pinnedRowsExtent, ), @@ -750,8 +754,12 @@ class RenderTableViewport extends RenderTwoDimensionalViewport { needsCompositing, offset, Rect.fromLTWH( - 0.0, - _pinnedRowsExtent, + axisDirectionIsReversed(horizontalAxisDirection) + ? viewportDimension.width - _pinnedColumnsExtent + : 0.0, + axisDirectionIsReversed(verticalAxisDirection) + ? 0.0 + : _pinnedRowsExtent, _pinnedColumnsExtent, viewportDimension.height - _pinnedRowsExtent, ), @@ -778,8 +786,12 @@ class RenderTableViewport extends RenderTwoDimensionalViewport { needsCompositing, offset, Rect.fromLTWH( - _pinnedColumnsExtent, - 0.0, + axisDirectionIsReversed(horizontalAxisDirection) + ? 0.0 + : _pinnedColumnsExtent, + axisDirectionIsReversed(horizontalAxisDirection) + ? viewportDimension.height - _pinnedRowsExtent + : 0.0, viewportDimension.width - _pinnedColumnsExtent, _pinnedRowsExtent, ), diff --git a/packages/two_dimensional_scrollables/pubspec.yaml b/packages/two_dimensional_scrollables/pubspec.yaml index fba32c5fa639..bd30a0106dbc 100644 --- a/packages/two_dimensional_scrollables/pubspec.yaml +++ b/packages/two_dimensional_scrollables/pubspec.yaml @@ -1,6 +1,6 @@ name: two_dimensional_scrollables description: Widgets that scroll using the two dimensional scrolling foundation. -version: 0.0.2 +version: 0.0.3 repository: https://github.com/flutter/packages/tree/main/packages/two_dimensional_scrollables issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+two_dimensional_scrollables%22+ diff --git a/packages/two_dimensional_scrollables/test/table_view/goldens/reversed.pinned.painting.png b/packages/two_dimensional_scrollables/test/table_view/goldens/reversed.pinned.painting.png new file mode 100644 index 0000000000000000000000000000000000000000..f3355f07dfe1273ec94ac3d82fe9f3b3c4246ed1 GIT binary patch literal 4867 zcmeH~SyWTk8ppSyf+C`&S1Ln-ZW z=@$a3ODcTa@p^?kweRB3>A*8Ka{5kAz7D8AoIRN2^-Vzt?J0&YFz5*Gu`ZiK7oFZ* zcKtp|{d4v+39#EXWpKFYcib{d5sRQd7f!yDzhjTFgfYGze}jhgseOvT|0M#Ob8FN= zzQvK!CsqlJb0l(hA-aFi`k=6FsfFw0owI@7h32V2BT*bngpP;SZvf!t4kG~2x4}99 z{<%Q|fbGU;0204gw;q5tjqLy!o&5CZpCbY}TnPZpROZ4PXBLXkaUXAUOLK4APa zzD6P$^L`dZwPE&vR&Nw)Z@pHSQ?A7$!2rWb8X)JS`FZs^D ztS2+_i5teZQTf1H+OqLTAgSzPymX!}ZfE*Dsv$p9-vDA?q)9V4C0_6^G9uCgTsUXv zO7(`#O_9@1Og_Iv)2y^felIRGYO+e7lP&1wESi>4!gx6H@BYevAiXCwc7hzc8r$FR z4M|os!zt^0LwG57mfktV4Z#Y9s$XEoPtA&r>?d*^^$n@0#wv-eoG;@}-k}L~m7I}? z?q45MZQZoXy!?(ijL;7;vaFYRqrbozq4dH z+o$kh5f|>Ta$Mv5hCJnd!*3)vyR)3GggsI3+fN;9mCxivYxnEeY|E7)55I5FmX$`NB|sC$sHw+x||E(?z$SH)>Pl&xF0mSxC_i8|InMgNuT7@hIJ!IWbj z9?^|h3=6Ro$(+~P0T)x;`21o`)A9#-I9EcaUXJ+LT6Xc=pk;lcY3+sc!N;OIsO3-8 z2#TI$Y2Cc2wI9p5dj2=*FOyUi?Zf^z+7oT;vk*{fAxsF0dPmm2t>n#H;1~CjC#HQY zij+>8eEVLJMrK^_XtI=;usTlX57mcC*mF8al#0K8^*>d_O6tRJ^Omi{wE>zC>W+?qlOzGA9y)R zNh*E#)aqORU4{k~1+C1ZTk`Un>Mr_A+Vyg+imkc56LSBOBslK0c?VO_mny7q@+UP+ zgvcMNLcJTJ`!dXG#lfWA0gDZqDiEEZGF-dTv}Ih8lqh)q%DD~F-Ew1NM{Yz*YFOii znsu8E0o%xoq)aoew;(WnnX}5*59d`@JtBp;_zp>o;@R6E!shEz^;hi7{d6v#8dW4Q z^LX;-U1sp$4q>T&V{BaZqFr`+`S8r`eM|?dN?@MV z4Jq0}YGfY*=Q3+~me~YWaUepBdyVbWj=fCuI#s*_5;rSO{(OfPN9rakdN~DWE=s`v@USV zmCq%2ccsII{8Si!#=7f>&&!Uxk^AFLV%V2Jn8sYVQh);TlQ(t zLbL@E>$~omca^Hhe|c`crx^eKuJ2fy?4kb`5cJn?C^A8xi~ZpoRFQqE(Ej`ph;)Za z?rwR7zg$!_w=2JN);nhWgHA1raB2HA^2#5@_6q7JySBRxUt;|L)ErMZAFr@Kcl}>& CdbYm+ literal 0 HcmV?d00001 diff --git a/packages/two_dimensional_scrollables/test/table_view/goldens/tableSpanDecoration.defaultMainAxis.png b/packages/two_dimensional_scrollables/test/table_view/goldens/tableSpanDecoration.defaultMainAxis.png index 8fe4353ef521e237ece67505554eef12d3d65c63..baf2cd358cf6de8fd3a82c2f09b8b32bcd6717af 100644 GIT binary patch literal 4914 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 delta 2013 zcmXw4eN>WZ7Ju;zJ!@j)X1bN+*om`8Gy70W1FWr_rj%)oNKvtqX^CGgA(`k)Hs#Fp zfpgf()O6h@O%c!-QBfpQ2b;|gOfdnW(UJ-LLPSIa_qEx5{&>!P&b{|{p8I?5^Sdm+ zfBF?44#J!`dicz>@|kh4ew>yd(VI+4)smojm-{%v=|#G?6TfheNA_md&hwu9UtD+f zJO6lPGk9qW@l@;87?}c^NCcfqMomhJ5A(y$ zW^0A2ea-w+rN&GboA&EM)hbUQ{@)y=a_B1B9yp2P>0kiBkorbId&x!8>Z&1O0I0lMper`-II+Vtt68a>yvfn;qH zo;Tf}KN@r(wyEVVa-V!itqGD;6CPNx9Y;qZ2fY{G97*a20Z$T z0lGTtVRt-`K+qwFUcepMa6k_Ox{fifo}#~;=!UY9up!_7MU=04*542CL`ErOMacF@ zdeBgyJ2K;~4EY@bI45-Y3Lf}pByyZi6KNWY!b)9*w5sLj)mF~Exmfe9z$rVx2DUi* zuj2-KBFm~F@BnHw7*Uu=rXR9;gvx$Ftg3Rs+qfgC=R~sQ8~Hc)qQ2f;9+B z8gwbX|6~hN-Day6YC>nZlm9_^w$FAURDKw*V8g_Pu0<)au5>q^$kKGo4)c8{>;b1I z#D>DmccP~l<1L)5+dq<>cAkD{MOLQUja^99++(W8zy)ta^}gYdC{8K28YJVlVXOqh z#H1iYlF1h2zHir`p2^A!+6Fvyf_;&*^Ts@a&y>7w=x-*;xjKM%M1ZXu3rg zZe80~j{pLTJc{p^f6t8MTE|+!<>z&2?Ak1Dt3Wne@HIW?MSr&hht8hfJn#dvt}bOx zYP+}FhbLKottg)($Zy(ekeoI8_3BLRb$71_96i_aeSSDCVbr)4c=?QCH`GYOS~x=5 z+k_@<_b2#UHivDqlE{jEMLH&-gFRc;(m3f-6^>Jd=pP731|RU0+VmiUDOwaE+xeqQ zSRzdcram%2y&27LWzY_ZpU#e7C2%k~&$-Hl9=Yw6H0ME>Lj>ZrDMg}CvRv&FW8 zf14rBmiuvel{j|IC{V9GyKc;>KNuBUN%_JKIC&HB4hpS&M=V2N z&S1fbTaF}B+?53M-U9rn-w|3!LAvErkh59dN{VU{$B7Hp&eTAKZ~h4V*MF7ara5qu zTyFFVDuDv?h(;S%0sw(b{zjMAFjldhd&FlI%0W8-CkJGR%*(CukvkDQi`jn$L9z|YrT)RMVA z;d4zIQ@`xDM~Zb7f?DRB+@Y5diyj*$@sSm*HOLkfO^I(R1U0143zVMu&$n%LWZOeHWC;tEma{Zm znde^`SAgf$5rW?e@Nl-OMNli?$c@wK+pfKam^lwIlkKs6+havMCq2!)NtBy&Ay?A5##?sssY1pzd zCV}bvq!Hq~d diff --git a/packages/two_dimensional_scrollables/test/table_view/table_test.dart b/packages/two_dimensional_scrollables/test/table_view/table_test.dart index 3fbd4e7a938f..75cdfb0b9e3d 100644 --- a/packages/two_dimensional_scrollables/test/table_view/table_test.dart +++ b/packages/two_dimensional_scrollables/test/table_view/table_test.dart @@ -957,11 +957,13 @@ void main() { columnBuilder: (int index) => TableSpan( extent: const FixedTableSpanExtent(200.0), foregroundDecoration: const TableSpanDecoration( - border: TableSpanBorder( - trailing: BorderSide( - color: Colors.orange, - width: 3, - ))), + border: TableSpanBorder( + trailing: BorderSide( + color: Colors.orange, + width: 3, + ), + ), + ), backgroundDecoration: TableSpanDecoration( color: index.isEven ? Colors.red : null, ), @@ -969,11 +971,13 @@ void main() { rowBuilder: (int index) => TableSpan( extent: const FixedTableSpanExtent(200.0), foregroundDecoration: const TableSpanDecoration( - border: TableSpanBorder( - leading: BorderSide( - color: Colors.green, - width: 3, - ))), + border: TableSpanBorder( + leading: BorderSide( + color: Colors.green, + width: 3, + ), + ), + ), backgroundDecoration: TableSpanDecoration( color: index.isOdd ? Colors.blue : null, ), @@ -1002,11 +1006,13 @@ void main() { columnBuilder: (int index) => TableSpan( extent: const FixedTableSpanExtent(200.0), foregroundDecoration: const TableSpanDecoration( - border: TableSpanBorder( - trailing: BorderSide( - color: Colors.orange, - width: 3, - ))), + border: TableSpanBorder( + trailing: BorderSide( + color: Colors.orange, + width: 3, + ), + ), + ), backgroundDecoration: TableSpanDecoration( color: index.isEven ? Colors.red : null, ), @@ -1014,11 +1020,13 @@ void main() { rowBuilder: (int index) => TableSpan( extent: const FixedTableSpanExtent(200.0), foregroundDecoration: const TableSpanDecoration( - border: TableSpanBorder( - leading: BorderSide( - color: Colors.green, - width: 3, - ))), + border: TableSpanBorder( + leading: BorderSide( + color: Colors.green, + width: 3, + ), + ), + ), backgroundDecoration: TableSpanDecoration( color: index.isOdd ? Colors.blue : null, ), @@ -1040,6 +1048,63 @@ void main() { ); }); + testWidgets('paint rects are correct when reversed and pinned', + (WidgetTester tester) async { + // TODO(Piinks): Rewrite this to remove golden files from this repo when + // mock_canvas is public - https://github.com/flutter/flutter/pull/131631 + // foreground, background, and precedence per mainAxis + final TableView tableView = TableView.builder( + verticalDetails: const ScrollableDetails.vertical(reverse: true), + horizontalDetails: const ScrollableDetails.horizontal(reverse: true), + rowCount: 2, + pinnedRowCount: 1, + columnCount: 2, + pinnedColumnCount: 1, + columnBuilder: (int index) => TableSpan( + extent: const FixedTableSpanExtent(200.0), + foregroundDecoration: const TableSpanDecoration( + border: TableSpanBorder( + trailing: BorderSide( + color: Colors.orange, + width: 3, + ), + ), + ), + backgroundDecoration: TableSpanDecoration( + color: index.isEven ? Colors.red : null, + ), + ), + rowBuilder: (int index) => TableSpan( + extent: const FixedTableSpanExtent(200.0), + foregroundDecoration: const TableSpanDecoration( + border: TableSpanBorder( + leading: BorderSide( + color: Colors.green, + width: 3, + ), + ), + ), + backgroundDecoration: TableSpanDecoration( + color: index.isOdd ? Colors.blue : null, + ), + ), + cellBuilder: (_, TableVicinity vicinity) { + return const SizedBox.square( + dimension: 200, + child: Center(child: FlutterLogo()), + ); + }, + ); + + await tester.pumpWidget(MaterialApp(home: tableView)); + await tester.pumpAndSettle(); + await expectLater( + find.byType(TableView), + matchesGoldenFile('goldens/reversed.pinned.painting.png'), + skip: !runGoldens, + ); + }); + testWidgets('mouse handling', (WidgetTester tester) async { int enterCounter = 0; int exitCounter = 0;