From 4adfec44826912f05d6af51dd6798637bfd11242 Mon Sep 17 00:00:00 2001 From: Federico Hernandez Date: Fri, 12 Feb 2010 00:21:52 +0100 Subject: [PATCH] color.due.today and color.calendar.due.today - tasks due on the current day ("today") can now be colorized with their own color. - this is for reports and the calendar --- ChangeLog | 2 ++ src/Config.cpp | 38 ++++++++++++----------- src/command.cpp | 4 +-- src/recur.cpp | 7 +++-- src/report.cpp | 39 +++++++++++++++++++++--- src/rules.cpp | 6 +++- src/tests/color.due.t | 2 +- src/tests/color.duetoday.t | 62 ++++++++++++++++++++++++++++++++++++++ 8 files changed, 131 insertions(+), 29 deletions(-) create mode 100755 src/tests/color.duetoday.t diff --git a/ChangeLog b/ChangeLog index 19ecf1342..e45eac57d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -53,6 +53,8 @@ The default dateformat being YMD (20101224) set by dateformat.holiday. + The coloring of due tasks in reports can now be enabled for all tasks, and not only the imminent ones, by setting the configuration variable due=0. + + Tasks due on the current day ("today") can now have their own color setting + color.due.today and color.calendar.due.today. + Added a new 'task-faq' man page for common questions and answers. + Added a new 'task-color' man page detailing how to set up and use color in task. diff --git a/src/Config.cpp b/src/Config.cpp index c3e0d41d7..b12fddbdb 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -82,16 +82,17 @@ std::string Config::defaults = "#monthsperline=3 # Number of calendar months on a line\n" "\n" "# Color controls.\n" - "color=on # Enable color\n" - "#color.header=bold green # Color of header messages\n" - "#color.footnote=bold green # Color of footnote messages\n" - "color.calendar.today=black on cyan # Color of today in calendar\n" - "color.calendar.due=black on green # Color of days with due tasks in calendar\n" - "color.calendar.overdue=black on red # Color of days with overdue tasks in calendar\n" + "color=on # Enable color\n" + "#color.header=bold green # Color of header messages\n" + "#color.footnote=bold green # Color of footnote messages\n" + "color.calendar.today=black on cyan # Color of today in calendar\n" + "color.calendar.due=black on green # Color of days with due tasks in calendar\n" + "color.calendar.due.today=black on magenta # Color of days with due tasks in calendar\n" + "color.calendar.overdue=black on red # Color of days with overdue tasks in calendar\n" "color.calendar.weekend=bright white on black # Color of weekend days in calendar\n" "color.calendar.holiday=black on bright yellow # Color of public holidays in calendar\n" "color.calendar.weeknumber=black on white # Color of the weeknumbers in calendar\n" - "#color.debug=magenta # Color of diagnostic output\n" + "#color.debug=magenta # Color of diagnostic output\n" "\n" "# The following rules are presented in their order of precedence.\n" "# The higher the color rule is up this list, the higher precedence\n" @@ -99,17 +100,18 @@ std::string Config::defaults = "# in brackets [1]\n" "#color.recurring=on red # [1] Color of recur.any: tasks\n" "color.overdue=bold red # [2] Color of overdue tasks\n" - "color.due=bold yellow # [3] Color of due tasks\n" - "#color.keyword.car=on blue # [4] Color of description.contains:car tasks\n" - "#color.project.garden=on green # [5] Color of project:garden tasks\n" - "#color.tag.bug=yellow # [6] Color of +bug tasks\n" - "color.active=bold cyan # [7] Color of active tasks\n" - "#color.pri.none=white on blue # [8] Color of priority: tasks\n" - "color.pri.H=bold # [8] Color of priority:H tasks\n" - "#color.pri.M=on yellow # [8] Color of priority:M tasks\n" - "#color.pri.L=on green # [8] Color of priority:L tasks\n" - "color.tagged=yellow # [9] Color of tagged tasks\n" - "#color.alternate=on rgb253 # [10] Alternate color for line coloring\n" + "color.due.today=bold magenta # [3] Color of tasks due today\n" + "color.due=bold yellow # [4] Color of due tasks\n" + "#color.keyword.car=on blue # [5] Color of description.contains:car tasks\n" + "#color.project.garden=on green # [6] Color of project:garden tasks\n" + "#color.tag.bug=yellow # [7] Color of +bug tasks\n" + "color.active=bold cyan # [8] Color of active tasks\n" + "#color.pri.none=white on blue # [9] Color of priority: tasks\n" + "color.pri.H=bold # [9] Color of priority:H tasks\n" + "#color.pri.M=on yellow # [9] Color of priority:M tasks\n" + "#color.pri.L=on green # [9] Color of priority:L tasks\n" + "color.tagged=yellow # [10] Color of tagged tasks\n" + "#color.alternate=on rgb253 # [11] Alternate color for line coloring\n" "\n" "# Shadow file support\n" "#shadow.file=/tmp/shadow.txt # Location of shadow file\n" diff --git a/src/command.cpp b/src/command.cpp index 74ac69ce5..38b438bc0 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -704,10 +704,10 @@ int handleConfig (std::string &outs) // Note that there is a leading and trailing space, to make searching easier. std::string recognized = " annotations blanklines bulk calendar.details calendar.details.report " - "calendar.holidays calendar.legend color color.active color.due " + "calendar.holidays calendar.legend color color.active color.due color.due.today " "color.overdue color.pri.H color.pri.L color.pri.M color.pri.none " "color.recurring color.tagged color.footnote color.header color.debug " - "color.alternate color.calendar.today color.calendar.due " + "color.alternate color.calendar.today color.calendar.due color.calendar.due.today " "color.calendar.overdue color.calendar.weekend color.calendar.holiday " "color.calendar.weeknumber confirmation curses data.location dateformat " "dateformat.holiday dateformat.report debug default.command " diff --git a/src/recur.cpp b/src/recur.cpp index 4454c8abd..1b7c59d30 100644 --- a/src/recur.cpp +++ b/src/recur.cpp @@ -388,6 +388,9 @@ int getDueState (const std::string& due) Date thisDay (rightNow.month (), rightNow.day (), rightNow.year ()); if (dt < thisDay) + return 3; + + if (dt == thisDay) return 2; int imminentperiod = context.config.getInteger ("due"); @@ -436,7 +439,7 @@ bool nag (Task& task) { if (t->id == task.id) { - if (getDueState (t->get ("due")) == 2) + if (getDueState (t->get ("due")) == 3) isOverdue = true; std::string priority = t->get ("priority"); @@ -445,7 +448,7 @@ bool nag (Task& task) } else if (t->getStatus () == Task::pending) { - if (getDueState (t->get ("due")) == 2) + if (getDueState (t->get ("due")) == 3) overdue++; std::string priority = t->get ("priority"); diff --git a/src/report.cpp b/src/report.cpp index c9a97ec8b..ed3e70778 100644 --- a/src/report.cpp +++ b/src/report.cpp @@ -1473,6 +1473,7 @@ std::string renderMonths ( Color color_today (context.config.get ("color.calendar.today")); Color color_due (context.config.get ("color.calendar.due")); + Color color_duetoday (context.config.get ("color.calendar.due.today")); Color color_overdue (context.config.get ("color.calendar.overdue")); Color color_weekend (context.config.get ("color.calendar.weekend")); Color color_holiday (context.config.get ("color.calendar.holiday")); @@ -1542,19 +1543,44 @@ std::string renderMonths ( // colorize due tasks if (context.config.get ("calendar.details") != "none") + { + context.config.set ("due", 0); foreach (task, all) { + + if (task->getStatus () == Task::pending && task->has ("due")) { - Date due (atoi (task->get ("due").c_str ())); + std::string due = task->get ("due"); + Date duedmy (atoi(due.c_str())); - if (due.day () == d && - due.month () == months[mpl] && - due.year () == years[mpl]) - table.setCellColor (row, thisCol, (due < today ? color_overdue : color_due)); + if (duedmy.day () == d && + duedmy.month () == months[mpl] && + duedmy.year () == years[mpl]) + { + switch (getDueState (due)) + { + case 1: // imminent + table.setCellColor (row, thisCol, color_due); + break; + + case 2: // today + table.setCellColor (row, thisCol, color_duetoday); + break; + + case 3: // overdue + table.setCellColor (row, thisCol, color_overdue); + break; + + case 0: // not due at all + default: + break; + } + } } } + } } // Check for end of week, and... @@ -1741,6 +1767,7 @@ int handleReportCalendar (std::string &outs) Color color_today (context.config.get ("color.calendar.today")); Color color_due (context.config.get ("color.calendar.due")); + Color color_duetoday (context.config.get ("color.calendar.due.today")); Color color_overdue (context.config.get ("color.calendar.overdue")); Color color_weekend (context.config.get ("color.calendar.weekend")); Color color_holiday (context.config.get ("color.calendar.holiday")); @@ -1753,6 +1780,8 @@ int handleReportCalendar (std::string &outs) << ", " << color_due.colorize ("due") << ", " + << color_duetoday.colorize ("due-today") + << ", " << color_overdue.colorize ("overdue") << ", " << color_weekend.colorize ("weekend") diff --git a/src/rules.cpp b/src/rules.cpp index b406d5dc1..aef5f57c4 100644 --- a/src/rules.cpp +++ b/src/rules.cpp @@ -144,7 +144,11 @@ void autoColorize (Task& task, Color& c) c.blend (gsColor["color.due"]); break; - case 2: // overdue + case 2: // today + c.blend (gsColor["color.due.today"]); + break; + + case 3: // overdue c.blend (gsColor["color.overdue"]); break; diff --git a/src/tests/color.due.t b/src/tests/color.due.t index 3e23d8b3d..314e969cf 100755 --- a/src/tests/color.due.t +++ b/src/tests/color.due.t @@ -41,7 +41,7 @@ if (open my $fh, '>', 'color.rc') } # Test the add command. -qx{../task rc:color.rc add due:eoy nothing}; +qx{../task rc:color.rc add due:12/31/2037 nothing}; qx{../task rc:color.rc add due:tomorrow red}; my $output = qx{../task rc:color.rc list}; diff --git a/src/tests/color.duetoday.t b/src/tests/color.duetoday.t new file mode 100755 index 000000000..b0c4dd5c0 --- /dev/null +++ b/src/tests/color.duetoday.t @@ -0,0 +1,62 @@ +#! /usr/bin/perl +################################################################################ +## task - a command line task list manager. +## +## Copyright 2006 - 2010, Paul Beckingham. +## 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 +## +################################################################################ + +use strict; +use warnings; +use Test::More tests => 6; + +# Create the rc file. +if (open my $fh, '>', 'color.rc') +{ + print $fh "data.location=.\n", + "color.due.today=red\n", + "_forcecolor=1\n"; + close $fh; + ok (-r 'color.rc', 'Created color.rc'); +} + +# Test the add command. +qx{../task rc:color.rc add due:12/31/2037 nothing}; +qx{../task rc:color.rc add due:today red}; +my $output = qx{../task rc:color.rc list}; + +like ($output, qr/ (?!<\033\[\d\dm) \d{1,2}\/\d{1,2}\/\d{4} (?!>\033\[0m) .* nothing /x, 'none'); +like ($output, qr/ \033\[31m .* red .* \033\[0m/x, 'color.due.today'); + +# Cleanup. +unlink 'pending.data'; +ok (!-r 'pending.data', 'Removed pending.data'); + +unlink 'undo.data'; +ok (!-r 'undo.data', 'Removed undo.data'); + +unlink 'color.rc'; +ok (!-r 'color.rc', 'Removed color.rc'); + +exit 0; +