feat: major ui/ux improvements
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 1.7 MiB |
@@ -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:
|
||||||
@@ -35,12 +35,8 @@ class HomeScreenBloc extends Bloc<HomeScreenEvent, HomeScreenState> {
|
|||||||
void _setupHandlers() {
|
void _setupHandlers() {
|
||||||
on<HomeScreenLoad>(_onHomeScreenLoad);
|
on<HomeScreenLoad>(_onHomeScreenLoad);
|
||||||
on<HomeScreenDownloadRequested>(_onHomeScreenDownloadRequested);
|
on<HomeScreenDownloadRequested>(_onHomeScreenDownloadRequested);
|
||||||
|
on<HomeScreenDownloadPaused>(_onHomeScreenDownloadPaused);
|
||||||
on<HomeScreenDownloadPaused>((event, emit) {
|
on<HomeScreenOutputDirRequested>(_onHomeOutputDirRequested);
|
||||||
// _downloadManager.pauseDownload();
|
|
||||||
// emit(HomeScreenDownloadPausedState());
|
|
||||||
});
|
|
||||||
|
|
||||||
on<HomeScreenDownloadProgressUpdated>(
|
on<HomeScreenDownloadProgressUpdated>(
|
||||||
_onHomeScreenDownloadProgressUpdated,
|
_onHomeScreenDownloadProgressUpdated,
|
||||||
transformer: (events, mapper) =>
|
transformer: (events, mapper) =>
|
||||||
@@ -66,23 +62,10 @@ class HomeScreenBloc extends Bloc<HomeScreenEvent, HomeScreenState> {
|
|||||||
Emitter<HomeScreenState> emit,
|
Emitter<HomeScreenState> emit,
|
||||||
) async {
|
) async {
|
||||||
if (state.model.outputPath == null) {
|
if (state.model.outputPath == null) {
|
||||||
final directory = await FilePicker.platform.getDirectoryPath(
|
emit(HomeScreenOutputDirSelectionState(model: state.model.copyWith()));
|
||||||
dialogTitle: 'Please select installation directory',
|
|
||||||
);
|
|
||||||
|
|
||||||
if (directory == null) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await _preferencesRepository.setOutputDir(Uri.directory(directory));
|
|
||||||
|
|
||||||
emit(
|
|
||||||
HomeScreenReadyToDownloadState(
|
|
||||||
model: state.model.copyWith(outputPath: Uri.directory(directory)),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
_downloadProgressSubscription = _downloadManager
|
_downloadProgressSubscription = _downloadManager
|
||||||
.start(
|
.start(
|
||||||
id: _downloadId,
|
id: _downloadId,
|
||||||
@@ -91,6 +74,8 @@ class HomeScreenBloc extends Bloc<HomeScreenEvent, HomeScreenState> {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
.listen((progress) => add(HomeScreenDownloadProgressUpdated(progress)));
|
.listen((progress) => add(HomeScreenDownloadProgressUpdated(progress)));
|
||||||
|
|
||||||
|
emit(HomeScreenDownloadInitializing(model: state.model.copyWith()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onHomeScreenDownloadProgressUpdated(
|
void _onHomeScreenDownloadProgressUpdated(
|
||||||
@@ -111,4 +96,36 @@ class HomeScreenBloc extends Bloc<HomeScreenEvent, HomeScreenState> {
|
|||||||
|
|
||||||
return super.close();
|
return super.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FutureOr<void> _onHomeScreenDownloadPaused(
|
||||||
|
HomeScreenDownloadPaused event,
|
||||||
|
Emitter<HomeScreenState> emit,
|
||||||
|
) async {
|
||||||
|
await _downloadManager.pause(_downloadId);
|
||||||
|
|
||||||
|
emit(HomeScreenDownloadPausedState(model: state.model.copyWith()));
|
||||||
|
}
|
||||||
|
|
||||||
|
FutureOr<void> _onHomeOutputDirRequested(
|
||||||
|
HomeScreenOutputDirRequested event,
|
||||||
|
Emitter<HomeScreenState> 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)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ final class HomeScreenLoad extends HomeScreenEvent {}
|
|||||||
|
|
||||||
final class HomeScreenDownloadRequested extends HomeScreenEvent {}
|
final class HomeScreenDownloadRequested extends HomeScreenEvent {}
|
||||||
|
|
||||||
|
final class HomeScreenOutputDirRequested extends HomeScreenEvent {}
|
||||||
|
|
||||||
final class HomeScreenDownloadPaused extends HomeScreenEvent {}
|
final class HomeScreenDownloadPaused extends HomeScreenEvent {}
|
||||||
|
|
||||||
final class HomeScreenDownloadProgressUpdated extends HomeScreenEvent {
|
final class HomeScreenDownloadProgressUpdated extends HomeScreenEvent {
|
||||||
|
|||||||
@@ -19,6 +19,18 @@ final class HomeScreenDownloadPausedState extends HomeScreenState {
|
|||||||
const HomeScreenDownloadPausedState({required super.model});
|
const HomeScreenDownloadPausedState({required super.model});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final class HomeScreenDownloadInitializing extends HomeScreenState {
|
||||||
|
const HomeScreenDownloadInitializing({required super.model});
|
||||||
|
}
|
||||||
|
|
||||||
final class HomeScreenDownloadingState extends HomeScreenState {
|
final class HomeScreenDownloadingState extends HomeScreenState {
|
||||||
const HomeScreenDownloadingState({required super.model});
|
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});
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.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/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/app/theme/mw_theme.dart';
|
||||||
import 'package:moonwell_launcher/features/downloader/application/download_manager.dart';
|
import 'package:moonwell_launcher/features/downloader/application/download_manager.dart';
|
||||||
import 'package:moonwell_launcher/features/preferences/domain/repositories/preferences_repository.dart';
|
import 'package:moonwell_launcher/features/preferences/domain/repositories/preferences_repository.dart';
|
||||||
@@ -19,10 +19,34 @@ class HomeScreen extends StatelessWidget {
|
|||||||
downloadManager: getIt<DownloadManager>(),
|
downloadManager: getIt<DownloadManager>(),
|
||||||
preferencesRepository: getIt<PreferencesRepository>(),
|
preferencesRepository: getIt<PreferencesRepository>(),
|
||||||
),
|
),
|
||||||
child: Builder(
|
child: BlocConsumer<HomeScreenBloc, HomeScreenState>(
|
||||||
builder: (context) {
|
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<HomeScreenBloc>().add(
|
||||||
|
HomeScreenOutputDirRequested(),
|
||||||
|
),
|
||||||
|
label: Text('Select directory'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
builder: (context, state) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
body: Container(
|
body: Stack(
|
||||||
|
children: [
|
||||||
|
Positioned.fill(
|
||||||
|
child: Container(
|
||||||
decoration: const BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
// subtle vignette for “night” vibe
|
// subtle vignette for “night” vibe
|
||||||
gradient: RadialGradient(
|
gradient: RadialGradient(
|
||||||
@@ -34,32 +58,36 @@ class HomeScreen extends StatelessWidget {
|
|||||||
child: Center(
|
child: Center(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: EdgeInsets.all(24.0),
|
padding: EdgeInsets.all(24.0),
|
||||||
child: Row(
|
child: Stack(
|
||||||
|
children: [
|
||||||
|
Positioned.fill(
|
||||||
|
child: Image.asset(
|
||||||
|
'assets/background.png',
|
||||||
|
fit: BoxFit.fitWidth,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Row(
|
||||||
children: [
|
children: [
|
||||||
Expanded(
|
Expanded(
|
||||||
child: LeftPane(
|
child: HomeScreenContent(
|
||||||
title: Text(
|
title: Text(
|
||||||
'MoonWell',
|
'MoonWell',
|
||||||
style: theme.textTheme.headlineLarge,
|
style: theme.textTheme.headlineLarge,
|
||||||
),
|
),
|
||||||
progress: 0.0,
|
|
||||||
isDownloading: false,
|
|
||||||
kbps: 0.0,
|
|
||||||
eta: Duration.zero,
|
|
||||||
onStart: () {
|
|
||||||
context.read<HomeScreenBloc>().add(
|
|
||||||
HomeScreenDownloadRequested(),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
onPause: () {},
|
|
||||||
onReset: () {},
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
if (state is HomeScreenDownloadInitializing)
|
||||||
|
Center(child: const CircularProgressIndicator()),
|
||||||
|
],
|
||||||
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -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<HomeScreenBloc>().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<MoonWellDecorations>()!;
|
||||||
|
|
||||||
|
final state = context.read<HomeScreenBloc>().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<HomeScreenBloc>().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<HomeScreenBloc>().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<HomeScreenBloc>().add(HomeScreenDownloadRequested());
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onPause(BuildContext context) {
|
||||||
|
context.read<HomeScreenBloc>().add(HomeScreenDownloadPaused());
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onReset(BuildContext context) {
|
||||||
|
// context.read<HomeScreenBloc>().add(HomeScreenDownloadReset());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<HomeScreenBloc>().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<MoonWellDecorations>()!;
|
|
||||||
|
|
||||||
return BlocBuilder<HomeScreenBloc, HomeScreenState>(
|
|
||||||
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<HomeScreenBloc>().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';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+12
-7
@@ -2,13 +2,14 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:moonwell_launcher/app/theme/mw_theme.dart';
|
import 'package:moonwell_launcher/app/theme/mw_theme.dart';
|
||||||
|
|
||||||
class GildedProgressBar extends StatelessWidget {
|
class GildedProgressBar extends StatelessWidget {
|
||||||
const GildedProgressBar({required this.value});
|
const GildedProgressBar({super.key, required this.value});
|
||||||
final double value;
|
final double value;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final cs = Theme.of(context).colorScheme;
|
final cs = Theme.of(context).colorScheme;
|
||||||
final deco = Theme.of(context).extension<MoonWellDecorations>()!;
|
final deco = Theme.of(context).extension<MoonWellDecorations>()!;
|
||||||
|
|
||||||
return Container(
|
return Container(
|
||||||
height: 20,
|
height: 20,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
@@ -19,8 +20,16 @@ class GildedProgressBar extends StatelessWidget {
|
|||||||
clipBehavior: Clip.antiAlias,
|
clipBehavior: Clip.antiAlias,
|
||||||
child: Stack(
|
child: Stack(
|
||||||
children: [
|
children: [
|
||||||
// Fill with gold bevel
|
// Subtle top highlight
|
||||||
FractionallySizedBox(
|
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),
|
widthFactor: value.clamp(0.0, 1.0),
|
||||||
alignment: Alignment.centerLeft,
|
alignment: Alignment.centerLeft,
|
||||||
child: DecoratedBox(
|
child: DecoratedBox(
|
||||||
@@ -29,10 +38,6 @@ class GildedProgressBar extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
// Subtle top highlight
|
|
||||||
Align(
|
|
||||||
alignment: Alignment.topCenter,
|
|
||||||
child: Container(height: 6, color: Colors.white.withAlpha(10)),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -81,7 +81,7 @@ ThemeData moonWellTheme() {
|
|||||||
),
|
),
|
||||||
|
|
||||||
cardTheme: CardThemeData(
|
cardTheme: CardThemeData(
|
||||||
color: cs.surface,
|
color: cs.surface.withAlpha(50),
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
margin: const EdgeInsets.all(12),
|
margin: const EdgeInsets.all(12),
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
@@ -99,6 +99,9 @@ ThemeData moonWellTheme() {
|
|||||||
shape: WidgetStatePropertyAll(
|
shape: WidgetStatePropertyAll(
|
||||||
RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)),
|
RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)),
|
||||||
),
|
),
|
||||||
|
textStyle: WidgetStatePropertyAll(
|
||||||
|
TextStyle(fontWeight: FontWeight.bold, fontFamily: 'Cinzel'),
|
||||||
|
),
|
||||||
elevation: const WidgetStatePropertyAll(6),
|
elevation: const WidgetStatePropertyAll(6),
|
||||||
shadowColor: WidgetStatePropertyAll(MWColors.moonBlue.withAlpha(89)),
|
shadowColor: WidgetStatePropertyAll(MWColors.moonBlue.withAlpha(89)),
|
||||||
backgroundColor: WidgetStateProperty.resolveWith((states) {
|
backgroundColor: WidgetStateProperty.resolveWith((states) {
|
||||||
@@ -138,7 +141,18 @@ ThemeData moonWellTheme() {
|
|||||||
shape: WidgetStatePropertyAll(
|
shape: WidgetStatePropertyAll(
|
||||||
RoundedRectangleBorder(borderRadius: BorderRadius.circular(14)),
|
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;
|
||||||
|
}),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class DownloadObjectUseCase
|
|||||||
);
|
);
|
||||||
final total = meta.size;
|
final total = meta.size;
|
||||||
|
|
||||||
final pathToFile = '${request.destinationPath}/${Config.objectName}';
|
final pathToFile = '${request.destinationPath}${Config.objectName}';
|
||||||
|
|
||||||
await _fileSystem.ensureParentExists(pathToFile);
|
await _fileSystem.ensureParentExists(pathToFile);
|
||||||
|
|
||||||
|
|||||||
@@ -7,9 +7,26 @@ import 'package:flutter/foundation.dart'
|
|||||||
import 'package:moonwell_launcher/app/mw_app.dart';
|
import 'package:moonwell_launcher/app/mw_app.dart';
|
||||||
import 'package:moonwell_launcher/app/theme/mw_theme.dart';
|
import 'package:moonwell_launcher/app/theme/mw_theme.dart';
|
||||||
import 'package:moonwell_launcher/service_container.dart';
|
import 'package:moonwell_launcher/service_container.dart';
|
||||||
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
|
||||||
Future<void> main() async {
|
Future<void> main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
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');
|
await configureDependencies(env: 'flutter');
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,14 @@
|
|||||||
|
|
||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
|
#include <screen_retriever_linux/screen_retriever_linux_plugin.h>
|
||||||
|
#include <window_manager/window_manager_plugin.h>
|
||||||
|
|
||||||
void fl_register_plugins(FlPluginRegistry* registry) {
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
|
screen_retriever_linux
|
||||||
|
window_manager
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||||
|
|||||||
@@ -6,9 +6,13 @@ import FlutterMacOS
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
import file_picker
|
import file_picker
|
||||||
|
import screen_retriever_macos
|
||||||
import shared_preferences_foundation
|
import shared_preferences_foundation
|
||||||
|
import window_manager
|
||||||
|
|
||||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||||
FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin"))
|
FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin"))
|
||||||
|
ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin"))
|
||||||
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
||||||
|
WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin"))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,27 +2,39 @@ PODS:
|
|||||||
- file_picker (0.0.1):
|
- file_picker (0.0.1):
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
- FlutterMacOS (1.0.0)
|
- FlutterMacOS (1.0.0)
|
||||||
|
- screen_retriever_macos (0.0.1):
|
||||||
|
- FlutterMacOS
|
||||||
- shared_preferences_foundation (0.0.1):
|
- shared_preferences_foundation (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
- FlutterMacOS
|
- FlutterMacOS
|
||||||
|
- window_manager (0.5.0):
|
||||||
|
- FlutterMacOS
|
||||||
|
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`)
|
- file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`)
|
||||||
- FlutterMacOS (from `Flutter/ephemeral`)
|
- 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`)
|
- shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`)
|
||||||
|
- window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`)
|
||||||
|
|
||||||
EXTERNAL SOURCES:
|
EXTERNAL SOURCES:
|
||||||
file_picker:
|
file_picker:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/file_picker/macos
|
:path: Flutter/ephemeral/.symlinks/plugins/file_picker/macos
|
||||||
FlutterMacOS:
|
FlutterMacOS:
|
||||||
:path: Flutter/ephemeral
|
:path: Flutter/ephemeral
|
||||||
|
screen_retriever_macos:
|
||||||
|
:path: Flutter/ephemeral/.symlinks/plugins/screen_retriever_macos/macos
|
||||||
shared_preferences_foundation:
|
shared_preferences_foundation:
|
||||||
:path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin
|
:path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin
|
||||||
|
window_manager:
|
||||||
|
:path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
file_picker: 7584aae6fa07a041af2b36a2655122d42f578c1a
|
file_picker: 7584aae6fa07a041af2b36a2655122d42f578c1a
|
||||||
FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1
|
FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1
|
||||||
|
screen_retriever_macos: 452e51764a9e1cdb74b3c541238795849f21557f
|
||||||
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
|
shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7
|
||||||
|
window_manager: b729e31d38fb04905235df9ea896128991cad99e
|
||||||
|
|
||||||
PODFILE CHECKSUM: 54d867c82ac51cbd61b565781b9fada492027009
|
PODFILE CHECKSUM: 54d867c82ac51cbd61b565781b9fada492027009
|
||||||
|
|
||||||
|
|||||||
@@ -608,6 +608,46 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.28.0"
|
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:
|
shared_preferences:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@@ -821,6 +861,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.14.0"
|
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:
|
xdg_directories:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
+3
-7
@@ -48,6 +48,7 @@ dependencies:
|
|||||||
file_picker: ^10.3.2
|
file_picker: ^10.3.2
|
||||||
pixelarticons: ^0.4.0
|
pixelarticons: ^0.4.0
|
||||||
shared_preferences: ^2.5.3
|
shared_preferences: ^2.5.3
|
||||||
|
window_manager: ^0.5.1
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
@@ -73,8 +74,8 @@ flutter:
|
|||||||
uses-material-design: true
|
uses-material-design: true
|
||||||
|
|
||||||
# To add assets to your application, add an assets section, like this:
|
# To add assets to your application, add an assets section, like this:
|
||||||
# assets:
|
assets:
|
||||||
# - images/a_dot_burr.jpeg
|
- assets/background.png
|
||||||
# - images/a_dot_ham.jpeg
|
# - images/a_dot_ham.jpeg
|
||||||
|
|
||||||
# An image asset can refer to one or more resolution-specific "variants", see
|
# 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
|
# For details regarding adding assets from package dependencies, see
|
||||||
# https://flutter.dev/to/asset-from-package
|
# 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:
|
fonts:
|
||||||
- family: Cinzel
|
- family: Cinzel
|
||||||
fonts:
|
fonts:
|
||||||
|
|||||||
@@ -6,6 +6,12 @@
|
|||||||
|
|
||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
|
#include <screen_retriever_windows/screen_retriever_windows_plugin_c_api.h>
|
||||||
|
#include <window_manager/window_manager_plugin.h>
|
||||||
|
|
||||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||||
|
ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar(
|
||||||
|
registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi"));
|
||||||
|
WindowManagerPluginRegisterWithRegistrar(
|
||||||
|
registry->GetRegistrarForPlugin("WindowManagerPlugin"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
|
screen_retriever_windows
|
||||||
|
window_manager
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||||
|
|||||||
Reference in New Issue
Block a user