When I first released ToDoList more than 11 years ago it was as a consequence of exploring some UI ideas, the principal of which was using the non-client region of a tree-view control to draw attribute columns.

But while this satisfied my research goal it had a major drawback: The attribute columns could not move independently of the task titles meaning that if you displayed too many columns the task title got squeezed and some of the attribute columns might not be visible.

In addition there was no column reordering or resizing because I would have had to write this from scratch and that seemed too great an effort when the built-in Windows list-view gave you that for free. So I pushed the problem into the background and palmed-away questions as they came up.

Then sometime in 2012 I started to think about creating a Gantt plugin and I realised that the 'tree-part' and the 'bar-part' were going to have to be physically separate because the 'bar-part' was definitely going to need to scroll horizontally but that scrolling could not cause the 'tree-part' to be hidden. And I further realised that solving this might also provide the solution to Task-Tree attribute columns issue.

So I started work on a 'Tree-List-Syncer' whose primary goal was to synchronise the vertical scrolling of either a tree and a list or two lists, positioned side-by-side. Additionally the LHS widget had to hide its vertical scrollbar and instead respond to scroll events from the RHS widget.

The Gantt plugin was released with 6.7 in 2013 and proved successful as a solution yet it still took a couple more versions for me to summon up the courage to pull open the guts of the app to replace the Task-Tree and List-View. I think I was still hoping that the Gantt plugin would reveal a huge flaw in my approach so that I didn't have to do the work!

But here it is. Both the Task-Tree and List-View now have task attributes that can be scrolled horizontally without impacting the task titles. They are divided by a splitter bar (which can be effectively hidden in the preferences) giving total control over 'pane' widths. Attributes columns can be reordered and resized by dragging the column header dividers ala Explorer.

I do understand that some of you will find these changes upsetting but they had to made in order that other more important usability features could be included to keep ToDoList relevant.

Introduction

You know how it is - you start work on one project and halfway through, you find one or two side-projects crop up that have to be solved before you can continue on the original project.

This is one such project with the added twist that it too started its life as a side-project. Here's what happened:

<Cue wavy screen effect>

I can only imagine that the planets must have been in (mis-)alignment or something, because at one point a few months ago, I was suddenly fielding emails on four or five separate articles I had previously submitted to CodeProject, some asking for features and others for bug fixes.

Foolishly or otherwise, I largely agreed with all the points raised, and subsequently found myself with fourteen or fifteen separate issues to resolve.

The situation was also made worse because I was trying to use CodeProject to keep track of all the things I had agreed to do, meaning that I had to continuously trawl the comments section of each article to remind myself of what I was supposed to be working on.

It even got to the stage where I was worrying that I'd fail to deliver on something - silly I know, but there you are!

Keeping a list on paper was a definite step in the right direction, but since I do all my coding on the same machine, it seemed somewhat inelegant, and anyway, we all know what happens to crucial bits of paper left lying around on desks and such.

The next step was to hunt around on the web for a tool to meet the following requirements:

Simple interface

Support for hierarchical data

Numbered items/subitems

Open file format

Freeware

Simple, huh! not!

I will admit that I did not spend weeks searching, but I am still surprised at the general lack of software matching my needs.

On reflection, I think that the reason may be simple: people are so used to commercial software being 'feature-rich' that when they come to design software themselves, they (not unreasonably) think they too need to cram as much in as possible, often leading to software where a lot of essential functionality is hidden away in the menu bar.

So, surprise, surprise, I decided to write something myself.

However, it's fair to say that I did not originally intend to post it on CodeProject and am only really doing so because I had a heap of fun solving some very interesting problems and these are what I think make it worth it.

Using the Software

There's really very little I need to say here since every feature/function is explicitly visible in the interface.

Nevertheless, the following list of basic capabilities and omissions may go someway to answering any questions that arise:

Files are stored in XML format with .xml file extension.

Trying to load a non-tasklist file will generally fail (unless you read the code to see how to circumvent it).

The number of items/subitems is limited only by memory (although performance may be the deciding factor before you exhaust memory).

