/// <returns> /// true: notify new active task /// false: nothing to notify /// </returns> public static bool AddAllUnfinishedTaskOf(Task task) { TimeSpan timeOfDay = DateTime.Now.TimeOfDay; bool isCurrentIndexChanged = false; int index = 0; int timeInfoIndex = 0; UnfinishedTask unfinishedTask = null; while (timeInfoIndex < task.Time.Count && index < UnfinishedTasks.Count) { if (unfinishedTask == null) { unfinishedTask = new UnfinishedTask(task, task.Time[timeInfoIndex]); } if (unfinishedTask < UnfinishedTasks[index]) { UnfinishedTasks.Insert(index, unfinishedTask); isCurrentIndexChanged = isCurrentIndexChanged || RenewCurrentActiveTaskIndexAfterAdding(index, timeOfDay); timeInfoIndex++; unfinishedTask = null; } index++; } while (timeInfoIndex < task.Time.Count) { if (task.Time[timeInfoIndex].ActiveTimeOfDay.Value <= timeOfDay) { CurrentIndex = UnfinishedTasks.Count; isCurrentIndexChanged = true; } UnfinishedTasks.Insert(UnfinishedTasks.Count, new UnfinishedTask(task, task.Time[timeInfoIndex])); } return(isCurrentIndexChanged); }
public static void DoLater(UnfinishedTask task) { if (UnfinishedTasks.Remove(task)) { if (UnfinishedAndDoneLaterTasks.Contains(task)) { throw new Exception("UnfinishedAndDoneLaterTasks is containing it now"); } ; UnfinishedAndDoneLaterTasks.Add(task); int index = 0; while (index < SnoozedTasks.Count) { if (SnoozedTasks[index].UnfinishedTask == task) { break; } index++; } if (index != SnoozedTasks.Count) { SnoozedTasks.RemoveAt(index); } } throw new Exception("UnfinishedTasks doesn't contain it to do later"); }
public static void Snooze(UnfinishedTask unfinishedTask, TimeSpan duration) { if (duration <= TimeSpan.Zero) { throw new Exception("duration must be more than zero"); } if (!SnoozedTasks.Any(x => x.UnfinishedTask == unfinishedTask)) { SnoozedTasks.Add(new SnoozedTask() { UnfinishedTask = unfinishedTask, OriginalNotifiedTime = unfinishedTask.NotifiedTime }); } unfinishedTask.NotifiedTime += duration; int index = UnfinishedTasks.IndexOf(unfinishedTask); if (index == -1) { throw new Exception("UnfinishedTasks doesn't contain it to snooze"); } var oldIndex = index; index++; while (index < UnfinishedTasks.Count && unfinishedTask > UnfinishedTasks[index]) { index++; } index--; UnfinishedTasks.Move(oldIndex, index); }
public static void Done(UnfinishedTask task) { DataManager.Current.FinishTodayTasksAsync(task); if (!UnfinishedTasks.Remove(task)) { UnfinishedAndDoneLaterTasks.Remove(task); } else { int index = 0; while (index < SnoozedTasks.Count) { if (SnoozedTasks[index].UnfinishedTask == task) { break; } index++; } if (index != SnoozedTasks.Count) { SnoozedTasks.RemoveAt(index); } } CurrentIndex = -CurrentIndex - 1; }
static void Notify(UnfinishedTask task) { if (IsFocusing) { return; } Notifying?.Invoke(task); }
internal static void CheckChangedTask(SQLCollectionChangedArgs e) { Task changedTask = e.Item as Task; if (e.Property == "Time") { DateTime now = DateTime.Now; if (changedTask.Type == TaskType.Schedule && changedTask.GetStatusOn(now) == TaskStatus.Available) { int index = 0; while (index < SnoozedTasks.Count) { if (SnoozedTasks[index].UnfinishedTask.Task == changedTask) { SnoozedTasks.RemoveAt(index); } else { index++; } } bool isfree = CurrentIndex < 0; UnfinishedTask oldActiveTask = null; if (CurrentIndex != -1) { oldActiveTask = UnfinishedTasks[GetLastestActiveTaskIndex()]; oldActiveTask.NotifiedTime = oldActiveTask.TimeInfo.ActiveTimeOfDay.Value; } RemoveAllUnfinishedTaskOf(changedTask); AddAllUnfinishedTaskOf(changedTask); if (CurrentIndex > -1) { if (oldActiveTask != UnfinishedTasks[CurrentIndex]) { Notify(UnfinishedTasks[CurrentIndex]); } else if (isfree) { CurrentIndex = -CurrentIndex - 2; } } else if (CurrentIndex == -1 && oldActiveTask != null) { Notify(null); } } } else if (e.Property == "Repeat") { DateTime now = DateTime.Now; if (changedTask.Type == TaskType.Schedule && changedTask.GetStatusOn(now) == TaskStatus.Available) { if (!UnfinishedTasks.Any(x => x.Task == changedTask)) { if (AddAllUnfinishedTaskOf(changedTask)) { Notify(UnfinishedTasks[CurrentIndex]); } } } else { if (UnfinishedTasks.Any(x => x.Task == changedTask)) { if (RemoveAllUnfinishedTaskOf(changedTask)) { Notify(UnfinishedTasks[CurrentIndex]); } } } } }
/// <summary> /// use to set IsFinished true in TodayTasks table /// </summary> /// <param name="id">ID of finished task</param> /// <returns></returns> public void FinishTodayTasksAsync(UnfinishedTask task) { _sQL.AddFinishedTodayTaskAsync(task.Task.ID, task.TimeInfo.ActiveTimeOfDay.Value.TotalMinutes.ToString()).ConfigureAwait(false); }