diff --git a/.github/workflows/build-macos-bindings.yml b/.github/workflows/build-macos-bindings.yml index 99ded764..33ddcfc5 100644 --- a/.github/workflows/build-macos-bindings.yml +++ b/.github/workflows/build-macos-bindings.yml @@ -52,6 +52,7 @@ jobs: path: | /usr/local/include/opencv4 /usr/local/lib/libopencv_* + /usr/local/lib/cmake/opencv4 key: ${{ runner.os }}-opencv-${{ hashFiles('openvino_bindings/scripts/setup_opencv.sh') }} - name: Install OpenCV diff --git a/lib/pages/import/huggingface.dart b/lib/pages/import/huggingface.dart index 22545ab9..527ac979 100644 --- a/lib/pages/import/huggingface.dart +++ b/lib/pages/import/huggingface.dart @@ -7,142 +7,158 @@ import 'package:inference/importers/manifest_importer.dart'; import 'package:inference/pages/import/providers/import_provider.dart'; import 'package:inference/pages/import/widgets/badge.dart'; import 'package:inference/pages/import/widgets/model_card.dart'; +import 'package:inference/pages/models/widgets/model_filter.dart'; +import 'package:inference/providers/project_filter_provider.dart'; +import 'package:inference/theme_fluent.dart'; import 'package:inference/widgets/controls/dropdown_multiple_select.dart'; import 'package:inference/widgets/controls/search_bar.dart'; import 'package:inference/widgets/empty_model_widget.dart'; import 'package:inference/widgets/fixed_grid.dart'; +import 'package:inference/widgets/grid_container.dart'; import 'package:provider/provider.dart'; -class Huggingface extends StatefulWidget { +class Huggingface extends StatelessWidget { const Huggingface({super.key}); - @override - State createState() => _HuggingfaceState(); -} - -class _HuggingfaceState extends State { - List selectedOptimizations = []; - String? searchValue; - bool orderAsc = true; + static Map> get filterOptions { + var options = { + "Text Generation": [ + const Option("Text generation", "text-generation"), + ], + "Image Generation": [ + const Option("Text to Image", "text-to-image") + ], + "Audio": [ + const Option("Speech to text", "speech") + ] + }; - List filterModels(List models) { - var filteredModels = models; - if (searchValue != null && searchValue!.isNotEmpty) { - filteredModels = filteredModels.where((model) => model.name.toLowerCase().contains(searchValue!.toLowerCase())).toList(); - } - if (selectedOptimizations.isNotEmpty) { - filteredModels = filteredModels.where((model) => selectedOptimizations.contains(model.optimizationPrecision)).toList(); - } - - filteredModels.sort((a,b) => a.name.compareTo(b.name) * (orderAsc ? -1 : 1)); - return filteredModels; + return options; } @override Widget build(BuildContext context) { + final theme = FluentTheme.of(context); + return Consumer(builder: (context, importProvider, child) { - return ConstrainedBox(constraints: const BoxConstraints(maxWidth: 1228), - child: Padding( - padding: const EdgeInsets.only(left: 133, right: 80, top: 36, bottom: 50), - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 280), - child: Semantics( - label: 'Find a model', - child: SearchBar(onChange: (value) { setState(() { - searchValue = value; - }); }, placeholder: 'Find a model',), + return Consumer( + builder: (context, filter, child) { + return ConstrainedBox(constraints: const BoxConstraints(maxWidth: 1228), + child: Row( + children: [ + GridContainer( + color: backgroundColor.of(theme), + padding: const EdgeInsets.all(13), + child: ModelFilter(filterOptions: filterOptions) + ), + Expanded( + child: GridContainer( + color: backgroundColor.of(theme), + padding: const EdgeInsets.only(left: 33, right: 80, top: 36, bottom: 50), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 280), + child: Semantics( + label: 'Find a model', + child: SearchBar( + placeholder: 'Find a model', + onChange: (value) { + filter.name = value; + }, + ), + ), + ), + Padding( + padding: const EdgeInsets.only(left: 8), + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 184), + child: DropdownMultipleSelect( + items: const ['int4', 'int8', 'fp16'], + selectedItems: filter.optimizations, + onChanged: (value) { + filter.optimizations = value; + }, + placeholder: 'Select optimizations', + ), + ), + ) + ], + ), + IconButton(icon: Icon(filter.order ? FluentIcons.descending : FluentIcons.ascending, size: 18,), onPressed: () => filter.order = !filter.order), + ], ), - ), - Padding( - padding: const EdgeInsets.only(left: 8), - child: ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 184), - child: DropdownMultipleSelect( - items: const ['int4', 'int8', 'fp16'], - selectedItems: selectedOptimizations, - onChanged: (value) { - if (!value.contains(importProvider.selectedModel?.optimizationPrecision)) { - importProvider.selectedModel = null; - } - setState(() { - selectedOptimizations = value; - }); - }, - placeholder: 'Select optimizations', + Padding( + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 2), + child: SizedBox( + height: 28, + width: double.infinity, + child: Align( + alignment: Alignment.centerLeft, + child: Wrap( + spacing: 8, + children: [ + ...filter.optimizations.map((opt) { + return Badge(text: opt, onDelete: () { + if (opt == importProvider.selectedModel?.optimizationPrecision && filter.optimizations.length > 1) { + importProvider.selectedModel = null; + } + filter.removeOptimization(opt); + }); + }), + if (filter.option != null) + Badge(text: filter.option!.name, onDelete: () { + filter.option = null; + }) + ] + ), + ), ), ), - ) - ], - ), - IconButton(icon: Icon(orderAsc ? FluentIcons.descending : FluentIcons.ascending, size: 18,), onPressed: () => setState(() => orderAsc = !orderAsc),), - ], - ), - Padding( - padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 2), - child: SizedBox( - height: 28, - width: double.infinity, - child: Align( - alignment: Alignment.centerLeft, - child: Wrap( - spacing: 8, - children: selectedOptimizations.map((opt) { - return Badge(text: opt, onDelete: () { - if (opt == importProvider.selectedModel?.optimizationPrecision && selectedOptimizations.length > 1) { - importProvider.selectedModel = null; - } - setState(() { - selectedOptimizations.remove(opt); - }); - }); - }).toList(), - ), - ), - ), - ), - Expanded( - child: SingleChildScrollView( - child: FutureBuilder>( - future: importProvider.allModelsFuture, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const ProgressRing(); - } else if (snapshot.hasError) { - return Text('Error: ${snapshot.error}'); - } else if (!snapshot.hasData || snapshot.data!.isEmpty) { - return const Text('No models available'); - } else { - var allModels = filterModels(snapshot.data!); - return FixedGrid( - tileWidth: 226, - spacing: 24, - itemCount: allModels.length, - emptyWidget: EmptyModelListWidget(searchQuery: searchValue), - itemBuilder: (context, index) => ModelCard( - model: allModels[index], - checked: importProvider.selectedModel == allModels[index], - onChecked: (value) { - setState(() { - importProvider.selectedModel = value ? allModels[index] : null; - }); - }, + Expanded( + child: SingleChildScrollView( + child: FutureBuilder>( + future: importProvider.allModelsFuture, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const ProgressRing(); + } else if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } else if (!snapshot.hasData || snapshot.data!.isEmpty) { + return const Text('No models available'); + } else { + var allModels = filter.applyFilterOnModel(snapshot.data!); + return FixedGrid( + tileWidth: 226, + spacing: 24, + itemCount: allModels.length, + emptyWidget: EmptyModelListWidget(searchQuery: filter.name), + itemBuilder: (context, index) => ModelCard( + model: allModels[index], + checked: importProvider.selectedModel == allModels[index], + onChecked: (value) { + importProvider.selectedModel = value ? allModels[index] : null; + }, + ), + ); + } + }, + ), ), - ); - } - }, + ), + ], + ), ), ), - ), - ], - ), - ), + ], + ), + ); + } ); }); } diff --git a/lib/pages/import/import.dart b/lib/pages/import/import.dart index 57fc40d3..53feb7c8 100644 --- a/lib/pages/import/import.dart +++ b/lib/pages/import/import.dart @@ -8,6 +8,8 @@ import 'package:go_router/go_router.dart'; import 'package:inference/pages/import/huggingface.dart'; import 'package:inference/pages/import/providers/import_provider.dart'; import 'package:inference/pages/import/widgets/import_geti_model_dialog.dart'; +import 'package:inference/providers/project_filter_provider.dart'; +import 'package:inference/theme_fluent.dart'; import 'package:inference/widgets/controls/close_model_button.dart'; import 'package:provider/provider.dart'; @@ -26,7 +28,7 @@ class _ImportPageState extends State { final theme = FluentTheme.of(context); final updatedTheme = theme.copyWith( navigationPaneTheme: theme.navigationPaneTheme.merge(NavigationPaneThemeData( - backgroundColor: theme.scaffoldBackgroundColor, + backgroundColor: backgroundColor.of(theme), )) ); @@ -56,7 +58,10 @@ class _ImportPageState extends State { PaneItem( icon: SvgPicture.asset('images/huggingface_logo-noborder.svg', width: 15,), title: const Text("Huggingface"), - body: const Huggingface(), + body: ChangeNotifierProvider( + create: (_) => ProjectFilterProvider(), + child: const Huggingface() + ), ), PaneItemAction( icon: const Icon(FluentIcons.project_collection), diff --git a/lib/pages/models/models.dart b/lib/pages/models/models.dart index 5742a0d2..fb7a5904 100644 --- a/lib/pages/models/models.dart +++ b/lib/pages/models/models.dart @@ -11,14 +11,31 @@ import 'package:inference/theme_fluent.dart'; import 'package:inference/widgets/import_model_button.dart'; import 'package:provider/provider.dart'; -class ModelsPage extends StatefulWidget { +class ModelsPage extends StatelessWidget { const ModelsPage({super.key}); - @override - State createState() => _ModelsPageState(); -} + static Map> get filterOptions { + var options = { + "Image": [ + const Option("Detection", "detection"), + const Option("Classification", "classification"), + const Option("Segmentation", "segmentation"), + const Option("Anomaly detection","anomaly") + ], + "Text Generation": [ + const Option("Text generation", "text"), + ], + "Image Generation": [ + const Option("Text to Image", "text-to-image") + ], + "Audio": [ + const Option("Speech to text", "speech") + ] + }; + + return options; + } -class _ModelsPageState extends State { @override Widget build(BuildContext context) { final theme = FluentTheme.of(context); @@ -50,9 +67,9 @@ class _ModelsPageState extends State { ), Expanded( child: GridContainer( - color: backgroundColor.of(theme), + color: backgroundColor.of(theme), padding: const EdgeInsets.all(13), - child: const ModelFilter() + child: ModelFilter(filterOptions: filterOptions) ), ), ], diff --git a/lib/pages/models/widgets/model_filter.dart b/lib/pages/models/widgets/model_filter.dart index 7e32e6f1..c279168f 100644 --- a/lib/pages/models/widgets/model_filter.dart +++ b/lib/pages/models/widgets/model_filter.dart @@ -9,7 +9,8 @@ import 'package:provider/provider.dart'; class ModelFilter extends StatelessWidget { - const ModelFilter({super.key}); + final Map> filterOptions; + const ModelFilter({super.key, required this.filterOptions}); @override Widget build(BuildContext context) { @@ -19,8 +20,8 @@ class ModelFilter extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - ...Option.filterOptions.keys.map((key) { - return Group(key, Option.filterOptions[key]!); + ...filterOptions.keys.map((key) { + return Group(key, filterOptions[key]!); }), ] ), diff --git a/lib/providers/project_filter_provider.dart b/lib/providers/project_filter_provider.dart index 80925630..27b93d99 100644 --- a/lib/providers/project_filter_provider.dart +++ b/lib/providers/project_filter_provider.dart @@ -4,36 +4,14 @@ import 'dart:core'; import 'package:fluent_ui/fluent_ui.dart'; +import 'package:inference/importers/manifest_importer.dart'; import 'package:inference/project.dart'; -import 'package:inference/public_model_info.dart'; class Option { final String name; final String filter; const Option(this.name, this.filter); - - static Map> get filterOptions { - var options = { - "Image": [ - const Option("Detection", "detection"), - const Option("Classification", "classification"), - const Option("Segmentation", "segmentation"), - const Option("Anomaly detection","anomaly") - ], - "Text Generation": [ - const Option("Text generation", "text"), - ], - "Image Generation": [ - const Option("Text to Image", "text-to-image") - ], - "Audio": [ - const Option("Speech to text", "speech") - ] - }; - - return options; - } } @@ -53,15 +31,20 @@ class ProjectFilterProvider extends ChangeNotifier { notifyListeners(); } - final List optimizations = []; + List _optimizations = []; + List get optimizations => _optimizations; + set optimizations(List optimizations) { + _optimizations = optimizations; + notifyListeners(); + } void addOptimization(String opt) { - optimizations.add(opt); + _optimizations.add(opt); notifyListeners(); } void removeOptimization(String opt) { - optimizations.remove(opt); + _optimizations.remove(opt); notifyListeners(); } @@ -90,25 +73,23 @@ class ProjectFilterProvider extends ChangeNotifier { return filteredList; } - List applyFilterOnPublicModelInfo(List projects) { + List applyFilterOnModel(List projects) { var filtered = projects .where((project) => project.id.toLowerCase().contains((name ?? "").toLowerCase()) ); if (optimizations.isNotEmpty) { - filtered = filtered.where((model) { - return optimizations.where((opt) { - return model.name.contains(opt); - }).isNotEmpty; - }); + filtered = filtered.where((model) => optimizations.contains(model.optimizationPrecision)).toList(); } if (option != null) { - filtered = filtered.where((model) => model.taskType == option!.filter); + filtered = filtered.where((model) => model.task == option!.filter); } + final filteredList = filtered.toList(); + filteredList.sort((a,b) => a.name.compareTo(b.name) * (order ? -1 : 1)); - return filtered.toList(); + return filteredList; } } diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index fd35ea17..65f5fe1e 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,6 +7,7 @@ import Foundation import desktop_drop import device_info_plus +import file_picker import irondash_engine_context import macos_window_utils import objectbox_flutter_libs @@ -19,12 +20,14 @@ import system_theme import universal_video_controls import url_launcher_macos import video_player_avfoundation +import volume_controller import wakelock_plus import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) IrondashEngineContextPlugin.register(with: registry.registrar(forPlugin: "IrondashEngineContextPlugin")) MacOSWindowUtilsPlugin.register(with: registry.registrar(forPlugin: "MacOSWindowUtilsPlugin")) ObjectboxFlutterLibsPlugin.register(with: registry.registrar(forPlugin: "ObjectboxFlutterLibsPlugin")) @@ -37,6 +40,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { UniversalVideoControlsPlugin.register(with: registry.registrar(forPlugin: "UniversalVideoControlsPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin")) + VolumeControllerPlugin.register(with: registry.registrar(forPlugin: "VolumeControllerPlugin")) WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) } diff --git a/macos/Podfile.lock b/macos/Podfile.lock index e05d79b0..b8dc6f23 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -3,15 +3,17 @@ PODS: - FlutterMacOS - device_info_plus (0.0.1): - FlutterMacOS + - file_picker (0.0.1): + - FlutterMacOS - FlutterMacOS (1.0.0) - irondash_engine_context (0.0.1): - FlutterMacOS - macos_window_utils (1.0.0): - FlutterMacOS - - ObjectBox (4.0.1) + - ObjectBox (4.1.0) - objectbox_flutter_libs (0.0.1): - FlutterMacOS - - ObjectBox (= 4.0.1) + - ObjectBox (= 4.1.0) - package_info_plus (0.0.1): - FlutterMacOS - path_provider_foundation (0.0.1): @@ -32,6 +34,8 @@ PODS: - video_player_avfoundation (0.0.1): - Flutter - FlutterMacOS + - volume_controller (0.0.1): + - FlutterMacOS - wakelock_plus (0.0.1): - FlutterMacOS - window_manager (0.2.0): @@ -40,6 +44,7 @@ PODS: DEPENDENCIES: - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`) - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - irondash_engine_context (from `Flutter/ephemeral/.symlinks/plugins/irondash_engine_context/macos`) - macos_window_utils (from `Flutter/ephemeral/.symlinks/plugins/macos_window_utils/macos`) @@ -53,6 +58,7 @@ DEPENDENCIES: - universal_video_controls (from `Flutter/ephemeral/.symlinks/plugins/universal_video_controls/macos`) - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - video_player_avfoundation (from `Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin`) + - volume_controller (from `Flutter/ephemeral/.symlinks/plugins/volume_controller/macos`) - wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`) - window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`) @@ -65,6 +71,8 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos device_info_plus: :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + file_picker: + :path: Flutter/ephemeral/.symlinks/plugins/file_picker/macos FlutterMacOS: :path: Flutter/ephemeral irondash_engine_context: @@ -91,30 +99,34 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos video_player_avfoundation: :path: Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin + volume_controller: + :path: Flutter/ephemeral/.symlinks/plugins/volume_controller/macos wakelock_plus: :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos window_manager: :path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos SPEC CHECKSUMS: - desktop_drop: e0b672a7d84c0a6cbc378595e82cdb15f2970a43 - device_info_plus: a56e6e74dbbd2bb92f2da12c64ddd4f67a749041 + desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898 + device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720 + file_picker: e716a70a9fe5fd9e09ebc922d7541464289443af FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 - irondash_engine_context: 893c7d96d20ce361d7e996f39d360c4c2f9869ba - macos_window_utils: 3bca8603c2a1cf2257351dfe6bbccc9accf739fd - ObjectBox: 0bc4bb75eea85f6af06b369148b334c2056bbc29 - objectbox_flutter_libs: 769e6f44f7381c8a8e46a2ed5c71c6068bb476f7 - package_info_plus: f0052d280d17aa382b932f399edf32507174e870 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 - screen_brightness_macos: 2a3ee243f8051c340381e8e51bcedced8360f421 - screen_retriever_macos: 452e51764a9e1cdb74b3c541238795849f21557f - super_native_extensions: c2795d6d9aedf4a79fae25cb6160b71b50549189 - system_theme: ed74293ad07d3a05e3e2d0059ff342360346f1a0 - universal_video_controls: a89c586ac49c73d6965eabe1908c2e47d0b6a9b9 - url_launcher_macos: 0fba8ddabfc33ce0a9afe7c5fef5aab3d8d2d673 - video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b - wakelock_plus: 21ddc249ac4b8d018838dbdabd65c5976c308497 - window_manager: 1d01fa7ac65a6e6f83b965471b1a7fdd3f06166c + irondash_engine_context: da62996ee25616d2f01bbeb85dc115d813359478 + macos_window_utils: 933f91f64805e2eb91a5bd057cf97cd097276663 + ObjectBox: bf3d4b51075d52868422d5d1f2f2141b1d630d30 + objectbox_flutter_libs: 90e8897eeef16e16bccaf0f91a6c92d53589dd64 + package_info_plus: 12f1c5c2cfe8727ca46cbd0b26677728972d9a5b + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + screen_brightness_macos: 2d6d3af2165592d9a55ffcd95b7550970e41ebda + screen_retriever_macos: 776e0fa5d42c6163d2bf772d22478df4b302b161 + super_native_extensions: 85efee3a7495b46b04befcfc86ed12069264ebf3 + system_theme: c7b9f6659a5caa26c9bc2284da096781e9a6fcbc + universal_video_controls: 6e055af943bd4e3cba227253ac516f790e8923f2 + url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 + video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3 + volume_controller: 90a5978956cf18ebb7739bf5382fc1b0cfef66d0 + wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269 + window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8 PODFILE CHECKSUM: b5ff078e9cf81bae88fdc8e0ce3668e57b68e9b6 diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index b58ae974..f8490322 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -59,6 +59,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/pubspec.lock b/pubspec.lock index ca4ef889..956e9012 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -74,26 +74,26 @@ packages: dependency: transitive description: name: build_daemon - sha256: "294a2edaf4814a378725bfe6358210196f5ea37af89ecd81bfa32960113d4948" + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" url: "https://pub.dev" source: hosted - version: "4.0.3" + version: "4.0.4" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e" + sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 url: "https://pub.dev" source: hosted - version: "2.4.3" + version: "2.4.4" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" + sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" url: "https://pub.dev" source: hosted - version: "2.4.14" + version: "2.4.15" build_runner_core: dependency: transitive description: @@ -242,18 +242,18 @@ packages: dependency: transitive description: name: dart_style - sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" + sha256: "7306ab8a2359a48d22310ad823521d723acfed60ee1f7e37388e8986853b6820" url: "https://pub.dev" source: hosted - version: "2.3.7" + version: "2.3.8" dbus: dependency: transitive description: name: dbus - sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" url: "https://pub.dev" source: hosted - version: "0.7.10" + version: "0.7.11" desktop_drop: dependency: "direct main" description: @@ -282,18 +282,18 @@ packages: dependency: "direct main" description: name: dio - sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" + sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" url: "https://pub.dev" source: hosted - version: "5.7.0" + version: "5.8.0+1" dio_web_adapter: dependency: transitive description: name: dio_web_adapter - sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" + sha256: e485c7a39ff2b384fa1d7e09b4e25f755804de8384358049124830b04fc4f93a url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" docx_to_text: dependency: "direct main" description: @@ -338,10 +338,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: c904b4ab56d53385563c7c39d8e9fa9af086f91495dfc48717ad84a42c3cf204 + sha256: "3d57312a53746ed4eb8c843dc50372454bbda37dd0c01a4d40fedc83e2ce4921" url: "https://pub.dev" source: hosted - version: "8.1.7" + version: "8.3.5" fixnum: dependency: transitive description: @@ -362,10 +362,10 @@ packages: dependency: "direct main" description: name: fluent_ui - sha256: "069dc196e093864ba7252a3ed5cc4e28039f04fc9cb687f35aeaa2e2b265dd7e" + sha256: a4f1e8388ac06cc45b741cfa155db98d83f4b8b998b34a8c5a7b8c2c98c773d0 url: "https://pub.dev" source: hosted - version: "4.10.0" + version: "4.11.1" flutter: dependency: "direct main" description: flutter @@ -401,10 +401,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: e37f4c69a07b07bb92622ef6b131a53c9aae48f64b176340af9e8e5238718487 + sha256: e7bbc718adc9476aa14cfddc1ef048d2e21e4e8f18311aaac723266db9f9e7b5 url: "https://pub.dev" source: hosted - version: "0.7.5" + version: "0.7.6+2" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -456,18 +456,18 @@ packages: dependency: transitive description: name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" go_router: dependency: "direct main" description: name: go_router - sha256: "7c2d40b59890a929824f30d442e810116caf5088482629c894b9e4478c67472d" + sha256: "04539267a740931c6d4479a10d466717ca5901c6fdfd3fcda09391bbb8ebd651" url: "https://pub.dev" source: hosted - version: "14.6.3" + version: "14.8.0" graphs: dependency: transitive description: @@ -496,10 +496,10 @@ packages: dependency: "direct main" description: name: http - sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 + sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.3.0" http_multi_server: dependency: transitive description: @@ -733,26 +733,26 @@ packages: dependency: "direct main" description: name: objectbox - sha256: ea823f4bf1d0a636e7aa50b43daabb64dd0fbd80b85a033016ccc1bc4f76f432 + sha256: "3d1cb5f9aa564f95c76ba251299f6cb1591c3dd8ff05fd76fa0549d899d9fe31" url: "https://pub.dev" source: hosted - version: "4.0.3" + version: "4.1.0" objectbox_flutter_libs: dependency: "direct main" description: name: objectbox_flutter_libs - sha256: c91350bbbce5e6c2038255760b5be988faead004c814f833c2cd137445c6ae70 + sha256: "4f54ebbd7a3b72f1a5ef4fea76cb01cc36440a4cac1f63bfb6719afba400eedb" url: "https://pub.dev" source: hosted - version: "4.0.3" + version: "4.1.0" objectbox_generator: dependency: "direct dev" description: name: objectbox_generator - sha256: "96da521f2cef455cd524f8854e31d64495c50711ad5f1e2cf3142a8e527bc75f" + sha256: "777924e14daf18603a023b346333acac1c4fce9fe4a715b85d98cfcc723d9a1a" url: "https://pub.dev" source: hosted - version: "4.0.3" + version: "4.1.0" package_config: dependency: transitive description: @@ -765,18 +765,18 @@ packages: dependency: transitive description: name: package_info_plus - sha256: "70c421fe9d9cc1a9a7f3b05ae56befd469fe4f8daa3b484823141a55442d858d" + sha256: "67eae327b1b0faf761964a1d2e5d323c797f3799db0e85aa232db8d9e922bc35" url: "https://pub.dev" source: hosted - version: "8.1.2" + version: "8.2.1" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b + sha256: "205ec83335c2ab9107bbba3f8997f9356d72ca3c715d2f038fc773d0366b4c76" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.1.0" path: dependency: "direct main" description: @@ -1053,10 +1053,10 @@ packages: dependency: transitive description: name: shelf_web_socket - sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.0" shimmer: dependency: "direct main" description: @@ -1226,10 +1226,10 @@ packages: dependency: "direct main" description: name: universal_video_controls - sha256: "58ae640b5e008e13cbb0fc7c74a9a589e2e813e289c5f0106a053850d607e06a" + sha256: "3e4d05bd083e3322e7f32be10e1695fac761a5d270001753043158d0047971d3" url: "https://pub.dev" source: hosted - version: "1.0.27" + version: "1.1.0" url_launcher: dependency: "direct main" description: @@ -1306,10 +1306,10 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7" + sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" url: "https://pub.dev" source: hosted - version: "1.1.15" + version: "1.1.18" vector_graphics_codec: dependency: transitive description: @@ -1354,26 +1354,26 @@ packages: dependency: transitive description: name: video_player_avfoundation - sha256: "61c54fb08fee52861d819a9b3b8e30b92456dad43a875434c677c892eb7772de" + sha256: "84b4752745eeccb6e75865c9aab39b3d28eb27ba5726d352d45db8297fbd75bc" url: "https://pub.dev" source: hosted - version: "2.6.6" + version: "2.7.0" video_player_platform_interface: dependency: transitive description: name: video_player_platform_interface - sha256: "229d7642ccd9f3dc4aba169609dd6b5f3f443bb4cc15b82f7785fcada5af9bbb" + sha256: df534476c341ab2c6a835078066fc681b8265048addd853a1e3c78740316a844 url: "https://pub.dev" source: hosted - version: "6.2.3" + version: "6.3.0" video_player_web: dependency: transitive description: name: video_player_web - sha256: "881b375a934d8ebf868c7fb1423b2bfaa393a0a265fa3f733079a86536064a10" + sha256: "3ef40ea6d72434edbfdba4624b90fd3a80a0740d260667d91e7ecd2d79e13476" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.3.4" video_player_win: dependency: "direct main" description: @@ -1394,10 +1394,10 @@ packages: dependency: transitive description: name: volume_controller - sha256: c71d4c62631305df63b72da79089e078af2659649301807fa746088f365cb48e + sha256: "297237e6f756fa838b55e79c1ce050cb48328168b94f19d839b1edd0a1eb9eca" url: "https://pub.dev" source: hosted - version: "2.0.8" + version: "3.2.0" wakelock_plus: dependency: transitive description: @@ -1442,10 +1442,10 @@ packages: dependency: transitive description: name: web_socket_channel - sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" webdriver: dependency: transitive description: @@ -1458,10 +1458,10 @@ packages: dependency: transitive description: name: win32 - sha256: "154360849a56b7b67331c21f09a386562d88903f90a1099c5987afc1912e1f29" + sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e url: "https://pub.dev" source: hosted - version: "5.10.0" + version: "5.10.1" win32_registry: dependency: transitive description: diff --git a/test/pages/models/widgets/model_filter_test.dart b/test/pages/models/widgets/model_filter_test.dart index 77acb64d..1e1d36d1 100644 --- a/test/pages/models/widgets/model_filter_test.dart +++ b/test/pages/models/widgets/model_filter_test.dart @@ -5,6 +5,7 @@ import 'package:fluent_ui/fluent_ui.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:inference/pages/models/models.dart'; import 'package:inference/pages/models/widgets/model_filter.dart'; import 'package:inference/providers/project_filter_provider.dart'; import 'package:provider/provider.dart'; @@ -12,8 +13,8 @@ import 'package:provider/provider.dart'; Widget modelWidget(ProjectFilterProvider provider) { return ChangeNotifierProvider.value( value: provider, - child: const FluentApp( - home: ModelFilter() + child: FluentApp( + home: ModelFilter(filterOptions: ModelsPage.filterOptions) ) ); }