Tasks in Tomboy

New Tasks Design (5 Dec 2007)

  • Tasks can exist one of two ways
    • Standalone Note (real Tomboy note)
      • Tagged with system-tag
      • Priority, Due Date, Completion Date, etc. are stored as a system tag
    • Embedded task (task that only exists inside of another note)
      • Priority, Due Date, Completion Date, etc. are stored as TextTag attributes and are serialized to the Note XML

  • Tasks should no longer be .task files, they should just be special notes.
  • You should be able to type [] or todo: and the task will be created as a link to a note
    • The note will not be created until they click it.
  • TaskManager needs to parse all notes and look for [] and todo: and show them in the TaskListWindow

    • Alternatively, task notes could be tagged "TaskNote" (for example). This way a user can easily turn any note into a task/todo note, plus no parsing required by TaskManager. Some other internal identification mechanism could be used instead of tagging, if it made more sense. --SandyArmstrong

      • Oooo! I like that idea. Perhaps we can introduce the concept of "system/hidden" tags for this. It'd definitely be a lot faster than parsing all the text looking for "todo:" or whatever. And we wouldn't have to modify the code when we use other mechanisms besides [] or todo:. --BoydTimothy

  • When you open a Task note, a Task toolbar should be available. The toolbar will have options to set a due date and if the task is completed
  • The todo/[] line should be struckout when the note is completed
  • If the note has a priority, the line should be colored (red, green, yellow?)
  • The task menu list should have a preference to show/hide
    • Disabled by default

