From 13fbbeda118a8e1db0bba00cb657b3cba333d75c Mon Sep 17 00:00:00 2001 From: kolo Date: Sun, 29 Mar 2026 14:59:51 +0300 Subject: [PATCH] stableee --- lib/features/add_transaction/screen.dart | 168 +++++-- .../add_transaction/widgets/account_row.dart | 25 +- .../widgets/color_editor_overlay.dart | 420 ++++++++++-------- 3 files changed, 362 insertions(+), 251 deletions(-) diff --git a/lib/features/add_transaction/screen.dart b/lib/features/add_transaction/screen.dart index 7f7836b..85e7a6a 100644 --- a/lib/features/add_transaction/screen.dart +++ b/lib/features/add_transaction/screen.dart @@ -51,6 +51,8 @@ class _AddTransactionScreenState extends ConsumerState bool _showToAccountDropdown = false; String? _toAccountError; String? _fromAccountError; + String? _transferExpenseRecordId; + String? _transferIncomeRecordId; @override void initState() { @@ -82,22 +84,59 @@ class _AddTransactionScreenState extends ConsumerState if (widget.initial!.category == 'Transfer') { WidgetsBinding.instance.addPostFrameCallback((_) { final allTxs = ref.read(transactionsProvider).valueOrNull ?? []; - final counterpart = allTxs.firstWhereOrNull( - (t) => - t.category == 'Transfer' && - t.type == TransactionType.income && - t.amount == widget.initial!.amount && - t.date.year == widget.initial!.date.year && - t.date.month == widget.initial!.date.month && - t.date.day == widget.initial!.date.day && - t.date.hour == widget.initial!.date.hour && - t.date.minute == widget.initial!.date.minute && - t.note == widget.initial!.note, - ); - if (counterpart != null) { - ref - .read(addTransactionProvider(widget.initial).notifier) - .setToAccountId(counterpart.accountId); + + if (widget.initial!.type == TransactionType.expense) { + // widget.initial IS the expense side — find income counterpart for To + final counterpart = allTxs.firstWhereOrNull( + (t) => + t.id != widget.initial!.id && + t.category == 'Transfer' && + t.type == TransactionType.income && + t.amount == widget.initial!.amount && + t.date.year == widget.initial!.date.year && + t.date.month == widget.initial!.date.month && + t.date.day == widget.initial!.date.day && + t.date.hour == widget.initial!.date.hour && + t.date.minute == widget.initial!.date.minute && + t.note == widget.initial!.note, + ); + if (counterpart != null) { + ref + .read(addTransactionProvider(widget.initial).notifier) + .setToAccountId(counterpart.accountId); + } + setState(() { + _transferExpenseRecordId = widget.initial!.id; + _transferIncomeRecordId = counterpart?.id; + }); + } else { + // widget.initial IS the income side — find expense counterpart + final expenseRecord = allTxs.firstWhereOrNull( + (t) => + t.id != widget.initial!.id && + t.category == 'Transfer' && + t.type == TransactionType.expense && + t.amount == widget.initial!.amount && + t.date.year == widget.initial!.date.year && + t.date.month == widget.initial!.date.month && + t.date.day == widget.initial!.date.day && + t.date.hour == widget.initial!.date.hour && + t.date.minute == widget.initial!.date.minute && + t.note == widget.initial!.note, + ); + if (expenseRecord != null) { + // Swap: From = expense account, To = this income account + ref + .read(addTransactionProvider(widget.initial).notifier) + .setAccountId(expenseRecord.accountId); + ref + .read(addTransactionProvider(widget.initial).notifier) + .setToAccountId(widget.initial!.accountId); + } + setState(() { + _transferExpenseRecordId = expenseRecord?.id; + _transferIncomeRecordId = widget.initial!.id; + }); } }); } @@ -235,9 +274,9 @@ class _AddTransactionScreenState extends ConsumerState if (state.isEditing) { // Update both sides of the transfer pair - // Update the expense side (widget.initial = expense record) + // Update the expense side final updatedExpense = Transaction( - id: widget.initial!.id, + id: _transferExpenseRecordId ?? widget.initial!.id, amount: amount, category: 'Transfer', type: TransactionType.expense, @@ -245,30 +284,14 @@ class _AddTransactionScreenState extends ConsumerState note: note, currency: currency, currencyCode: currencyCode, - accountId: widget.initial!.accountId, // locked, unchanged + accountId: state.selectedAccountId!, // from initState ); await ref.read(transactionsProvider.notifier).update(updatedExpense); - // Find and update the income counterpart - final allTxs = ref.read(transactionsProvider).valueOrNull ?? []; - final counterpart = allTxs.firstWhereOrNull( - (t) => - t.category == 'Transfer' && - t.type == TransactionType.income && - t.accountId == state.toAccountId && - t.amount == - widget.initial!.amount && // match by original amount - t.date.year == widget.initial!.date.year && - t.date.month == widget.initial!.date.month && - t.date.day == widget.initial!.date.day && - t.date.hour == widget.initial!.date.hour && - t.date.minute == widget.initial!.date.minute && - t.note == widget.initial!.note, - ); - - if (counterpart != null) { + // Update the income side + if (_transferIncomeRecordId != null) { final updatedIncome = Transaction( - id: counterpart.id, + id: _transferIncomeRecordId!, amount: amount, // updated amount category: 'Transfer', type: TransactionType.income, @@ -276,7 +299,7 @@ class _AddTransactionScreenState extends ConsumerState note: note, currency: currency, // updated currency currencyCode: currencyCode, - accountId: counterpart.accountId, // locked, unchanged + accountId: state.toAccountId!, // from initState ); await ref.read(transactionsProvider.notifier).update(updatedIncome); } @@ -458,7 +481,8 @@ class _AddTransactionScreenState extends ConsumerState final activeAccount = ref.watch(activeAccountProvider); final isTransfer = state.type == TransactionType.transfer; final isEditingTransfer = isEditing && isTransfer; - final isAccountLocked = activeAccount != null || isEditingTransfer; + final isFromAccountLocked = activeAccount != null || isTransfer; + final isToAccountLocked = isEditingTransfer; return Scaffold( backgroundColor: Theme.of(context).scaffoldBackgroundColor, @@ -485,12 +509,60 @@ class _AddTransactionScreenState extends ConsumerState child: Text(s.cancel), ), TextButton( - onPressed: () { - ref + onPressed: () async { + Navigator.pop(ctx); + + // Always delete the record we were given + await ref .read(transactionsProvider.notifier) .delete(widget.initial!.id); - Navigator.pop(ctx); - context.pop(); + + // If this is a Transfer, also delete the counterpart + if (widget.initial!.category == 'Transfer') { + // Use the pre-populated IDs from initState if available + final counterpartId = + widget.initial!.type == TransactionType.expense + ? _transferIncomeRecordId + : _transferExpenseRecordId; + + if (counterpartId != null) { + await ref + .read(transactionsProvider.notifier) + .delete(counterpartId); + } else { + // Fallback: search manually + final allTxs = + ref.read(transactionsProvider).valueOrNull ?? + []; + final oppositeType = + widget.initial!.type == + TransactionType.expense + ? TransactionType.income + : TransactionType.expense; + final counterpart = allTxs.firstWhereOrNull( + (t) => + t.id != widget.initial!.id && + t.category == 'Transfer' && + t.type == oppositeType && + t.amount == widget.initial!.amount && + t.date.year == widget.initial!.date.year && + t.date.month == + widget.initial!.date.month && + t.date.day == widget.initial!.date.day && + t.date.hour == widget.initial!.date.hour && + t.date.minute == + widget.initial!.date.minute && + t.note == widget.initial!.note, + ); + if (counterpart != null) { + await ref + .read(transactionsProvider.notifier) + .delete(counterpart.id); + } + } + } + + if (mounted) context.pop(); }, style: TextButton.styleFrom( foregroundColor: const Color(0xFFE05C6B), @@ -544,7 +616,8 @@ class _AddTransactionScreenState extends ConsumerState fromAccountError: _fromAccountError, toAccountError: _toAccountError, isDark: isDark, - isAccountLocked: isAccountLocked, + isFromAccountLocked: isFromAccountLocked, + isToAccountLocked: isToAccountLocked, ), if (isTransfer) const SizedBox(height: 24), @@ -586,7 +659,7 @@ class _AddTransactionScreenState extends ConsumerState }), indicatorKey: _fromAccountIndicatorKey, isDark: isDark, - isLocked: isAccountLocked, + isLocked: isFromAccountLocked, ), ], ], @@ -767,8 +840,9 @@ class _InlineAccountSelector extends ConsumerWidget { onTap: onToggleDropdown, child: Container( key: indicatorKey, + constraints: const BoxConstraints(minWidth: 130), padding: const EdgeInsets.symmetric( - horizontal: 14, + horizontal: 16, vertical: 16, ), decoration: BoxDecoration( diff --git a/lib/features/add_transaction/widgets/account_row.dart b/lib/features/add_transaction/widgets/account_row.dart index 4a6b3ac..e65ed30 100644 --- a/lib/features/add_transaction/widgets/account_row.dart +++ b/lib/features/add_transaction/widgets/account_row.dart @@ -16,7 +16,8 @@ class AccountRow extends ConsumerWidget { final String? fromAccountError; final String? toAccountError; final bool isDark; - final bool isAccountLocked; + final bool isFromAccountLocked; + final bool isToAccountLocked; const AccountRow({ super.key, @@ -30,7 +31,8 @@ class AccountRow extends ConsumerWidget { this.fromAccountError, this.toAccountError, required this.isDark, - this.isAccountLocked = false, + this.isFromAccountLocked = false, + this.isToAccountLocked = false, }); @override @@ -81,7 +83,8 @@ class AccountRow extends ConsumerWidget { fromAccountError: fromAccountError, toAccountError: toAccountError, isDark: isDark, - isAccountLocked: isAccountLocked, + isFromAccountLocked: isFromAccountLocked, + isToAccountLocked: isToAccountLocked, ) else _SingleAccountSelector( @@ -229,7 +232,8 @@ class _TransferAccountRow extends ConsumerWidget { final String? fromAccountError; final String? toAccountError; final bool isDark; - final bool isAccountLocked; + final bool isFromAccountLocked; + final bool isToAccountLocked; const _TransferAccountRow({ required this.initial, @@ -243,7 +247,8 @@ class _TransferAccountRow extends ConsumerWidget { this.fromAccountError, this.toAccountError, required this.isDark, - this.isAccountLocked = false, + this.isFromAccountLocked = false, + this.isToAccountLocked = false, }); @override @@ -290,11 +295,11 @@ class _TransferAccountRow extends ConsumerWidget { account: fromAccount, label: 'From', showDropdown: showFromDropdown, - onToggle: isAccountLocked ? null : onToggleFromDropdown, + onToggle: isFromAccountLocked ? null : onToggleFromDropdown, indicatorKey: fromIndicatorKey, error: fromAccountError, isDark: isDark, - disabled: isAccountLocked, + disabled: isFromAccountLocked, ), ), Padding( @@ -310,11 +315,13 @@ class _TransferAccountRow extends ConsumerWidget { account: toAccount, label: 'To', showDropdown: showToDropdown, - onToggle: autoSelectEnabled ? null : onToggleToDropdown, + onToggle: (autoSelectEnabled || isToAccountLocked) + ? null + : onToggleToDropdown, indicatorKey: toIndicatorKey, error: toAccountError, isDark: isDark, - disabled: autoSelectEnabled, + disabled: autoSelectEnabled || isToAccountLocked, ), ), ], diff --git a/lib/features/dashboard/widgets/color_editor_overlay.dart b/lib/features/dashboard/widgets/color_editor_overlay.dart index 0484a3e..47c3c5c 100644 --- a/lib/features/dashboard/widgets/color_editor_overlay.dart +++ b/lib/features/dashboard/widgets/color_editor_overlay.dart @@ -66,22 +66,21 @@ class _FullScreenBlurOverlayState extends State { child: SizedBox( height: cardHeight, child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Consumer( - builder: (ctx, ref, _) => BalanceCard( - balance: ref.read(totalBalanceProvider), - currencyInfo: ref.read(currencyProvider), - onLongPress: null, - previewPrimary: dash.tempPrimary, - previewSecondary: dash.tempSecondary, - previewGradientType: Theme.of(widget.context) - .brightness == - Brightness.dark - ? dash.tempDarkGradientType - : dash.tempLightGradientType, - ), + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Consumer( + builder: (ctx, ref, _) => BalanceCard( + balance: ref.read(totalBalanceProvider), + currencyInfo: ref.read(currencyProvider), + onLongPress: null, + previewPrimary: dash.tempPrimary, + previewSecondary: dash.tempSecondary, + previewGradientType: + Theme.of(widget.context).brightness == Brightness.dark + ? dash.tempDarkGradientType + : dash.tempLightGradientType, ), ), + ), ), ), ), @@ -97,30 +96,34 @@ class _FullScreenBlurOverlayState extends State { ), // Close Button - Top Right Positioned( - top: mq.padding.top + 8, + top: mq.padding.top + (kToolbarHeight / 2) - 20, right: 20, - child: SafeArea( - child: GestureDetector( - onTap: () => dash.closeOverlay(apply: false), - child: Container( - width: 40, - height: 40, - decoration: BoxDecoration( - color: Theme.of(widget.context).colorScheme.surface, - shape: BoxShape.circle, - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.3), - blurRadius: 8, - offset: const Offset(0, 2), - ), - ], - ), - child: Icon( - Icons.close_rounded, - size: 24, - color: Theme.of(widget.context).colorScheme.onSurface, + child: GestureDetector( + onTap: () => dash.closeOverlay(apply: false), + child: Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: Theme.of(widget.context).colorScheme.surface, + shape: BoxShape.circle, + border: Border.all( + color: Theme.of( + widget.context, + ).colorScheme.onSurface.withOpacity(0.15), + width: 1.5, ), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + blurRadius: 8, + offset: const Offset(0, 2), + ), + ], + ), + child: Icon( + Icons.close_rounded, + size: 24, + color: Theme.of(widget.context).colorScheme.onSurface, ), ), ), @@ -137,7 +140,9 @@ class _FullScreenBlurOverlayState extends State { color: Theme.of(widget.context).colorScheme.surface, borderRadius: BorderRadius.circular(20), border: Border.all( - color: Theme.of(widget.context).colorScheme.onSurface.withOpacity(0.1), + color: Theme.of( + widget.context, + ).colorScheme.onSurface.withOpacity(0.1), width: 1.5, ), boxShadow: [ @@ -153,7 +158,7 @@ class _FullScreenBlurOverlayState extends State { final s = AppStrings( ProviderScope.containerOf(widget.context).read(localeProvider), ); - + void onHSVChanged(HSVColor hsv) { setPanelState(() {}); dash.setState(() { @@ -170,8 +175,8 @@ class _FullScreenBlurOverlayState extends State { final activeGradientType = Theme.of(widget.context).brightness == Brightness.dark - ? dash.tempDarkGradientType - : dash.tempLightGradientType; + ? dash.tempDarkGradientType + : dash.tempLightGradientType; final isSolid = activeGradientType == GradientType.solid; final currentHSV = (isSolid || dash.editingPrimary) ? dash.tempPrimaryHSV @@ -191,10 +196,9 @@ class _FullScreenBlurOverlayState extends State { label: s.colorPrimary, isSelected: dash.editingPrimary && !isSolid, color: isSolid - ? Theme.of(widget.context) - .colorScheme - .onSurface - .withOpacity(0.12) + ? Theme.of( + widget.context, + ).colorScheme.onSurface.withOpacity(0.12) : dash.tempPrimary, isDimmed: isSolid, onTap: () { @@ -246,31 +250,36 @@ class _FullScreenBlurOverlayState extends State { padding: const EdgeInsets.symmetric(horizontal: 8), child: Container( width: 1, - color: Theme.of(widget.context) - .colorScheme - .onSurface - .withOpacity(0.15), + color: Theme.of( + widget.context, + ).colorScheme.onSurface.withOpacity(0.15), margin: const EdgeInsets.symmetric(vertical: 4), ), ), GestureDetector( - onTap: isSolid ? null : () { - dash.setState(() { - if (Theme.of(widget.context).brightness == - Brightness.dark) { - dash.tempDarkGradientType = GradientType.solid; - } else { - dash.tempLightGradientType = GradientType.solid; - } - dash.editingPrimary = true; - }); - setPanelState(() {}); - dash.overlayEntry?.markNeedsBuild(); - }, + onTap: isSolid + ? null + : () { + dash.setState(() { + if (Theme.of(widget.context).brightness == + Brightness.dark) { + dash.tempDarkGradientType = + GradientType.solid; + } else { + dash.tempLightGradientType = + GradientType.solid; + } + dash.editingPrimary = true; + }); + setPanelState(() {}); + dash.overlayEntry?.markNeedsBuild(); + }, child: Container( height: double.infinity, padding: const EdgeInsets.symmetric( - horizontal: 10, vertical: 6), + horizontal: 10, + vertical: 6, + ), decoration: BoxDecoration( color: isSolid ? const Color(0xFF7C6DED).withOpacity(0.15) @@ -279,10 +288,9 @@ class _FullScreenBlurOverlayState extends State { border: Border.all( color: isSolid ? const Color(0xFF7C6DED) - : Theme.of(widget.context) - .colorScheme - .onSurface - .withOpacity(0.2), + : Theme.of( + widget.context, + ).colorScheme.onSurface.withOpacity(0.2), width: 1.5, ), ), @@ -297,8 +305,8 @@ class _FullScreenBlurOverlayState extends State { color: dash.tempPrimary, shape: BoxShape.circle, border: Border.all( - color: Theme.of(widget.context) - .brightness == + color: + Theme.of(widget.context).brightness == Brightness.dark ? Colors.white30 : Colors.black12, @@ -321,9 +329,9 @@ class _FullScreenBlurOverlayState extends State { color: isSolid ? const Color(0xFF7C6DED) : Theme.of(widget.context) - .colorScheme - .onSurface - .withOpacity(0.5), + .colorScheme + .onSurface + .withOpacity(0.5), ), ), ), @@ -339,9 +347,8 @@ class _FullScreenBlurOverlayState extends State { child: LayoutBuilder( builder: (lbCtx, constraints) { const reservedBelow = 78.0; - final spectrumH = - (constraints.maxHeight - reservedBelow).clamp( - 40.0, double.infinity); + final spectrumH = (constraints.maxHeight - reservedBelow) + .clamp(40.0, double.infinity); return Column( mainAxisSize: MainAxisSize.min, @@ -360,7 +367,7 @@ class _FullScreenBlurOverlayState extends State { ), const SizedBox(height: 8), SizedBox( - height: 36, // + height: 36, // child: ColorPickerSlider( TrackType.hue, currentHSV, @@ -381,7 +388,8 @@ class _FullScreenBlurOverlayState extends State { GestureDetector( onTap: () { dash.setState( - () => dash.editingPrimary = true); + () => dash.editingPrimary = true, + ); setPanelState(() {}); dash.overlayEntry?.markNeedsBuild(); }, @@ -398,10 +406,12 @@ class _FullScreenBlurOverlayState extends State { border: dash.editingPrimary ? Border.all( color: Colors.white, - width: 2) + width: 2, + ) : Border.all( color: Colors.transparent, - width: 2), + width: 2, + ), ), ), const SizedBox(width: 5), @@ -417,9 +427,10 @@ class _FullScreenBlurOverlayState extends State { .colorScheme .onSurface .withOpacity( - dash.editingPrimary - ? 0.8 - : 0.4), + dash.editingPrimary + ? 0.8 + : 0.4, + ), ), ), ], @@ -429,8 +440,9 @@ class _FullScreenBlurOverlayState extends State { if (!isSolid) GestureDetector( onTap: () { - dash.setState(() => - dash.editingPrimary = false); + dash.setState( + () => dash.editingPrimary = false, + ); setPanelState(() {}); dash.overlayEntry?.markNeedsBuild(); }, @@ -449,9 +461,10 @@ class _FullScreenBlurOverlayState extends State { .colorScheme .onSurface .withOpacity( - !dash.editingPrimary - ? 0.8 - : 0.4), + !dash.editingPrimary + ? 0.8 + : 0.4, + ), ), ), const SizedBox(width: 5), @@ -465,11 +478,13 @@ class _FullScreenBlurOverlayState extends State { border: !dash.editingPrimary ? Border.all( color: Colors.white, - width: 2) + width: 2, + ) : Border.all( color: Colors.transparent, - width: 2), + width: 2, + ), ), ), ], @@ -495,92 +510,99 @@ class _FullScreenBlurOverlayState extends State { children: GradientType.values .where((t) => t != GradientType.solid) .map((type) { - final isSelected = activeGradientType == type; - final label = switch (type) { - GradientType.linear => s.gradientLinear, - GradientType.linearReverse => s.gradientReverse, - GradientType.radial => s.gradientRadial, - GradientType.sweep => s.gradientSweep, - GradientType.solid => '', - }; - final icon = switch (type) { - GradientType.linear => Icons.trending_flat_rounded, - GradientType.linearReverse => - Icons.swap_horiz_rounded, - GradientType.radial => Icons.blur_circular_rounded, - GradientType.sweep => Icons.rotate_right_rounded, - GradientType.solid => Icons.square_rounded, - }; - return Expanded( - child: Padding( - padding: const EdgeInsets.only(right: 6), - child: GestureDetector( - onTap: () { - dash.setState(() { - if (Theme.of(widget.context).brightness == - Brightness.dark) { - dash.tempDarkGradientType = type; - } else { - dash.tempLightGradientType = type; - } - }); - setPanelState(() {}); - dash.overlayEntry?.markNeedsBuild(); - }, - child: AnimatedContainer( - duration: const Duration(milliseconds: 150), - padding: - const EdgeInsets.symmetric(vertical: 5), - decoration: BoxDecoration( - color: isSelected - ? const Color(0xFF7C6DED) - .withOpacity(0.15) - : Theme.of(widget.context) - .colorScheme - .onSurface - .withOpacity(0.05), - borderRadius: BorderRadius.circular(8), - border: Border.all( - color: isSelected - ? const Color(0xFF7C6DED) - : Colors.transparent, - width: 1.5, - ), - ), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(icon, - size: 15, - color: isSelected - ? const Color(0xFF7C6DED) - : Theme.of(widget.context) + final isSelected = activeGradientType == type; + final label = switch (type) { + GradientType.linear => s.gradientLinear, + GradientType.linearReverse => s.gradientReverse, + GradientType.radial => s.gradientRadial, + GradientType.sweep => s.gradientSweep, + GradientType.solid => '', + }; + final icon = switch (type) { + GradientType.linear => + Icons.trending_flat_rounded, + GradientType.linearReverse => + Icons.swap_horiz_rounded, + GradientType.radial => + Icons.blur_circular_rounded, + GradientType.sweep => Icons.rotate_right_rounded, + GradientType.solid => Icons.square_rounded, + }; + return Expanded( + child: Padding( + padding: const EdgeInsets.only(right: 6), + child: GestureDetector( + onTap: () { + dash.setState(() { + if (Theme.of(widget.context).brightness == + Brightness.dark) { + dash.tempDarkGradientType = type; + } else { + dash.tempLightGradientType = type; + } + }); + setPanelState(() {}); + dash.overlayEntry?.markNeedsBuild(); + }, + child: AnimatedContainer( + duration: const Duration(milliseconds: 150), + padding: const EdgeInsets.symmetric( + vertical: 5, + ), + decoration: BoxDecoration( + color: isSelected + ? const Color( + 0xFF7C6DED, + ).withOpacity(0.15) + : Theme.of(widget.context) .colorScheme .onSurface - .withOpacity(0.45)), - const SizedBox(height: 2), - Text( - label, - style: TextStyle( - fontSize: 9, - fontWeight: isSelected - ? FontWeight.w600 - : FontWeight.normal, + .withOpacity(0.05), + borderRadius: BorderRadius.circular(8), + border: Border.all( color: isSelected ? const Color(0xFF7C6DED) - : Theme.of(widget.context) - .colorScheme - .onSurface - .withOpacity(0.45), + : Colors.transparent, + width: 1.5, ), ), - ], + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + icon, + size: 15, + color: isSelected + ? const Color(0xFF7C6DED) + : Theme.of(widget.context) + .colorScheme + .onSurface + .withOpacity(0.45), + ), + const SizedBox(height: 2), + Text( + label, + style: TextStyle( + fontSize: 9, + fontWeight: isSelected + ? FontWeight.w600 + : FontWeight.normal, + color: isSelected + ? const Color(0xFF7C6DED) + : Theme.of(widget.context) + .colorScheme + .onSurface + .withOpacity(0.45), + ), + ), + ], + ), + ), ), ), - ), - ), - ); - }).toList(), + ); + }) + .toList(), ), ), ), @@ -592,7 +614,7 @@ class _FullScreenBlurOverlayState extends State { onPressed: () { final isDarkTheme = Theme.of(widget.context).brightness == - Brightness.dark; + Brightness.dark; final defP = isDarkTheme ? CardColorService.defaultPrimary : CardColorService.defaultPrimaryLight; @@ -604,31 +626,32 @@ class _FullScreenBlurOverlayState extends State { dash.tempSecondary = defS; dash.tempPrimaryHSV = HSVColor.fromColor(defP); dash.tempSecondaryHSV = HSVColor.fromColor(defS); - dash.tempLightGradientType = - CardColorService.defaultGradientLight; - dash.tempDarkGradientType = - CardColorService.defaultGradientDark; + dash.tempLightGradientType = + CardColorService.defaultGradientLight; + dash.tempDarkGradientType = + CardColorService.defaultGradientDark; }); setPanelState(() {}); dash.overlayEntry?.markNeedsBuild(); }, icon: const Icon(Icons.restart_alt_rounded, size: 15), - label: Text(s.reset, - style: const TextStyle(fontSize: 13)), + label: Text( + s.reset, + style: const TextStyle(fontSize: 13), + ), style: OutlinedButton.styleFrom( - foregroundColor: Theme.of(widget.context) - .colorScheme - .onSurface - .withOpacity(0.7), + foregroundColor: Theme.of( + widget.context, + ).colorScheme.onSurface.withOpacity(0.7), side: BorderSide( - color: Theme.of(widget.context) - .colorScheme - .onSurface - .withOpacity(0.2), + color: Theme.of( + widget.context, + ).colorScheme.onSurface.withOpacity(0.2), ), padding: const EdgeInsets.symmetric(vertical: 10), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12)), + borderRadius: BorderRadius.circular(12), + ), ), ), ), @@ -642,11 +665,16 @@ class _FullScreenBlurOverlayState extends State { foregroundColor: Colors.white, padding: const EdgeInsets.symmetric(vertical: 10), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12)), + borderRadius: BorderRadius.circular(12), + ), + ), + child: Text( + s.apply, + style: const TextStyle( + fontWeight: FontWeight.w700, + fontSize: 14, + ), ), - child: Text(s.apply, - style: const TextStyle( - fontWeight: FontWeight.w700, fontSize: 14)), ), ), ], @@ -679,12 +707,14 @@ class PanelTab extends StatelessWidget { @override Widget build(BuildContext context) { final isDark = Theme.of(context).brightness == Brightness.dark; - final borderColor = isSelected + final borderColor = isSelected ? const Color(0xFF7C6DED) : (isDark ? Colors.white24 : const Color(0xFFCCCCDD)); final textColor = isSelected ? const Color(0xFF7C6DED) - : (isDark ? Colors.white60 : Theme.of(context).colorScheme.onSurface.withOpacity(0.5)); + : (isDark + ? Colors.white60 + : Theme.of(context).colorScheme.onSurface.withOpacity(0.5)); return GestureDetector( onTap: onTap, @@ -696,12 +726,11 @@ class PanelTab extends StatelessWidget { width: double.infinity, padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), decoration: BoxDecoration( - color: isSelected ? const Color(0xFF7C6DED).withOpacity(0.15) : Colors.transparent, + color: isSelected + ? const Color(0xFF7C6DED).withOpacity(0.15) + : Colors.transparent, borderRadius: BorderRadius.circular(10), - border: Border.all( - color: borderColor, - width: 1.5, - ), + border: Border.all(color: borderColor, width: 1.5), ), child: Row( mainAxisSize: MainAxisSize.min, @@ -728,8 +757,9 @@ class PanelTab extends StatelessWidget { textAlign: TextAlign.center, style: TextStyle( fontSize: 12, - fontWeight: - isSelected ? FontWeight.w600 : FontWeight.normal, + fontWeight: isSelected + ? FontWeight.w600 + : FontWeight.normal, color: textColor, ), ),