Major additions since the initial rebuild: - New tabs: Trash, Shares, Recent, configurable tab visibility/order/default - Nextcloud sharing: search users/teams, internal link, email shares, public links, "others with access" - in its own Share bottom sheet - Details bottom sheet (Info/Versions/Activity) with a persistent peek panel in the media viewer, reachable from selection, swipe, and the media viewer - Files/Photos: tap-and-hold multi-select with a sticky selection toolbar, swipe actions (favorite/delete/share), sticky sort/filter controls, list/grid views, breadcrumb chips, whole-account Photos view - Media viewer: pinch/double-tap zoom on images, predictive-back support, fixed PDF zoom-out floor - Settings: Material You theming incl. AMOLED black, configurable bottom bar tabs, swipe actions, media seek bar style, and folder-listing cache policy (never/periodic/manual) to cut down on refetching - Login flow moved to an in-app Chrome Custom Tab with retry-tolerant polling - Replaced ad hoc widgets with native Material 3 equivalents (toggle IconButtons, SliverAppBar selection toolbar, SearchBar, drag handles) - Rebrand: app renamed to Noo throughout, package id -> dev.ayushya.noo, new adaptive launcher icon Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
51 lines
1.5 KiB
Dart
51 lines
1.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:provider/provider.dart';
|
|
import '../models/app_tab.dart';
|
|
import '../providers/server_provider.dart';
|
|
import 'app_tab_view_builder.dart';
|
|
|
|
/// Opens a tab that's currently hidden from the bottom nav bar as its own
|
|
/// standalone screen. Shown in every tab's toolbar (not just Files) so
|
|
/// hidden destinations stay reachable no matter which tab is active.
|
|
/// Always visible; dims/disables itself when nothing is hidden.
|
|
class MoreTabsButton extends StatelessWidget {
|
|
const MoreTabsButton({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final provider = context.watch<ServerProvider>();
|
|
|
|
return PopupMenuButton<AppTab>(
|
|
icon: const Icon(Icons.apps_rounded),
|
|
tooltip: 'More tabs',
|
|
enabled: provider.hiddenTabs.isNotEmpty,
|
|
onSelected: (tab) => _openHiddenTab(context, tab),
|
|
itemBuilder: (context) => [
|
|
for (final tab in provider.tabOrder.where(
|
|
(t) => provider.hiddenTabs.contains(t),
|
|
))
|
|
PopupMenuItem(
|
|
value: tab,
|
|
child: Row(
|
|
children: [
|
|
Icon(tab.icon, size: 20),
|
|
const SizedBox(width: 12),
|
|
Text(tab.label),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
void _openHiddenTab(BuildContext context, AppTab tab) {
|
|
Navigator.push(
|
|
context,
|
|
MaterialPageRoute(
|
|
builder: (_) =>
|
|
Scaffold(body: buildAppTabView(tab, ScrollController())),
|
|
),
|
|
);
|
|
}
|
|
}
|