From 163056bd84b69f9d1b793f8ff7dd42291db630fe Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Tue, 13 Dec 2022 21:02:58 +0100 Subject: [PATCH] #437 tv: filter app bar --- .../src/main/res/drawable-nodpi/banner.png | Bin 7850 -> 7074 bytes lib/widgets/collection/app_bar.dart | 24 ++--- lib/widgets/filter_grids/common/app_bar.dart | 90 ++++++++++++++++-- .../common/quick_actions/action_button.dart | 5 + 4 files changed, 97 insertions(+), 22 deletions(-) diff --git a/android/app/src/main/res/drawable-nodpi/banner.png b/android/app/src/main/res/drawable-nodpi/banner.png index 271aa70c93c9737d233e6f2e94ee58a35c925799..c33433d6c2b389cac95a3b63cac0c74be873fb54 100644 GIT binary patch literal 7074 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 GBmV~npKjv- literal 7850 zcmcgxRa{h2n4f_mhLRFckOpZfK~U)!helc?BqRkThZt}GC8U(0BnA+qLmDKdM5Lsp z6a@qc=@?+o?7r;N?$hoIKjz*u_ntZDJOBEk^mR36?^Y+*Bv!Uw?)xq&w*N=~n`#yhu9ve&jcVmMq5g~Nfs>q02SeP<7 zIoWBZMo>iL=sQ9{Deu0e<*UHMO)gnk=KTEp7t|r5BKmFU;9IwDwRdztlarS(0`<+z zB8kapZ1&g25lAG)QmnVe`J4FTLADyVX~PxQ*Kgib1sy-jxb>6>B5v11C1O!S{;V7(-4?jZtJ=9Fs;In;=AdO_l!*JWn&8sq@pPh`)c`IxJBqdqtIQ(~_ABBj3M2 z@ZVcaT)lba$`wp=bMxv^m0d5zCH6bC>aOICg-xvH9I2_I*@d!3iY91!%wTwfb zo$zyXGcz*Uj29c5H9q5m*qp4>m%?jQ7}8*>0fO2;`;u~-s_ z|7Roy?*7-t9V%T@)BZ914x2&{3#8KF3sa5L2<9tar-G6yVs)`2OkaSpGGQk7ZSPAb zPFMFauS(Y$xTw|I%a6T94T+Uxdb{ZET=f`zef?1N7^buunD848h#B&^m^&W?W^Zq= zL<`F#=B9@*(YN=jU@p9>$RNmsu>hB#!it6lmW7~QY6#A!IZ-1eTLZ$BOnCU*9fi=~ zFCCCj9FDWpyqYv3BEnIyt=N#iBeuLQ0dgzoNSuh6_}}&q)d?0A=-Pu&y{tRO*1Prh zVy$V{1M2*{Hy+-q*^zdJUqzymICCJek)YIO>OC$&{CAG{Vamo!%-#JKq$!(Hi^DFF z$uLR^inVaOfU*koDqKrT>*LwMcSvYyvm)pEIY}WImyR+9YC&(=?CTz@HEgz%2ZNJ1 z@oL0gjZg?afzW!Mjk?&+wISf?q4<6+PgOa1ax5o<3e<$S(K2pG@q#T=-Uq`ekQgM9 zN-zBy-=F-k2!=DF6~fxs$ibh?HqZ%SqiZAeL&x*IRtCu_DWzE9SF81g6B4sqS_1mD zG>St1=8itrz&sZ_Fq<|Yg^-~v278xO%fZ1yFmqJlw0j`*0#E>2XbbIw&P{g{G z4N~be!aX%Lm5Rkf_66{r5tL6iXXSW#dE2kcuzpHke&qD!MP+idqVQeoC?DBfC}gQ8 zHY_iX$CXav0WXG=yddD&WckBy2z~A<6-|ajPKZFvWkll#;`q(%QMIs>*SOZ-^~=J1 z^OuY}zJF)!jl1?OZGG!xe?3((q?Mmgurg_)Gk{8GWnq;zahmg$s!7zC<3D+rFh% zzYp)wEoRffpvZi~$0`=W!X*}ow~}ewwGUuL!o)msa&qJp6hx4Z^I90=i^oTOdMg#V zYDBKCu3!x!*^@YOAcD$ai0z%3ILRA))|ntUy~l93Qj`}xC>+j??d@#~RyeYehYt*L@cuKJZ*otcI}xYz zRt6GEd5+33L{PB9qwUO5QjP@9ueNQOf2)u&INmKOcz)7YdOshDn9Q9-7*V?%M7K6)5B zIywLr>1}QJ9j(j~L-HcA(cca+X0Fg@jcfp=)r^c7KYWl(2)?*;RoYiY)!cP#?}J=X z4SRZD^P)4FhJw*K^3|(wEcSB1;U=}Pu<+NXfDu-|y}uM46Z3C(NRdYdE+Ar<<6%lU zR$V;f7ui_Qsh2|Hy*dnSZEcl5B$2rcYJG8QD_%36-ML@Py7g5Q!}VO}Zv~}Q;dD0c z@i5k#F5%$7*mYn?e8lKqMMWvQxD*%S!SKhbJ*BtK3*7_{1Aj=;B8G0@JmS)nTsG4qcjX zI$W9>=0ly+)D)h(BR4k}fD8u0rtly-`^}hZY;P>sH`_$Y8c&JQ(=1CziFZzh6aJ8CqIa zRuZIBtdcpqm?J`;A#RHasBhHjfF$G0*XPAk=9aI5&AcpZ0)b3aSjST@kVBHpB)(F7 zAPot6c{)whi8j>Kx*M?Pzx)Ex!!IUAQ&m-E;jqswhm4vzSx-uO?Glgu3Gqa5W{KO~ak{Gh%q$GQ#8B5nhb z_gM=+*!Z63vpzAje{$`%ug%%XKB-*&>(}&My}h3%CQNQ@c^z%r1|9!S$rZ3>j*E-) zUoWd){QWz^swJRfaBvWJm~H--;;{hwY~M5%#z(K^?JY|UCmL$|KD*U+5eL{$$HCw4 z9n7o8ytBguLpDvMF!uoCkvo3z6D(EkgZd}@UT0cJB%$I#nK@&xU%$SDHMJVSXC@{- z&$=7vV$3NkE1MzbrQu;kO7vk0J{6JWmav_{A?>E4-gi=&)J(dZ`5}v z$;p*o(p;BYo@K_lw&|%e~kCv2_lKQt4uef#=s2Fradx2k3 ztnJUp$Po8jY_~9|5VLFuwf*$MSPKnFNKdCwR8*wmP+&_;Ow=zjV&vp2e1H))EmuPz z$bUVPGa}l4r$2YG0!p|g@bJ;{KpOuf{;v0GLZREwuBZfLH>(PE1B-v`yEzNbH&iUD z=A(!6Yo~GwSvUKN?(FRBowVp>D~P7=RNH^1mv$cQ`n!IATA-zTe>NnpG&3V(@z*by zrl#hI(fggQo}NeBiyaM5mq_2XyV01=vN6G+hg%Dppm@NOY&<;T>Fhg*|E@i8%~V94GCZ?;0PJb;BfssveQd)VV*{@M45PK^-&C zSr7gE{N}p%p!KX3+5Gp+u z6v|GCAVI;wRgZ_*Teh^mJ}m#Dj#<7V&Yg%DZt_`Q*+f*_)6Kdg*!21FU`Ek>bf~;e zYIb%uB9x4VP3drRZl8Y6!ouQbrr$gr+;eyN>-OHBT1&uw@!1u^aoiyeji6+1O~4C1 z>WZXGcfag{iHsyq#M?_=sdNASLc*@c=%~$otdNdSB>?U0z$mi@PcCjAo~kEv@?UGy zW!%%}fA{ixin`IfB}So8N0V*me8mE)FQ|(4e87t^B_$;$(}X(z?$P#VV-^rgY>w(n z7wk1fG@EIK)wou8Bd{1NF7t0$`S|#b)=DbWemDDWU@9s+B6hxwUmp30^3qNfhXQIN zr>2f*ZoVC`zvhszTL73o&+8nI;^pIu%Ed8>S{R))0r0XL%#h370SmsqG3(~$rba9V zsr1{Lck%1I&d(oBuKH#&a)e3Y3N2Am1H{BwosOPb3*=^+QxkAZ_4`7Rd_5ReP-*TUiSV57wM zI{wF}m+B7S!noY3U7SHMO5Sf1-+30wAzCPf0hv=E?X$~gAB#m39)>%#Q9>L2kt zUs5IPUYMA>xCntg-}8<0_4PeEUAQPWF3=Y!#$rzZ`=>{(JNTnef7~JO3r5Dt0s+z? zt4~wAQ1^Y3a8Z&J3Oq<$i%d^VF_;d7`$slp9S3U-^L-g z-n-g+1K&~zK(wq-xT#ifD^TEe6Rm^yprvTZER}F^;l@Vv8Mq1)b`HK zsL<`FKf|p^h5DVQKjaTajl9>*EH>QroNMy2Z~$1ky3iI3tt}a#Hr?_x-Xy_8C zNQpjPM~dM{dMco+h2d*bS4Ww9<2jghAX!q62Ptnn1~AG#AAI=G;MmkUIKMucKM}Fr z!|D;)4^(Lhwr(9285KoGeIjE1p=)v7GB(OcC<0V>;hnp8uVrOrk<-xh06-B?^2#S@ zalQ^P`?q5iPkeo4CdwZQ3*Aus{R{PHp{>nnW3xc#t>@{1drKzJpVdxda$H=>Ngs10 zlaPEWs;ag9_LAnme3VLIjop zh~=S+`Y7rUhf);@!Ov+<<_o#$2Np+4p*n-eTjDER-84$4bv1D*l0itUk@e4E_52Mn_CIKF8@>0ky*MFNUL|BO9>T)p?)jDFu1yiwYDA_(y8-UszTH zPX_?}c8-h~l(+$_+1J-MjQUs}o8|a5J)im5I9!`Q%u=jk=M(KuVO1e)F2NF0P^dh5 z#O?cc%HYphc4{gM727SsevoEP_LEmKX<)h|SXz3t+>*~Hw^GNVxCVu|BId`isM zVQOY3_udCJ#HFbCUb7ETuhlsH;BZH=jc!d*0#ZE~XnB>v%aYuJIiO0u(FADc*!SVHj zet_fIz(HTCowWLtz@$k^dr zkC|~+hpqx#lO?8lD^7<1qt$fA)`s)7n2%0RfhxY^PYX^LF~p$w2889N3#0G|CBDz! z-`@t*L+%QYi&3CHD27ul8$6+a!8L<|KFZtI)rZ$ag=OESZfw1WKnzb`m`rF(GZK?h(Ux6m1!kYJY%Z9|u*m4KS|d1; zcYyfi2*FpG90R8$oGFa(&Re(oJTTA&UMQ$!X8>Y10OA6S6lU^fxrhC&EKMku7f;wp z4;_Lz-9^+L9r@=2*2^gPjx>ct^OflZ3V$=_@U;QEGG_Khix$Rq%Tvkdd_cAkCZwyy|)pPpzV5+o9-7To8cV^1-RaO!lYY#+S$QKWZ% zy0wSbDSC%^>`Pm}rZUh`bKIlcEv1M}m@4;E>s1YNjps<`r9y=_DBP(a@&(?vDf z=4jy1L7qd0yORFEnq^hq8 z+od20!Y=R4+2h8z7T=9@6Xb`fDYI8sq)34TBPS;hefg3MxDHA}gcPv!VHbE0b#?WI zkP8K|hfU!L3A9~ZU6BePX}856{R?PwWW=Q*hLe7i6`FE^Y{|mN3SBd1<{uCM43eu( zfer!zf(GqcnRT%tK-g+TmLL7A47_HrIVFFrjptD-*Mk0aGY|Q=O)J@=0I^m90*-Ab zyx-5yPuhKkQAS2aKuD-FjO>!`A~{Pl0jzc(PWqI#tC3yd6!EkxPQW(R@oF zknwE>1$cW0haX@VXi1UBrsG$;nT$s_#dd8>LZI6qMEKzFWo_VvT(~$< zX$d$>JZ*|!Zb(blXh@PWfTrM5|JHkH-X~haud|B^YPdmnFo^?nCv)&%n(*J6peZ4s zNa!6NgQ?Q@$AeblP9EW&pyGdh;0aH?Wl3py`S|Qc6%>r;X}8b91&ld5> zd|*_h>)fU>yDLL^;Li5pVJ{FN!=>g@R-A;d=s7zJ?(FUY4MGC)5v%{|aY|Uq4 diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index eec20b726..a05caa289 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -174,7 +174,7 @@ class _CollectionAppBarState extends State with SingleTickerPr children: [ if (isTelevision) SizedBox( - height: tvActionButtonHeight, + height: ActionButton.getTelevisionButtonHeight(context), child: ListView( padding: const EdgeInsets.symmetric(horizontal: 8), scrollDirection: Axis.horizontal, @@ -197,7 +197,7 @@ class _CollectionAppBarState extends State with SingleTickerPr EntryQueryBar( queryNotifier: context.select>((query) => query.queryNotifier), focusNode: _queryBarFocusNode, - ) + ), ], ), transitionKey: isSelecting, @@ -210,19 +210,10 @@ class _CollectionAppBarState extends State with SingleTickerPr ); } - double get tvActionButtonHeight { - final text = [ - ...EntrySetActions.general, - ...EntrySetActions.pageBrowsing, - ...EntrySetActions.pageSelection, - ].map((action) => action.getText(context)).fold('', (prev, v) => v.length > prev.length ? v : prev); - return ActionButton.getSize(context, text, showCaption: true).height; - } - double get appBarContentHeight { double height = kToolbarHeight; if (device.isTelevision) { - height += tvActionButtonHeight; + height += ActionButton.getTelevisionButtonHeight(context); } if (showFilterBar) { height += FilterBar.preferredHeight; @@ -318,12 +309,14 @@ class _CollectionAppBarState extends State with SingleTickerPr return device.isTelevision ? _buildTelevisionActions( + context: context, appMode: appMode, selection: selection, isVisible: isVisible, canApply: canApply, ) : _buildMobileActions( + context: context, appMode: appMode, selection: selection, isVisible: isVisible, @@ -332,6 +325,7 @@ class _CollectionAppBarState extends State with SingleTickerPr } List _buildTelevisionActions({ + required BuildContext context, required AppMode appMode, required Selection selection, required bool Function(EntrySetAction action) isVisible, @@ -344,16 +338,18 @@ class _CollectionAppBarState extends State with SingleTickerPr ...isSelecting ? EntrySetActions.pageSelection : EntrySetActions.pageBrowsing, ].where(isVisible).map((action) { // TODO TLAD [tv] togglers cf `_toIconActionButton` + final enabled = canApply(action); return ActionButton( text: action.getText(context), icon: action.getIcon(), - enabled: canApply(action), - onPressed: canApply(action) ? () => _onActionSelected(action) : null, + enabled: enabled, + onPressed: enabled ? () => _onActionSelected(action) : null, ); }).toList(); } List _buildMobileActions({ + required BuildContext context, required AppMode appMode, required Selection selection, required bool Function(EntrySetAction action) isVisible, diff --git a/lib/widgets/filter_grids/common/app_bar.dart b/lib/widgets/filter_grids/common/app_bar.dart index 1beed106f..84dad963b 100644 --- a/lib/widgets/filter_grids/common/app_bar.dart +++ b/lib/widgets/filter_grids/common/app_bar.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:aves/app_mode.dart'; import 'package:aves/model/actions/chip_set_actions.dart'; +import 'package:aves/model/device.dart'; import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/query.dart'; import 'package:aves/model/selection.dart'; @@ -17,6 +18,7 @@ import 'package:aves/widgets/common/search/route.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; import 'package:aves/widgets/filter_grids/common/query_bar.dart'; import 'package:aves/widgets/search/search_delegate.dart'; +import 'package:aves/widgets/settings/common/quick_actions/action_button.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:provider/provider.dart'; @@ -125,6 +127,8 @@ class _FilterGridAppBarState query.enabled, builder: (context, queryEnabled, child) { ActionsBuilder actionsBuilder = widget.actionsBuilder ?? _buildActions; + final isTelevision = device.isTelevision; + final actions = actionsBuilder(context, appMode, selection, widget.actionDelegate); return AvesAppBar( contentHeight: appBarContentHeight, leading: _buildAppBarLeading( @@ -132,13 +136,25 @@ class _FilterGridAppBarState( + actions: isTelevision ? [] : actions, + bottom: Column( + children: [ + if (isTelevision) + SizedBox( + height: ActionButton.getTelevisionButtonHeight(context), + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 8), + scrollDirection: Axis.horizontal, + children: actions, + ), + ), + if (queryEnabled) + FilterQueryBar( queryNotifier: context.select>((query) => query.queryNotifier), focusNode: _queryBarFocusNode, - ) - : null, + ), + ], + ), transitionKey: isSelecting, ); }, @@ -146,11 +162,19 @@ class _FilterGridAppBarState().enabled; - return kToolbarHeight + (hasQuery ? FilterQueryBar.preferredHeight : .0); + double height = kToolbarHeight; + if (device.isTelevision) { + height += ActionButton.getTelevisionButtonHeight(context); + } + if (context.read().enabled) { + height += FilterQueryBar.preferredHeight; + } + return height; } - Widget _buildAppBarLeading({required bool hasDrawer, required bool isSelecting}) { + Widget? _buildAppBarLeading({required bool hasDrawer, required bool isSelecting}) { + if (device.isTelevision) return null; + if (!hasDrawer) { return const CloseButton(); } @@ -225,6 +249,56 @@ class _FilterGridAppBarState _buildTelevisionActions({ + required BuildContext context, + required Selection> selection, + required bool Function(ChipSetAction action) isVisible, + required bool Function(ChipSetAction action) canApply, + required CSAD actionDelegate, + }) { + final isSelecting = selection.isSelecting; + + return [ + ...ChipSetActions.general, + ...isSelecting ? ChipSetActions.selection : ChipSetActions.browsing, + ].where(isVisible).map((action) { + // TODO TLAD [tv] togglers cf `FilterGridAppBar.toMenuItem` + final enabled = canApply(action); + return ActionButton( + text: action.getText(context), + icon: action.getIcon(), + enabled: enabled, + onPressed: enabled ? () => _onActionSelected(context, action, actionDelegate) : null, + ); + }).toList(); + } + + List _buildMobileActions({ + required BuildContext context, + required Selection> selection, + required bool Function(ChipSetAction action) isVisible, + required bool Function(ChipSetAction action) canApply, + required CSAD actionDelegate, + }) { + final isSelecting = selection.isSelecting; + final quickActionButtons = (isSelecting ? selectionQuickActions : browsingQuickActions).where(isVisible).map( (action) => _toActionButton(context, actionDelegate, action, enabled: canApply(action)), ); diff --git a/lib/widgets/settings/common/quick_actions/action_button.dart b/lib/widgets/settings/common/quick_actions/action_button.dart index fc7962b3c..49ffc0a48 100644 --- a/lib/widgets/settings/common/quick_actions/action_button.dart +++ b/lib/widgets/settings/common/quick_actions/action_button.dart @@ -70,4 +70,9 @@ class ActionButton extends StatelessWidget { } return Size(width, height); } + + static double getTelevisionButtonHeight(BuildContext context) { + final text = 'whatever' * 42; + return ActionButton.getSize(context, text, showCaption: true).height; + } }