From 94d9022f3d2cfcea3c66603c2cbb910f0d14c785 Mon Sep 17 00:00:00 2001
From: julian <julian@cypherstack.com>
Date: Tue, 14 Mar 2023 16:56:26 -0600
Subject: [PATCH] desktop UTXO clear selection button

---
 .../desktop_coin_control_view.dart            | 100 ++++++++++--------
 1 file changed, 58 insertions(+), 42 deletions(-)

diff --git a/lib/pages_desktop_specific/coin_control/desktop_coin_control_view.dart b/lib/pages_desktop_specific/coin_control/desktop_coin_control_view.dart
index ce5ea1868..7b5a7a9db 100644
--- a/lib/pages_desktop_specific/coin_control/desktop_coin_control_view.dart
+++ b/lib/pages_desktop_specific/coin_control/desktop_coin_control_view.dart
@@ -20,6 +20,7 @@ import 'package:stackwallet/widgets/custom_buttons/dropdown_button.dart';
 import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
 import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart';
 import 'package:stackwallet/widgets/desktop/primary_button.dart';
+import 'package:stackwallet/widgets/desktop/secondary_button.dart';
 import 'package:stackwallet/widgets/icon_widgets/x_icon.dart';
 import 'package:stackwallet/widgets/stack_text_field.dart';
 import 'package:stackwallet/widgets/textfield_icon_button.dart';
@@ -93,6 +94,35 @@ class _DesktopCoinControlViewState
     return _freezeLabelCache;
   }
 
+  Future<void> _onFreezeStateButtonPressed() async {
+    switch (_freezeLabelCache) {
+      case "Freeze":
+        for (final e in _selectedUTXOs) {
+          e.utxo = e.utxo.copyWith(isBlocked: true);
+        }
+        break;
+
+      case "Unfreeze":
+        for (final e in _selectedUTXOs) {
+          e.utxo = e.utxo.copyWith(isBlocked: false);
+        }
+        break;
+
+      default:
+        Logging.instance.log(
+          "Unknown utxo method name found in $runtimeType",
+          level: LogLevel.Fatal,
+        );
+        return;
+    }
+
+    // final update utxo set in db
+    await MainDB.instance.putUTXOs(_selectedUTXOs.map((e) => e.utxo).toList());
+
+    // change label of freeze/unfreeze button
+    setState(() {});
+  }
+
   @override
   void initState() {
     _searchController = TextEditingController();
@@ -317,35 +347,7 @@ class _DesktopCoinControlViewState
                     buttonHeight: ButtonHeight.l,
                     width: 200,
                     label: _freezeLabel(_selectedUTXOs),
-                    onPressed: () async {
-                      switch (_freezeLabelCache) {
-                        case "Freeze":
-                          for (final e in _selectedUTXOs) {
-                            e.utxo = e.utxo.copyWith(isBlocked: true);
-                          }
-                          break;
-
-                        case "Unfreeze":
-                          for (final e in _selectedUTXOs) {
-                            e.utxo = e.utxo.copyWith(isBlocked: false);
-                          }
-                          break;
-
-                        default:
-                          Logging.instance.log(
-                            "Unknown utxo method name found in $runtimeType",
-                            level: LogLevel.Fatal,
-                          );
-                          return;
-                      }
-
-                      // final update utxo set in db
-                      await MainDB.instance
-                          .putUTXOs(_selectedUTXOs.map((e) => e.utxo).toList());
-
-                      // change label of freeze/unfreeze button
-                      setState(() {});
-                    },
+                    onPressed: _onFreezeStateButtonPressed,
                   ),
                   crossFadeState: _selectedUTXOs.isEmpty
                       ? CrossFadeState.showFirst
@@ -357,19 +359,33 @@ class _DesktopCoinControlViewState
                 const SizedBox(
                   width: 24,
                 ),
-                JDropdownButton(
-                  redrawOnScreenSizeChanged: true,
-                  label: "Sort by...",
-                  width: 200,
-                  groupValue: _sort,
-                  items: CCSortDescriptor.values.toSet(),
-                  onSelectionChanged: (CCSortDescriptor? newValue) {
-                    if (newValue != null && newValue != _sort) {
-                      setState(() {
-                        _sort = newValue;
-                      });
-                    }
-                  },
+                AnimatedCrossFade(
+                  firstChild: JDropdownButton(
+                    redrawOnScreenSizeChanged: true,
+                    label: "Sort by...",
+                    width: 200,
+                    groupValue: _sort,
+                    items: CCSortDescriptor.values.toSet(),
+                    onSelectionChanged: (CCSortDescriptor? newValue) {
+                      if (newValue != null && newValue != _sort) {
+                        setState(() {
+                          _sort = newValue;
+                        });
+                      }
+                    },
+                  ),
+                  secondChild: SecondaryButton(
+                    buttonHeight: ButtonHeight.l,
+                    width: 200,
+                    label: "Clear selection (${_selectedUTXOs.length})",
+                    onPressed: () => setState(() => _selectedUTXOs.clear()),
+                  ),
+                  crossFadeState: _selectedUTXOs.isEmpty
+                      ? CrossFadeState.showFirst
+                      : CrossFadeState.showSecond,
+                  duration: const Duration(
+                    milliseconds: 200,
+                  ),
                 ),
               ],
             ),