]> git.sven.stormbind.net Git - sven/vym.git/blobdiff - src/task.cpp
New upstream version 2.9.22
[sven/vym.git] / src / task.cpp
diff --git a/src/task.cpp b/src/task.cpp
new file mode 100644 (file)
index 0000000..cca1bcc
--- /dev/null
@@ -0,0 +1,326 @@
+#include "task.h"
+
+#include <QDebug>
+
+#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);
+}