An intuitive outliner for personal knowledge and task management.
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.
- Linux: TreeNote requieres an installation of the programming language Python 3 and the GUI framework PyQt5, before it can be run from source. It is installed as follows:
- Arch Linux: Search in the AUR for 'treenote' with e.g. Pamac or enter
yaourt -S treenote-git
in a Terminal. - Debian and Ubuntu: Enter
sudo apt-get install python3-pip
, thensudo pip3 install sip pyqt5 treenote
in a Terminal. - Fedora: Enter
sudo yum install python3-pip
, thensudo pip3 install pyqt5 treenote
in a Terminal. - Other Linux distros: Enter
sudo pip3 install pyqt5 treenote
in a Terminal.
- Arch Linux: Search in the AUR for 'treenote' with e.g. Pamac or enter
- Windows: Download and extract the archive, then doubleclick the
treenote.exe
file inside. - Mac OS X: Download
For upgrading a version on Linux, run sudo pip3 install pyqt5 treenote --upgrade
.
- Collaborative editing through connection to my master thesis outliner webapp
- Auto-update for Windows and Mac, packages for more Linux distros
- Drag'n'Drop
- Insert images
- Insert mails, open them in the email client again
- When the user deletes an item: Move it to an archive instead of permanently deleting it
Apart from the listed huge changes new versions often contain small improvements and bugfixes, look in the detailed Git log if you are interested.
- Added a red label which appears and annoys you, if you have reminders (entries with a start date in the past).
Version 1.7.8 (February 16, 2017)
- New PyQt version finally fixes graphical glitches and crashes when using W and S (move item up or down)
Version 1.7.7 (February 7, 2017)
- Test for write permission when selecting a filename for saving
Version 1.7.6 (February 5, 2017)
- I adjusted the code for the Linux packages, so this version can't read .treenote files from older versions. Export your tree with the old version and import it again with the new version.
- Fixed a PyQt bug causing W and S (move item up or down) not to work anymore
Version 1.7 (January 3, 2017)
- It was necessary to remove the automatic update check. A future release will contain automatic update installation. Please register for my newsletter until then.
- New feature: Link to files
- The manual is complete now
- The user interface and the manual is available in English and German now
- Bug fixes
Version 1.6 (October 6, 2016)
- New filter
date<1d
gives all items whose date is at most tomorrow - Bookmarks with children get highlighted (every 3 hours)
- Pasted plain text trees get recognized, whatever indention they have (spaces, tabs)
- Many more bug fixes
Version 1.5 (September 11, 2016)
- Specify backup folder
- Focus in plan tab focuses in tree tab
- The menu has accelerator keys now
- Fixed 'Backups don't work on windows'
- Fixed 'Expanded state is not saved when expanding a row with the mouse'
Version 1.4 (August 30, 2016)
- This version can't read .treenote files from older versions, so export your tree with the old version and import it again with the new version.
- Bookmarks: Save optionally current root item
- Copy, paste, cut
- Print function
- Added a path bar
- Internal links
- File selected rows
- Planning view
- Increase estimate shortcut
- Set estimate in minutes with shortcuts like 10 30 60 120
- Shortcuts like '5d' to set start date to in 5 days
- Fix: Autocomplete with all tags of the tree when focused, not just with current focused tag subset
- Fix: When coloring multiple rows, the selection was not kept
- Fix: Vertical move out of the view now scrolls to the selection
- Fix: New line inside a row at the bottom edge shall scroll the tree upwards, otherwise the just entered new line is not in the visible part of the view
Version 1.3 (July 13, 2016)
- Fullscreen mode
- User interface: Collapse filter widgets
- List tags of visible items only
- Huge performance improvements
- Import from the mac todo application 'The Hit List'
Version 1.2 (June 20, 2016)
- You can set indentation size in the settings
- Clearer opened / closed icons
- Fixed error in update dialog
- No extra column for the checkboxes
- Export all databases which have changes to the folder 'backups' each .... minutes
- Removed CouchDB dependency and with that the feature to add several databases. You now have a single local JSON tree only and can't edit databases collaberatively anymore. However, editing is blazingly fast now and without bugs or crashes. I liked the feature of collaberatively editing and want to implement it sometime with a better database backend.
Version 1.1 (Feb 14, 2016)
- Automatic update check
- Copy a selection of the tree to the clipboard in plain text
- Paste a plain text list or tree from the clipboard into the tree
- Export the database to a plain text file
- Long texts inside an entry are automatically wrapped. While editing an entry, press alt + enter for a line break.
- Change font*size and padding (in the menu)
- Hide the sidebars (with a button)
- Go up / Open parent row (in the menu)
- Fixed styling bugs on windows
- Many small improvements and bugfixes (more details in the Git log)
Version 1.0 (June 23, 2015)
- Initial release after a half year of intensive development during my bachelor thesis
TreeNote 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:
- Look at the PyQt examples
- Look into the book Rapid GUI Programming with Python and Qt.
- Google e.g. ‘drag drop qt’ and you will find some results on stackoverflow.com. All the C++ Qt code is easily convertable to Python.
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:
- Each
QModelIndex
contains a pointer to aTree_item
. It can be retrieved withgetItem(index)
. index(row, parent_index)
andparent(index)
return a specificQModelIndex
rowCount(index)
returns not just the row count of theTree_item
to the givenindex
, but callsTree_item : init_childs
to get the children from the database and insert them as newTree_item
objects into the local data instance.
- Each
-
When the user does an action, methods like
insertRows(), removeRows(), move_left()
andsetData()
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.
- Create / update the translation files in
resources/locales/
from the current code by executingpylupdate5 treenote.pro
- Doubleclick these .ts files to translate them with Qt Linguist
- Compile the .ts files by executing
lrelease resources/locales/*.ts
. This creates .qm files which are used by application. - Check the translation by running TreeNote with
export LANGUAGE=de_DE
thenpython3 treenote.py
- Linux and Windows: Install PyInstaller by entering
pip3 install pyinstaller
in cmd.exe / terminal - Mac OS X: PyInstaller does not work with the pip version of PyQt yet, so we have to do the following:
-
Download 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
-
- Increase the 1.x version number in version.py. For bugfixes increase 1.11.x only.
- Create binaries with PyInstaller:
- Create binaries
- Windows
- Execute in cmd.exe:
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) - Copy the resources folder into the new treenote folder
- Execute in cmd.exe:
- Mac OS X
- Execute in Terminal:
python3 /path/to/pyinstaller.py --noconsole --icon=treenote/resources/images/treenote.icns TreeNote.py
- Right-click on treenote.app and choose “Show Package Contents”. Copy the resources folder to 'treenote.app/Contents/MacOS'
- Execute in Terminal:
- Windows
- Zip the new TreeNote folder / the TreeNote.app and name it e.g.
treenote_v1.7.7_windows.zip
- Test the release by running the binary
- Create binaries
- Create a GitHub release, add a changelog and upload the .zip files
- Update the download links and the changelog on the download site
- Create a pip release:
- Once: Enter your pip credentials in a file in your home folder like here: https://packaging.python.org/distributing/#create-an-account
python setup.py sdist
twine upload dist/*
- For major versions: Write a mail to interested people
- Create a package with
python setup.py bdist_wheel
- Install the new package with
pip3 install dist/TreeNote-1.7.0-py3-none-any.whl
for testing - Upload it with
twine upload dist/*
- Full guide
makepkg --printsrcinfo > .SRCINFO
-
Install the dependencies
Ubuntu
- Enter in Terminal:
sudo apt-get install git python3-pip
sudo apt-get purge appmenu-qt5
sudo pip3 install pyqt5
Fedora- Enter in Terminal:
sudo yum install git python3-pip
sudo pip3 install pyqt5
Windows- Install Git
- Install Python 3. During installation check the checkbox 'Add to path'.
- Install Python modules by entering
pip install pyqt5
in cmd.exe
OS X- Install Python 3.
- Install Python modules by entering
pip3 install pyqt5
in Terminal
- Enter 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
- To update the code to the latest changes, run
git pull
inside the TreeNote folder - For developing, I recommend the IDE PyCharm.
- Set 120 code width
- You may want to disable warnings (then you can recognize in the scrollbar the lines you edit)
- To share your code changes, I recommend the Git GUI GitKraken
-
Only methods overriding Qt methods inherit Qts
camelCase
naming scheme, everything else is Pythonssnake_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:
- docstring
- __magic__ methods
- other methods
- overrides of Qt methods
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.