Version history:

1.5 (2007-02-16)

Limited use of the plural form of tr() when the available version of Qt is
less than 4.2.

1.4 (2007-01-16)

Added support for plural forms in translations, supported by the new
facilities in Qt 4.2.

Improved the resize behaviour of columns in the tree view by resizing them
only when making a query or expanding a package node to view the associated
list of releases.

Fixed incorrect handling of unexpected release information caused by the
introduction of new fields in responses from the XML-RPC server.

1.3 (2006-09-12)

Updated the action editor to show underlined characters.

The manual is now installed in a subdirectory of the package so that it can be
found more easily at run-time.

1.2 (2006-08-20)

Added a simple action editor based on the one described in Qt Quarterly 14
(see http://doc.trolltech.com/qq/qq14-actioneditor.html for more information).

1.1 (2006-08-02)

Moved files into a package directory.

Put progress information in the correct column in the download dialog.

Fixed potential errors with styled painting in the ProgressDelegate.

1.0 (2006-07-31)

Added basic documentation.

Added signals to the package model to allow it to indicate when blocking
operations are in progress. The window shows the wait cursor during
blocking operations.

Ensured that the search model is cleared when a new package index is
opened.

Put the wait cursor related connections for the package model in the
correct place, adding appropriate ones for the search model at the same
time. The search model now requests the wait cursor when a search has been
started.

Add information about the desktop module to the about dialog.

Added an Open Manual item to the Help menu that opens the README.html file
in the user's web browser.

Added more information about the Python interpreter to the configuration
dialog.

0.9 (2006-07-25)

Merged the release_urls and download_url so that packages that are
available are shown and can be downloaded. Doing this in the pypi module
ensures that it is handled consistently at higher levels.

Handle application exiting more consistently, closing all other windows
when the main window is closed.

Remove incompletely downloaded files when the download process is stopped.

Added configuration support for the package index URL.

Double-clicking is better than clicking for opening information windows.

0.8 (2006-07-24)

More configuration options, better window handling on exit, better handling
of stopped downloads.

Moved the checks for valid download URLs into the Description class in the
PyPI communication module and changed the package and search modules so
that the release information for packages can reflect whether a package can
be downloaded or not. Releases with download URLs have checkboxes.

Note that we not only need to provide the correct flags in the search model
for release items, but we also need to return invalid variants in the
data() method for those that don't have associated download URLs. It seems
that returning the appropriate flags for items is not enough.

As suggested by Paul, check for more comprehensive download information by
using the XML-RPC package_urls() method to obtain a list of URLs rather
than rely on the incomplete information supplied in the "download_url"
key of the dictionary returned by release_data().

Restrict the number of columns in the search model not in the package
model.

Added a window to show information about packages and releases.

Moved the configuration dialog into the dialogs module.

Allow the types of preferred packages to be specified in the configuration
dialog. The download dialog was updated to try to download packages of the
allowed types in the order specified by the user.

Don't modify a Description's meta-data if the specified value is None.

Merge download_url information into the release_urls entry in the meta-data
for each Description. This enables us to fall back to the "default"
download URL if the package doesn't have release URLs.

0.6 (2006-07-19)

No longer rely on certain field names to be supplied from a combobox when
setting the field name for a search. Hopefully, this will make the
application more translation-aware.

Added help menu entries and message boxes.

Added support for opening home page URLs and HTML download URLs using
Paul's desktop module.

Short circuit download URLs that look like they refer to web pages or other
user-readable resources.

0.5 (2006-07-18)

Moved the version information into a new constants module and added Paul's
desktop module.

The package model now saves the list of packages to the application's
settings when exiting so that it can be used to determine which packages
are new the next time the same index is opened.

Moved the code to change the appearance of new package items from the
package model to the search model. The settings loading and saving methods
remain in the package model because the information is more useful there.

The package names are now encoded as UTF-8 and base64 encoded before
begin saved to the settings file. This avoids problems with
case-insensitivity that would cause names that differ only in case from
an existing name to be omitted from the settings file.

Added a filter new menu item to the main window and connected it to an
additional slot in the search model.

0.4 (2006-07-16)

Reverted the unnecessary change to avoid problems fixed in the previous
commit where the package list was loaded when the package model was created
instead of when its top-level row count was requested.

Fixed a bug where opening an index when the search model contained some
internal state left the view with old persistent indexes. We call reset()
instead of clear() on the search model before changing the underlying model
in openIndex().

Added documentation.

0.3 (2006-07-15)

Added license information and moved version and application details into
the setup.py file.

Added persistent package and release marking, a configuration dialog and
downloading to a user-specified directory.

Added a clear() method to the search model that clears the internal
dictionaries and resets the model to inform views that the model has
changed. This is called when we reload the list of packages from the
current package index.

Moved the check state handling from the package model into the search
model.

Record package versions instead of row numbers in the search model.
The search model's internal data is also cleared when a new model is
opened.

Fixed the marked() method in the Window class to work with a changed
dictionary of marked packages in the search model. Now, the packages
themselves are used as keys into the dictionary.

Added a configuration dialog so that the installation directory can be set.

Reverted the change that used packages as keys into the marked packages
directionary as the packages become invalid if the index is re-read.
The marked package dictionary now contains a reference to each package as
well as a dictionary containing marked releases for each package name key.

Update the progress bar during file transfers as well as after each one.

0.2 (2006-07-14)

Added filtering of marked items.

Refactored the main window's interaction with the search model. The model
now reports how many matches it found, requiring the field map to be moved
into it to ensure that the correct user-visible field names are used.

We also listen for signals from the underlying in order to be able to know
at any point whether there are any marked packages. This enables the
download menu item to be correctly enabled or disabled.

0.1 (2006-07-12)

Initial creation of a working PyPI XML-RPC convenience class and model.

Added version information and files for distutils.

Added more user interface features, but fetching package information is too
slow.

Added support for package downloading with an interactive dialog.

Added a method to reset the interface so that the dialog can be reused.

Added a Stop button and made Stop/Close button behavior consistent.

Added a search facility by placing a filtering proxy model between the view
and the package model. When a search occurs, the XML-RPC server is asked
for a list of matching packages, and these names are used to filter the
existing list of packages. Any existing information about these is also
augmented by the results of the search.

Note that the proxy model needs to be cleared and reset after each search.
The clear() call ensures that existing mappings are removed; the reset()
call ensures that the view clears any information about open branches.

Added a sanity check for suitable servers in the open connection dialog
(we try to download a list of classifiers). Maybe a more specific check for
XML-RPC capabilities would be better.

Added better exception handling for xmlrpclib exceptions in the
PackageServer class and improved the user interface slightly.

Added a simple test server.
