import 'package:flutter/material.dart'; import 'dart:math'; class Sectograph extends StatefulWidget { final DateTime currentTime; final List tasks; final bool hidePastTasks; const Sectograph({ Key? key, required this.currentTime, required this.tasks, this.hidePastTasks = true, }) : super(key: key); @override _SectographState createState() => _SectographState(); } class _SectographState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; @override void initState() { super.initState(); _controller = AnimationController( vsync: this, duration: const Duration(seconds: 1), )..repeat(); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return AnimatedBuilder( animation: _controller, builder: (context, child) { return CustomPaint( painter: SectographPainter( currentTime: widget.currentTime, tasks: widget.tasks, hidePastTasks: widget.hidePastTasks, ), size: const Size(300, 300), ); }, ); } } class SectographPainter extends CustomPainter { final DateTime currentTime; final List tasks; final bool hidePastTasks; SectographPainter({ required this.currentTime, required this.tasks, this.hidePastTasks = true, }); @override void paint(Canvas canvas, Size size) { final center = Offset(size.width / 2, size.height / 2); final radius = min(size.width, size.height) / 2; final paint = Paint()..style = PaintingStyle.stroke; for (var task in tasks) { if (hidePastTasks && task.endTime.isBefore(currentTime)) continue; final startAngle = (task.startTime.hour * 15 + task.startTime.minute * 0.25) * pi / 180; final sweepAngle = ((task.endTime.difference(task.startTime).inMinutes) * 0.25) * pi / 180; paint.color = task.color; paint.strokeWidth = 10; canvas.drawArc( Rect.fromCircle(center: center, radius: radius - 10), startAngle - pi / 2, sweepAngle, false, paint, ); } } @override bool shouldRepaint(covariant CustomPainter oldDelegate) => true; } class Task { final String name; final DateTime startTime; final DateTime endTime; final Color color; final IconData icon; final int priority; // Öncelik seviyesi 1-5 arası Task({ required this.name, required this.startTime, required this.endTime, required this.color, required this.icon, this.priority = 3, }); } // Örnek kullanım void main() { runApp(MaterialApp( home: Scaffold( body: Center( child: Sectograph( currentTime: DateTime.now(), tasks: [ Task( name: "Toplantı", startTime: DateTime.now().subtract(Duration(hours: 1)), endTime: DateTime.now().add(Duration(hours: 1)), color: Colors.blue, icon: Icons.work, priority: 2, ), Task( name: "Rapor Yazımı", startTime: DateTime.now().add(Duration(hours: 2)), endTime: DateTime.now().add(Duration(hours: 4)), color: Colors.red, icon: Icons.edit, priority: 1, ), ], ), ), ), )); }