diff --git a/assets/background.png b/assets/background.png new file mode 100644 index 0000000..70e9591 Binary files /dev/null and b/assets/background.png differ diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/lib/app/home_screen/bloc/home_screen_bloc.dart b/lib/app/home_screen/bloc/home_screen_bloc.dart index 7232388..6aaaec9 100644 --- a/lib/app/home_screen/bloc/home_screen_bloc.dart +++ b/lib/app/home_screen/bloc/home_screen_bloc.dart @@ -35,12 +35,8 @@ class HomeScreenBloc extends Bloc { void _setupHandlers() { on(_onHomeScreenLoad); on(_onHomeScreenDownloadRequested); - - on((event, emit) { - // _downloadManager.pauseDownload(); - // emit(HomeScreenDownloadPausedState()); - }); - + on(_onHomeScreenDownloadPaused); + on(_onHomeOutputDirRequested); on( _onHomeScreenDownloadProgressUpdated, transformer: (events, mapper) => @@ -66,21 +62,8 @@ class HomeScreenBloc extends Bloc { Emitter emit, ) async { if (state.model.outputPath == null) { - final directory = await FilePicker.platform.getDirectoryPath( - dialogTitle: 'Please select installation directory', - ); - - if (directory == null) { - return; - } - - await _preferencesRepository.setOutputDir(Uri.directory(directory)); - - emit( - HomeScreenReadyToDownloadState( - model: state.model.copyWith(outputPath: Uri.directory(directory)), - ), - ); + emit(HomeScreenOutputDirSelectionState(model: state.model.copyWith())); + return; } _downloadProgressSubscription = _downloadManager @@ -91,6 +74,8 @@ class HomeScreenBloc extends Bloc { ), ) .listen((progress) => add(HomeScreenDownloadProgressUpdated(progress))); + + emit(HomeScreenDownloadInitializing(model: state.model.copyWith())); } void _onHomeScreenDownloadProgressUpdated( @@ -111,4 +96,36 @@ class HomeScreenBloc extends Bloc { return super.close(); } + + FutureOr _onHomeScreenDownloadPaused( + HomeScreenDownloadPaused event, + Emitter emit, + ) async { + await _downloadManager.pause(_downloadId); + + emit(HomeScreenDownloadPausedState(model: state.model.copyWith())); + } + + FutureOr _onHomeOutputDirRequested( + HomeScreenOutputDirRequested event, + Emitter emit, + ) async { + emit(HomeScreenReadyToDownloadState(model: state.model.copyWith())); + + final directory = await FilePicker.platform.getDirectoryPath( + dialogTitle: 'Please select installation directory', + ); + + if (directory == null) { + return; + } + + await _preferencesRepository.setOutputDir(Uri.directory(directory)); + + emit( + HomeScreenReadyToDownloadState( + model: state.model.copyWith(outputPath: Uri.directory(directory)), + ), + ); + } } diff --git a/lib/app/home_screen/bloc/home_screen_event.dart b/lib/app/home_screen/bloc/home_screen_event.dart index ce744f2..50a8b1d 100644 --- a/lib/app/home_screen/bloc/home_screen_event.dart +++ b/lib/app/home_screen/bloc/home_screen_event.dart @@ -7,6 +7,8 @@ final class HomeScreenLoad extends HomeScreenEvent {} final class HomeScreenDownloadRequested extends HomeScreenEvent {} +final class HomeScreenOutputDirRequested extends HomeScreenEvent {} + final class HomeScreenDownloadPaused extends HomeScreenEvent {} final class HomeScreenDownloadProgressUpdated extends HomeScreenEvent { diff --git a/lib/app/home_screen/bloc/home_screen_state.dart b/lib/app/home_screen/bloc/home_screen_state.dart index aabf534..dff7cc3 100644 --- a/lib/app/home_screen/bloc/home_screen_state.dart +++ b/lib/app/home_screen/bloc/home_screen_state.dart @@ -19,6 +19,18 @@ final class HomeScreenDownloadPausedState extends HomeScreenState { const HomeScreenDownloadPausedState({required super.model}); } +final class HomeScreenDownloadInitializing extends HomeScreenState { + const HomeScreenDownloadInitializing({required super.model}); +} + final class HomeScreenDownloadingState extends HomeScreenState { const HomeScreenDownloadingState({required super.model}); } + +final class HomeScreenOutputDirSelectionState extends HomeScreenState { + const HomeScreenOutputDirSelectionState({required super.model}); +} + +final class HomeScreenReadyToPlayState extends HomeScreenState { + const HomeScreenReadyToPlayState({required super.model}); +} diff --git a/lib/app/home_screen/home_screen.dart b/lib/app/home_screen/home_screen.dart index 5d5e005..e386292 100644 --- a/lib/app/home_screen/home_screen.dart +++ b/lib/app/home_screen/home_screen.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:moonwell_launcher/app/home_screen/bloc/home_screen_bloc.dart'; -import 'package:moonwell_launcher/app/home_screen/left_pane.dart'; +import 'package:moonwell_launcher/app/home_screen/home_screen_content.dart'; import 'package:moonwell_launcher/app/theme/mw_theme.dart'; import 'package:moonwell_launcher/features/downloader/application/download_manager.dart'; import 'package:moonwell_launcher/features/preferences/domain/repositories/preferences_repository.dart'; @@ -19,46 +19,74 @@ class HomeScreen extends StatelessWidget { downloadManager: getIt(), preferencesRepository: getIt(), ), - child: Builder( - builder: (context) { - return Scaffold( - body: Container( - decoration: const BoxDecoration( - // subtle vignette for “night” vibe - gradient: RadialGradient( - center: Alignment(0, -0.5), - radius: 1.2, - colors: [MWColors.deepNavy, MWColors.abyss], - ), + child: BlocConsumer( + listener: (context, state) { + if (state is HomeScreenOutputDirSelectionState) { + showDialog( + context: context, + builder: (dialogContext) => AlertDialog( + title: Text('Alert'), + content: Text('Please select client location.'), + actions: [ + ElevatedButton.icon( + icon: const Icon(Icons.folder_open), + onPressed: () => context.read().add( + HomeScreenOutputDirRequested(), + ), + label: Text('Select directory'), + ), + ], ), - child: Center( - child: Padding( - padding: EdgeInsets.all(24.0), - child: Row( - children: [ - Expanded( - child: LeftPane( - title: Text( - 'MoonWell', - style: theme.textTheme.headlineLarge, - ), - progress: 0.0, - isDownloading: false, - kbps: 0.0, - eta: Duration.zero, - onStart: () { - context.read().add( - HomeScreenDownloadRequested(), - ); - }, - onPause: () {}, - onReset: () {}, + ); + } + }, + + builder: (context, state) { + return Scaffold( + body: Stack( + children: [ + Positioned.fill( + child: Container( + decoration: const BoxDecoration( + // subtle vignette for “night” vibe + gradient: RadialGradient( + center: Alignment(0, -0.5), + radius: 1.2, + colors: [MWColors.deepNavy, MWColors.abyss], + ), + ), + child: Center( + child: Padding( + padding: EdgeInsets.all(24.0), + child: Stack( + children: [ + Positioned.fill( + child: Image.asset( + 'assets/background.png', + fit: BoxFit.fitWidth, + ), + ), + Row( + children: [ + Expanded( + child: HomeScreenContent( + title: Text( + 'MoonWell', + style: theme.textTheme.headlineLarge, + ), + ), + ), + ], + ), + ], ), ), - ], + ), ), ), - ), + if (state is HomeScreenDownloadInitializing) + Center(child: const CircularProgressIndicator()), + ], ), ); }, diff --git a/lib/app/home_screen/home_screen_content.dart b/lib/app/home_screen/home_screen_content.dart new file mode 100644 index 0000000..dabdbc0 --- /dev/null +++ b/lib/app/home_screen/home_screen_content.dart @@ -0,0 +1,184 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:moonwell_launcher/app/home_screen/bloc/home_screen_bloc.dart'; +import 'package:moonwell_launcher/app/home_screen/widgets/gilded_progress_bar.dart'; +import 'package:moonwell_launcher/app/theme/mw_theme.dart'; +import 'package:pixelarticons/pixel.dart'; + +class HomeScreenContent extends StatelessWidget { + const HomeScreenContent({super.key, required this.title}); + + final Widget title; + + String _speedLabel(BuildContext context) { + final kbps = context.read().state.model.progress.speed; + + if (kbps <= 0) return '—'; + if (kbps >= 1024) { + return '${(kbps / 1024).toStringAsFixed(2)} MB/s'; + } + return '${kbps.toStringAsFixed(0)} kB/s'; + } + + @override + Widget build(BuildContext context) { + final cs = Theme.of(context).colorScheme; + final deco = Theme.of(context).extension()!; + + final state = context.read().state; + + final percent = _resolvePercentage(context); + final eta = state.model.progress.eta; + + final isDownloading = state is HomeScreenDownloadingState; + final canPlay = state is HomeScreenReadyToPlayState; + + return Card( + margin: EdgeInsets.zero, + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + title, + const SizedBox(height: 16), + Text( + 'Classic+ Wrath of the Lich King experience', + style: Theme.of(context).textTheme.titleMedium?.copyWith( + color: cs.onSurface.withAlpha(200), + ), + ), + const SizedBox(height: 28), + const Spacer(), + // Progress bar + GildedProgressBar( + value: state.model.progress.total == 0 + ? 0 + : state.model.progress.downloaded / + state.model.progress.total, + ), + + const SizedBox(height: 12), + Row( + children: [ + Text( + '$percent%', + style: Theme.of(context).textTheme.titleMedium, + ), + const Spacer(), + Icon(Pixel.speedfast, size: 18, color: cs.onSurfaceVariant), + const SizedBox(width: 6), + Text( + _speedLabel(context), + style: TextStyle(color: cs.onSurfaceVariant), + ), + const SizedBox(width: 16), + Icon( + Pixel.timeline, // Updated to use PixelArtIcons + size: 18, + color: cs.onSurfaceVariant, + ), + const SizedBox(width: 6), + Text( + eta == Duration.zero + ? '—' + : '${eta.inMinutes}:${(eta.inSeconds % 60).toString().padLeft(2, '0')}', + style: TextStyle(color: cs.onSurfaceVariant), + ), + ], + ), + + const SizedBox(height: 24), + + // Controls row + Row( + spacing: 12.0, + children: [ + Expanded( + child: ElevatedButton.icon( + icon: Icon( + canPlay ? Icons.play_arrow_rounded : Icons.download, + ), + label: Text( + canPlay + ? 'Play' + : (isDownloading + ? 'Downloading…' + : (state.model.progress.downloaded == 0 + ? 'Install' + : 'Resume')), + ), + onPressed: canPlay + ? null + : (isDownloading ? null : () => _onStart(context)), + ), + ), + OutlinedButton.icon( + icon: Icon(Pixel.pause), + label: Text('Pause'), + onPressed: isDownloading ? () => _onPause(context) : null, + ), + ], + ), + + const SizedBox(height: 20), + // Disk path / build info (placeholders) + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: cs.surfaceContainerHighest.withAlpha(128), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: cs.outline), + boxShadow: (deco.cardGlow), + ), + child: Row( + children: [ + const Icon(Pixel.folder), + const SizedBox(width: 8), + Expanded( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: () => context.read().add( + HomeScreenOutputDirRequested(), + ), + child: Text( + 'Install path: ${state.model.outputPath?.toFilePath() ?? '—'}', + overflow: TextOverflow.ellipsis, + ), + ), + ), + const SizedBox(width: 12), + ], + ), + ), + ], + ), + ), + ); + } + + String _resolvePercentage(BuildContext context) { + final state = context.read().state; + + if (state.model.progress.total == 0) { + return '0.0'; + } + + final percentage = + state.model.progress.downloaded / state.model.progress.total; + + return (percentage * 100).clamp(0, 100).toStringAsFixed(1); + } + + void _onStart(BuildContext context) { + context.read().add(HomeScreenDownloadRequested()); + } + + void _onPause(BuildContext context) { + context.read().add(HomeScreenDownloadPaused()); + } + + void _onReset(BuildContext context) { + // context.read().add(HomeScreenDownloadReset()); + } +} diff --git a/lib/app/home_screen/left_pane.dart b/lib/app/home_screen/left_pane.dart deleted file mode 100644 index 9cf524c..0000000 --- a/lib/app/home_screen/left_pane.dart +++ /dev/null @@ -1,181 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:moonwell_launcher/app/home_screen/bloc/home_screen_bloc.dart'; -import 'package:moonwell_launcher/app/home_screen/widgets/progress_bar.dart'; -import 'package:moonwell_launcher/app/theme/mw_theme.dart'; -import 'package:pixelarticons/pixel.dart'; - -class LeftPane extends StatelessWidget { - const LeftPane({ - super.key, - required this.title, - required this.progress, - required this.isDownloading, - required this.kbps, - required this.eta, - required this.onStart, - required this.onPause, - required this.onReset, - }); - - final Widget title; - final double progress; - final bool isDownloading; - final double kbps; - final Duration eta; - final VoidCallback onStart; - final VoidCallback onPause; - final VoidCallback onReset; - - String _speedLabel(BuildContext context) { - final kbps = context.read().state.model.progress.speed; - - if (kbps <= 0) return '—'; - if (kbps >= 1024) { - return '${(kbps / 1024).toStringAsFixed(2)} MB/s'; - } - return '${kbps.toStringAsFixed(0)} kB/s'; - } - - @override - Widget build(BuildContext context) { - final cs = Theme.of(context).colorScheme; - final deco = Theme.of(context).extension()!; - - return BlocBuilder( - builder: (context, state) { - final percent = _resolvePercentage(context); - final eta = state.model.progress.eta; - - final canPlay = progress >= 1.0 && state is! HomeScreenDownloadingState; - - return Card( - margin: EdgeInsets.zero, - child: Padding( - padding: const EdgeInsets.all(24), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - title, - const SizedBox(height: 16), - Text( - 'Classic+ Wrath of the Lich King experience', - style: Theme.of(context).textTheme.titleMedium?.copyWith( - color: cs.onSurface.withAlpha(200), - ), - ), - const SizedBox(height: 28), - - // Progress bar - GildedProgressBar(value: progress), - - const SizedBox(height: 12), - Row( - children: [ - Text( - '$percent%', - style: Theme.of(context).textTheme.titleMedium, - ), - const Spacer(), - Icon(Pixel.speedfast, size: 18, color: cs.onSurfaceVariant), - const SizedBox(width: 6), - Text( - _speedLabel(context), - style: TextStyle(color: cs.onSurfaceVariant), - ), - const SizedBox(width: 16), - Icon( - Pixel.timeline, // Updated to use PixelArtIcons - size: 18, - color: cs.onSurfaceVariant, - ), - const SizedBox(width: 6), - Text( - eta == Duration.zero - ? '—' - : '${eta.inMinutes}:${(eta.inSeconds % 60).toString().padLeft(2, '0')}', - style: TextStyle(color: cs.onSurfaceVariant), - ), - ], - ), - - const SizedBox(height: 24), - - // Controls row - Row( - children: [ - Expanded( - child: ElevatedButton.icon( - icon: Icon( - canPlay ? Icons.play_arrow_rounded : Icons.download, - ), - label: Text( - canPlay - ? 'Play' - : (isDownloading - ? 'Downloading…' - : (progress == 0 ? 'Install' : 'Resume')), - ), - onPressed: canPlay - ? () {} - : (isDownloading ? null : onStart), - ), - ), - // const SizedBox(width: 12), - // OutlinedButton.icon( - // icon: Icon( - // isDownloading ? Icons.pause_rounded : Icons.replay, - // ), - // label: Text(isDownloading ? 'Pause' : 'Reset'), - // onPressed: isDownloading - // ? onPause - // : (progress > 0 ? onReset : null), - // ), - ], - ), - - const SizedBox(height: 20), - // Disk path / build info (placeholders) - Container( - padding: const EdgeInsets.all(12), - decoration: BoxDecoration( - color: cs.surfaceContainerHighest.withAlpha(128), - borderRadius: BorderRadius.circular(12), - border: Border.all(color: cs.outline), - boxShadow: (deco.cardGlow), - ), - child: Row( - children: [ - const Icon(Pixel.folder), - const SizedBox(width: 8), - Expanded( - child: Text( - 'Install path: ${state.model.outputPath?.toFilePath() ?? '—'}', - overflow: TextOverflow.ellipsis, - ), - ), - const SizedBox(width: 12), - ], - ), - ), - ], - ), - ), - ); - }, - ); - } - - String _resolvePercentage(BuildContext context) { - final state = context.read().state; - - if (state is HomeScreenDownloadingState) { - final percentage = - state.model.progress.downloaded / state.model.progress.total; - - return (percentage * 100).clamp(0, 100).toStringAsFixed(1); - } - - return '0.0'; - } -} diff --git a/lib/app/home_screen/widgets/progress_bar.dart b/lib/app/home_screen/widgets/gilded_progress_bar.dart similarity index 57% rename from lib/app/home_screen/widgets/progress_bar.dart rename to lib/app/home_screen/widgets/gilded_progress_bar.dart index b418dd7..d5c0d0c 100644 --- a/lib/app/home_screen/widgets/progress_bar.dart +++ b/lib/app/home_screen/widgets/gilded_progress_bar.dart @@ -2,13 +2,14 @@ import 'package:flutter/material.dart'; import 'package:moonwell_launcher/app/theme/mw_theme.dart'; class GildedProgressBar extends StatelessWidget { - const GildedProgressBar({required this.value}); + const GildedProgressBar({super.key, required this.value}); final double value; @override Widget build(BuildContext context) { final cs = Theme.of(context).colorScheme; final deco = Theme.of(context).extension()!; + return Container( height: 20, decoration: BoxDecoration( @@ -19,21 +20,25 @@ class GildedProgressBar extends StatelessWidget { clipBehavior: Clip.antiAlias, child: Stack( children: [ - // Fill with gold bevel - FractionallySizedBox( - widthFactor: value.clamp(0.0, 1.0), - alignment: Alignment.centerLeft, - child: DecoratedBox( - decoration: BoxDecoration( - gradient: (deco.goldBevel as LinearGradient), + // Subtle top highlight + Positioned( + top: 0.0, + height: 6.0, + left: 0.0, + right: 0.0, + child: ColoredBox(color: Colors.white.withAlpha(10)), + ), + Positioned.fill( + child: FractionallySizedBox( + widthFactor: value.clamp(0.0, 1.0), + alignment: Alignment.centerLeft, + child: DecoratedBox( + decoration: BoxDecoration( + gradient: (deco.goldBevel as LinearGradient), + ), ), ), ), - // Subtle top highlight - Align( - alignment: Alignment.topCenter, - child: Container(height: 6, color: Colors.white.withAlpha(10)), - ), ], ), ); diff --git a/lib/app/theme/mw_theme.dart b/lib/app/theme/mw_theme.dart index 98d66c7..4427765 100644 --- a/lib/app/theme/mw_theme.dart +++ b/lib/app/theme/mw_theme.dart @@ -81,7 +81,7 @@ ThemeData moonWellTheme() { ), cardTheme: CardThemeData( - color: cs.surface, + color: cs.surface.withAlpha(50), elevation: 0, margin: const EdgeInsets.all(12), shape: RoundedRectangleBorder( @@ -99,6 +99,9 @@ ThemeData moonWellTheme() { shape: WidgetStatePropertyAll( RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)), ), + textStyle: WidgetStatePropertyAll( + TextStyle(fontWeight: FontWeight.bold, fontFamily: 'Cinzel'), + ), elevation: const WidgetStatePropertyAll(6), shadowColor: WidgetStatePropertyAll(MWColors.moonBlue.withAlpha(89)), backgroundColor: WidgetStateProperty.resolveWith((states) { @@ -138,7 +141,18 @@ ThemeData moonWellTheme() { shape: WidgetStatePropertyAll( RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)), ), - foregroundColor: WidgetStatePropertyAll(cs.primary), + foregroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return cs.primary.withAlpha(100); + } + return cs.primary; + }), + backgroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return MWColors.stormNavy.withAlpha(100); + } + return MWColors.stormNavy; + }), ), ), diff --git a/lib/features/downloader/use_cases/download_object_use_case.dart b/lib/features/downloader/use_cases/download_object_use_case.dart index fafe312..94fb514 100644 --- a/lib/features/downloader/use_cases/download_object_use_case.dart +++ b/lib/features/downloader/use_cases/download_object_use_case.dart @@ -47,7 +47,7 @@ class DownloadObjectUseCase ); final total = meta.size; - final pathToFile = '${request.destinationPath}/${Config.objectName}'; + final pathToFile = '${request.destinationPath}${Config.objectName}'; await _fileSystem.ensureParentExists(pathToFile); diff --git a/lib/main.dart b/lib/main.dart index 2a5a18d..f4f0397 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,9 +7,26 @@ import 'package:flutter/foundation.dart' import 'package:moonwell_launcher/app/mw_app.dart'; import 'package:moonwell_launcher/app/theme/mw_theme.dart'; import 'package:moonwell_launcher/service_container.dart'; +import 'package:window_manager/window_manager.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); + await windowManager.ensureInitialized(); + + WindowOptions windowOptions = WindowOptions( + size: Size(960, 540), + center: true, + backgroundColor: Colors.transparent, + skipTaskbar: false, + titleBarStyle: TitleBarStyle.hidden, + ); + + unawaited( + windowManager.waitUntilReadyToShow(windowOptions, () async { + await windowManager.show(); + await windowManager.focus(); + }), + ); await configureDependencies(env: 'flutter'); diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index e71a16d..c8f3dcc 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,14 @@ #include "generated_plugin_registrant.h" +#include +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) screen_retriever_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverLinuxPlugin"); + screen_retriever_linux_plugin_register_with_registrar(screen_retriever_linux_registrar); + g_autoptr(FlPluginRegistrar) window_manager_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "WindowManagerPlugin"); + window_manager_plugin_register_with_registrar(window_manager_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 2e1de87..00303ac 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,8 @@ # list(APPEND FLUTTER_PLUGIN_LIST + screen_retriever_linux + window_manager ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 438e7e5..5e7b670 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,9 +6,13 @@ import FlutterMacOS import Foundation import file_picker +import screen_retriever_macos import shared_preferences_foundation +import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) + ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) } diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 0243983..00658f6 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -2,27 +2,39 @@ PODS: - file_picker (0.0.1): - FlutterMacOS - FlutterMacOS (1.0.0) + - screen_retriever_macos (0.0.1): + - FlutterMacOS - shared_preferences_foundation (0.0.1): - Flutter - FlutterMacOS + - window_manager (0.5.0): + - FlutterMacOS DEPENDENCIES: - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`) - FlutterMacOS (from `Flutter/ephemeral`) + - screen_retriever_macos (from `Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos`) - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) + - window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`) EXTERNAL SOURCES: file_picker: :path: Flutter/ephemeral/.symlinks/plugins/file_picker/macos FlutterMacOS: :path: Flutter/ephemeral + screen_retriever_macos: + :path: Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos shared_preferences_foundation: :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin + window_manager: + :path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos SPEC CHECKSUMS: file_picker: 7584aae6fa07a041af2b36a2655122d42f578c1a FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1 + screen_retriever_macos: 452e51764a9e1cdb74b3c541238795849f21557f shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 + window_manager: b729e31d38fb04905235df9ea896128991cad99e PODFILE CHECKSUM: 54d867c82ac51cbd61b565781b9fada492027009 diff --git a/pubspec.lock b/pubspec.lock index 7e1dc8c..7050ece 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -608,6 +608,46 @@ packages: url: "https://pub.dev" source: hosted version: "0.28.0" + screen_retriever: + dependency: transitive + description: + name: screen_retriever + sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_linux: + dependency: transitive + description: + name: screen_retriever_linux + sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_macos: + dependency: transitive + description: + name: screen_retriever_macos + sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_platform_interface: + dependency: transitive + description: + name: screen_retriever_platform_interface + sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_windows: + dependency: transitive + description: + name: screen_retriever_windows + sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" + url: "https://pub.dev" + source: hosted + version: "0.2.0" shared_preferences: dependency: "direct main" description: @@ -821,6 +861,14 @@ packages: url: "https://pub.dev" source: hosted version: "5.14.0" + window_manager: + dependency: "direct main" + description: + name: window_manager + sha256: "7eb6d6c4164ec08e1bf978d6e733f3cebe792e2a23fb07cbca25c2872bfdbdcd" + url: "https://pub.dev" + source: hosted + version: "0.5.1" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 6dc3816..3488969 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -48,6 +48,7 @@ dependencies: file_picker: ^10.3.2 pixelarticons: ^0.4.0 shared_preferences: ^2.5.3 + window_manager: ^0.5.1 dev_dependencies: flutter_test: @@ -73,8 +74,8 @@ flutter: uses-material-design: true # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg + assets: + - assets/background.png # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see @@ -83,11 +84,6 @@ flutter: # For details regarding adding assets from package dependencies, see # https://flutter.dev/to/asset-from-package - # To add custom fonts/Users/kalistratovm/Downloads/Cinzel/Cinzel.ttf to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: fonts: - family: Cinzel fonts: diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 8b6d468..c6fe39a 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,12 @@ #include "generated_plugin_registrant.h" +#include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi")); + WindowManagerPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("WindowManagerPlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index b93c4c3..5e3bc3d 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,8 @@ # list(APPEND FLUTTER_PLUGIN_LIST + screen_retriever_windows + window_manager ) list(APPEND FLUTTER_FFI_PLUGIN_LIST