Skip to content

Commit

Permalink
fix ui for tv
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrii Pyvovarov committed Sep 27, 2024
1 parent 43fd8f0 commit 7c664ff
Show file tree
Hide file tree
Showing 10 changed files with 263 additions and 279 deletions.
97 changes: 30 additions & 67 deletions lib/auth/auth_icon.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:cloud_hook/auth/auth.dart';
import 'package:cloud_hook/auth/auth_provider.dart';
import 'package:cloud_hook/collection/collection_sync.dart';
import 'package:cloud_hook/utils/visual.dart';
import 'package:cloud_hook/widgets/dropdown.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
Expand All @@ -26,92 +27,54 @@ class AuthIcon extends ConsumerWidget {

return user.maybeWhen(
data: (user) {
return user != null ? const _AuthUserMenu() : _renderLogin(ref);
return user != null ? _AuthUserMenu(user: user) : _renderLogin(ref);
},
orElse: () => _renderLogin(ref),
);
}
}

class _AuthUserMenu extends ConsumerStatefulWidget {
const _AuthUserMenu();
class _AuthUserMenu extends ConsumerWidget {
final User user;

@override
ConsumerState<_AuthUserMenu> createState() => _AuthUserMenuState();
}

class _AuthUserMenuState extends ConsumerState<_AuthUserMenu> {
final MenuController _menuController = MenuController();
final FocusNode _focusNode = FocusNode();

@override
void dispose() {
super.dispose();
_focusNode.dispose();
}
const _AuthUserMenu({required this.user});

@override
Widget build(BuildContext context) {
final user = ref.watch(userProvider).requireValue!;

return MenuAnchor(
controller: _menuController,
builder: (context, controller, child) {
return InkResponse(
onTap: () {
if (controller.isOpen) {
controller.close();
} else {
controller.open();
_focusNode.requestFocus();
}
},
radius: 25,
child: MouseRegion(
cursor: SystemMouseCursors.click,
child: Tooltip(
message: user.name,
child: CircleAvatar(
radius: 20,
backgroundImage:
user.picture != null ? NetworkImage(user.picture!) : null,
),
Widget build(BuildContext context, WidgetRef ref) {
return Dropdown(
anchorBuilder: (context, onPressed, child) => InkResponse(
onTap: onPressed,
radius: 25,
child: MouseRegion(
cursor: SystemMouseCursors.click,
child: Tooltip(
message: user.name,
child: CircleAvatar(
radius: 20,
backgroundImage:
user.picture != null ? NetworkImage(user.picture!) : null,
),
),
);
},
),
),
style: MenuStyle(
alignment:
isMobile(context) ? Alignment.topCenter : Alignment.bottomLeft,
),
menuChildren: [
BackButtonListener(
onBackButtonPressed: () async {
_menuController.close();
return true;
MenuItemButton(
onPressed: () => CollectionSync.run(),
leadingIcon: const Icon(Icons.refresh),
child: Text(AppLocalizations.of(context)!.reload),
),
MenuItemButton(
onPressed: () {
Auth.instance.singOut();
},
child: FocusScope(
child: Column(
children: [
MenuItemButton(
focusNode: _focusNode,
onPressed: () => CollectionSync.run(),
leadingIcon: const Icon(Icons.refresh),
child: Text(AppLocalizations.of(context)!.reload),
),
MenuItemButton(
onPressed: () {
Auth.instance.singOut();
},
leadingIcon: const Icon(Icons.logout),
child: Text(AppLocalizations.of(context)!.singOut),
),
],
),
),
leadingIcon: const Icon(Icons.logout),
child: Text(AppLocalizations.of(context)!.singOut),
),
],
consumeOutsideTap: true,
);
}
}
8 changes: 5 additions & 3 deletions lib/collection/active_collection_items_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,11 @@ class ActiveCollectionItemsView extends ConsumerWidget {
}

return HorizontalList(
title: Text(
title!,
style: Theme.of(context).textTheme.titleMedium,
title: Focus(
child: Text(
title!,
style: Theme.of(context).textTheme.titleMedium,
),
),
itemBuilder: (context, index) {
final item = items![index];
Expand Down
73 changes: 17 additions & 56 deletions lib/collection/widgets/priority_selector.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import 'package:cloud_hook/app_localizations.dart';
import 'package:cloud_hook/collection/collection_item_model.dart';
import 'package:cloud_hook/widgets/dropdown.dart';
import 'package:flutter/material.dart';
import 'package:material_symbols_icons/symbols.dart';

typedef PrioritySelectCallback = Function(int priority);

class CollectionItemPrioritySelector extends StatefulWidget {
class CollectionItemPrioritySelector extends StatelessWidget {
final MediaCollectionItem collectionItem;
final PrioritySelectCallback onSelect;

Expand All @@ -15,67 +16,27 @@ class CollectionItemPrioritySelector extends StatefulWidget {
required this.onSelect,
});

@override
State<CollectionItemPrioritySelector> createState() =>
_CollectionItemPrioritySelectorState();
}

class _CollectionItemPrioritySelectorState
extends State<CollectionItemPrioritySelector> {
final _menuController = MenuController();
final _focusNode = FocusNode();

@override
void dispose() {
super.dispose();
_focusNode.dispose();
}

@override
Widget build(BuildContext context) {
return MenuAnchor(
controller: _menuController,
builder: (context, controller, child) => IconButton(
onPressed: () {
if (controller.isOpen) {
controller.close();
} else {
_focusNode.requestFocus();
controller.open();
}
},
icon: Icon(_priorityIcon(widget.collectionItem.priority)),
tooltip: AppLocalizations.of(context)!.priorityTooltip(
priorityLabel(context, widget.collectionItem.priority)),
return Dropdown(
anchorBuilder: (context, onPressed, child) => IconButton(
onPressed: onPressed,
icon: Icon(_priorityIcon(collectionItem.priority)),
tooltip: AppLocalizations.of(context)!
.priorityTooltip(priorityLabel(context, collectionItem.priority)),
),
style: const MenuStyle(alignment: Alignment.topLeft),
alignmentOffset: const Offset(0, -40),
menuChildren: [
BackButtonListener(
onBackButtonPressed: () async {
_menuController.close();
return true;
},
child: FocusScope(
child: Column(
children: List.generate(3, (index) => index)
.reversed
.map(
(index) => MenuItemButton(
focusNode: index == widget.collectionItem.priority
? _focusNode
: null,
onPressed: () => widget.onSelect(index),
leadingIcon: Icon(_priorityIcon(index)),
child: Text(priorityLabel(context, index)),
),
)
.toList(),
menuChildren: List.generate(3, (index) => index)
.reversed
.map(
(index) => MenuItemButton(
onPressed: () => onSelect(index),
leadingIcon: Icon(_priorityIcon(index)),
child: Text(priorityLabel(context, index)),
),
),
)
],
consumeOutsideTap: true,
)
.toList(),
);
}

Expand Down
112 changes: 33 additions & 79 deletions lib/collection/widgets/status_selector.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:cloud_hook/app_localizations.dart';
import 'package:cloud_hook/collection/collection_item_model.dart';
import 'package:cloud_hook/widgets/dropdown.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';

Expand All @@ -10,15 +11,44 @@ typedef AnchorChildBuilder = Function(
Widget? child,
);

class CollectionItemStatusSelector extends StatefulWidget {
class CollectionItemStatusSelector extends StatelessWidget {
late final AnchorChildBuilder? anchorBuilder;
late final Offset? alignmentOffset;
final MediaCollectionItem collectionItem;
final StatusSelectCallBack onSelect;

@override
State<CollectionItemStatusSelector> createState() =>
_CollectionItemStatusSelectorState();
Widget build(BuildContext context) {
return Dropdown(
anchorBuilder: anchorBuilder,
alignmentOffset: alignmentOffset,
menuChildren: _statusMenuItems(context),
);
}

List<Widget> _statusMenuItems(BuildContext context) {
return [
...MediaCollectionItemStatus.values
.where(
(e) =>
e != MediaCollectionItemStatus.none &&
e != collectionItem.status,
)
.mapIndexed(
(index, e) => MenuItemButton(
onPressed: () => onSelect(e),
child: Text(statusMenuItemLabel(context, e)),
),
),
if (collectionItem.status != MediaCollectionItemStatus.none)
MenuItemButton(
onPressed: () => onSelect(MediaCollectionItemStatus.none),
child: Text(
statusMenuItemLabel(context, MediaCollectionItemStatus.none),
),
)
];
}

CollectionItemStatusSelector.button({
super.key,
Expand Down Expand Up @@ -54,79 +84,3 @@ class CollectionItemStatusSelector extends StatefulWidget {
alignmentOffset = const Offset(0, -120);
}
}

class _CollectionItemStatusSelectorState
extends State<CollectionItemStatusSelector> {
final _menuControler = MenuController();
final _focusNode = FocusNode();

@override
void dispose() {
super.dispose();
_focusNode.dispose();
}

@override
Widget build(BuildContext context) {
return MenuAnchor(
controller: _menuControler,
builder: widget.anchorBuilder == null
? null
: (context, controller, child) {
final anchorBuilder = widget.anchorBuilder!;
return anchorBuilder(
context,
() {
if (controller.isOpen) {
controller.close();
} else {
_focusNode.requestFocus();
controller.open();
}
},
child,
);
},
alignmentOffset: widget.alignmentOffset,
menuChildren: [
BackButtonListener(
onBackButtonPressed: () async {
_menuControler.close();
return true;
},
child: FocusScope(
child: Column(
children: _statusMenuItems(context),
),
),
)
],
consumeOutsideTap: true,
);
}

List<Widget> _statusMenuItems(BuildContext context) {
return [
...MediaCollectionItemStatus.values
.where(
(e) =>
e != MediaCollectionItemStatus.none &&
e != widget.collectionItem.status,
)
.mapIndexed(
(index, e) => MenuItemButton(
focusNode: index == 0 ? _focusNode : null,
onPressed: () => widget.onSelect(e),
child: Text(statusMenuItemLabel(context, e)),
),
),
if (widget.collectionItem.status != MediaCollectionItemStatus.none)
MenuItemButton(
onPressed: () => widget.onSelect(MediaCollectionItemStatus.none),
child: Text(
statusMenuItemLabel(context, MediaCollectionItemStatus.none),
),
)
];
}
}
2 changes: 1 addition & 1 deletion lib/content/content_details_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ class ContentDetailsView extends ConsumerWidget {
);
}

return title;
return Focus(child: title);
}

List<Widget> _renderAdditionalInfo(BuildContext context) {
Expand Down
Loading

0 comments on commit 7c664ff

Please sign in to comment.