This commit is contained in:
@@ -10,6 +10,7 @@ import 'package:provider/provider.dart';
|
||||
import 'package:repertory/constants.dart' as constants;
|
||||
import 'package:repertory/models/auth.dart';
|
||||
import 'package:repertory/models/settings.dart';
|
||||
import 'package:repertory/widgets/app_dropdown.dart';
|
||||
import 'package:repertory/widgets/aurora_sweep.dart';
|
||||
import 'package:sodium_libs/sodium_libs.dart' show SecureKey, StringX;
|
||||
|
||||
@@ -414,16 +415,12 @@ Future<String?> editMountLocation(
|
||||
controller: controller,
|
||||
onChanged: (value) => setState(() => currentLocation = value),
|
||||
)
|
||||
: DropdownButton<String>(
|
||||
hint: const Text("Select drive"),
|
||||
: AppDropdownFormField<String>(
|
||||
labelText: "Select drive",
|
||||
labelOf: (s) => s,
|
||||
value: currentLocation,
|
||||
onChanged: (value) => setState(() => currentLocation = value),
|
||||
items: available.map<DropdownMenuItem<String>>((item) {
|
||||
return DropdownMenuItem<String>(
|
||||
value: item,
|
||||
child: Text(item),
|
||||
);
|
||||
}).toList(),
|
||||
values: available.toList(),
|
||||
),
|
||||
title: const Text('Mount Location', textAlign: TextAlign.center),
|
||||
);
|
||||
@@ -432,47 +429,49 @@ Future<String?> editMountLocation(
|
||||
);
|
||||
}
|
||||
|
||||
Scaffold createCommonScaffold(Widget child, {Widget? floatingActionButton}) =>
|
||||
Scaffold(
|
||||
body: SafeArea(
|
||||
child: Stack(
|
||||
children: [
|
||||
Container(
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
decoration: const BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.topLeft,
|
||||
end: Alignment.bottomRight,
|
||||
colors: constants.gradientColors,
|
||||
),
|
||||
),
|
||||
Scaffold createCommonScaffold(
|
||||
List<Widget> children, {
|
||||
Widget? floatingActionButton,
|
||||
}) => Scaffold(
|
||||
body: SafeArea(
|
||||
child: Stack(
|
||||
children: [
|
||||
Container(
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
decoration: const BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
begin: Alignment.topLeft,
|
||||
end: Alignment.bottomRight,
|
||||
colors: constants.gradientColors,
|
||||
),
|
||||
Consumer<Settings>(
|
||||
builder: (_, settings, _) =>
|
||||
AuroraSweep(enabled: settings.enableAnimations),
|
||||
),
|
||||
Positioned.fill(
|
||||
child: BackdropFilter(
|
||||
filter: ImageFilter.blur(sigmaX: 6, sigmaY: 6),
|
||||
child: Container(color: Colors.black.withValues(alpha: 0.06)),
|
||||
),
|
||||
),
|
||||
child,
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
floatingActionButton: floatingActionButton,
|
||||
);
|
||||
Consumer<Settings>(
|
||||
builder: (_, settings, _) =>
|
||||
AuroraSweep(enabled: settings.enableAnimations),
|
||||
),
|
||||
Positioned.fill(
|
||||
child: BackdropFilter(
|
||||
filter: ImageFilter.blur(sigmaX: 6, sigmaY: 6),
|
||||
child: Container(color: Colors.black.withValues(alpha: 0.06)),
|
||||
),
|
||||
),
|
||||
...children,
|
||||
],
|
||||
),
|
||||
),
|
||||
floatingActionButton: floatingActionButton,
|
||||
);
|
||||
|
||||
InputDecoration createCommonDecoration(
|
||||
ColorScheme colorScheme,
|
||||
String label,
|
||||
IconData icon, {
|
||||
String label, {
|
||||
IconData? icon,
|
||||
bool filled = true,
|
||||
}) => InputDecoration(
|
||||
labelText: label,
|
||||
prefixIcon: Icon(icon),
|
||||
prefixIcon: icon == null ? null : Icon(icon),
|
||||
filled: filled,
|
||||
fillColor: colorScheme.primary.withValues(alpha: constants.primaryAlpha),
|
||||
border: OutlineInputBorder(
|
||||
|
@@ -10,6 +10,7 @@ import 'package:repertory/models/auth.dart';
|
||||
import 'package:repertory/models/mount.dart';
|
||||
import 'package:repertory/models/mount_list.dart';
|
||||
import 'package:repertory/types/mount_config.dart';
|
||||
import 'package:repertory/widgets/app_dropdown.dart';
|
||||
import 'package:repertory/widgets/mount_settings.dart';
|
||||
|
||||
class AddMountScreen extends StatefulWidget {
|
||||
@@ -44,7 +45,7 @@ class _AddMountScreenState extends State<AddMountScreen> {
|
||||
final scheme = Theme.of(context).colorScheme;
|
||||
final textTheme = Theme.of(context).textTheme;
|
||||
|
||||
return createCommonScaffold(
|
||||
return createCommonScaffold([
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(constants.padding),
|
||||
child: Column(
|
||||
@@ -128,41 +129,21 @@ class _AddMountScreenState extends State<AddMountScreen> {
|
||||
],
|
||||
),
|
||||
const SizedBox(height: constants.padding),
|
||||
UnconstrainedBox(
|
||||
alignment: Alignment.centerLeft,
|
||||
child: IntrinsicWidth(
|
||||
stepWidth: 250.0,
|
||||
child: DropdownButtonFormField<String>(
|
||||
initialValue: _mountType.isEmpty ? null : _mountType,
|
||||
isExpanded: false,
|
||||
decoration: createCommonDecoration(
|
||||
scheme,
|
||||
"Provider Type",
|
||||
Icons.storage,
|
||||
),
|
||||
dropdownColor: scheme.primary.withValues(alpha: 0.8),
|
||||
style: textTheme.bodyMedium?.copyWith(
|
||||
color: scheme.onSurface.withValues(alpha: 0.96),
|
||||
),
|
||||
items: constants.providerTypeList.map((item) {
|
||||
return DropdownMenuItem<String>(
|
||||
value: item,
|
||||
child: Text(
|
||||
item,
|
||||
style: textTheme.bodyMedium?.copyWith(
|
||||
color: scheme.onSurface.withValues(alpha: 0.96),
|
||||
),
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
onChanged: (mountType) {
|
||||
_handleChange(
|
||||
Provider.of<Auth>(context, listen: false),
|
||||
mountType ?? '',
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
AppDropdownFormField<String>(
|
||||
labelText: 'Provider Type',
|
||||
prefixIcon: Icons.extension,
|
||||
values: constants.providerTypeList,
|
||||
value: _mountType.isEmpty ? null : _mountType,
|
||||
labelOf: (s) => s,
|
||||
onChanged: (mountType) {
|
||||
_handleChange(
|
||||
Provider.of<Auth>(context, listen: false),
|
||||
mountType ?? '',
|
||||
);
|
||||
},
|
||||
constrainToIntrinsic: true,
|
||||
widthMultiplier: 2.0,
|
||||
isExpanded: false,
|
||||
),
|
||||
if (_mountType.isNotEmpty && _mountType != 'Remote') ...[
|
||||
const SizedBox(height: constants.padding),
|
||||
@@ -180,7 +161,7 @@ class _AddMountScreenState extends State<AddMountScreen> {
|
||||
decoration: createCommonDecoration(
|
||||
scheme,
|
||||
'Configuration Name',
|
||||
Icons.drive_file_rename_outline,
|
||||
icon: Icons.drive_file_rename_outline,
|
||||
).copyWith(hintText: 'Enter a unique name'),
|
||||
),
|
||||
],
|
||||
@@ -324,7 +305,7 @@ class _AddMountScreenState extends State<AddMountScreen> {
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
]);
|
||||
}
|
||||
|
||||
void _handleChange(Auth auth, String mountType) {
|
||||
|
@@ -233,7 +233,7 @@ class _AuthScreenState extends State<AuthScreen> {
|
||||
decoration: createCommonDecoration(
|
||||
scheme,
|
||||
'Username',
|
||||
Icons.person,
|
||||
icon: Icons.person,
|
||||
),
|
||||
validator: (v) {
|
||||
if (v == null || v.trim().isEmpty) {
|
||||
@@ -255,7 +255,7 @@ class _AuthScreenState extends State<AuthScreen> {
|
||||
createCommonDecoration(
|
||||
scheme,
|
||||
'Password',
|
||||
Icons.lock,
|
||||
icon: Icons.lock,
|
||||
).copyWith(
|
||||
suffixIcon: IconButton(
|
||||
tooltip: _obscure
|
||||
|
@@ -27,7 +27,7 @@ class _EditMountScreenState extends State<EditMountScreen> {
|
||||
final scheme = Theme.of(context).colorScheme;
|
||||
final textTheme = Theme.of(context).textTheme;
|
||||
|
||||
return createCommonScaffold(
|
||||
return createCommonScaffold([
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
@@ -215,7 +215,7 @@ class _EditMountScreenState extends State<EditMountScreen> {
|
||||
const SizedBox(height: constants.padding),
|
||||
],
|
||||
),
|
||||
);
|
||||
]);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@@ -25,7 +25,7 @@ class _EditSettingsScreenState extends State<EditSettingsScreen> {
|
||||
final scheme = Theme.of(context).colorScheme;
|
||||
final textTheme = Theme.of(context).textTheme;
|
||||
|
||||
return createCommonScaffold(
|
||||
return createCommonScaffold([
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
@@ -174,7 +174,7 @@ class _EditSettingsScreenState extends State<EditSettingsScreen> {
|
||||
const SizedBox(height: constants.padding),
|
||||
],
|
||||
),
|
||||
);
|
||||
]);
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> _grabSettings() async {
|
||||
|
@@ -24,119 +24,128 @@ class _HomeScreeState extends State<HomeScreen> {
|
||||
final textTheme = Theme.of(context).textTheme;
|
||||
|
||||
return createCommonScaffold(
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
const SizedBox(height: constants.padding),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: constants.padding),
|
||||
child: Row(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Image.asset(
|
||||
'assets/images/repertory.png',
|
||||
fit: BoxFit.contain,
|
||||
errorBuilder: (_, _, _) {
|
||||
return Icon(
|
||||
Icons.folder,
|
||||
color: scheme.primary,
|
||||
size: 32,
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
const SizedBox(width: constants.padding),
|
||||
Expanded(
|
||||
child: Text(
|
||||
widget.title,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: textTheme.headlineSmall?.copyWith(
|
||||
fontWeight: FontWeight.w700,
|
||||
letterSpacing: 0.2,
|
||||
color: scheme.onSurface.withValues(alpha: 0.96),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: constants.padding),
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.circular(constants.borderRadius),
|
||||
child: BackdropFilter(
|
||||
filter: ImageFilter.blur(
|
||||
sigmaX: constants.borderRadius,
|
||||
sigmaY: constants.borderRadius,
|
||||
),
|
||||
child: Container(
|
||||
height: 40,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 6),
|
||||
decoration: BoxDecoration(
|
||||
color: scheme.surface.withValues(alpha: 0.40),
|
||||
borderRadius: BorderRadius.circular(
|
||||
constants.borderRadius,
|
||||
),
|
||||
border: Border.all(
|
||||
color: scheme.outlineVariant.withValues(alpha: 0.08),
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
const Text("Auto-start"),
|
||||
Consumer<Settings>(
|
||||
builder: (context, settings, _) {
|
||||
return IconButton(
|
||||
icon: Icon(
|
||||
settings.autoStart
|
||||
? Icons.toggle_on
|
||||
: Icons.toggle_off,
|
||||
),
|
||||
color: settings.autoStart
|
||||
? scheme.primary
|
||||
: scheme.onSurface.withValues(alpha: 0.70),
|
||||
onPressed: () =>
|
||||
settings.setAutoStart(!settings.autoStart),
|
||||
);
|
||||
},
|
||||
),
|
||||
IconButton(
|
||||
tooltip: 'Settings',
|
||||
icon: const Icon(Icons.settings),
|
||||
onPressed: () {
|
||||
Navigator.pushNamed(context, '/settings');
|
||||
},
|
||||
),
|
||||
Consumer<Auth>(
|
||||
builder: (context, auth, _) {
|
||||
return IconButton(
|
||||
tooltip: 'Log out',
|
||||
icon: const Icon(Icons.logout),
|
||||
onPressed: () {
|
||||
auth.logoff();
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: constants.padding),
|
||||
Expanded(
|
||||
child: Padding(
|
||||
[
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: [
|
||||
const SizedBox(height: constants.padding),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: constants.padding,
|
||||
),
|
||||
child: const MountListWidget(),
|
||||
child: Row(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Image.asset(
|
||||
'assets/images/repertory.png',
|
||||
fit: BoxFit.contain,
|
||||
errorBuilder: (_, _, _) {
|
||||
return Icon(
|
||||
Icons.folder,
|
||||
color: scheme.primary,
|
||||
size: 32,
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
const SizedBox(width: constants.padding),
|
||||
Expanded(
|
||||
child: Text(
|
||||
widget.title,
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: textTheme.headlineSmall?.copyWith(
|
||||
fontWeight: FontWeight.w700,
|
||||
letterSpacing: 0.2,
|
||||
color: scheme.onSurface.withValues(alpha: 0.96),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: constants.padding),
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.circular(constants.borderRadius),
|
||||
child: BackdropFilter(
|
||||
filter: ImageFilter.blur(
|
||||
sigmaX: constants.borderRadius,
|
||||
sigmaY: constants.borderRadius,
|
||||
),
|
||||
child: Container(
|
||||
height: 40,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 6),
|
||||
decoration: BoxDecoration(
|
||||
color: scheme.surface.withValues(alpha: 0.40),
|
||||
borderRadius: BorderRadius.circular(
|
||||
constants.borderRadius,
|
||||
),
|
||||
border: Border.all(
|
||||
color: scheme.outlineVariant.withValues(
|
||||
alpha: 0.08,
|
||||
),
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
const Text("Auto-start"),
|
||||
Consumer<Settings>(
|
||||
builder: (context, settings, _) {
|
||||
return IconButton(
|
||||
icon: Icon(
|
||||
settings.autoStart
|
||||
? Icons.toggle_on
|
||||
: Icons.toggle_off,
|
||||
),
|
||||
color: settings.autoStart
|
||||
? scheme.primary
|
||||
: scheme.onSurface.withValues(
|
||||
alpha: 0.70,
|
||||
),
|
||||
onPressed: () => settings.setAutoStart(
|
||||
!settings.autoStart,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
IconButton(
|
||||
tooltip: 'Settings',
|
||||
icon: const Icon(Icons.settings),
|
||||
onPressed: () {
|
||||
Navigator.pushNamed(context, '/settings');
|
||||
},
|
||||
),
|
||||
Consumer<Auth>(
|
||||
builder: (context, auth, _) {
|
||||
return IconButton(
|
||||
tooltip: 'Log out',
|
||||
icon: const Icon(Icons.logout),
|
||||
onPressed: () {
|
||||
auth.logoff();
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
const SizedBox(height: constants.padding),
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: constants.padding,
|
||||
),
|
||||
child: const MountListWidget(),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
floatingActionButton: Padding(
|
||||
padding: const EdgeInsets.all(constants.padding),
|
||||
child: Hero(
|
||||
|
Reference in New Issue
Block a user