From 5ff5a5c1aed563c00d478bb17c0d1d13c6bb329c Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Mon, 16 Jan 2017 20:25:58 -0500 Subject: [PATCH] TW-1881: default.scheduled seems not to work - Thanks to Onion. --- ChangeLog | 2 ++ doc/man/taskrc.5.in | 8 ++++++++ scripts/vim/syntax/taskrc.vim | 1 + src/Config.cpp | 1 + src/Context.cpp | 1 + src/Task.cpp | 28 ++++++++++++++++++++++------ src/Task.h | 1 + src/commands/CmdShow.cpp | 1 + test/default.t | 5 +++++ 9 files changed, 42 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5aee9fc93..62a74b1cb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -49,6 +49,8 @@ (thanks to Eli). - TW-1878 uuids subcommand produces a space-delimited list, not comma-delimited (thanks to Scott Kostyshak). +- TW-1881 default.scheduled seems not to work + (thanks to Onion). - Added 'juhannus' as a synonym for 'midsommarafton' (thanks to Lynoure Braakman). - Deprecated the 'DUETODAY' virtual tag, which is a synonym for the 'TODAY' diff --git a/doc/man/taskrc.5.in b/doc/man/taskrc.5.in index cb22bf429..eae6c4ce0 100644 --- a/doc/man/taskrc.5.in +++ b/doc/man/taskrc.5.in @@ -1183,6 +1183,14 @@ Provides a default due date for the command, if you don't specify one. You can use a date, or a duration value which is assumed to be relative to 'now'. The default is blank. +.TP +.B +default.scheduled=... +Provides a default scheduled date for the +.I task add +command, if you don't specify one. You can use a date, or a duration value which +is assumed to be relative to 'now'. The default is blank. + .TP .B uda..default=... diff --git a/scripts/vim/syntax/taskrc.vim b/scripts/vim/syntax/taskrc.vim index 42841d2a8..9e2eb8f4c 100644 --- a/scripts/vim/syntax/taskrc.vim +++ b/scripts/vim/syntax/taskrc.vim @@ -102,6 +102,7 @@ syn match taskrcGoodKey '^\s*\Vdefault.command='he=e-1 syn match taskrcGoodKey '^\s*\Vdefault.due='he=e-1 syn match taskrcGoodKey '^\s*\Vdefault.priority='he=e-1 syn match taskrcGoodKey '^\s*\Vdefault.project='he=e-1 +syn match taskrcGoodKey '^\s*\Vdefault.scheduled='he=e-1 syn match taskrcGoodKey '^\s*\Vdefaultheight='he=e-1 syn match taskrcGoodKey '^\s*\Vdefaultwidth='he=e-1 syn match taskrcGoodKey '^\s*\Vdependency.confirmation='he=e-1 diff --git a/src/Config.cpp b/src/Config.cpp index d230e1624..84682b8b6 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -249,6 +249,7 @@ std::string Config::_defaults = "\n" "#default.project=foo # Default project for 'add' command\n" "#default.due=eom # Default due date for 'add' command\n" + "#default.scheduled=eom # Default scheduled date for 'add' command\n" "default.command=next # When no arguments are specified\n" "\n" "_forcecolor=0 # Forces color to be on, even for non TTY output\n" diff --git a/src/Context.cpp b/src/Context.cpp index 1b0bfd131..5808d6ea6 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -686,6 +686,7 @@ void Context::staticInitialization () Task::defaultProject = config.get ("default.project"); Task::defaultDue = config.get ("default.due"); + Task::defaultScheduled = config.get ("default.scheduled"); Task::searchCaseSensitive = Variant::searchCaseSensitive = config.getBoolean ("search.case.sensitive"); Task::regex = Variant::searchUsingRegex = config.getBoolean ("regex"); diff --git a/src/Task.cpp b/src/Task.cpp index 51e444cf7..087ce66d4 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -67,10 +67,11 @@ extern Task& contextTask; static const float epsilon = 0.000001; #endif -std::string Task::defaultProject = ""; -std::string Task::defaultDue = ""; -bool Task::searchCaseSensitive = true; -bool Task::regex = false; +std::string Task::defaultProject = ""; +std::string Task::defaultDue = ""; +std::string Task::defaultScheduled = ""; +bool Task::searchCaseSensitive = true; +bool Task::regex = false; std::map Task::attributes; std::map Task::coefficients; @@ -1565,6 +1566,20 @@ void Task::validate (bool applyDefault /* = true */) } } + // Override with default.scheduled, if not specified. + if (Task::defaultScheduled != "" && + ! has ("scheduled")) + { + if (context.columns["scheduled"]->validate (Task::defaultScheduled)) + { + Duration dur (Task::defaultScheduled); + if (dur.toTime_t () != 0) + set ("scheduled", (Datetime () + dur.toTime_t ()).toEpoch ()); + else + set ("scheduled", Datetime (Task::defaultScheduled).toEpoch ()); + } + } + // If a UDA has a default value in the configuration, // override with uda.(uda).default, if not specified. // Gather a list of all UDAs with a .default value @@ -2044,8 +2059,9 @@ void Task::modify (modType type, bool text_required /* = false */) // ::composeF4 will skip if the value is blank, but the presence of // the attribute will prevent ::validate from applying defaults. if ((has (name) && get (name) != "") || - (name == "due" && context.config.has ("default.due")) || - (name == "project" && context.config.has ("default.project"))) + (name == "due" && context.config.has ("default.due")) || + (name == "scheduled" && context.config.has ("default.scheduled")) || + (name == "project" && context.config.has ("default.project"))) { mods = true; set (name, ""); diff --git a/src/Task.h b/src/Task.h index 6aa8121c7..a159a3bab 100644 --- a/src/Task.h +++ b/src/Task.h @@ -39,6 +39,7 @@ class Task public: static std::string defaultProject; static std::string defaultDue; + static std::string defaultScheduled; static bool searchCaseSensitive; static bool regex; static std::map attributes; // name -> type diff --git a/src/commands/CmdShow.cpp b/src/commands/CmdShow.cpp index b756f862a..b617fc95a 100644 --- a/src/commands/CmdShow.cpp +++ b/src/commands/CmdShow.cpp @@ -144,6 +144,7 @@ int CmdShow::execute (std::string& output) " default.command" " default.due" " default.project" + " default.scheduled" " defaultheight" " defaultwidth" " dependency.confirmation" diff --git a/test/default.t b/test/default.t index 29f84d99b..af583cd8e 100755 --- a/test/default.t +++ b/test/default.t @@ -64,6 +64,7 @@ class TestDefaults(TestCase): cls.t.config("default.project", "PROJECT") cls.t.config("uda.priority.default", "M") cls.t.config("default.due", "eom") + cls.t.config("default.scheduled", "eom") def test_all_defaults(self): """Verify all defaults are employed""" @@ -73,6 +74,7 @@ class TestDefaults(TestCase): self.assertIn('"project":"PROJECT"', out) self.assertIn('"priority":"M"', out) self.assertIn('"due":"', out) + self.assertIn('"scheduled":"', out) def test_all_specified(self): self.t("add project:specific priority:L due:eoy all specified") @@ -81,6 +83,7 @@ class TestDefaults(TestCase): self.assertIn('"project":"specific"', out) self.assertIn('"priority":"L"', out) self.assertIn('"due":"', out) + self.assertIn('"scheduled":"', out) def test_project_specified(self): self.t("add project:specific project specified") @@ -89,6 +92,7 @@ class TestDefaults(TestCase): self.assertIn('"project":"specific"', out) self.assertIn('"priority":"M"', out) self.assertIn('"due":"', out) + self.assertIn('"scheduled":"', out) def test_priority_specified(self): self.t("add priority:L priority specified") @@ -97,6 +101,7 @@ class TestDefaults(TestCase): self.assertIn('"project":"PROJECT"', out) self.assertIn('"priority":"L"', out) self.assertIn('"due":"', out) + self.assertIn('"scheduled":"', out) def test_default_command(self): self.t("add foo")