Add Trash/Shares/Recent tabs, file sharing, Details sheet, and rebrand to Noo
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>
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
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())),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user