Skip to content

Commit ec67902

Browse files
authored
Merge pull request #117 from openvinotoolkit/rhecker/project-import
Adds project import via folder
2 parents 3bdbb3d + e71bb19 commit ec67902

20 files changed

+681
-244
lines changed

lib/config.dart

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,39 +20,57 @@ class Hints {
2020
}
2121

2222
class Config {
23-
static Hints hints = Hints();
24-
static String _proxy = '';
25-
static bool _proxyEnabled = false;
26-
static ThemeMode _mode = ThemeMode.system;
27-
static Envvars envvars = Envvars();
28-
29-
static String get proxy => _proxy;
30-
static setProxy(String value) async {
23+
static final Config _instance = Config._internal();
24+
Config._internal();
25+
26+
factory Config () {
27+
return _instance;
28+
}
29+
30+
final List<String> _externalModels = [];
31+
List<String> get externalModels => _externalModels;
32+
addExternalModel(String path) async {
33+
_externalModels.add(path);
34+
await _save('externalModels', _externalModels);
35+
}
36+
removeExternalModel(String path) async {
37+
_externalModels.remove(path);
38+
await _save('externalModels', _externalModels);
39+
}
40+
41+
Hints hints = Hints();
42+
String _proxy = '';
43+
bool _proxyEnabled = false;
44+
ThemeMode _mode = ThemeMode.system;
45+
Envvars envvars = Envvars();
46+
47+
String get proxy => _proxy;
48+
setProxy(String value) async {
3149
_proxy = value;
3250
await _save('proxy', value);
3351
}
3452

35-
static bool get proxyEnabled => _proxyEnabled;
36-
static setProxyEnabled(bool value) async {
53+
bool get proxyEnabled => _proxyEnabled;
54+
setProxyEnabled(bool value) async {
3755
_proxyEnabled = value;
3856
await _save('proxyEnabled', value);
3957
}
4058

41-
static ThemeMode get themeMode => _mode;
42-
static setThemeMode(ThemeMode value) async {
59+
ThemeMode get themeMode => _mode;
60+
setThemeMode(ThemeMode value) async {
4361
_mode = value;
4462
await _save('mode', value.index);
4563
}
4664

47-
static void reset() {
65+
void reset() {
4866
hints = Hints();
4967
_proxy = '';
5068
_proxyEnabled = false;
5169
_mode = ThemeMode.system;
5270
envvars = Envvars();
5371
}
5472

55-
static Future<String> _getProxy() async {
73+
Future<String> _getProxy() async {
5674
final dio = Dio(BaseOptions(connectTimeout: const Duration(seconds: 10)));
5775
dio.httpClientAdapter = IOHttpClientAdapter(
5876
createHttpClient: () {
@@ -79,7 +97,7 @@ class Config {
7997
return '';
8098
}
8199

82-
static Future<void> loadFromFile() async {
100+
Future<void> loadFromFile() async {
83101
final directory = await getApplicationSupportDirectory();
84102
final file = File('${directory.path}/config.json');
85103
if (await file.exists()) {
@@ -92,10 +110,11 @@ class Config {
92110
_proxy = await _getProxy();
93111
}
94112
_mode = ThemeMode.values[json['mode'] ?? 0];
113+
_externalModels.addAll(List<String>.from(json['externalModels'] ?? []));
95114
}
96115
}
97116

98-
static Future<void> _save(String key, dynamic value) async {
117+
Future<void> _save(String key, dynamic value) async {
99118
final directory = await getApplicationSupportDirectory();
100119
final file = File('${directory.path}/config.json');
101120
Map<String, dynamic> json = {};
@@ -104,7 +123,8 @@ class Config {
104123
json = jsonDecode(contents);
105124
}
106125
json[key] = value;
107-
await file.writeAsString(jsonEncode(json));
126+
const encoder = JsonEncoder.withIndent(" ");
127+
await file.writeAsString(encoder.convert(json));
108128
}
109129

110130
}

lib/deployment_processor.dart

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import 'dart:convert';
66
import 'dart:io';
77
import 'package:flutter/services.dart';
8+
import 'package:inference/config.dart';
89
import 'package:inference/importers/manifest_importer.dart';
910
import 'package:inference/migration/migration_manager.dart';
10-
import 'package:inference/migration/migrations/migration_1.0.0_to_25.0.1.dart';
1111
import 'package:inference/project.dart';
1212
import 'package:path_provider/path_provider.dart';
1313
import 'package:path/path.dart';
@@ -35,31 +35,32 @@ Future<List<Project>> loadProjectsFromStorage() async {
3535
final directory = await getApplicationSupportDirectory();
3636
final manifest = ManifestImporter("assets/manifest.json");
3737
await manifest.loadManifest();
38-
final migrationManager = MigrationManager(
38+
final migrationManager = MigrationManager.withMigrations(
3939
destinationVersion: currentApplicationVersion,
4040
manifest: manifest.allModels,
41-
migrations: [
42-
MigrationV1ToV2501(),
43-
]
4441
);
4542

46-
return List.from(directory.listSync()
43+
final modelPaths = [
44+
Config().externalModels,
45+
directory.listSync().map((m) => m.path),
46+
].expand((l) => l);
47+
48+
return List.from(modelPaths
4749
.map((projectFolder) {
48-
if (!Directory(projectFolder.path).existsSync()) {
50+
if (!Directory(projectFolder).existsSync()) {
4951
return null;
5052
}
5153
final platformContext = Context(style: Style.platform);
5254
try {
53-
final projectFile = File(platformContext.join(projectFolder.path, "project.json"));
55+
final projectFile = File(platformContext.join(projectFolder, "project.json"));
5456
final content = projectFile.readAsStringSync();
5557
var jsonContent = jsonDecode(content);
5658
if (migrationManager.eligible((jsonContent))) {
57-
print("Migrating ${projectFolder.path}");
5859
jsonContent = migrationManager.migrate(jsonContent);
5960
const encoder = JsonEncoder.withIndent(" ");
6061
projectFile.writeAsStringSync(encoder.convert(jsonContent));
6162
}
62-
final project = Project.fromJson(jsonContent, projectFolder.path);
63+
final project = Project.fromJson(jsonContent, projectFolder);
6364
project.loaded.complete();
6465
return project;
6566
} catch (exception, stack) {

lib/importers/geti_deployment.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:archive/archive_io.dart';
1010
import 'package:inference/interop/utils.dart';
1111
import 'package:inference/importers/importer.dart';
1212
import 'package:inference/project.dart';
13+
import 'package:inference/utils.dart';
1314
import 'package:path/path.dart';
1415
import 'package:path_provider/path_provider.dart';
1516
import 'package:uuid/uuid.dart';
@@ -63,7 +64,7 @@ class GetiDeploymentProcessor extends Importer {
6364
await processTask(task);
6465
}
6566
const encoder = JsonEncoder.withIndent(" ");
66-
project!.size = project!.calculateDiskUsage();
67+
project!.size = calculateDiskUsage(project!.storagePath);
6768
File(platformContext.join(project!.storagePath, "project.json"))
6869
.writeAsString(encoder.convert(project!.toMap()));
6970
project!.loaded.complete();
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// Copyright (c) 2024 Intel Corporation
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
import 'dart:convert';
6+
import 'dart:io';
7+
8+
import 'package:collection/collection.dart';
9+
import 'package:flutter/material.dart';
10+
import 'package:inference/config.dart';
11+
import 'package:inference/importers/importer.dart';
12+
import 'package:inference/migration/migration_manager.dart';
13+
import 'package:inference/project.dart';
14+
import 'package:path/path.dart';
15+
16+
class ModelDirImporter extends Importer {
17+
final String directory;
18+
Project? project;
19+
20+
ModelDirImporter(this.directory);
21+
22+
@override
23+
Future<Project> generateProject() async {
24+
final projectJson = findProjectJsonFile();
25+
if (projectJson == null) {
26+
throw Exception("no project json in file");
27+
} else {
28+
final migrationManager = MigrationManager.withMigrations(
29+
destinationVersion: currentApplicationVersion,
30+
manifest: [],
31+
);
32+
33+
final source = File(projectJson).readAsStringSync();
34+
final migrated = migrationManager.migrate(jsonDecode(source));
35+
project = Project.fromJson(migrated, directory);
36+
}
37+
return project!;
38+
}
39+
40+
bool get containsProjectJson => findProjectJsonFile() != null;
41+
42+
String? findProjectJsonFile() {
43+
final files = Directory(directory).listSync();
44+
return files.firstWhereOrNull((file) => basename(file.path) == "project.json")?.path;
45+
}
46+
47+
@override
48+
bool match() {
49+
return findProjectJsonFile() != null;
50+
}
51+
52+
@override
53+
Future<void> setupFiles() async {
54+
55+
await Config().addExternalModel(project!.storagePath);
56+
project!.loaded.complete();
57+
return;
58+
}
59+
60+
@override
61+
Future<bool> askUser(BuildContext context) async {
62+
return true;
63+
}
64+
}

lib/main.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ void main() async {
2121
WidgetsFlutterBinding.ensureInitialized();
2222
await windowManager.ensureInitialized();
2323
await ObjectBox.create();
24-
await Config.loadFromFile();
24+
await Config().loadFromFile();
2525
WindowOptions windowOptions = WindowOptions(
2626
size: const Size(1400, 1024),
2727
center: true,

lib/migration/migration_manager.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:collection/collection.dart';
66
import 'package:inference/importers/model_manifest.dart';
77
import 'package:inference/migration/migration.dart';
8+
import 'package:inference/migration/migrations/migration_1.0.0_to_25.0.1.dart';
89

910
class MigrationManager {
1011
final String destinationVersion;
@@ -17,6 +18,19 @@ class MigrationManager {
1718
required this.migrations,
1819
});
1920

21+
factory MigrationManager.withMigrations({
22+
required String destinationVersion,
23+
required List<ModelManifest> manifest,
24+
}) {
25+
return MigrationManager(
26+
destinationVersion: destinationVersion,
27+
manifest: manifest,
28+
migrations: [
29+
MigrationV1ToV2501(),
30+
]
31+
);
32+
}
33+
2034
bool eligible(Map<String, dynamic> json) {
2135
return migrations.firstWhereOrNull((migration) {
2236
return migration.from == json["application_version"];

lib/pages/import/import.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'package:flutter_svg/svg.dart';
77
import 'package:go_router/go_router.dart';
88
import 'package:inference/pages/import/huggingface.dart';
99
import 'package:inference/pages/import/providers/import_provider.dart';
10-
import 'package:inference/pages/import/widgets/import_geti_model_dialog.dart';
10+
import 'package:inference/pages/import/widgets/import_model_dialog.dart';
1111
import 'package:inference/project.dart';
1212
import 'package:inference/providers/project_filter_provider.dart';
1313
import 'package:inference/theme_fluent.dart';
@@ -67,7 +67,7 @@ class _ImportPageState extends State<ImportPage> {
6767
PaneItemAction(
6868
icon: const Icon(FluentIcons.project_collection),
6969
title: const Text("Local disk"),
70-
onTap: () => showImportGetiModelDialog(context,
70+
onTap: () => showImportModelDialog(context,
7171
callback: (projects) {
7272
if (projects != null && projects.isNotEmpty) {
7373
if (projects.length == 1) {

0 commit comments

Comments
 (0)