import 'package:flutter/material.dart'; import 'dart:math'; class SectographWidget extends StatefulWidget { @override _SectographWidgetState createState() => _SectographWidgetState(); } class _SectographWidgetState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; DateTime _currentTime = DateTime.now(); List tasks = [ Task(name: "Work", startTime: DateTime.now().add(Duration(hours: 1)), duration: Duration(hours: 2), color: Colors.blue, icon: Icons.work, priority: 3), Task(name: "Gym", startTime: DateTime.now().add(Duration(hours: 4)), duration: Duration(hours: 1), color: Colors.red, icon: Icons.fitness_center, priority: 5), Task(name: "Lunch", startTime: DateTime.now().add(Duration(hours: 3)), duration: Duration(hours: 1), color: Colors.green, icon: Icons.restaurant, priority: 4), ]; @override void initState() { super.initState(); _controller = AnimationController(vsync: this, duration: Duration(seconds: 1)) ..addListener(() => setState(() => _currentTime = DateTime.now())) ..repeat(); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Stack( alignment: Alignment.center, children: [ CustomPaint( size: Size(300, 300), painter: SectographPainter(_currentTime, tasks), ), Positioned( child: Column( mainAxisSize: MainAxisSize.min, children: [ Text( "${_currentTime.hour}:${_currentTime.minute.toString().padLeft(2, '0')}", style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold, color: Colors.white), ), ElevatedButton( onPressed: () => setState(() => _currentTime = DateTime.now()), child: Text("Güncelle"), ) ], ), ) ], ); } } class SectographPainter extends CustomPainter { final DateTime currentTime; final List tasks; SectographPainter(this.currentTime, this.tasks); @override void paint(Canvas canvas, Size size) { final center = Offset(size.width / 2, size.height / 2); final radius = min(size.width / 2, size.height / 2); final paint = Paint()..style = PaintingStyle.stroke..strokeWidth = 15; for (var task in tasks) { if (task.isVisible(currentTime)) { paint.color = task.color; double startAngle = _timeToAngle(task.startTime); double sweepAngle = _durationToAngle(task.duration); canvas.drawArc(Rect.fromCircle(center: center, radius: radius), startAngle, sweepAngle, false, paint); } } final linePaint = Paint() ..color = Colors.yellow ..strokeWidth = 3; double timeAngle = _timeToAngle(currentTime); final lineStart = center + Offset(cos(timeAngle) * (radius - 10), sin(timeAngle) * (radius - 10)); final lineEnd = center + Offset(cos(timeAngle) * radius, sin(timeAngle) * radius); canvas.drawLine(lineStart, lineEnd, linePaint); } double _timeToAngle(DateTime time) { return (time.hour * 60 + time.minute) * pi / 720 - pi / 2; } double _durationToAngle(Duration duration) { return (duration.inMinutes) * pi / 720; } @override bool shouldRepaint(covariant CustomPainter oldDelegate) => true; } class Task { String name; DateTime startTime; Duration duration; Color color; IconData icon; int priority; Task({required this.name, required this.startTime, required this.duration, required this.color, required this.icon, required this.priority}); bool isVisible(DateTime currentTime) { return startTime.day == currentTime.day; } }