Hourglass

This commit is contained in:
Sewmina
2022-03-23 03:41:05 +05:30
parent acfb03d7a3
commit aa72b5dc92
7 changed files with 432 additions and 131 deletions

View File

@@ -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;
}