From 208d4f8dc9663b45298cc5f6d3075a250b2f870a Mon Sep 17 00:00:00 2001 From: Mark Johnson Date: Fri, 14 Jun 2024 15:05:00 +0100 Subject: [PATCH] Fix icon loading This fixes the loading of OS icons so they are correctly replaced with a generic computer if no matching icon is found. It also centralises the loading process so it happens once during app initialisation, and displays the corresponding icon next to each VM on the manager screen. --- lib/main.dart | 20 +++++++++++++++++++ lib/src/model/osicons.dart | 3 +++ lib/src/pages/manager.dart | 16 ++++++++++++++- lib/src/pages/operating_system_selection.dart | 7 ++++--- 4 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 lib/src/model/osicons.dart diff --git a/lib/main.dart b/lib/main.dart index 738372b..251d685 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,10 +1,12 @@ import 'dart:io'; +import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; import 'package:window_size/window_size.dart'; +import 'package:flutter/services.dart'; import 'src/app.dart'; import 'src/mixins/app_version.dart'; @@ -12,6 +14,7 @@ import 'src/model/app_settings.dart'; import 'src/model/operating_system.dart'; import 'src/model/option.dart'; import 'src/model/version.dart'; +import 'src/model/osicons.dart'; Future> loadOperatingSystems(bool showUbuntus) async { var process = await Process.run('quickget', ['list_csv']); @@ -54,6 +57,22 @@ Future> loadOperatingSystems(bool showUbuntus) async { return output; } +Future getIcons() async { + final manifestContent = await rootBundle.loadString('AssetManifest.json'); + final Map manifestMap = json.decode(manifestContent); + final imagePaths = manifestMap.keys + .where((String key) => key.contains('quickemu-icons/')) + .where((String key) => key.contains('.svg')) + .toList(); + for (final imagePath in imagePaths) { + String filename = imagePath + .split('/') + .last; + String id = filename.substring(0, filename.lastIndexOf('.')); + osIcons[id] = imagePath; + } +} + void main() async { WidgetsFlutterBinding.ensureInitialized(); // Don't forget to also change the size in linux/my_application.cc:50 @@ -62,6 +81,7 @@ void main() async { final foundQuickGet = await Process.run('which', ['quickget']); if (foundQuickGet.exitCode == 0) { gOperatingSystems = await loadOperatingSystems(false); + getIcons(); AppVersion.packageInfo = await PackageInfo.fromPlatform(); } runApp( diff --git a/lib/src/model/osicons.dart b/lib/src/model/osicons.dart new file mode 100644 index 0000000..2ecef86 --- /dev/null +++ b/lib/src/model/osicons.dart @@ -0,0 +1,3 @@ +// Store a list of OS icons against the OS name. + +Map osIcons = {}; diff --git a/lib/src/pages/manager.dart b/lib/src/pages/manager.dart index 8d8b626..1cda222 100644 --- a/lib/src/pages/manager.dart +++ b/lib/src/pages/manager.dart @@ -4,7 +4,6 @@ import 'dart:core'; import 'dart:io'; import 'package:file_picker/file_picker.dart'; -import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:gettext_i18n/gettext_i18n.dart'; @@ -14,6 +13,7 @@ import 'package:process_run/shell.dart'; import '../globals.dart'; import '../mixins/preferences_mixin.dart'; import '../model/vminfo.dart'; +import '../model/osicons.dart'; /// VM manager page. /// Displays a list of available VMs, running state and connection info, @@ -255,8 +255,22 @@ class _ManagerState extends State with PreferencesMixin { }); } } + String vmStem = currentVm; + SvgPicture? osIcon; + while(vmStem.contains('-')) { + vmStem = vmStem.substring(0, vmStem.lastIndexOf('-')); + if (osIcons.containsKey(vmStem)) { + osIcon = SvgPicture.asset( + osIcons[vmStem]!, + width: 32, + height: 32, + ); + break; + } + } return [ ListTile( + leading: osIcon ?? const Icon(Icons.computer, size: 32), title: Text(currentVm), trailing: Row( mainAxisSize: MainAxisSize.min, diff --git a/lib/src/pages/operating_system_selection.dart b/lib/src/pages/operating_system_selection.dart index b032724..622fc2c 100644 --- a/lib/src/pages/operating_system_selection.dart +++ b/lib/src/pages/operating_system_selection.dart @@ -3,6 +3,7 @@ import 'package:flutter_svg/svg.dart'; import 'package:gettext_i18n/gettext_i18n.dart'; import '../model/operating_system.dart'; +import '../model/osicons.dart'; class OperatingSystemSelection extends StatefulWidget { const OperatingSystemSelection({Key? key}) : super(key: key); @@ -76,13 +77,13 @@ class _OperatingSystemSelectionState extends State { var item = list[index]; Widget icon; - try { + if (osIcons.containsKey(item.code)) { icon = SvgPicture.asset( - "assets/quickemu-icons/${item.code}.svg", + osIcons[item.code]!, width: 32, height: 32, ); - } catch (e) { + } else { // Replace with generic icon icon = const Icon(Icons.computer, size: 32); }