import 'dart:math'; import 'package:flutter/material.dart'; class TaskClock extends StatefulWidget { const TaskClock({super.key}); @override State createState() => _TaskClockState(); } class _TaskClockState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; DateTime currentTime = DateTime.now(); // 🕒 Görevler Listesi (Tamamen Özelleştirilebilir) final List> tasks = [ {"name": "Spor", "start": 6, "end": 7, "priority": "Yüksek", "emoji": "🏋️‍♂️"}, {"name": "Toplantı", "start": 9, "end": 10, "priority": "Kritik", "emoji": "📅"}, {"name": "Öğle Yemeği", "start": 12, "end": 13, "priority": "Orta", "emoji": "🍽️"}, {"name": "Kodlama", "start": 15, "end": 17, "priority": "Düşük", "emoji": "💻"}, ]; // 🔥 Öncelik Seviyeleri final List> priorities = [ {"name": "Düşük", "color": Colors.blue, "effect": "opacity"}, {"name": "Orta", "color": Colors.green, "effect": "none"}, {"name": "Yüksek", "color": Colors.orange, "effect": "pulse"}, {"name": "Kritik", "color": Colors.red, "effect": "vibration"}, ]; @override void initState() { super.initState(); _controller = AnimationController(vsync: this, duration: const Duration(seconds: 1))..repeat(reverse: true); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: AnimatedBuilder( animation: _controller, builder: (context, child) { return CustomPaint( painter: TaskPainter( tasks: tasks, currentTime: currentTime, priorities: priorities, animationValue: _controller.value, ), size: const Size(300, 300), ); }, ), ), ); } } // 🎨 CANVAS RENDERING (GÖREV ÇİZİMİ) class TaskPainter extends CustomPainter { final List> tasks; final List> priorities; final DateTime currentTime; final double animationValue; TaskPainter({ required this.tasks, required this.currentTime, required this.priorities, required this.animationValue, }); @override void paint(Canvas canvas, Size size) { final center = Offset(size.width / 2, size.height / 2); final radius = size.width / 2; final paint = Paint()..style = PaintingStyle.fill; // ⏳ Çemberin Arka Planı paint.color = Colors.grey.shade800; canvas.drawCircle(center, radius, paint); // 🔥 Görevleri Çiz for (var task in tasks) { final priority = priorities.firstWhere((p) => p["name"] == task["priority"]); final color = priority["color"] as Color; final effect = priority["effect"] as String; double startAngle = (task["start"] / 24) * 2 * pi - pi / 2; double sweepAngle = ((task["end"] - task["start"]) / 24) * 2 * pi; paint.color = color.withOpacity(effect == "opacity" ? 0.5 : 1.0); canvas.drawArc(Rect.fromCircle(center: center, radius: radius), startAngle, sweepAngle, true, paint); // 🎭 Animasyon Efektleri if (effect == "pulse") { paint.color = color.withOpacity(animationValue); canvas.drawArc(Rect.fromCircle(center: center, radius: radius - 5), startAngle, sweepAngle, true, paint); } else if (effect == "vibration") { final offset = (animationValue - 0.5) * 10; canvas.drawArc( Rect.fromCircle(center: Offset(center.dx + offset, center.dy), radius: radius), startAngle, sweepAngle, true, paint); } // 🕒 Saat Etiketleri final textPainter = TextPainter( text: TextSpan( text: "${task["emoji"]} ${task["name"]}", style: const TextStyle(color: Colors.white, fontSize: 12), ), textDirection: TextDirection.ltr, )..layout(); final angle = startAngle + sweepAngle / 2; final labelX = center.dx + cos(angle) * radius * 0.7 - textPainter.width / 2; final labelY = center.dy + sin(angle) * radius * 0.7 - textPainter.height / 2; textPainter.paint(canvas, Offset(labelX, labelY)); } } @override bool shouldRepaint(TaskPainter oldDelegate) => true; }