From 7d9b44517b16b810d32668fad98e3d7923028aa0 Mon Sep 17 00:00:00 2001 From: Ryan Leavengood Date: Sun, 9 Jan 2011 17:43:41 +0000 Subject: [PATCH] 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. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@40180 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/showimage/ImageFileNavigator.cpp | 107 +++++++++++++++++++++- 1 file changed, 102 insertions(+), 5 deletions(-) diff --git a/src/apps/showimage/ImageFileNavigator.cpp b/src/apps/showimage/ImageFileNavigator.cpp index 2c6afa3814..1370d4b9e4 100644 --- a/src/apps/showimage/ImageFileNavigator.cpp +++ b/src/apps/showimage/ImageFileNavigator.cpp @@ -66,6 +66,8 @@ public: 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 @@ private: }; +// 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 @@ TrackerNavigator::UpdateSelection(const entry_ref& ref) } +bool +TrackerNavigator::IsValid() +{ + return fTrackerMessenger.IsValid(); +} + + // #pragma mark - @@ -323,6 +352,78 @@ FolderNavigator::_CompareRefs(const entry_ref* refA, const entry_ref* refB) // #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 @@ ImageFileNavigator::ImageFileNavigator(const entry_ref& ref, 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); }