diff --git a/src/Config.cpp b/src/Config.cpp index b275b8ac2..d1c2d7ca7 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -146,6 +146,7 @@ std::string Config::_defaults = "urgency.tags.coefficient=1.0 # Urgency coefficient for tags\n" "urgency.project.coefficient=1.0 # Urgency coefficient for projects\n" "urgency.blocked.coefficient=-5.0 # Urgency coefficient for blocked tasks\n" + "urgency.inherit.coefficient=0.0 # Urgency coefficient for blocked tasks inheriting from blocking tasks\n" "urgency.waiting.coefficient=-3.0 # Urgency coefficient for waiting status\n" "urgency.age.max=365 # Maximum age in days\n" "\n" diff --git a/src/Context.cpp b/src/Context.cpp index 3c2883ecf..738ab6d56 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -640,6 +640,7 @@ void Context::staticInitialization () Task::urgencyScheduledCoefficient = config.getReal ("urgency.scheduled.coefficient"); Task::urgencyWaitingCoefficient = config.getReal ("urgency.waiting.coefficient"); Task::urgencyBlockedCoefficient = config.getReal ("urgency.blocked.coefficient"); + Task::urgencyInheritCoefficient = config.getReal ("urgency.inherit.coefficient"); Task::urgencyAnnotationsCoefficient = config.getReal ("urgency.annotations.coefficient"); Task::urgencyTagsCoefficient = config.getReal ("urgency.tags.coefficient"); Task::urgencyNextCoefficient = config.getReal ("urgency.next.coefficient"); diff --git a/src/Task.cpp b/src/Task.cpp index 33d4527b9..6767dba2a 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -79,6 +79,7 @@ float Task::urgencyActiveCoefficient = 0.0; float Task::urgencyScheduledCoefficient = 0.0; float Task::urgencyWaitingCoefficient = 0.0; float Task::urgencyBlockedCoefficient = 0.0; +float Task::urgencyInheritCoefficient = 0.0; float Task::urgencyAnnotationsCoefficient = 0.0; float Task::urgencyTagsCoefficient = 0.0; float Task::urgencyNextCoefficient = 0.0; @@ -1721,6 +1722,7 @@ float Task::urgency_c () const value += fabsf (Task::urgencyDueCoefficient) > epsilon ? (urgency_due () * Task::urgencyDueCoefficient) : 0.0; value += fabsf (Task::urgencyBlockingCoefficient) > epsilon ? (urgency_blocking () * Task::urgencyBlockingCoefficient) : 0.0; value += fabsf (Task::urgencyAgeCoefficient) > epsilon ? (urgency_age () * Task::urgencyAgeCoefficient) : 0.0; + value += fabsf (Task::urgencyInheritCoefficient) > epsilon ? (urgency_inherit () * Task::urgencyInheritCoefficient) : 0.0; // Tag- and project-specific coefficients. std::map ::iterator var; @@ -1792,6 +1794,39 @@ float Task::urgency_priority () const return 0.0; } +//////////////////////////////////////////////////////////////////////////////// +float Task::urgency_inherit () const +{ + if (!is_blocking) + return 0.0; + + std::vector blocked; + std::vector ::const_iterator it; + float v = 0.0; + + // Calling dependencyGetBlocked is rather expensive. + // It is called recursively for each dependency in the chain here. + // Paul is going to kill me. :) + dependencyGetBlocked (*this, blocked); + for (it = blocked.begin (); it != blocked.end (); ++it) + { + // urgency_blocked, _blocking, _project and _tags left out. + v += it->urgency_active(); + v += it->urgency_age(); + v += it->urgency_annotations(); + v += it->urgency_due(); + v += it->urgency_next(); + v += it->urgency_priority(); + v += it->urgency_scheduled(); + v += it->urgency_waiting(); + + // Inherit from all parent tasks in the dependency chain recursively. + v += it->urgency_inherit(); + } + + return v; +} + //////////////////////////////////////////////////////////////////////////////// float Task::urgency_project () const { diff --git a/src/Task.h b/src/Task.h index 9a946bcfe..23620c663 100644 --- a/src/Task.h +++ b/src/Task.h @@ -49,6 +49,7 @@ public: static float urgencyScheduledCoefficient; static float urgencyWaitingCoefficient; static float urgencyBlockedCoefficient; + static float urgencyInheritCoefficient; static float urgencyAnnotationsCoefficient; static float urgencyTagsCoefficient; static float urgencyNextCoefficient; @@ -171,6 +172,7 @@ public: float urgency_scheduled () const; float urgency_waiting () const; float urgency_blocked () const; + float urgency_inherit () const; float urgency_annotations () const; float urgency_tags () const; float urgency_next () const; diff --git a/src/commands/CmdShow.cpp b/src/commands/CmdShow.cpp index 9375ec9cd..5ab03b2e5 100644 --- a/src/commands/CmdShow.cpp +++ b/src/commands/CmdShow.cpp @@ -192,6 +192,7 @@ int CmdShow::execute (std::string& output) " urgency.annotations.coefficient" " urgency.blocked.coefficient" " urgency.blocking.coefficient" + " urgency.inherit.coefficient" " urgency.due.coefficient" " urgency.next.coefficient" " urgency.priority.coefficient"