X-Git-Url: https://git.sven.stormbind.net/?a=blobdiff_plain;f=src%2Ftask.cpp;fp=src%2Ftask.cpp;h=cca1bcc5cb4659c61dd134429dea52dd9424f51a;hb=d483bd8e6523c23c6f1d8908a2e0611c2bc9ff4f;hp=0000000000000000000000000000000000000000;hpb=7dfa3fe589d1722d49681f42cdb0bf1e6efb5223;p=sven%2Fvym.git diff --git a/src/task.cpp b/src/task.cpp new file mode 100644 index 0000000..cca1bcc --- /dev/null +++ b/src/task.cpp @@ -0,0 +1,326 @@ +#include "task.h" + +#include + +#include "branchitem.h" +#include "taskmodel.h" +#include "vymmodel.h" + +Task::Task(TaskModel *tm) +{ + // qDebug()<<"Constr. Task"; + status = NotStarted; + awake = Task::WideAwake; + branch = NULL; + prio = 0; + prio_delta = 0; + model = tm; + date_creation = QDateTime::currentDateTime(); +} + +Task::~Task() +{ + // qDebug()<<"Destr. Task"; + if (branch) + branch->setTask(NULL); +} + +void Task::setModel(TaskModel *tm) { model = tm; } + +void Task::cycleStatus(bool reverse) +{ + if (awake == Morning) + setAwake(WideAwake); + else { + int i = status; + reverse ? i-- : i++; + + if (i < 0) + i = 2; + if (i > 2) + i = 0; + + setStatus((Task::Status)i); + } + if (branch) + branch->updateTaskFlag(); +} + +void Task::setStatus(const QString &s) +{ + if (s == "NotStarted") + setStatus(NotStarted); + else if (s == "WIP") + setStatus(WIP); + else if (s == "Finished") + setStatus(Finished); + else + qWarning() << "Task::setStatus Unknown value: " << s; +} + +void Task::setStatus(Status s) +{ + if (s == status) + return; + status = s; + if (branch) + branch->updateTaskFlag(); +} + +Task::Status Task::getStatus() { return status; } + +QString Task::getStatusString() +{ + switch (status) { + case NotStarted: + return "NotStarted"; + case WIP: + return "WIP"; + case Finished: + return "Finished"; + } + return "Undefined"; +} + +QString Task::getIconString() +{ + QString s; + switch (status) { + case NotStarted: + s = "task-new"; + break; + case WIP: + s = "task-wip"; + break; + case Finished: + s = "task-finished"; + break; + default: + s = "status:undefined"; + } + if (status != Finished) + switch (awake) { + case Sleeping: + s += "-sleeping"; + break; + case Morning: + s += "-morning"; + break; + default: + break; + } + return s; +} + +void Task::setAwake(const QString &s) +{ + if (s == "Sleeping") + setAwake(Sleeping); + else if (s == "Morning") + setAwake(Morning); + else if (s == "WideAwake") + setAwake(WideAwake); + else + qWarning() << "Task::setAwake Unknown value: " << s; +} + +void Task::setAwake(Task::Awake a) +{ + if (awake != a) { + awake = a; + if (branch) + branch->updateTaskFlag(); + } +} + +Task::Awake Task::getAwake() { return awake; } + +QString Task::getAwakeString() +{ + switch (getAwake()) { + case Sleeping: + return "Sleeping"; + case Morning: + return "Morning"; + case WideAwake: + return "WideAwake"; + } + return "Undefined"; +} + +bool Task::updateAwake() +{ + qint64 secs = getSecsSleep(); + + if (secs < 0) { + if (awake == Task::Sleeping) { + setAwake(Task::Morning); + return true; + } + } + else if (secs > 0) { + if (awake != Task::Sleeping) { + setAwake(Task::Sleeping); + return true; + } + } + return false; +} + +void Task::setPriority(int p) { prio = p; } + +int Task::getPriority() { return prio; } + +int Task::getAgeCreation() +{ + return date_creation.daysTo(QDateTime::currentDateTime()); +} + +int Task::getAgeModification() +{ + if (date_modification.isValid()) + return date_modification.daysTo(QDateTime::currentDateTime()); + else + return getAgeCreation(); +} + +void Task::setDateCreation(const QString &s) +{ + date_creation = QDateTime().fromString(s, Qt::ISODate); +} + +QDateTime Task::getDateCreation() { return date_creation; } + +void Task::setDateModification() +{ + date_modification = QDateTime::currentDateTime(); +} + +void Task::setDateModification(const QString &s) +{ + date_modification = QDateTime().fromString(s, Qt::ISODate); +} + +QDateTime Task::getDateModification() { return date_modification; } + +bool Task::setDaysSleep(qint64 n) +{ + return setDateSleep(QDate::currentDate().addDays(n).toString(Qt::ISODate)); +} + +bool Task::setHoursSleep(qint64 n) +{ + return setDateSleep( + QDateTime::currentDateTime().addSecs(n * 3600).toString(Qt::ISODate)); +} + +bool Task::setSecsSleep(qint64 n) +{ + if (n == 0) + setAwake(Morning); + return setDateSleep( + QDateTime::currentDateTime().addSecs(n).toString(Qt::ISODate)); +} + +bool Task::setDateSleep(const QString &s) +{ + if (setDateSleep(QDateTime().fromString(s, Qt::ISODate))) + return true; + else if (setDateSleep(QDateTime().fromString(s, Qt::TextDate))) + return true; + else if (setDateSleep( + QDateTime().fromString(s, Qt::DefaultLocaleShortDate))) + return true; + else if (setDateSleep(QDateTime().fromString(s, Qt::DefaultLocaleLongDate))) + return true; + else + return false; +} + +bool Task::setDateSleep(const QDateTime &d) +{ + if (!d.isValid()) + return false; + + date_sleep = d; + updateAwake(); + return true; +} + +qint64 Task::getDaysSleep() +{ + qint64 d = 1; + if (date_sleep.isValid()) + d = QDateTime::currentDateTime().daysTo(date_sleep); + else { + // qWarning() << "Task::getDaysSleep date_sleep is invalid for branch " + // << branch->getHeadingPlain(); + return -1; + } + return d; +} + +qint64 Task::getSecsSleep() +{ + qint64 d = 0; // Meaning: No sleep time set so far + if (date_sleep.isValid()) + d = QDateTime::currentDateTime().secsTo(date_sleep); + return d; +} + +QDateTime Task::getSleep() { return date_sleep; } + +void Task::setPriorityDelta(const int &n) { prio_delta = n; } + +int Task::getPriorityDelta() { return prio_delta; } + +void Task::setBranch(BranchItem *bi) +{ + branch = bi; + mapName = bi->getModel()->getMapName(); +} + +BranchItem *Task::getBranch() { return branch; } + +QString Task::getName() +{ + if (branch) + return branch->getHeadingPlain(); + else { + qWarning() << "Task::getName no branch!"; + return "UNDEFINED"; + } +} + +QString Task::getMapName() { return mapName; } + +QString Task::saveToDir() +{ + QString sleepAttr; + if (date_sleep.isValid()) + sleepAttr = attribut("date_sleep", date_sleep.toString(Qt::ISODate)); + else + sleepAttr = attribut("date_sleep", "2018-01-01T00:00:00"); + + // Experimental: Also output priority based on arrow flags for external + // sorting + QString prioAttr; + if (branch) { + if (branch->hasActiveFlag("2arrow-up")) + prioAttr = attribut("prio", "2"); + if (branch->hasActiveFlag("arrow-up")) + prioAttr = attribut("prio", "1"); + } + + QString prioDeltaAttr; + if (prio_delta != 0) + prioDeltaAttr = attribut("prio_delta", QString("%1").arg(prio_delta)); + return singleElement( + "task", + attribut("status", getStatusString()) + + attribut("awake", getAwakeString()) + + attribut("date_creation", date_creation.toString(Qt::ISODate)) + + attribut("date_modification", + date_modification.toString(Qt::ISODate)) + + prioDeltaAttr + sleepAttr + prioAttr); +}