From d075d310a3e5976416f15995e470d83f39d414de Mon Sep 17 00:00:00 2001 From: danemadsen Date: Sun, 4 Aug 2024 13:54:03 +1000 Subject: [PATCH] update loading model dialog --- lib/ui/shared/buttons/load_model_button.dart | 1 - lib/ui/shared/dialogs/load_model_dialog.dart | 113 ++++++++++--------- 2 files changed, 61 insertions(+), 53 deletions(-) diff --git a/lib/ui/shared/buttons/load_model_button.dart b/lib/ui/shared/buttons/load_model_button.dart index 701ec900..4fd16db1 100644 --- a/lib/ui/shared/buttons/load_model_button.dart +++ b/lib/ui/shared/buttons/load_model_button.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:maid/classes/providers/huggingface_selection.dart'; -import 'package:maid/classes/providers/large_language_models/llama_cpp_model.dart'; import 'package:maid/classes/providers/app_data.dart'; import 'package:maid/ui/shared/dialogs/load_model_dialog.dart'; import 'package:provider/provider.dart'; diff --git a/lib/ui/shared/dialogs/load_model_dialog.dart b/lib/ui/shared/dialogs/load_model_dialog.dart index 54995d54..471e0cc4 100644 --- a/lib/ui/shared/dialogs/load_model_dialog.dart +++ b/lib/ui/shared/dialogs/load_model_dialog.dart @@ -22,19 +22,19 @@ class _LoadModelDialogState extends State { Future> get previouslyLoadedModels async { final prefs = await SharedPreferences.getInstance(); - final models = prefs.getString("imported_models") ?? "{}"; - - return json.decode(models); + return Map.from(json.decode(models)); } @override - void dispose() async { - final prefs = await SharedPreferences.getInstance(); + void dispose() { + saveImportedModels(); + super.dispose(); + } + void saveImportedModels() async { + final prefs = await SharedPreferences.getInstance(); prefs.setString("imported_models", json.encode(importedModels ?? {})); - - super.dispose(); } @override @@ -44,63 +44,63 @@ class _LoadModelDialogState extends State { future: loadingFuture!, onComplete: (_) { importedModels ??= {}; - final key = LlamaCppModel.of(context).name; - if (importedModels![key] != null) { File(importedModels![key]!).delete(); } - importedModels![key] = LlamaCppModel.of(context).uri; + saveImportedModels(); }, ); - } - else { + } else { return FutureBuilder>( future: previouslyLoadedModels, - builder: buildDialog, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + importedModels = snapshot.data; + return buildDialog(context); + } else { + return const LoadingDialog(title: "Loading Models"); + } + }, ); } } - Widget buildDialog(BuildContext context, AsyncSnapshot> snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - importedModels = snapshot.data; - - return AlertDialog( - title: const Text( - "LlamaCPP Models", - textAlign: TextAlign.center - ), - content: buildDropdown(), - actionsAlignment: MainAxisAlignment.center, - actions: [ - FilledButton( - onPressed: () { - loadingFuture = LlamaCppModel.of(context).loadModel(); - Navigator.of(context).pop(); - }, - child: Text( - "Import", - style: Theme.of(context).textTheme.labelLarge, - ), + Widget buildDialog(BuildContext context) { + return AlertDialog( + title: const Text( + "LlamaCPP Models", + textAlign: TextAlign.center, + ), + content: importedModels!.isNotEmpty ? + buildDropdown() : + const SizedBox(), + actionsAlignment: MainAxisAlignment.center, + actionsOverflowAlignment: OverflowBarAlignment.center, + actionsOverflowButtonSpacing: 8.0, + actions: [ + FilledButton( + onPressed: () => setState(() { + loadingFuture = LlamaCppModel.of(context).loadModel(); + }), + child: Text( + "Import", + style: Theme.of(context).textTheme.labelLarge, ), - if (selected != null) ...importedOptions, - FilledButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: Text( - "Close", - style: Theme.of(context).textTheme.labelLarge, - ), + ), + if (selected != null) ...importedOptions, + FilledButton( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text( + "Close", + style: Theme.of(context).textTheme.labelLarge, ), - ], - ); - } - else { - return const LoadingDialog(title: "Loading Models"); - } + ), + ], + ); } List get importedOptions { @@ -119,7 +119,11 @@ class _LoadModelDialogState extends State { FilledButton( onPressed: () { File(importedModels![selected!]!).delete(); - Navigator.of(context).pop(); + setState(() { + importedModels!.remove(selected); + selected = null; + }); + saveImportedModels(); }, child: Text( "Delete", @@ -131,6 +135,7 @@ class _LoadModelDialogState extends State { Widget buildDropdown() { return Row( + mainAxisAlignment: MainAxisAlignment.center, children: [ Text(selected ?? "Select Model"), PopupMenuButton( @@ -144,13 +149,17 @@ class _LoadModelDialogState extends State { itemBuilder: itemBuilder, onOpened: () => setState(() => dropdownOpen = true), onCanceled: () => setState(() => dropdownOpen = false), - onSelected: (_) => setState(() => dropdownOpen = false) + onSelected: (_) => setState(() => dropdownOpen = false), ), ], ); } List> itemBuilder(BuildContext context) { + if (importedModels == null) { + return []; + } + return importedModels!.entries.map((entry) { return PopupMenuItem( value: entry.key, @@ -159,4 +168,4 @@ class _LoadModelDialogState extends State { ); }).toList(); } -} \ No newline at end of file +}