- Created CMakeLists.txt for Flutter and runner components. - Implemented resource script (Runner.rc) for application metadata. - Developed main entry point (main.cpp) for the Windows application. - Added FlutterWindow class to manage the Flutter view within a Win32 window. - Implemented utility functions for console management and command line argument parsing. - Established Win32Window class for high DPI-aware window handling. - Included application icon and manifest for proper Windows integration. - Set up build configurations and dependencies for the Flutter application on Windows.
		
			
				
	
	
		
			175 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'dart:async';
 | |
| import 'package:marco/controller/my_controller.dart';
 | |
| import 'package:marco/helpers/extensions/string.dart';
 | |
| import 'package:marco/helpers/theme/admin_theme.dart';
 | |
| import 'package:marco/helpers/widgets/my_button.dart';
 | |
| import 'package:marco/helpers/widgets/my_spacing.dart';
 | |
| import 'package:marco/helpers/widgets/my_text.dart';
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:get/get.dart';
 | |
| import 'package:flutter_lucide/flutter_lucide.dart';
 | |
| 
 | |
| class NotificationController extends MyController {
 | |
|   final TickerProvider ticker;
 | |
|   Timer? _timer;
 | |
| 
 | |
|   TextEditingController toastTitleController =
 | |
|       TextEditingController(text: "Flatten is awesome");
 | |
|   ContentThemeColor selectedColor = ContentThemeColor.primary;
 | |
|   SnackBarBehavior selectedBehavior = SnackBarBehavior.floating;
 | |
|   late AnimationController animationController =
 | |
|       AnimationController(vsync: ticker, duration: Duration(seconds: 20));
 | |
| 
 | |
|   bool showCloseIcon = true,
 | |
|       showOkAction = true,
 | |
|       showBanner = false,
 | |
|       showLeadingIcon = true,
 | |
|       sticky = false;
 | |
| 
 | |
|   NotificationController(this.ticker);
 | |
| 
 | |
|   void setBannerType(bool value) {
 | |
|     showBanner = value;
 | |
|     update();
 | |
|   }
 | |
| 
 | |
|   void onChangeColor(ContentThemeColor? value) {
 | |
|     if (value != null) {
 | |
|       selectedColor = value;
 | |
|       update();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void onChangeBehavior(SnackBarBehavior? value) {
 | |
|     if (value != null) {
 | |
|       selectedBehavior = value;
 | |
|       update();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void onChangeShowCloseIcon(bool? value) {
 | |
|     if (value != null) {
 | |
|       showCloseIcon = value;
 | |
|       update();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void onAction(bool? value) {
 | |
|     if (value != null) {
 | |
|       showBanner ? showLeadingIcon = value : showOkAction = value;
 | |
|       update();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void onChangeSticky(bool? value) {
 | |
|     if (value != null) {
 | |
|       sticky = value;
 | |
|       update();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   //Show snackBar
 | |
|   void show() {
 | |
|     showBanner ? showMaterialBanner() : showSnackBar();
 | |
|   }
 | |
| 
 | |
|   void showMaterialBanner() {
 | |
|     String text = toastTitleController.text.nullIfEmpty ?? "Please set title";
 | |
|     Color backgroundColor = selectedColor.color;
 | |
|     Color color = selectedColor.onColor;
 | |
| 
 | |
|     List<Widget> actions = [];
 | |
|     if (showCloseIcon) {
 | |
|       actions.add(MyButton.text(
 | |
|           onPressed: () {
 | |
|             ScaffoldMessenger.of(Get.context!).hideCurrentMaterialBanner();
 | |
|           },
 | |
|           padding: MySpacing.x(8),
 | |
|           splashColor: color.withValues(alpha: 0.1),
 | |
|           child: MyText.labelMedium(
 | |
|             'Dismiss',
 | |
|             color: color,
 | |
|           )));
 | |
|     } else {
 | |
|       actions.add(MySpacing.empty());
 | |
|     }
 | |
| 
 | |
|     Widget? leadingIcon;
 | |
|     if (showLeadingIcon) {
 | |
|       leadingIcon = Icon(
 | |
|         LucideIcons.info,
 | |
|         color: color,
 | |
|         size: 20,
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     MaterialBanner banner = MaterialBanner(
 | |
|       content: MyText.labelMedium(
 | |
|         text,
 | |
|         color: color,
 | |
|       ),
 | |
|       padding: MySpacing.x(24),
 | |
|       leading: leadingIcon,
 | |
|       actions: actions,
 | |
|       overflowAlignment: OverflowBarAlignment.center,
 | |
|       forceActionsBelow: false,
 | |
|       backgroundColor: backgroundColor,
 | |
|     );
 | |
| 
 | |
|     ScaffoldMessenger.of(Get.context!).hideCurrentMaterialBanner();
 | |
|     ScaffoldMessenger.of(Get.context!).showMaterialBanner(banner);
 | |
| 
 | |
|     _timer?.cancel();
 | |
|     if (!sticky) {
 | |
|       _timer = Timer(Duration(seconds: 3), () {
 | |
|         ScaffoldMessenger.of(Get.context!).hideCurrentMaterialBanner();
 | |
|       });
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void showSnackBar() {
 | |
|     String text = toastTitleController.text.nullIfEmpty ?? "Please set title";
 | |
|     Color backgroundColor = selectedColor.color;
 | |
|     Color color = selectedColor.onColor;
 | |
|     double? width = selectedBehavior == SnackBarBehavior.fixed ? null : 300;
 | |
|     Duration duration = Duration(seconds: sticky ? 10000 : 3);
 | |
| 
 | |
|     SnackBarAction? action;
 | |
|     if (showOkAction) {
 | |
|       action = SnackBarAction(
 | |
|         label: "Ok",
 | |
|         onPressed: () =>
 | |
|             ScaffoldMessenger.of(Get.context!).hideCurrentSnackBar(),
 | |
|         textColor: color,
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     SnackBar snackBar = SnackBar(
 | |
|       width: width,
 | |
|       behavior: selectedBehavior,
 | |
|       duration: duration,
 | |
|       showCloseIcon: showCloseIcon,
 | |
|       closeIconColor: color,
 | |
|       action: action,
 | |
|       animation: Tween<double>(begin: 0, end: 300).animate(animationController),
 | |
|       content: MyText.labelLarge(
 | |
|         text,
 | |
|         color: color,
 | |
|       ),
 | |
|       backgroundColor: backgroundColor,
 | |
|     );
 | |
|     ScaffoldMessenger.of(Get.context!).hideCurrentSnackBar();
 | |
|     ScaffoldMessenger.of(Get.context!).showSnackBar(snackBar);
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void dispose() {
 | |
|     super.dispose();
 | |
|     _timer?.cancel();
 | |
|     try {
 | |
|       ScaffoldMessenger.of(Get.context!).hideCurrentSnackBar();
 | |
|       ScaffoldMessenger.of(Get.context!).hideCurrentMaterialBanner();
 | |
|     } catch (e) {}
 | |
|   }
 | |
| }
 |