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
This commit is contained in:
Ryan Leavengood
2011-01-09 17:43:41 +00:00
parent 80589ff3d4
commit 7d9b44517b
+102 -5
View File
@@ -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);
}