Author: leavengood Date: 2011-01-09 18:43:41 +0100 (Sun, 09 Jan 2011) New Revision: 40180 Changeset: http://dev.haiku-os.org/changeset/40180 Modified: haiku/trunk/src/apps/showimage/ImageFileNavigator.cpp Log: Add an auto-adjusting image navigator which can switch to a folder navigator when the Tracker window is closed. Tested with normal navigation and slideshows. Axel's excellent navigation classes code made this pretty easy. Modified: haiku/trunk/src/apps/showimage/ImageFileNavigator.cpp =================================================================== --- haiku/trunk/src/apps/showimage/ImageFileNavigator.cpp 2011-01-09 16:30:59 UTC (rev 40179) +++ haiku/trunk/src/apps/showimage/ImageFileNavigator.cpp 2011-01-09 17:43:41 UTC (rev 40180) @@ -66,6 +66,8 @@ entry_ref& ref, bool next, bool rewind); virtual void UpdateSelection(const entry_ref& ref); + bool IsValid(); + private: BMessenger fTrackerMessenger; // of the window that this was launched from @@ -92,6 +94,26 @@ }; +// This class handles the case of the user closing the Tracker window after +// opening ShowImage from that window. +class AutoAdjustingNavigator : public Navigator { +public: + AutoAdjustingNavigator(entry_ref& ref, + const BMessenger& trackerMessenger); + virtual ~AutoAdjustingNavigator(); + + virtual bool FindNextImage(const entry_ref& currentRef, + entry_ref& ref, bool next, bool rewind); + virtual void UpdateSelection(const entry_ref& ref); + +private: + bool _CheckForTracker(const entry_ref& ref); + + TrackerNavigator* fTrackerNavigator; + FolderNavigator* fFolderNavigator; +}; + + // TODO: Remove this and use Tracker's Command.h once it is moved into the // private headers! namespace BPrivate { @@ -218,6 +240,13 @@ } +bool +TrackerNavigator::IsValid() +{ + return fTrackerMessenger.IsValid(); +} + + // #pragma mark - @@ -323,6 +352,78 @@ // #pragma mark - +AutoAdjustingNavigator::AutoAdjustingNavigator(entry_ref& ref, + const BMessenger& trackerMessenger) + : + fTrackerNavigator(NULL), + fFolderNavigator(NULL) +{ + // TODO: allow selecting a folder from Tracker as well! + if (trackerMessenger.IsValid()) + fTrackerNavigator = new TrackerNavigator(trackerMessenger); + else + fFolderNavigator = new FolderNavigator(ref); +} + + +AutoAdjustingNavigator::~AutoAdjustingNavigator() +{ + delete fTrackerNavigator; + delete fFolderNavigator; +} + + +bool +AutoAdjustingNavigator::FindNextImage(const entry_ref& currentRef, entry_ref& nextRef, + bool next, bool rewind) +{ + if (_CheckForTracker(currentRef)) { + return fTrackerNavigator->FindNextImage(currentRef, nextRef, next, rewind); + } + + if (fFolderNavigator != NULL) + return fFolderNavigator->FindNextImage(currentRef, nextRef, next, rewind); + + return false; +} + + +void +AutoAdjustingNavigator::UpdateSelection(const entry_ref& ref) +{ + if (_CheckForTracker(ref)) { + return fTrackerNavigator->UpdateSelection(ref); + } + + if (fFolderNavigator != NULL) + return fFolderNavigator->UpdateSelection(ref); +} + + +bool +AutoAdjustingNavigator::_CheckForTracker(const entry_ref& ref) +{ + if (fTrackerNavigator != NULL) { + if (fTrackerNavigator->IsValid()) + return true; + else { + delete fTrackerNavigator; + fTrackerNavigator = NULL; + + // If for some reason we already have one + delete fFolderNavigator; + entry_ref currentRef = ref; + fFolderNavigator = new FolderNavigator(currentRef); + } + } + + return false; +} + + +// #pragma mark - + + ImageFileNavigator::ImageFileNavigator(const entry_ref& ref, const BMessenger& trackerMessenger) : @@ -330,11 +431,7 @@ fDocumentIndex(1), fDocumentCount(1) { - // TODO: allow selecting a folder from Tracker as well! - if (trackerMessenger.IsValid()) - fNavigator = new TrackerNavigator(trackerMessenger); - else - fNavigator = new FolderNavigator(fCurrentRef); + fNavigator = new AutoAdjustingNavigator(fCurrentRef, trackerMessenger); }