diff --git a/src/Config.cpp b/src/Config.cpp index d6e4f88cf..b5b34942a 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -79,6 +79,7 @@ std::string Config::defaults = "search.case.sensitive=yes # Setting to no allows case insensitive searches\n" "active.indicator=* # What to show as an active task indicator\n" "tag.indicator=+ # What to show as a tag indicator\n" + "dependency.indicator=D # What to show as a dependency indicator\n" "recurrence.indicator=R # What to show as a task recurrence indicator\n" "recurrence.limit=1 # Number of future recurring pending tasks\n" "undo.style=side # Undo style - can be 'side', or 'diff'\n" diff --git a/src/columns/CMakeLists.txt b/src/columns/CMakeLists.txt index a175cca6d..8a230b8f1 100644 --- a/src/columns/CMakeLists.txt +++ b/src/columns/CMakeLists.txt @@ -5,6 +5,7 @@ include_directories (${CMAKE_SOURCE_DIR}/src ${TASK_INCLUDE_DIRS}) set (columns_SRCS Column.cpp Column.h + ColDepends.cpp ColDepends.h ColDescription.cpp ColDescription.h ColID.cpp ColID.h ColPriority.cpp ColPriority.h diff --git a/src/columns/ColDepends.cpp b/src/columns/ColDepends.cpp new file mode 100644 index 000000000..af6a51c92 --- /dev/null +++ b/src/columns/ColDepends.cpp @@ -0,0 +1,142 @@ +//////////////////////////////////////////////////////////////////////////////// +// taskwarrior - a command line task list manager. +// +// Copyright 2006 - 2011, Paul Beckingham, Federico Hernandez. +// All rights reserved. +// +// This program is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2 of the License, or (at your option) any later +// version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +// details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the +// +// Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, +// Boston, MA +// 02110-1301 +// USA +// +//////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include + +extern Context context; + +//////////////////////////////////////////////////////////////////////////////// +ColumnDepends::ColumnDepends () +{ + _type = "string"; + _style = "default"; + _label = "Depends"; +} + +//////////////////////////////////////////////////////////////////////////////// +ColumnDepends::~ColumnDepends () +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// Overriden so that style <----> label are linked. +// Note that you can not determine which gets called first. +void ColumnDepends::setStyle (const std::string& value) +{ + _style = value; + + if (_style == "indicator" && _label == "Depends") _label = _label.substr (0, context.config.get ("dependency.indicator").length ()); + else if (_style == "count" && _label == "Depends") _label = "Dep"; +} + +//////////////////////////////////////////////////////////////////////////////// +// Set the minimum and maximum widths for the value. +void ColumnDepends::measure (Task& task, int& minimum, int& maximum) +{ + std::vector blocked; + dependencyGetBlocking (task, blocked); + + if (_style == "indicator") minimum = maximum = context.config.get ("dependency.indicator").length (); + else if (_style == "count") minimum = maximum = 2 + format ((int) blocked.size ()).length (); + else if (_style == "default") + { + minimum = maximum = 0; + if (task.has ("depends")) + { + std::vector blocked_ids; + std::vector ::iterator i; + for (i = blocked.begin (); i != blocked.end (); ++i) + blocked_ids.push_back (i->id); + + std::string all; + join (all, " ", blocked_ids); + maximum = all.length (); + + int length; + for (i = blocked.begin (); i != blocked.end (); ++i) + { + length = format (i->id).length (); + if (length > minimum) + minimum = length; + } + } + } + else + throw std::string ("Unrecognized column format '") + _type + "." + _style + "'"; +} + +//////////////////////////////////////////////////////////////////////////////// +void ColumnDepends::render ( + std::vector & lines, + Task& task, + int width, + Color& color) +{ + if (task.has ("depends")) + { + if (_style == "indicator") + { + lines.push_back ( + color.colorize ( + rightJustify (context.config.get ("dependency.indicator"), width))); + return; + } + + std::vector blocked; + dependencyGetBlocking (task, blocked); + + if (_style == "count") + { + lines.push_back ( + color.colorize ( + rightJustify ("[" + format ((int)blocked.size ()) + "]", width))); + } + else if (_style == "default") + { + std::vector blocked; + dependencyGetBlocking (task, blocked); + + std::string combined; + std::vector blocked_ids; + join (combined, " ", blocked_ids); + + std::vector all; + wrapText (all, combined, width); + + std::vector ::iterator i; + for (i = all.begin (); i != all.end (); ++i) + lines.push_back (color.colorize (leftJustify (*i, width))); + } + } +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/columns/ColDepends.h b/src/columns/ColDepends.h new file mode 100644 index 000000000..450ae8511 --- /dev/null +++ b/src/columns/ColDepends.h @@ -0,0 +1,50 @@ +//////////////////////////////////////////////////////////////////////////////// +// taskwarrior - a command line task list manager. +// +// Copyright 2006 - 2011, Paul Beckingham, Federico Hernandez. +// All rights reserved. +// +// This program is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2 of the License, or (at your option) any later +// version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +// details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the +// +// Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, +// Boston, MA +// 02110-1301 +// USA +// +//////////////////////////////////////////////////////////////////////////////// +#ifndef INCLUDED_COLDEPENDS +#define INCLUDED_COLDEPENDS + +#include +#include +#include +#include +#include + +class ColumnDepends : public Column +{ +public: + ColumnDepends (); + ~ColumnDepends (); + + void setStyle (const std::string&); + void measure (Task&, int&, int&); + void render (std::vector &, Task&, int, Color&); + +private: +}; + +#endif +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/columns/Column.cpp b/src/columns/Column.cpp index 172b9b62a..c2436e660 100644 --- a/src/columns/Column.cpp +++ b/src/columns/Column.cpp @@ -27,7 +27,7 @@ #include #include -//#include +#include #include //#include //#include @@ -68,8 +68,8 @@ Column* Column::factory (const std::string& name) } Column* column; -// if (column_name == "depends") column = new ColumnDepends (); - if (column_name == "description") column = new ColumnDescription (); + if (column_name == "depends") column = new ColumnDepends (); + else if (column_name == "description") column = new ColumnDescription (); // else if (column_name == "due") column = new ColumnDue (); // else if (column_name == "end") column = new ColumnEnd (); // else if (column_name == "entry") column = new ColumnEntry (); diff --git a/test/view.t.cpp b/test/view.t.cpp index eed333c22..043cf25e7 100644 --- a/test/view.t.cpp +++ b/test/view.t.cpp @@ -45,9 +45,20 @@ int main (int argc, char** argv) context.config.set ("tag.indicator", "+"); // Two sample tasks. - Task t1 ("[uuid:\"2a64f6e0-bf8e-430d-bf71-9ec3f0d9b661\" description:\"This is the description text\" project:\"Home\" priority:\"H\" tags:\"one,two\"]"); + Task t1 ("[" + "uuid:\"2a64f6e0-bf8e-430d-bf71-9ec3f0d9b661\" " + "description:\"This is the description text\" " + "project:\"Home\" " + "priority:\"H\" " + "tags:\"one,two\"" + "]"); t1.id = 1; - Task t2 ("[uuid:\"f30cb9c3-3fc0-483f-bfb2-3bf134f00694\" description:\"This is the description text\" project:\"Garden Care\"]"); + Task t2 ("[" + "uuid:\"f30cb9c3-3fc0-483f-bfb2-3bf134f00694\" " + "description:\"This is the description text\" " + "project:\"Garden Care\" " + "depends:\"2a64f6e0-bf8e-430d-bf71-9ec3f0d9b661\"" + "]"); t2.id = 11; std::vector data; @@ -74,7 +85,8 @@ int main (int argc, char** argv) view.add (Column::factory ("tags.indicator")); view.add (Column::factory ("tags.count")); view.add (Column::factory ("description.truncated")); - view.width (64); + view.add (Column::factory ("depends")); + view.width (100); view.leftMargin (4); /* view.extraPadding (1);