Marking a parent item as 'done' will also gray-out child items, but they are not disabled or automatically marked as 'done'.

An ellipsis (...) indicates that an item has sub-items.

All items can be expanded or collapsed (by double-clicking).

Top-level items and sub-items are created using different toolbar buttons.

There are task-specific context-menus.

The previously open tasklists are re-opened on startup.

The tasklist is automatically saved when closing the software or minimizing it to the system tray.

The priority of a task is shown as a grayscale box to the left of the item.

Points of Interest

Here's where we come to the side-projects I was talking about, the first two of which I intend to work up into follow-up articles.

They are:

The 'ordered' tree control, which incorporates a non-client gutter for displaying the item numbers.

The idea stemmed from research I did into alternative designs for a tree-list control, which did not solve it by creating a hybrid control incorporating a tree and a list.

The hybrid control seems such an obvious solution that I suspect few people have stopped to question it, but it has still always struck me as looking far too much like hard work to be truly elegant ('square pegs' and 'round holes' spring to mind).

One possible idea is to implement the 'list' portion entirely in the non-client area of the tree. I.e., shift the right hand client edge to the left and then render the list portion in the resulting non-client area.

Whilst I've yet to get round to building a proof of concept, it was nevertheless this ongoing mental debate which prompted me to try to solve the requirement for numbered items and subitems by rendering the item/subitem numbers in the non-client area.

Without going into too much detail (as this will subsequently be an article of its own), this is how I got it to work:

Handle TVM_INSERTITEM and TVM_DELETEITEM to know exactly when items are added and removed.

In these handlers recalculate the width of the gutter required to display the widest 'dotted' item/subitem number. (Note: this is not necessarily simply the deepest subitem.)

Handle WM_NCCALCSIZE when it does, and offset the left border by the required gutter width.

Handle WM_NCPAINT for painting the numbers.

This is necessarily an over-simplification, but it captures the essence of the solution, and all that essentially remains is lots of fiddling about to ensure the non-client area gets redrawn at the the right times to stay synchronized with the client area.

Embedding .RC control definition data directly in a .cpp file to break the dependency on binary resources (a.k.a. 'Runtime Dialogs').

This is an idea that has been floating about for quite some time and which has only recently gelled into a workable solution.

