Added:
- Class AMRecursiveDirectoryCompare ~ Created by David Chevrier,
essentially recursively checks for differences between two directories
and returns states:
FullyMatchingResult = All files in directories match
Side1ModifiedResult = Side1 contains files not in Side2
Side2ModifiedResult = Side2 contains files not in Side1
BothSidesModifiedResult = Both Sides contain files not in the other

-  Class AMDirectorySynchronizer ~ Takes two directory paths (source and
destination), validates that (ensures that exist, attempts to create if
they don't), runs a AMRecursiveDirectoryCompare on them, and if the
result is a full match, then copies the source into the destination
using cp -u -r
Added:
- AMRecursiveDirectoryCompare::uniqueSide1Files(),
uniqueSide1Directories(), uniqueSide2Files() and
uniqueSide2Directories() ~ to obtain the list results of the compare

- Changed the logic of AMDirectorySynchronizer::start() to copy based on
the results of AMRecursiveDirectoryCompare results
Added:
- AMDirectorySynchronizer::progressMessages and errorMessages ~
QStringLists containing output relating to the sync
- AMDirectorySynchronizer::percentageProgress ~ value representing the
percent progress of the copy process
- AMDirectorySynchronizerDialog ~ Modal dialog which controls and shows
results of the sync (eventually this will become the message dialog
shown to the user)
Altered:
- The AMDirectorySynchronizerDialog is now actually a modal dialog
- AMDirectorySynchronizerDialog now contains a progress bar
- AMDirectorySynchronizerDialog is now designed to show and close
automatically depending on the running of the copy (call
AMDirectorySynchronizerDialog::start() to start the copy)
Altered:
- Rsync args used by AMDirectorySynchronizer
- AMRecursiveDirectoryCompare::compareOneLevel to also build list of
files which are newer on one side over the other
Added:
- Class AMDirectorySynchronizationAction to wrap an
AMDirectorySynchronizer in an AMAction3 so it can be added to a workflow

Altered:
- AMDirectorySynchronizer::start now returns true indicating started
success if, when starting, it find that no copying is necessary. It then
uses a timer to wait for five seconds before emitting copyCompleted

-AMDirectorySynchronizer::errorMessagesChanged and
progressMessagesChanged to now emit a single QString rather than the
whole list
Modified:
- AMUserSettings::remoteDataFolder ~ stores value from ini file (if no
value in found in the ini file for this key, then it will be blank)
- Altered the AMDirectorySynchronizer and
AMDirectorySynchronizationAction to load remote and local directories
from the ini settings
- AMSettings window to show the remoteDataFolder
Initial changes to attempt to develop a locking mechanism for db files
during copy
Removed:

- Initial tests from AMDatabase relating to locking and unlocking using
PRAGMA (was unstable)
- Registering of AMDirectorySynchronizationAction in AMAppController

Added:
- More documentation to class AMDirectorySynchronizationAction
- AMDatamanAppController::startupBackupDataDirectory() ~ function to run
modal dialog if AM is started with remote directory in ini file

Altered:
- AMDirectorySynchronizerDialog::start() now runs exec instead of show,
in order to ensure that the AMDatamanAppController startup is blocked
till the dialog is complete.
- AMDatamanAppController::startup() now includes a call to
startBackupDataDirectory
Altered:
- AMDirectorySynchronizerDialog::start() ~ Now returns a boolean value
depending on whether the sync was successful
- AMDatamanAppController::startup() ~ Now sets an AMErrorMon error if
the sync was not performed successfully (if a sync is necessary)
Altered:

- AMDatamanAppController::shutdown() ~ Now includes call to
startupBackupDataDirectory in order to ensure that data is synchronized
on closing AM
Added:
- AMLightweightScanInfo ~ A class representing the information stored
against a scan in the user database. The class is designed to be a more
lightweight, quick to load way of displaying bulk information about
scans.
Added:

- AMLightweightScanInfoCollection ~ Class to store and load bulk
information regarding scans
Added:

- Class AMLightweightScanInfoModel ~ An method for an
AMLightweightScanInfoCollection to distribute its data in the standard
Qt MV way

Altered:

- Fixed minor bugs with AMLightweightScanInfo and
AMLightweightScanInfoCollection
Added:
- AMSortFilterWidget ~ A standardized widget for controlling any
QSortFilterProxyModel
Added:

- Documentation to AMSortFilterWidget
Added:
- Class AMScanDataView ~ The new version of AMDataView.
- Class AMAbstractScanDataChildView ~ The base class from which all the
views which AMScanDataView will contain are derived.
- Class AMScanDataChildTableView ~ The first of the views which
AMScanDataView will contain. Displays the scans in a table view.
Altered:

- AMScanDataChildTableView::AMScanDataChildTableView ~ Fixed bug where
call to base class constructor contained QIcon(), which is no longer a
parameter of the AMAbstractScanDataChildView constructor.
Altered:
- AMRecursiveDirectoryCompare now also checks to see if a more recent
file is smaller than the older file. Catches the corner case where AM
has created files for a new user, but the ones that we want to use are
on the remote. Stops loss of remote data

- AMDirectorySynchronizer now checks for the above mentioned state
before continuing
Altered:

- Order in which startup actions are performed in
AMDatamanAppController::startup() ~ Now checks if a backup is needed
before initializing for first time use. This means that if local
versions of files have been deleted, running AM will replace them,
instead of creating files as if it was a first time use, and then
writing over the remote files with the new blank ones.
- AMDirectorySynchronizerDialog::start() now displays a nice message to
the user if it encountered an error with the copy process before
starting.
- AMDirectorySynchronizer::start() now sets the percentage complete to
100% if it finds the files are already the same.