From fec65a0f24bfb434c284f1cf569be1e6ade00e9a Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 31 Jan 2016 19:27:54 -0500 Subject: [PATCH] ColRecur: Added ::modify --- src/columns/ColRecur.cpp | 38 ++++++++++++++++++++++++++++++++++++++ src/columns/ColRecur.h | 1 + 2 files changed, 39 insertions(+) diff --git a/src/columns/ColRecur.cpp b/src/columns/ColRecur.cpp index 5c543ee45..3c57b2833 100644 --- a/src/columns/ColRecur.cpp +++ b/src/columns/ColRecur.cpp @@ -28,11 +28,17 @@ #include #include #include +#include +#include +#include +#include +#include #include #include #include extern Context context; +extern Task& contextTask; //////////////////////////////////////////////////////////////////////////////// ColumnRecur::ColumnRecur () @@ -99,3 +105,35 @@ void ColumnRecur::render ( } //////////////////////////////////////////////////////////////////////////////// +// The duration is stored in raw form, but it must still be valid, +// and therefore is parsed first. +void ColumnRecur::modify (Task& task, const std::string& value) +{ + // Try to evaluate 'value'. It might work. + Variant evaluatedValue; + try + { + Eval e; + e.addSource (domSource); + e.addSource (namedDates); + contextTask = task; + e.evaluateInfixExpression (value, evaluatedValue); + } + + catch (...) + { + evaluatedValue = Variant (value); + } + + if (evaluatedValue.type () == Variant::type_duration) + { + // Store the raw value, for 'recur'. + std::string label = " MODIFICATION "; + context.debug (label + _name + " <-- '" + value + "'"); + task.set (_name, value); + } + else + throw format (STRING_TASK_INVALID_DUR, value); +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/columns/ColRecur.h b/src/columns/ColRecur.h index 6d8d21faf..e83a9457d 100644 --- a/src/columns/ColRecur.h +++ b/src/columns/ColRecur.h @@ -38,6 +38,7 @@ public: void setStyle (const std::string&); void measure (Task&, unsigned int&, unsigned int&); void render (std::vector &, Task&, int, Color&); + void modify (Task&, const std::string&); private: };