Hourglass
This commit is contained in:
240
lib/main.dart
240
lib/main.dart
@@ -24,6 +24,7 @@ import 'Activities.dart';
|
||||
import 'User.dart' as User;
|
||||
import 'package:syncfusion_flutter_charts/charts.dart';
|
||||
import 'Dialogs.dart';
|
||||
import 'CustomWidgets.dart';
|
||||
final GlobalKey<NavigatorState> navigatorKey = new GlobalKey<NavigatorState>();
|
||||
showAlertDialog(BuildContext context, String title, String message) {
|
||||
// set up the button
|
||||
@@ -116,7 +117,7 @@ DateTime? firstDay = null;
|
||||
DateTime? lastDay = null;
|
||||
DateTimeRange? taskTypeRange = null;
|
||||
DateTimeRange? catsRange = null;
|
||||
|
||||
DateTimeRange? prodRange = null;
|
||||
List<ProductivityMapData> productivityData = <ProductivityMapData>[
|
||||
ProductivityMapData('02/24', 35),
|
||||
ProductivityMapData('02/25', 28),
|
||||
@@ -140,6 +141,8 @@ List<CatMapData> dailyData = <CatMapData>[
|
||||
CatMapData('Apr', 32, Colors.grey),
|
||||
];
|
||||
|
||||
List<CatMapData> hourglassCatData = <CatMapData>[];
|
||||
|
||||
class MyHomePage extends StatefulWidget {
|
||||
const MyHomePage({Key? key}) : super(key: key);
|
||||
|
||||
@@ -175,7 +178,10 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
startLoadStatRefresher();
|
||||
// User.progressDialog=progressDialog;
|
||||
}
|
||||
|
||||
double hourglassTime = 0;
|
||||
List<Color> hourglassColors = [Colors.black];
|
||||
List<double> hourglassStops = [1];
|
||||
int hourglassTotalTime = 0;
|
||||
void startLoadStatRefresher() async{
|
||||
int lastMinute = 0;
|
||||
while(true){
|
||||
@@ -185,6 +191,14 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
LoadStats();
|
||||
}
|
||||
await Refresh();
|
||||
// hourglassTime+=0.05;
|
||||
// if(hourglassTime > 1){
|
||||
// hourglassTime=0;
|
||||
// }
|
||||
|
||||
setState(() {
|
||||
|
||||
});
|
||||
await Future.delayed(Duration(seconds: 1));
|
||||
}
|
||||
}
|
||||
@@ -230,6 +244,19 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
}else{
|
||||
ongoingActName = "";
|
||||
}
|
||||
hourglassTime = ((DateTime.now().hour * 60) + DateTime.now().minute) / 1440;
|
||||
print('hourglass time : $hourglassTime');
|
||||
hourglassColors =[];
|
||||
hourglassStops = [];
|
||||
hourglassCatData.forEach((element) {
|
||||
hourglassColors.add(element.color);
|
||||
hourglassStops.add(element.time/hourglassTotalTime);
|
||||
});
|
||||
|
||||
if(hourglassColors.isEmpty){
|
||||
hourglassColors.add(Colors.black);
|
||||
hourglassStops.add(1);
|
||||
}
|
||||
setState(() {
|
||||
|
||||
});
|
||||
@@ -248,6 +275,9 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
Map<String, int> productivtyActs = <String, int>{};
|
||||
Map<String, int> unproductivtyActs = <String, int>{};
|
||||
Map<TaskType, int> taskTypesDuration = <TaskType, int>{};
|
||||
|
||||
hourglassColors=[];
|
||||
hourglassTotalTime=0;
|
||||
firstDay = null;
|
||||
lastDay = null;
|
||||
String lastDate = "";
|
||||
@@ -265,6 +295,10 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
print("$lastDay - $firstDay");
|
||||
catsRange = DateTimeRange(start: lastDay!.subtract(const Duration(days: 0)), end: lastDay!);
|
||||
}
|
||||
if (prodRange == null) {
|
||||
print("$lastDay - $firstDay");
|
||||
prodRange = DateTimeRange(start: lastDay!.subtract(const Duration(days: 7)), end: lastDay!);
|
||||
}
|
||||
firstDay = element.startTime;
|
||||
String thisDate = dFormat.format(element.startTime);
|
||||
|
||||
@@ -286,21 +320,25 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
}
|
||||
}
|
||||
|
||||
if (element.taskType.cat?.productive ?? false) {
|
||||
if(lastProductive==null){lastProductive = element.trueEndTime;}
|
||||
if (productivtyActs.containsKey(thisDate)) {
|
||||
productivtyActs[thisDate] = (productivtyActs[thisDate]! + thisMinutes);
|
||||
if ((element.startTime.isAfter(prodRange!.start) && element.startTime.isBefore(prodRange!.end)) ||
|
||||
(dFormat.format(element.startTime) == dFormat.format(prodRange!.start) || dFormat.format(element.startTime) == dFormat.format(prodRange!.end))) {
|
||||
if (element.taskType.cat?.productive ?? false) {
|
||||
if (lastProductive == null) {
|
||||
lastProductive = element.trueEndTime;
|
||||
}
|
||||
if (productivtyActs.containsKey(thisDate)) {
|
||||
productivtyActs[thisDate] = (productivtyActs[thisDate]! + thisMinutes);
|
||||
} else {
|
||||
productivtyActs.putIfAbsent(thisDate, () => thisMinutes);
|
||||
}
|
||||
} else {
|
||||
productivtyActs.putIfAbsent(thisDate, () => thisMinutes);
|
||||
}
|
||||
} else {
|
||||
if (unproductivtyActs.containsKey(thisDate)) {
|
||||
unproductivtyActs[thisDate] = (unproductivtyActs[thisDate]! + thisMinutes);
|
||||
} else {
|
||||
unproductivtyActs.putIfAbsent(thisDate, () => thisMinutes);
|
||||
if (unproductivtyActs.containsKey(thisDate)) {
|
||||
unproductivtyActs[thisDate] = (unproductivtyActs[thisDate]! + thisMinutes);
|
||||
} else {
|
||||
unproductivtyActs.putIfAbsent(thisDate, () => thisMinutes);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (thisDate == curDay) {
|
||||
if (element.taskType.cat == null) {
|
||||
continue;
|
||||
@@ -312,6 +350,7 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
} else {
|
||||
catTimeMap.putIfAbsent(element.taskType.cat!, () => thisMinutes);
|
||||
}
|
||||
hourglassTotalTime+=thisMinutes;
|
||||
}
|
||||
|
||||
if ((element.startTime.isAfter(catsRange!.start) && element.startTime.isBefore(catsRange!.end)) ||
|
||||
@@ -326,57 +365,84 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
catBriefMap.putIfAbsent(element.taskType.cat!, () => thisMinutes);
|
||||
}
|
||||
}
|
||||
|
||||
if(dFormat.format(element.startTime) == dFormat.format(DateTime.now())){
|
||||
if (element.taskType.cat == null) {
|
||||
continue;
|
||||
}
|
||||
print("Null : ${thisMinutes}");
|
||||
|
||||
int? existingEntryIndex;
|
||||
|
||||
for(int i=0; i < hourglassCatData.length; i++){
|
||||
if(hourglassCatData[i].name == element.taskType.category){
|
||||
existingEntryIndex=i;
|
||||
}
|
||||
}
|
||||
|
||||
if (existingEntryIndex==null) {
|
||||
hourglassCatData.add(CatMapData(element.taskType.category, thisMinutes, HexColor.fromHex(element.taskType.cat!.color)));
|
||||
} else {
|
||||
hourglassCatData[existingEntryIndex!].time+=thisMinutes;
|
||||
}
|
||||
}
|
||||
|
||||
hourglassCatData.sort((a, b) => a.time.compareTo(b.time));
|
||||
hourglassCatData = hourglassCatData.reversed.toList();
|
||||
}
|
||||
dailyData = <CatMapData>[];
|
||||
productivityData = <ProductivityMapData>[];
|
||||
taskTypesData = <TaskTypeMapData>[];
|
||||
catsData = <CatMapData>[];
|
||||
int trackedTime = 0;
|
||||
catTimeMap.forEach((key, value) {
|
||||
//print(key.name + " : $value");
|
||||
Color barCol = HexColor.fromHex(key.color);
|
||||
dailyData.add(CatMapData(key.name, value, barCol));
|
||||
trackedTime += value;
|
||||
});
|
||||
int untrackedTime = 1440-trackedTime;
|
||||
if(untrackedTime<0){
|
||||
User.refreshUserData().then((val)=>LoadStats());
|
||||
print("Shit went wrong!");
|
||||
}
|
||||
print("Tracked time : $trackedTime");
|
||||
|
||||
dailyData.sort((a, b) {
|
||||
return a.name.toLowerCase().compareTo(b.name.toLowerCase());
|
||||
});
|
||||
if(untrackedTime> 0){dailyData.add(CatMapData("Untracked",1440-trackedTime, Colors.black));}else{}
|
||||
bool untrackedUnprod = await Settings.getUntrackedUnproductive();
|
||||
for (var element in days) {
|
||||
// if(productivtyActs.containsKey(element) && unproductivtyActs.containsKey(element)){
|
||||
int prodActs = (productivtyActs[element] ?? 0);
|
||||
int unprodActs = (unproductivtyActs[element] ?? 0);
|
||||
double prod = (untrackedUnprod) ? ((prodActs / 1440) * 100) : ((prodActs / unprodActs)*100);
|
||||
if(prod>0){
|
||||
productivityData.add(ProductivityMapData(element, prod));
|
||||
}
|
||||
// }
|
||||
}
|
||||
|
||||
taskTypesDuration.forEach((key, value) {
|
||||
print("$key : $value");
|
||||
taskTypesData.add(TaskTypeMapData(key.name, value, HexColor.fromHex(key.cat!.color)));
|
||||
});
|
||||
|
||||
taskTypesData.sort((a, b) {
|
||||
return a.time.compareTo(b.time);
|
||||
});
|
||||
|
||||
catBriefMap.forEach((key, value) {
|
||||
print(key.name + " : $value");
|
||||
Color barCol = HexColor.fromHex(key.color);
|
||||
catsData.add(CatMapData(key.name, value, barCol));
|
||||
});
|
||||
catsData.sort((a, b) => a.time.compareTo(b.time));
|
||||
//curDay = days[0];
|
||||
if (this.mounted) {
|
||||
setState(() {
|
||||
dailyData = <CatMapData>[];
|
||||
productivityData = <ProductivityMapData>[];
|
||||
taskTypesData = <TaskTypeMapData>[];
|
||||
catsData = <CatMapData>[];
|
||||
int trackedTime = 0;
|
||||
catTimeMap.forEach((key, value) {
|
||||
//print(key.name + " : $value");
|
||||
Color barCol = HexColor.fromHex(key.color);
|
||||
dailyData.add(CatMapData(key.name, value, barCol));
|
||||
trackedTime += value;
|
||||
});
|
||||
int untrackedTime = 1440-trackedTime;
|
||||
if(untrackedTime<0){
|
||||
User.refreshUserData().then((val)=>LoadStats());
|
||||
print("Shit went wrong!");
|
||||
}
|
||||
print("Tracked time : $trackedTime");
|
||||
|
||||
dailyData.sort((a, b) {
|
||||
return a.name.toLowerCase().compareTo(b.name.toLowerCase());
|
||||
});
|
||||
if(untrackedTime> 0){dailyData.add(CatMapData("Untracked",1440-trackedTime, Colors.black));}else{}
|
||||
for (var element in days) {
|
||||
// if(productivtyActs.containsKey(element) && unproductivtyActs.containsKey(element)){
|
||||
int prodActs = (productivtyActs[element] ?? 0);
|
||||
int unprodActs = (unproductivtyActs[element] ?? 0);
|
||||
double prod = (prodActs / 1440) * 100;
|
||||
productivityData.add(ProductivityMapData(element, prod));
|
||||
// }
|
||||
}
|
||||
|
||||
taskTypesDuration.forEach((key, value) {
|
||||
print("$key : $value");
|
||||
taskTypesData.add(TaskTypeMapData(key.name, value, HexColor.fromHex(key.cat!.color)));
|
||||
});
|
||||
|
||||
taskTypesData.sort((a, b) {
|
||||
return a.time.compareTo(b.time);
|
||||
});
|
||||
|
||||
catBriefMap.forEach((key, value) {
|
||||
print(key.name + " : $value");
|
||||
Color barCol = HexColor.fromHex(key.color);
|
||||
catsData.add(CatMapData(key.name, value, barCol));
|
||||
});
|
||||
catsData.sort((a, b) => a.time.compareTo(b.time));
|
||||
});
|
||||
}
|
||||
// loadingStats=false;
|
||||
@@ -527,6 +593,34 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
),
|
||||
)),
|
||||
),
|
||||
Container(
|
||||
padding: EdgeInsets.all(10),
|
||||
child: Card(
|
||||
color: Colors.white12,
|
||||
elevation: 20,
|
||||
shadowColor: Colors.brown,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 25, vertical: 20),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
Container(width:100,height: 150,child: CustomPaint(painter: HourglassPainter(hourglassTime, hourglassColors, hourglassStops),)),
|
||||
Column(
|
||||
children: [
|
||||
Text(DateFormat("MMMM-dd").format(DateTime.now()),style:TextStyle(fontSize: 18)),
|
||||
Text(DateFormat("hh:mm").format(DateTime.now()),style:TextStyle(fontSize: 40, fontWeight: FontWeight.bold)),
|
||||
Container(height: 20,)
|
||||
],
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
)),
|
||||
),
|
||||
Container(
|
||||
height: 350,
|
||||
padding: EdgeInsets.all(10),
|
||||
@@ -537,14 +631,26 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 20),
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
Text("Productivity", style: TextStyle(color: Colors.green, fontWeight: FontWeight.bold)),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10,vertical: 0),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text("Productivity", style: TextStyle(color: Colors.green, fontWeight: FontWeight.bold)),
|
||||
InkWell(
|
||||
onTap: () async {
|
||||
DateTimeRange? value = await showDateRangePicker(context: context, firstDate: firstDay ?? DateTime.now(), lastDate: lastDay ?? DateTime.now());
|
||||
if (value != null) {
|
||||
prodRange = value;
|
||||
}
|
||||
|
||||
],
|
||||
LoadStats();
|
||||
},
|
||||
child: Text((prodRange != null) ? (DateFormat("MM/dd").format(prodRange!.start) + " - " + DateFormat("MM/dd").format(prodRange!.end)) : 'n/a'),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
Divider(),
|
||||
Row(
|
||||
@@ -928,7 +1034,7 @@ class MyPlayerBar extends CustomPainter {
|
||||
class CatMapData {
|
||||
CatMapData(this.name, this.time, this.color);
|
||||
final String name;
|
||||
final int time;
|
||||
int time;
|
||||
final Color color;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user