The problem, put simply, is that if you want to take advantage of the resource editor in Visual Studio (and who doesn't), then you very quickly find yourself stuck with having to load dialog templates from resources compiled into the binary file.

This further means that if you want to make use of a dialog across multiple projects, then either you need to copy and paste the dialog template between project .RC files, or you need to build the dialog into a DLL from which it can be accessed.

'Runtime Dialogs' (a snappy title I coined myself) is a solution that neatly sidesteps both the nuisance of copying dialog resources between resource files and the extra work (and maintenance) involved in packaging dialogs in DLLs.

And it works like this:

First, you design your dialog template in the resource editor, create a CDialog derived class using class wizard, and wire up all the controls just as you normally would.

Next, you #include "runtimedlg.h" and change all instances of CDialog to CRuntimeDlg.

Then, you cut and paste the control definition section from the appropriate section in the .RC file and embed it directly in the dialog's .cpp file as a static string (with a bit of tweaking to handle double quotes and such like).

Finally, in the constructor of your dialog, you simply call CRuntimeDlg::AddRCControls(...) passing the control definitions as a string.

And CRuntimeDlg takes care of the rest including, if required, auto-sizing the dialog to suit the control layout.

I'm certainly not suggesting that this is a 'win-win' solution for all situations but it certainly has merits in its closer coupling of dialog template to dialog code which makes sharing dialogs across multiple projects a breeze.

P.S.: In case it's not clear here, I used CRuntimeDlg to create CToDoCtrl which encapsulates the ordered tree together with the priority, date and comments controls as a single simple-to-instantiate control.

This is possibly the most satisfying aspect of the whole project because it was completely unexpected.

What I mean is that, until recently, my knowledge of DOM and XMLDOM was virtually non-existent, as it's only since I've become more interested in the presentation of AbstractSpoon that I've been forced to get to grips with the various implementations of DOM and XMLDOM out there.

I'm pleased to say that the code on my site works under IE 6.0, Netscape 7.1, and Mozilla, although custom code was required to achieve this.

Generic MFC Classes that may prove Useful to You

The following table lists a wide range of utility classes written for this project. They can all be included in any MFC project provided you include any class dependencies too. Feel free to ask any questions relating to these specific classes and how to use them.

Adds support for recognizing urls, clicking them and setting custom url callbacks

CWinClasses

Encapsulates the ::GetClassName Win32 functions

CXmlFile, CXmlItem

Non-Unicode class for reading and writing xml files

CXmlFileEx

Adds encryption capabilities to CXmlFile

CXmlFile, IEncryption

* CSubclassWnd was originally written by Paul DiLascia for MSJ magazine. The version I use has been heavily extended to suit my specific needs. The classes that depend on it here need this extended version.

Further Work

Whilst this tool was originally intended for my personal use only, it is now a 'community' project, so if you find it useful and want to make suggestions for enhancements or bug fixes, then post below.

History

7.0.13 (04 Feb 2016) - Mostly likely the last update of 7.0

Fixed uneven task row heights on Windows XP 64-bit

Fixed incorrect strike-through in Find Tasks dialog for incomplete parent tasks having all their subtasks completed

Fixed doubled-up Help Menu separator on XP

Fixed translation 'Cleanup' button not saving changes

Fixed XML encoding for Unicode tasklists

Fixed tasklist tab-bar resize bug after double-clicking on titlebar

7.0.12.1 (20 Jan 2016)

Fixed loading of Ansi tasklists

7.0.12 (14 Jan 2016)

Fixed bug where pasting a text fragment from Firefox would display the wrong source URL

Fixed List View selection render artifacts in full screen when resizing the title pane

Fixed inability to tab to Status field after making the field 'read-only'

Comments and Discussions

Please understand, all I have been saying is that for the amount of effort you're going to expend, and need of Dan (e.g. to ensure strict adherence to the xsd of the moment), applying that effort in a different direction is likely to provide greater returns to a greater audience. Something Dan has said he would like to see.

Ran than Dan do all the work, as you say, let's create an environment in which we can all help him in the 'rewrite'.

e.g. If you're going to do the work of data in/out, you've just completed a non-trivial portion of any rewrite - and eliminated any need to keep anything in sync, it will inherently already be in sync. If that data is in something like PostgreSQL, then strong typing is inherent to that vehicle - the code won't have to worry about making sure all i's are dotted and t's crossed, the database won't let you write non-adhering data in the first place - you may have to fix some code in a specific place for a specific field, but you'll have confidence that you won't be breaking something else. And if you do, it will be immediately noticeable when records fail to write. Data integrity will be maintained throughout, and there will be less of a need to write remediating code.

But I do get what you're saying. Today is today, and you're scratching an itch because you have a particular urge to solve a particular problem today because it's impacting you.

Many applications operate on a RDBMS, whether MySql, SQL Server, Oracle, or Sqlite for Android. Most reporting apps do not have a driver for XML, and those that do require a schema (which as discussed, I'll create a new schema as a by-product of this effort).

The library consists of strongly typed classes for app development but I will also add a DataTable interface for ADO.NET. With this it will be easy for someone to extract data from a .tdl, and push it into a RDBMS table for subsequent reporting - a near-line / off-line datastore. Then any reporting tool of choice can be used to operate on the data. I will not be adding exports to specific databases unless I need them. That exercise will be left to anyone who's motivated to do that kind of development.

It's good and necessary that TDL has some form of built-in reporting, so this doesn't preclude that effort. But this will offer options to those who prefer to use other reporting products, especially commercial tools that they've purchased to get consistent reporting in their department or company.

2) For CSV/Excel exports, the library can be used in conjunction with other development tools like Linq-to-CSV or Excel automation libraries. With these tools and a class library, developers will have a much easier time creating custom export utilities.

3) Developers can use this to create outbound notifications where changes to TDL trigger emails, SMS, or other notifications.

