An intuitive outliner for personal knowledge and task management
An intuitive outliner for personal knowledge and task management.
Update 2021: I recommend moving to Logseq, because it has a better performance with many notes, and the concept of having a network instead of a tree is easier to organize.
pages
folder in MS Code and replaced in all files - (.*\[\[\d)
with - TODO $1
(check the button regular expression
).This program is free and open source. Therefore, you can trust it. Your data stays on your computer.
Half a year of research flowed into the development. I developed this application in my bachelor thesis in the year 2015, graded A+ and written at the University of Oldenburg. Have a look at it: German PDF file.
The author has used many time management programs over the last four years. When the number of tasks grew, a neat system like Getting Things Done became essential. Therefore the development of TreeNote was influenced by powerful tools like Omnifocus (Mac only) and Org mode (too complex). However, TreeNote is as intuitive to use as the light tools Wunderlist and Evernote.
When starting TreeNote for the first time, you will see a detailed manual which guides you through the features. The user interface and the manual are supplied in German and English.
You find a complete list of features in the wiki.
Me and couple of friends are using TreeNote on a daily basis since years. It is a central and valuable piece for our self-management. TreeNote is well tested and bug-free, apart from this one:
When you have searched or filtered the tree you must not edit the tree's structure. If you do, TreeNote may crash and your tree may become corrupted (you cannot open it anymore). Editing of a single entry (text, color, date) is okay.
It is a good thing to enable daily backups in the settings.
I would like to do a complete rewrite of TreeNote in Scala. It shall be more robust, faster and collaboratively editable (while of course running offline and privacy-friendly). Therefore I won't develop TreeNote any further.
Alternatives to TreeNote are the collaborative online outliners Dynalist, Workflowy and Moo.do. They have desktop apps, too.
yaourt -S treenote-git
in a Terminal.sudo apt-get install python3-pip
, then sudo pip3 install sip pyqt5 treenote
in a Terminal.sudo yum install python3-pip
, then sudo pip3 install pyqt5 treenote
in a Terminal.sudo pip3 install pyqt5 treenote
in a Terminal.treenote.exe
file inside.For upgrading a version on Linux, run sudo pip3 install pyqt5 treenote --upgrade
.
Apart from the listed huge changes new versions often contain small improvements and bugfixes, look in the detailed Git log if you are interested.
date<1d
gives all items whose date is at most tomorrowTreeNote is written in the most beautiful programming language available: Python. It pays off to learn it. So start with one of these great books.
TreeNote uses the GUI library PyQt, which is a Python wrapper for the popular Qt library. Qt has a really good documentation. If you want to know what a particular class is able to to, just google it, e.g. ‘qtreeview 5’ (the 5 is for Qt version 5) and it will give you http://doc.qt.io/qt-5/qtreeview.html.
If you don’t know how to do something:
The QTreeView
interacts with the underlying data structure through the class TreeModel
, a subclass of the QAbstractItemModel
. The overwritten methods can be divided into two categories:
When the views needs data to build or change itself, it calls the following methods:
QModelIndex
contains a pointer to a Tree_item
. It can be retrieved with getItem(index)
.index(row, parent_index)
and parent(index)
return a specific QModelIndex
rowCount(index)
returns not just the row count of the Tree_item
to the given index
, but calls Tree_item : init_childs
to get the children from the database and insert them as new Tree_item
objects into the local data instance.When the user does an action, methods like insertRows(), removeRows(), move_left()
and setData()
are called. They edit the underlying data model.
Filtering is done with the QSortFilterProxyModel
very easily. It is
inserted between the regular model and the view and passes through only
the desired items, for example the ones which match to a search string.
resources/locales/
from the current code by executing pylupdate5 treenote.pro
lrelease resources/locales/*.ts
. This creates .qm files which are used by application.export LANGUAGE=de_DE
then python3 treenote.py
pip3 install pyinstaller
in cmd.exe / terminalDownload the latest dev version of PyInstaller, e.g. with git clone https://github.com/pyinstaller/pyinstaller.git
Install Xcode
from the AppStore
Install Qt
Download the SIP source package. Unarchive it and run:
> python3 configure.py
> make
> sudo make install
Download the PyQt source package. Unarchive it and run (takes several minutes):
> python3 configure.py --qmake=/Users/YourUsername/Qt/5.7/clang_64/bin/qmake
> make
> sudo make install
pyinstaller --path=C:\Users\YourUsername\AppData\Local\Programs\Python\Python35\Lib\site-packages\PyQt5\Qt\bin --noconsole --icon=treenote\resources\images\treenote.ico TreeNote.py
(the --path option is needed until this bug is fixed)python3 /path/to/pyinstaller.py --noconsole --icon=treenote/resources/images/treenote.icns TreeNote.py
treenote_v1.7.7_windows.zip
python setup.py sdist
twine upload dist/*
python setup.py bdist_wheel
pip3 install dist/TreeNote-1.7.0-py3-none-any.whl
for testingtwine upload dist/*
makepkg --printsrcinfo > .SRCINFO
Install the dependencies
Ubuntu
sudo apt-get install git python3-pip
sudo apt-get purge appmenu-qt5
sudo pip3 install pyqt5
Fedora
sudo yum install git python3-pip
sudo pip3 install pyqt5
Windows
pip install pyqt5
in cmd.exe
OS X
pip3 install pyqt5
in Terminal
Clone the Git repo by opening a command line and entering git clone https://github.com/TreeNote/TreeNote.git
Navigate into the code folder with cd TreeNote/treenote
Run with python3 TreeNote.py
git pull
inside the TreeNote folderOnly methods overriding Qt methods inherit Qts camelCase
naming scheme, everything else is Pythons snake_case
naming scheme. Even slots.
Use docstrings:
def function(a, b):
"""Do something and return a list."""
class SampleClass(object):
"""Summary of class here.
Longer class information.
Longer class information.
"""
The layout of a class should be like this:
This app was created by me and a fellow student at university. It is working nice, but I don't like its progamming language (Java is so cumbersome compared to Python). Therefore I will not develop it any further. If you want to pick it up, I can explain you some code, but in general it should be written cleanly.
Download the .apk file. If you have a Google Play Developer Account, feel free to publish the app.
Synchronisation with a JSON file in your OwnCloud is possible. However, Desktop TreeNote is not able to synchronize with a JSON file.
The code and images are in this repo.