marco.pms.mobileapp/lib/helpers/widgets/my_page_dragger.dart
Vaibhav Surve a5dd5e19fc Add Windows runner implementation for Flutter application
- 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.
2025-04-23 09:55:31 +05:30

163 lines
4.0 KiB
Dart

// ignore_for_file: prefer_typing_uninitialized_variables, non_constant_identifier_names, constant_identifier_names
import 'dart:async';
import 'dart:ui';
import 'package:marco/helpers/widgets/my_page_indicator.dart';
import 'package:flutter/material.dart';
class MyPageDragger extends StatefulWidget {
final canDragLeftToRight;
final canDragRightToLeft;
final StreamController<SlideUpdate>? slideUpdateStream;
MyPageDragger({
super.key,
this.canDragLeftToRight,
this.canDragRightToLeft,
this.slideUpdateStream,
});
@override
_MyPageDraggerState createState() => _MyPageDraggerState();
}
class _MyPageDraggerState extends State<MyPageDragger> {
static const FULL_TRANSITION_PX = 300.0;
Offset? dragStart;
SlideDirection? slideDirection;
double slidePercent = 0.0;
onDragStart(DragStartDetails details) {
dragStart = details.globalPosition;
}
onDragUpdate(DragUpdateDetails details) {
if (dragStart != null) {
final Position = details.globalPosition;
final dx = dragStart!.dx - Position.dx;
if (dx > 0 && widget.canDragRightToLeft) {
slideDirection = SlideDirection.rightToLeft;
} else if (dx < 0 && widget.canDragLeftToRight) {
slideDirection = SlideDirection.leftToRight;
} else {
slideDirection = SlideDirection.none;
}
if (slideDirection != SlideDirection.none) {
slidePercent = (dx / FULL_TRANSITION_PX).abs().clamp(0.0, 1.0);
} else {
slidePercent = 0.0;
}
widget.slideUpdateStream!
.add(SlideUpdate(UpdateType.dragging, slideDirection, slidePercent));
}
}
onDragEnd(DragEndDetails details) {
widget.slideUpdateStream!.add(SlideUpdate(
UpdateType.doneDragging,
SlideDirection.none,
0.0,
));
dragStart = null;
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onHorizontalDragStart: onDragStart,
onHorizontalDragUpdate: onDragUpdate,
onHorizontalDragEnd: onDragEnd,
);
}
}
class AnimatedPageDragger {
static const PERCENT_PER_MILLISECOND = 0.005;
final slideDirection;
final transitionGoal;
late AnimationController completionAnimationController;
AnimatedPageDragger({
this.slideDirection,
this.transitionGoal,
slidePercent,
StreamController<SlideUpdate>? slideUpdateStream,
required TickerProvider vsync,
}) {
final startSlidePercent = slidePercent;
double endSlidePercent;
Duration duration;
if (transitionGoal == TransitionGoal.open) {
endSlidePercent = 1.0;
final slideRemaining = 1.0 - slidePercent;
duration = Duration(
milliseconds: (slideRemaining / PERCENT_PER_MILLISECOND).round());
} else {
endSlidePercent = 0.0;
duration = Duration(
milliseconds: (slidePercent / PERCENT_PER_MILLISECOND).round());
}
completionAnimationController =
AnimationController(duration: duration, vsync: vsync)
..addListener(() {
slidePercent = lerpDouble(startSlidePercent, endSlidePercent,
completionAnimationController.value);
slideUpdateStream!.add(SlideUpdate(
UpdateType.animating,
slideDirection,
slidePercent,
));
})
..addStatusListener((AnimationStatus status) {
if (status == AnimationStatus.completed) {
slideUpdateStream!.add(SlideUpdate(
UpdateType.doneAnimating,
slideDirection,
endSlidePercent,
));
}
});
}
run() {
completionAnimationController.forward(from: 0.0);
}
dispose() {
completionAnimationController.dispose();
}
}
enum TransitionGoal {
open,
close,
}
enum UpdateType {
dragging,
doneDragging,
animating,
doneAnimating,
}
class SlideUpdate {
final updateType;
final direction;
final slidePercent;
SlideUpdate(this.updateType, this.direction, this.slidePercent);
}