4) Developers can use this to export data from other applications into TDL. Examples include creating new tasks for sales people to notify clients of some new event, or triggers to purchasing people to check vendor pricing when it's getting close to re-order time. Someone can even wire this to a Facebook app which gets new birthday events and updates TDL with a task to go buy a gift.

5) Mobile apps can be created which monitor the installation of specific versions of software. For company use, let's say you have a Task is to get all company mobile phones upgraded to v2.0 of a specific app. You know how many phones are in the hands of company employees. That count becomes you 100% mark to task completion. As each employee gets their phone updated and notifications are sent in, the %Complete flag is updated to reflect the new count. So if there are 50 employees and 20 of them have updated, %Complete = 40. And to complete the cycle, if a read trigger is on that, when that task is 100% complete perhaps an email can be sent to management that everyone has now updated.

6) This can help to bi-directionally integrate TDL with Bugzilla or other issue tracking systems.

7) Many FOSS projects (Drupal, Wordpress, MediaWiki...) send email when there is a new release out. You can have an app monitor specific accounts for mail from these projects, and when one is found that says "you need to upgrade your software", it will create a task in your website .tdl. Or you can be pro-active and have an app poll the various websites for new releases, whether checking their FTP sites or a portal/download page. So the app queries for an update and if found it creates a new task that you should check into it.

As I understand, View > Toggle Filter will toggle between the most recent filter and the default filter (i.e. All Tasks filter). To me, this feature is very convenient. Anyway, there's a minor issue as follows:

In the All Tasks filter, the default value of "Hide Completed Tasks" is false (unchecked). So whenever I use the Toggle Filter feature to switch back to the All Tasks filter, the completed tasks show up and I have to set the “Hide Completed Tasks” option back to true (checked).

There's an option under User Interface > Column Selection which is called “Always hide parent tasks in List View”. Is it possible to add a similar option called “Always hide completed tasks in All Tasks filter”?

Thank you for the most awesome todolist application known to me (at least)

But when I tried to open any tasklist file directly--i.e., instead of starting ToDoList.exe first, I got the Windows' error message again.

Great, this seems like the most useful line of enquiry.

What I need you do now is to send me the ini file and one of the tasklists (which I will delete on completion) that causes a crash, together with the precise steps that provoke the error message including whether it matters if TDL is already running when you load the tasklist via Explorer.

I've no doubt the same would be true when running as a non-admin in Win 7.

I believe this stems from the new security models introduced with Win 7, and made more strict with Win 8.

It seems that these Win's do some sort of tricky / bizarre / stupid / <pick MUCH stronger language> environment sandboxing, watch what the .exe's do / happens around them, then applies various bits around them.

This seems to be why the compatibility settings surround .exe's (go to the properties of an .exe, in there are various compatibility running modes that can be set) are present.

