1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-11-26 14:59:22 +00:00
comunicmobile/lib/ui/widgets/navbar_widget.dart

191 lines
4.9 KiB
Dart
Raw Normal View History

2019-07-01 09:51:23 +00:00
import 'package:comunic/utils/intl_utils.dart';
2019-11-01 13:17:46 +00:00
import 'package:comunic/utils/ui_utils.dart';
2019-07-01 09:51:23 +00:00
import 'package:flutter/material.dart';
/// Navigation bar widget
///
/// @author Pierre HUBERT
typedef OnSelectMenuAction = void Function(BarCallbackActions);
/// Callback actions
enum BarCallbackActions {
OPEN_NOTIFICATIONS,
2019-07-01 09:51:23 +00:00
OPEN_CONVERSATIONS,
OPEN_NEWEST_POSTS,
OPEN_FRIENDS,
OPEN_MY_PAGE,
2020-04-15 10:04:19 +00:00
OPEN_GROUPS,
2020-04-15 16:06:20 +00:00
OPEN_GROUP_PAGE,
2020-04-16 11:13:31 +00:00
OPEN_USER_PAGE,
2020-04-16 11:26:04 +00:00
OPEN_USER_ACCESS_DENIED_PAGE,
2019-11-01 08:59:22 +00:00
OPEN_APP_SETTINGS,
2020-04-16 11:13:31 +00:00
OPEN_USER_FRIENDS_LIST,
2020-04-16 07:29:37 +00:00
OPEN_ABOUT_DIALOG,
2019-07-01 09:51:23 +00:00
NONE,
ACTION_LOGOUT
}
2019-11-01 13:17:46 +00:00
Color _primaryColor() => darkTheme() ? Colors.black : Colors.blue;
2019-11-01 13:17:46 +00:00
Color _secondaryColor() => darkTheme() ? darkAccentColor : Colors.white;
2019-07-01 09:51:23 +00:00
/// Menu item information
class _MenuItem {
final String label;
final Widget icon;
final BarCallbackActions action;
final bool isMenu;
2019-11-01 08:59:22 +00:00
const _MenuItem({
@required this.label,
@required this.icon,
@required this.action,
this.isMenu = false,
}) : assert(label != null),
2019-07-01 09:51:23 +00:00
assert(icon != null || isMenu),
assert(action != null),
assert(isMenu != null);
}
/// Item of action menu
class _ActionMenuItem {
final String label;
final BarCallbackActions action;
const _ActionMenuItem({@required this.label, @required this.action})
: assert(label != null),
assert(action != null);
}
2019-07-01 09:51:23 +00:00
/// List of menu items to show
final _menuItems = <_MenuItem>[
_MenuItem(
label: tr("Notifications"),
icon: Icon(Icons.notifications),
action: BarCallbackActions.OPEN_NOTIFICATIONS),
2019-07-01 09:51:23 +00:00
_MenuItem(
label: tr("Conversations"),
icon: Icon(Icons.comment),
action: BarCallbackActions.OPEN_CONVERSATIONS),
_MenuItem(
label: tr("Newest"),
icon: Icon(Icons.refresh),
action: BarCallbackActions.OPEN_NEWEST_POSTS),
_MenuItem(
label: tr("Friends"),
icon: Icon(Icons.group),
action: BarCallbackActions.OPEN_FRIENDS),
_MenuItem(
label: tr("Menu"),
icon: Icon(Icons.more_vert),
isMenu: true,
action: BarCallbackActions.NONE)
];
/// List of menu actions items
final _menuActionsItem = <_ActionMenuItem>[
_ActionMenuItem(
label: tr("My Page"), action: BarCallbackActions.OPEN_MY_PAGE),
2020-04-15 10:04:19 +00:00
_ActionMenuItem(label: tr("Groups"), action: BarCallbackActions.OPEN_GROUPS),
2019-11-01 08:59:22 +00:00
_ActionMenuItem(
label: tr("App settings"), action: BarCallbackActions.OPEN_APP_SETTINGS),
2020-04-16 07:29:37 +00:00
_ActionMenuItem(
label: tr("About Comunic"), action: BarCallbackActions.OPEN_ABOUT_DIALOG),
_ActionMenuItem(
label: tr("Sign out"), action: BarCallbackActions.ACTION_LOGOUT),
];
2019-07-01 09:51:23 +00:00
/// Public widget
class ComunicAppBar extends StatelessWidget implements PreferredSizeWidget {
final OnSelectMenuAction onTap;
final BarCallbackActions selectedAction;
const ComunicAppBar(
{Key key, @required this.onTap, @required this.selectedAction})
: assert(onTap != null),
super(key: key);
@override
Widget build(BuildContext context) {
return Material(
2019-11-01 13:17:46 +00:00
color: darkTheme() ? Colors.black : Colors.blue,
2019-07-01 09:51:23 +00:00
child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: List.generate(
_menuItems.length,
(i) => _MenuItemWidget(
2019-11-01 08:59:22 +00:00
item: _menuItems[i],
onTap: onTap,
isSelected: _menuItems[i].action == selectedAction,
),
2019-07-01 09:51:23 +00:00
),
),
);
}
@override
2019-11-02 13:02:38 +00:00
Size get preferredSize => Size.fromHeight(40);
2019-07-01 09:51:23 +00:00
}
/// The [Widget] part of a menu item
class _MenuItemWidget extends StatelessWidget {
final _MenuItem item;
final OnSelectMenuAction onTap;
final bool isSelected;
const _MenuItemWidget(
{Key key,
@required this.item,
@required this.onTap,
@required this.isSelected})
: assert(item != null),
assert(onTap != null),
assert(isSelected != null),
super(key: key);
@override
Widget build(BuildContext context) {
assert(debugCheckHasMaterial(context));
return Expanded(
child: Material(
2019-11-01 13:17:46 +00:00
color: isSelected ? _secondaryColor() : _primaryColor(),
2019-07-01 09:51:23 +00:00
child: !item.isMenu
? InkWell(
child: _buildIconContainer(),
onTap: () => onTap(item.action),
)
: _buildContextMenuPopupButton(),
),
);
}
Widget _buildIconContainer() {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
IconTheme(
data: IconThemeData(
2019-11-01 13:17:46 +00:00
color: isSelected ? _primaryColor() : _secondaryColor()),
2019-07-01 09:51:23 +00:00
child: item.icon,
)
],
);
}
// Build context menu
Widget _buildContextMenuPopupButton() {
return PopupMenuButton<BarCallbackActions>(
child: _buildIconContainer(),
itemBuilder: (i) => _menuActionsItem
.map((f) => PopupMenuItem(
child: Text(f.label),
value: f.action,
))
.toList(),
2019-07-01 09:51:23 +00:00
onSelected: onTap,
);
}
}