106 lines
2.2 KiB
Dart
106 lines
2.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:hive/hive.dart';
|
|
|
|
part 'todo.g.dart';
|
|
|
|
@HiveType(typeId: 0)
|
|
class Todo extends HiveObject {
|
|
@HiveField(0)
|
|
late int id;
|
|
|
|
@HiveField(1)
|
|
late String title;
|
|
|
|
@HiveField(2)
|
|
late String content;
|
|
|
|
@HiveField(3)
|
|
late bool isCompleted;
|
|
|
|
@HiveField(4)
|
|
late DateTime? dueDate;
|
|
|
|
@HiveField(5)
|
|
late int priorityIndex;
|
|
|
|
@HiveField(6)
|
|
late DateTime createTime;
|
|
|
|
@HiveField(7)
|
|
late DateTime updateTime;
|
|
|
|
TodoPriority get priority => TodoPriority.values[priorityIndex];
|
|
|
|
set priority(TodoPriority value) => priorityIndex = value.index;
|
|
|
|
Todo({
|
|
int? id,
|
|
required this.title,
|
|
this.content = '',
|
|
this.isCompleted = false,
|
|
this.dueDate,
|
|
TodoPriority priority = TodoPriority.medium,
|
|
DateTime? createTime,
|
|
DateTime? updateTime,
|
|
}) {
|
|
// 简单时间戳ID
|
|
this.id = id ?? DateTime.now().millisecondsSinceEpoch ~/ 1000;
|
|
this.priorityIndex = priority.index;
|
|
this.createTime = createTime ?? DateTime.now();
|
|
this.updateTime = updateTime ?? DateTime.now();
|
|
}
|
|
|
|
Todo copyWith({
|
|
String? title,
|
|
String? content,
|
|
bool? isCompleted,
|
|
DateTime? dueDate,
|
|
TodoPriority? priority,
|
|
}) {
|
|
return Todo(
|
|
id: id,
|
|
title: title ?? this.title,
|
|
content: content ?? this.content,
|
|
isCompleted: isCompleted ?? this.isCompleted,
|
|
dueDate: dueDate ?? this.dueDate,
|
|
priority: priority ?? this.priority,
|
|
createTime: createTime,
|
|
updateTime: DateTime.now(),
|
|
);
|
|
}
|
|
|
|
static Todo getEmpty() {
|
|
return Todo(
|
|
id: DateTime.now().millisecondsSinceEpoch ~/ 1000,
|
|
title: '日常待办',
|
|
content: '',
|
|
isCompleted: false,
|
|
dueDate: null,
|
|
priority: TodoPriority.medium,
|
|
);
|
|
}
|
|
}
|
|
|
|
enum TodoPriority {
|
|
low('低', Color(0xFF757575), Icons.low_priority),
|
|
medium('中', Color(0xFFF57C00), Icons.flag),
|
|
high('高', Color(0xFFD32F2F), Icons.warning);
|
|
|
|
final String label;
|
|
final Color color;
|
|
final IconData icon;
|
|
|
|
const TodoPriority(this.label, this.color, this.icon);
|
|
}
|
|
|
|
enum TodoTab {
|
|
all('全部'),
|
|
active('待完成'),
|
|
completed('已完成'),
|
|
today('今天');
|
|
|
|
final String label;
|
|
|
|
const TodoTab(this.label);
|
|
}
|