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, // ), // ], // ), // ), // ), // )); // }