This has caused me no end of grief in Win 8, such that I can't get things working, and hope to never purchase an MS product again. Stuff was all just working, put it on Win 8, and forget it - it doesn't work. (ze/nmap is the latest victim of this that I've encountered.)

Anywho, I suspect the problem does not line within TDL itself, but within the environment Windows runs the .exe.

HTH, these are my best guesses / experiences, you certainly have my best wishes for sleuthing this out.

No, this one. You're running along in 8.1 things are working ... and ... suddenly stop, for no apparent reason. Really frustrating.

But I now see how you might think that.

In that case, I'm going to guess that some sort of setting needs to be in the .exe header. (The specifics of which I have no clue.)

As I understand it, be it in the build of the .exe or windows itself since it dynamically creates a run time environment database, likely both, there are settings for permissions / capabilities required that get detected at load time. Thus, I suspect, windows will prompt 'you need to be an administrator', if the bit indicating such permissions are needed is present. I suspect the same is true at attempt to copy a file (like an .exe?) to certain places. Like C:\Program Files?

Until 8/8.1 one could run as administrator, or be an administrator and things would work, permissions were inherent to the account. UAC could actually be turned off pre-8. In 8+ you can turn off UAC, but it doesn't really turn off. PITA. The only way of which I can see around is to actually run as administrator. I mean literally Administrator. Which is 'bad' for all sorts of reasons, and certainly counter to all supposed best practices.

But is what Windows 8 forces people towards. (No wonder Chrome / Google / Android has come along.) Or, replace every piece of software you've come to rely on over the years. And face the re-learning curve and $, particularly on desktops, of the new touch interface. I have a desktop, and a real keyboard, for a REASON!

In this thread, what seems to happen is this dynamic run time environment database comes along and adjusts itself out of your ability to use the program at all. (This is anecdotal, I've yet to pin down / resolve exactly what's going on / how to fix at various times.) I wondered if that is what was biting the OP here. (Versus the update thread, where I expect an improved copy failure detection is needed by the installer - be it need to be an administrator or file permissions failure. Which, evidently since it's only now rearing its head, 'just worked' pre-8.) {And, I suspect, like myself, many people run as part of the administrator group for their own sanity.}

These compatibility modes, as far as I can see, is why the compatibility settings exist in an .exe's properties. Let alone, there is an XP compatibility setting, but is not exposed by that GUI. (But is in the task scheduler.) [It is the complexity of this run time environment ecosystem / compatibility settings, so many fingers in these puzzles, that is causing a great deal of frustration out there.]

iSpyConnect is a recent example for me - it collects cam feeds (e.g. nanny cams), and can also serve via an app built-in web server. Completely falls over for me as of 8.1 - it can open the port for listening, but AFAICT can't talk out the port it's just opened. Pre-8, just worked. For others on 8+, it works. And I've absolutely no idea in all this compatibility / run time environment ecosystem what to fix. (Assuming any gui even exposes the setting I need - if I knew what it was.)

Sorry to run off like this into the generic, but I do wonder if it is this sort of dynamic win thing, beyond TDL's control, that is biting the OP.

I can say, Dan, if you're not running 8.1, you might find it problematic to find and fix these sorts of win 8 things. Win 8 sandboxes in some way that pre-8 doesn't, and I suspect, if you can even duplicate a problem, you need to put it in a windbg level environment to detect what's stopping things in their tracks - to know what to look for to address. (Yet I wouldn't wish Win 8 on my worst enemy.)

The URL to this project changes with every new release.Dan, what do you think about not putting the release ID and release status in the top subject line, so that URL stays more consistent?We can get to the page using simply:www.codeproject.com/Articles/5371/ToDoListbut I don't think a lot of people know that, so a copy/paste of the URL looks more like:Articles/5371/ToDoList-6-8-5-Feature-Release-An-effective-and-fl(That and other variants always work because CodeProject simply ignores most of it.)Thanks.

I use the URL http://www.codeproject.com/tools/todolist2.asp for this page.

There ya go. Two people who are familiar with how CodeProject works and we use two different ways to access this page. With that URL I believe the URL changes to the current one when the user visits. Not so with http://www.codeproject.com/Articles/5371/ToDoList[^]

Note that if you get a permalink from forum threads that it uses the URL that you used to come to the site plus it adds the thread/response IDs. Those URLs are too long and too ugly right now. And from what I've seen the /tools/todolist2.asp link doesn't work with permalinks either (because the permalink uses the long/current version. But the one above does.

If Dan can just put the version data in a second header line rather than updating the primary header on every update, then we'll get a consistent URL that everyone can use.

Now that I'm using TDL for tracking time I find myself occasionally needing to go back to adjust mistakes. I'll leave the timer on when going AFK and then need to manually decrease the time logged. So I ctrl-L to open Excel and the .log, change the detail there, and then manually adjust the total task time by the same amount.

But then I remembered we have an option for Edit>Other Task Attributes>Add time to Task Log File ( Which I've set as hot-key Ctrl-Alt-A )

We can use that to modify the log time and optionally to change the task time, and that value can be negative.

Not only do I see this as a good way to make corrections, but in good accounting form it creates a transaction that indicates the event occurred, which for some might be preferable to a manual adjustment which could be made in error.

Now I need to move toward summarizing my CSV logged time by date by task (rather than displaying all line items) so that I can present my data to clients without reporting every one of these clock-on/off events and adjustments.

Does 6.9 include the reporting you mentioned here[^]? Wow dude, that was fast.

You had asked for notes about how we use TDL for timekeeping and invoicing. I provided feedback here[^] and that describes a user-defined utility which I now use to modify the CSV log with more information about my current activity. I'm currently writing a Bill/NoCharge flag into column K (1-based 11) and multi-line comments into L=12. But if you're modifying the columns I can adjust this.

You also asked for feedback here[^], I don't know if you saw my recent response there. (Which is why I asked about forum sorting... )

My thoughts/issues on this whole topic revolve around reporting to a client the Project>Task>Subtask tree with dates and hours (start/end time not important), and separating billable from non billable time. I track both so that I can report how much I'm not charging my clients even though I put in effort for them (sometimes more than I invoice). As mentioned above, I'm saving per-event comments (versus per task comments) but I rarely share these with clients. This is so I know what I was doing at any given moment just in case someone asks. If all of the required data is in columns (yes, redundant data), then we can do all of the sorting and sub-totalling as we desire. I almost wish you'd only put minimal effort into reporting for now and just focus on providing more data. Most people will open the CSV in Excel or similar apps, and those tools were made for reporting on data.

I think v6.9 is going to make my wife very happy. Unless I'm keeping good time I don't invoice very effectively. Better logging means more income. And that makes me wish you'd sell this software and get some more income yourself, but we've already covered that topic.

I think what I've done so far will go some way to meeting your needs, so when I release DR1 I'll get you to identify where it would need more work to meet your specific needs, and then I'll take those comments and weave them into a more generic solution.

I will be extending the log file format to indicate whether a log entry was 'tracked' or 'adjusted', so that you may make better sense of the numbers.

Could you elaborate on that? I'm manipulating the CSV file at a byte level and it would help to know what's changing. TDL uses a EOL of \n but when Excel saves a CSV it uses \r\n. So docs updated in both apps have different EOLs. Multi-line comments are delimited by \n so my code has to figure out what the EOLs are versus comments that I've injected.

Also 'tracked' or 'adjusted'? Not only am I adjusting the CSV, I'm also getting a backup of it every time I touch it, just in case there's a question of my utility doing any damage, I don't want anyone to lose any logged time.

@iamstarbuck - you say you wish to summarise the time (as I'm sure a number of people do). Pending this being built in - not even Dan can do everything at once I simply use a spreadsheet. Here's how:- open the log file (a csv file). Use "open as copy" so that you don't lock the file and prevent TDL updating it (it writes to the file whenever you stop tracking or track a different task).- I don't recall whether I had to use "text to columns" or not, sorry - but you'll need each column of data in the csv in a separate excel column. - create a new spreadsheet.- in the new spreadsheet, insert a pivot table, sourced from the data in the first.- drag start date to "column labels", title to "row labels", time spent to "values". Alter the field settings on time spent to compute the sum of the values.- save this sheethey presto - you now have a day by day breakdown of time. In the pivot table where it says "column labels" you can select the dates you want - try "date values">"this week" for example.When you need a new analysis, open both sheets (remember to open the first as a copy) and "refresh" the pivot table.

But this is exactly the kind of manual document processing that I'm trying to get away from. I already spend too much time in document reformatting, column shifting, merging of data from different sources, pivoting, transforming, and re-calculating with custom formulas. I can automate this if only I could find the time, but somehow I'm constantly stuck at the last hour manipulating data manually to get invoicing out, rather than writing code to do it for me. (The cobbler's children have no shoes...)

This is what prompted me to start writing a class library around TDL. Dan has been very generous over the last decade to bend over backwards to provide us features in TDL, and now he's taking the extra steps for v6.9 to add in reporting functions as well. As I see it, no matter what he does there will always be requests for more. Yes, the core should have basic functionality for those who don't seek to push beyond the defaults. So his efforts aren't wasted. But beyond that, right now my focus has turned to building more tools around the platform to make it easier for us to get away from the sort of manipulation that you've kindly provided.

With your class library we might even be able to move some core functionality into external C# executables.

After all, the existing Print/Preview functionality is really just a layer on top of the built-in HTML exporter, which itself effectively just processes a modified version of the taskfile via the same interface used by all the other plugin dlls.

You could save yourself some extra time by looking into Power Query! It is an Excel Addin by Microsoft that will allow you to use the TDL csv log file as a datasource. Then you can have your Excel spreadsheet update automatically without the need for copy/paste. I have taken the time to set this up over the last weekend, and it is working great! I have already saved myself a bunch of time.

"It amazes me that over the internet you can be anything you want, and yet so many people still choose to be idiots!"

I have been using TDL for a number of years, and I have so far converted two others in my office. I would be more than happy to give back in this way! I will do my best to have something back to you by the end of the week.

Yes that was it, Thanks. I never knew that was an option. Might I suggest removing that 'Features' pull down and just having a 'Sortable' checkbox as it's the only thing on that pull down anyway. Unless of course there are plans to add more 'Features'.

Hi! Here's a quick description of some problems I encountered with setting status through attribute calculations:

I'm happy that I can set TDL up so a new task always starts with a specific status (Default Task Attributes > Status: e. g. TODO), then make it so that a completed task gets another status automatically (Attribute Calculations > After completing a task, set its 'Status' to: e. g. DONE).

When I then create a new task, its status is TODO. When I complete the task, its status becomes DONE. So far, so good. But when I now un-check the task, thus un-completing it, its status will be cleared - no status set at all. This MAY be OK for some users/workflows, so a preference that allows status to be set to the default status attribute instead of blank would certainly be very nice to have.

When I want to have an empty status as a valid status, I encounter some more problems:

When I enable "After completing a task, set its 'Status' to:", but do not enter anything (deleting the default value of "Completed"), it ignores my preference and resets to the default "Completed". I'd rather have it stick with what I entered, and if I don't enter anything and delete the default value, it should clear status on task completion.

In fact, I'd love to have an empty status as a valid status choice. However, when I fill the list of Default Statuses and enable "Status list is readonly", any blank line or line with just spaces gets ignoried/removed. Could you make it so that an empty status is also valid and selectable from the dropdown box when the list is readonly, if an empty entry (blank line) is entered in the Default Statuses list? That would be very helpful!

When I complete a task (clicking the checkbox), I want its status to become "DONE". This I can set up through Attribute Calculations > After completing... - however, I would like to make sure that this status is only used when a task is really completed.

To achieve that, I did NOT add "DONE" to the list of Default Statuses, then checked "Status list is readonly". Now it can't be selected, it can only be set by checking off a task.

Unfortunately, as soon as a task has been checked off and the "DONE" status has been set once, it is automatically added to the selection list. So now it can be selected for uncompleted tasks.

The solution here would be to either not add statuses which aren't listed on the Default Statuses list to the selection list when that list is supposed to be readonly - or to add an option which allows or disallows the automatic addition as there might be other workflows where it could come in handy.

Thanks again for your much appreciated support and continued development of my favorite todo list application!

I have not knowledge about programing and probably is a stupid suggestion but, ..Would be possible transform ToDolist in a addon of Thunderbird ? The task manager of thunderbird (lighting) is so simple and your software is perfect

Would it be possible to add an option so when the Time Estimate column adds up child task time estimates, it ignores completed tasks?

I know there are many ways users use this attribute - the way I've been using it is to figure out how much total time all my tasks will take going forward. It's not possible since it includes time estimates for completed tasks (Currently I don't archive tasks so ALL my completed tasks are included).

Or maybe make it dependent on what tasks are visible by way of filters - this would account for many variables, not just completed or not completed.