Files
PinePods-nix/PinePods-0.8.2/mobile/lib/ui/settings/bottom_bar_order.dart
2026-03-03 10:57:43 -05:00

128 lines
4.2 KiB
Dart

// Copyright 2020 Ben Hills and the project contributors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:pinepods_mobile/bloc/settings/settings_bloc.dart';
import 'package:pinepods_mobile/l10n/L.dart';
/// A widget that allows users to reorder the bottom navigation bar items
class BottomBarOrderWidget extends StatefulWidget {
const BottomBarOrderWidget({super.key});
@override
State<BottomBarOrderWidget> createState() => _BottomBarOrderWidgetState();
}
class _BottomBarOrderWidgetState extends State<BottomBarOrderWidget> {
late List<String> _currentOrder;
@override
void initState() {
super.initState();
final settingsBloc = Provider.of<SettingsBloc>(context, listen: false);
_currentOrder = List.from(settingsBloc.currentSettings.bottomBarOrder);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Reorganize Bottom Bar'),
actions: [
TextButton(
onPressed: () async {
final settingsBloc = Provider.of<SettingsBloc>(context, listen: false);
settingsBloc.setBottomBarOrder(_currentOrder);
// Show a brief confirmation
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Bottom bar order saved!'),
duration: Duration(seconds: 1),
),
);
// Small delay to let the user see the changes take effect
await Future.delayed(const Duration(milliseconds: 500));
if (mounted) {
Navigator.pop(context);
}
},
child: Text(
'Save',
style: TextStyle(color: Theme.of(context).colorScheme.primary),
),
),
],
),
body: Column(
children: [
Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
'Drag and drop to reorder the bottom navigation items. The first items will be easier to access.',
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: Theme.of(context).textTheme.bodySmall?.color,
),
),
),
Expanded(
child: ReorderableListView(
onReorder: (oldIndex, newIndex) {
setState(() {
if (newIndex > oldIndex) {
newIndex -= 1;
}
final item = _currentOrder.removeAt(oldIndex);
_currentOrder.insert(newIndex, item);
});
},
children: _currentOrder.map((item) {
return ListTile(
key: Key(item),
leading: Icon(_getIconForItem(item)),
title: Text(item),
trailing: const Icon(Icons.drag_handle),
);
}).toList(),
),
),
Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
children: [
Expanded(
child: ElevatedButton(
onPressed: () {
setState(() {
_currentOrder = ['Home', 'Feed', 'Saved', 'Podcasts', 'Downloads', 'History', 'Playlists', 'Search'];
});
},
child: const Text('Reset to Default'),
),
),
],
),
),
],
),
);
}
IconData _getIconForItem(String item) {
switch (item) {
case 'Home': return Icons.home;
case 'Feed': return Icons.rss_feed;
case 'Saved': return Icons.bookmark;
case 'Podcasts': return Icons.podcasts;
case 'Downloads': return Icons.download;
case 'History': return Icons.history;
case 'Playlists': return Icons.playlist_play;
case 'Search': return Icons.search;
default: return Icons.home;
}
}
}