Features to implement for Tomboy 0.8.0 (before GNOME 2.20 UI Change/String Announce Period, July 9, 2007)

  • Create a new "Tasks" Mono.Addin
    • Since Tasks are a little off the main focus for Tomboy, implementing this as a plugin may satisfy the Tomboy purists. If it's well accepted, we could then turn it into an addin that's enabled by default
    • Need to write supporting code in Tomboy to allow the addin to be able to tie in with all the necessary places. This may include the NoteWindow's Tool Bar, Note Buffer, etc.

  • Focus on personal tasks (don't worry about assigning tasks to contacts or delegating tasks)
  • Be able to easily create a task within a note
    • Type "todo:" at the beginning of a line
    • Press the "To Do" button in the Note Window toolbar and the current line will be converted into a task
    • Type "[]" followed by text and it would be converted into a task
  • Easily mark a task as completed anywhere in the UI where the task is shown
    • Need to figure out a way to display a checkbox inside of a TextView and allow the mouse clicks to interact with it

  • Task Details Popup/Window/Dialog
    • When a user clicks on a task in the note, they should be able to set more details about the note such as:
      • Due Date
      • Priority
  • Task List Window/UI
    • Shows tasks from all notes
    • Access/open the note where the task was originated from
    • Sorting
      • List uncompleted tasks first by priority/due date
      • Implement the window with a TreeView control so the user could sort by any column

    • Be able to create a new task from the window that doesn't necessarily have a note associated with it
      • Extra Credit: Drag and drop a task from this window into a note to subsequently make a note association
    • Be able to view how old/stale a note is

Schedule

Iteration 0: May 29 - June 1

  • [X] Create initial Plugin
  • [X] Implement Task and TaskManager (classes)

  • [X] Add a "To Do List" in the Tomboy Icon Menu
  • [X] Initial Task List Window
    • [X] Mark tasks as complete
    • [X] Reopen tasks
    • [X] Delete tasks
    • [X] Create new tasks
    • [X] Show Due Date
    • [X] Edit Due Date
    • [X] Show Completed Date
    • [X] Show Priority
    • [X] Edit Priority
    • [X] Fix CellRendererDate to use the right State so the colors are correct

    • [X] Fix CellRendererDate so that it positions the text in the proper place so it matches the other columns

  • [X] Create TaskOptions popup (will be used in NoteWindow and TaskListWindow)

    • [X] Show Due Date
    • [X] Edit Due Date
    • [X] Show Priority
    • [X] Edit Priority
    • [X] Show Details
    • [X] Edit Details

Iteration 1: June 2 - June 8

  • [X] Add Mono.Addin support into Tomboy

    • [X] Create TasksAddin as the first Tomboy Addin

    • [X] Migrate an existing plugin to be an addin (Backlinks)
    • Set the base for converting all Tomboy Plugins -> Mono Addins

  • [X] Add a "To Do List" menu item in the Search All Notes Window's new "Tools" menu
  • [X] Add watcher to watch typing in a note and interpret it as a task
  • [X] Add code to update the task summary in a NoteWindow if the task's summary is modified/renamed

  • [X] Figure out a plan for what should happen in NoteWindow when a task is deleted inside the TaskListWindow (or elsewhere)

  • [X] Sort TaskListWindow columns

    • Basic sorting complete, but the behavior is weird when you modify tasks and they move/jump around. Adding something for next iteration to fix this behavior.
    • This one could be hard because we're not using a traditional TreeModel with multiple columns. I think the sorting is puking because of that. Anyone care to get this working? It should put all open tasks at the top with tasks that are overdue first, then the ones that are due next, then the ones with no due date.

  • [X] Add metadata into a task that shows which note(s) it's referenced/included in
    • Task now contains a OriginNoteUri:string [read-only] property

    • [X] Be able to open the corresponding note from the TaskListWindow

      • [X] Open with file menu item
      • [X] Open with right-click context menu
        • [X] Fix the problem where the context menu pops up before the selection has been changed
  • [X] Pretty-up TaskOptionsDialog

  • [X] Change the display dates to not use times
    • Add a bool argument to the GetPrettyPrintDate code to specify whether the time should be included

  • [X] When cursor is at the end of a todo line and the user presses enter, create a new todo on the next line
    • [X] If the user presses <Enter> on a todo line with no summary, delete the empty todo

  • [X] Handle creating a new todo item with the same name as an existing one

Iteration 2: July 6 - July 13

  • [ ] Add code to archive completed tasks that are stale (older than 30 days)
    • [ ] Figure out/implement UI to be able to search/access the archived notes
  • [X] Ellipsize the task summary in the TaskListWindow to only be as wide as the column

  • [ ] Fix TaskListWindow so that when you modify a task and it moves in the list because of the sorting, that it remains highlighted. Or figure out a better behavior.

  • [ ] Fix TaskListWindow Column Headers to include a sort indicator. Since it's not using a multi-column TreeModel it isn't putting the indicator there. This really is a low-priority item and could be moved to a future iteration.

  • [ ] Figure out how to intercept the events in the TaskListWindow so you aren't bumped out of edit mode when a task is saved. For example, if you create a new task and go to edit the summary really quickly, it ends up jumping out of edit mode and you have to go back in there.

  • [ ] When creating a new task inside the TaskList window, see if it's possible to put the Summary column into edit mode from the get-go

  • [ ] Fix problem of <Delete> key triggering a delete when editing a task summary inside of the TaskList window

    • Might help to suppress certain handlers when entering edit mode on the summary combo box. Is that possible?
  • [ ] Add a "To Do" item in the Note's Text menu that will toggle a line to be a todo item
  • [ ] Fix the Due Date column sorting so that the items due next are listed first
  • [ ] Get the CellRendererDate's Calendar to popup in the right place (i.e., not always near the top of the TreeView)

  • [ ] Change the colors of the todo lines
    • [ ] Completed tasks should be grayed out (insensitive)
    • [ ] Incomplete tasks should be ???. (someone please suggest a color) Perhaps don't use a color?
  • [ ] Indicate in the TaskListWindow which column is currently being sorted and which direction (ascending/descending)

  • [ ] If a user deletes the entire todo line in a note, delete the task
    • [X] Delete the task when the user presses the backspace key and removes a todo line character by character
    • [ ] Delete the task when the user highlights the entire line and presses <Delete>, <Backspace> or any other key that would cause the todo item to be removed

    • [ ] Delete the task(s) when the user highlights multiple lines with tasks contained in the selection and deletes the text

July 15 - July 21

  • GUADEC (www.guadec.org)

July 22 - 27

  • Boyd on vacation - Maybe someone else can step in and put in the golden touches?

July 30

  • Release Feature Frozen (bugs can still exist)
  • Feature & UI Freeze

Architecture/Design

How does a user create a new task?

Does one of the following:

  • Types one of the following, followed by a task summary, and then presses the <Enter> key:

    • []
    • todo:
    • TODO:
  • Places the cursor on the line that should be converted into a task and then clicks the "To Do"/"Task" button in the Note Window's Toolbar
  • Places the cursor on the line that should be converted into a task and then selects "To Do"/"Task" menu item from the Note Window's "Text" menu

Note: After pressing <Enter> on a line that's a task, the next line will also be created as a task. Pressing <Enter> or <Backspace> on a blank task line will remove the blank task.

Where are tasks stored?

Eventually, it might be nice to just consume tasks directly from some other system (such as Evolution). But, rather than require all Tomboy users to be forced into an external dependency for tasks, we'll store tasks in files.

When a new task is created, a task file will be created here:

    ~/.tomboy/Tasks/{GUID}.task

For example, if a user types the following line and presses <Enter> . . .

    todo: Write a letter to mom

. . . the "todo:" will be converted to a checkbox in the Note, and a new file will be created with a unique ID of, say, "8be2bffc-dd5e-4c9b-bc77-85e199ea9289". So the following file will exist:

    ~/.tomboy/Tasks/8be2bffc-dd5e-4c9b-bc77-85e199ea9289.task

The note will now be serialized with the following line for the task:

    <task url="task://tomboy/8be2bffc-dd5e-4c9b-bc77-85e199ea9289" completed="false">Write a letter to mom</task>

Other details about the note are stored inside the 8be2bffc-dd5e-4c9b-bc77-85e199ea9289.task file.

Scaling the ~/.tomboy/Tasks/ directory

Q. How well will Tomboy behave after running with years of tasks? Won't the ~/.tomboy/Tasks/ directory fill up with too many tasks?

One thing we could do to address this problem would be to move completed tasks that are stale (older than 30 days) into a ~/.tomboy/Tasks/Archive directory. We'll have to add something into the UI that would let users view/search/etc stale tasks, but the main core of Tomboy shouldn't have to always load/parse them. Instead, it just deals with the tasks in ~/.tomboy/Tasks/*.task.

*.task File Format

Dates should use the following format string: yyyy-MM-ddTHH:mm:ss.fffffffzzz. Example: 2007-03-26T14:13:28.8596090-06:00

Required elements:

  • <summary>

  • <create-date>

  • <last-change-date>

Optional elements:

  • <due-date>

  • <completion-date>

    • If this element exists, the task should be marked as completed
  • <priority>

    • Valid values are: low, normal, high

    • A "normal" priority is assumed if this doesn't exist
  • <details>

    • Contains more details/notes about the task that are not shown in a Tomboy note itself
    • Should be wrapped with a <text xml:space="preserve"> element just like the content of a standard Tomboy note is

Sample File

<?xml version="1.0" encoding="utf-8"?>
<task version="0.1">
  <summary>Write letter to mom</summary>
  <create-date>2007-03-14T15:25:50.5256930-06:00</create-date>
  <last-change-date>2007-03-26T14:13:28.8596090-06:00</last-change-date>
  <priority>normal</priority>
  <text xml:space="preserve"><details>I started writing the letter but then realized I don't have mom's address since she just moved.

I'm on the phone with mom.  Here's her new address:

1234 Cherry Tree Lane
Funville, CA  99999
  </details></text>
</task>

Task (class)

Methods:

  • Task (string summary) // constructor
  • Complete():void // Marks the task as completed
  • Reopen():void // Reopens a completed task

Properties:

  • Summary:string // read/write

  • Details:string // read/write

  • CreateDate:DateTime // read-only, the task archiver modifies this in the file

  • LastChangeDate:DateTime // read-only, the task archiver modifies this in the file

  • DueDate:DateTime // read/write

  • CompletionDate:DateTime // read-only

  • Priority:TaskPriority (enum: Low, Normal, High) // read-write

  • IsComplete:bool // Indicates whether this task is completed

TaskManager (class)

Just as NoteManager deals with managing and providing access to all the Notes in Tomboy, TaskManager will manage and provide access to Tasks.

Methods:

  • Create (string summary):Task
  • Delete (Task):void
  • Find (string summary):Task
  • FindByUri (string uri):Task

Properties:

Events:

Possible Future Features (to be worked on after Tomboy 0.8.0 & GNOME 2.20 releases)

  • Integrate with Evolution
  • Assign tasks to people (delegation)
    • Assign an Evolution/Telepathy/Banter contact a task. It magically appears on their machine and the originator is updated with any updates/changes/completion dates on the task
  • View tasks by assignee
    • Possibly right-click on someone's name and list all their assigned tasks
  • Be able to view "My Tasks" only in the Task List Window

Comments

  • Consider restricting task details to Evo feature set. I anticipate that many users will want Evo integration, and if that integration is awkward (or data is lost), it will not look good for us. --SandyArmstrong

    • Good suggestion. I'm not super familiar with Evo's tasks, but this comment is duly noted. --BoydTimothy

    • I took a look at Evolution's tasks (just via the GUI) and noticed that the proposed features above don't do anything that Evo doesn't already do. It should map over fairly nicely. --BoydTimothy

  • Question: does a task summary correspond to the text next to the check box? And from the user's point of view, this text can be formatted the same as any other text in the note? If this is all true, can the summary be edited from outside of the note (in the Task List GUI, for example)? So the text in the note needs to be updated to be in sync with the summary text, right? --SandyArmstrong

    • Answer: Yes, the task summary is the text that appears to the right of the checkbox. In the same way that an HTML link now appears in a Tomboy note (i.e., you can edit it freely), you will be able to edit the summary. Also, if you modify the summary elsewhere (say, from the task list view), the text in the note should update itself just like note title links update themselves when note titles are renamed. --BoydTimothy

  • It would be cool if details appeared embedded in the note when clicking on a task. I'm thinking you click on the task, and the area below that task expands to fill with the details UI. A cool slide/wipe effect would really top it off, too. :-) --SandyArmstrong

    • Keep in mind that what we have to deal with is a TextView widget (a royal pain in the you know what!). In any case, I'm picturing in my mind a simple popup that expands right under the task that lets you change the due date, priority, add more detailed description, etc. If you know how to pull this off, we'll gladly use your amazing slide/wipe effect. --BoydTimothy

  • How about options for how completed tasks display? Struck-through, changes color, or disappears. The note could have an option (maybe internal) for whether to remove completed tasks from the note or not. Also, if the task had a proper name, a syntax like [TaskName] could be used to pull a task into a note. --JosephMethod

  • I find it more natural to write "TODO" instead of "TODO:". The string will be converted to a checkbox anyway, so the colon is not needed to prettify the appearance. --StefanSchweizer

  • Why "~/.tomboy/Tasks" and not "~/.tomboy/tasks"? A regular user shouldn't generally be messing around there, so it only matters for us, right? --SandyArmstrong

    • Because the other subdirs that are already present use caps; ~/.tomboy/Backup, ~/.tomboy/BugzillaPlugin, etc. I guess it looks more consistent to use "Tasks" instead of "tasks". --BoydTimothy

  • There is a problem with the current implementation of the plugin: every time I delete a note, the TaskManager is shut down and the ToDo list disappears from the icon menu. Is this a general problem with that kind of plugins? What happens if the note is deleted that runs the timer of the NoteOfTheDay plugin? -- StefanSchweizer

    • Oops, this must be a bug. I'll look into it soon. I forgot that a plugin gets unloaded when a note goes away...or something like that. Thanks for tipping me off to it. --BoydTimothy

    • I'm adding Mono.Addin support into Tomboy and will convert Tasks to be an Addin. This should solve this problem.
  • There is already Task Coach] - a (very) good and advanced Task Manager written in Python, which uses a similar xml format. I don't know the stage in development of Tomboy Tasks, but I would really love to see a compatibility between those two apps. Maybe you can reuse the format or make it easy to convert?! -- NikolausFilus, 12 Dec 2007

    • Given the current plan for implementing tasks as special notes, this seems unlikely to happen. It would be awesome though if somebody wanted to write an add-in for import/export from this app, or if it was supported by Conduit for synchronization. --SandyArmstrong

Apps/Tomboy/Tasks (last edited 2013-08-09 00:14:57 by WilliamJonMcCann)