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:
@@ -66,6 +66,8 @@ public:
|
|||||||
entry_ref& ref, bool next, bool rewind);
|
entry_ref& ref, bool next, bool rewind);
|
||||||
virtual void UpdateSelection(const entry_ref& ref);
|
virtual void UpdateSelection(const entry_ref& ref);
|
||||||
|
|
||||||
|
bool IsValid();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BMessenger fTrackerMessenger;
|
BMessenger fTrackerMessenger;
|
||||||
// of the window that this was launched from
|
// 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
|
// TODO: Remove this and use Tracker's Command.h once it is moved into the
|
||||||
// private headers!
|
// private headers!
|
||||||
namespace BPrivate {
|
namespace BPrivate {
|
||||||
@@ -218,6 +240,13 @@ TrackerNavigator::UpdateSelection(const entry_ref& ref)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
TrackerNavigator::IsValid()
|
||||||
|
{
|
||||||
|
return fTrackerMessenger.IsValid();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
@@ -323,6 +352,78 @@ FolderNavigator::_CompareRefs(const entry_ref* refA, const entry_ref* refB)
|
|||||||
// #pragma mark -
|
// #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,
|
ImageFileNavigator::ImageFileNavigator(const entry_ref& ref,
|
||||||
const BMessenger& trackerMessenger)
|
const BMessenger& trackerMessenger)
|
||||||
:
|
:
|
||||||
@@ -330,11 +431,7 @@ ImageFileNavigator::ImageFileNavigator(const entry_ref& ref,
|
|||||||
fDocumentIndex(1),
|
fDocumentIndex(1),
|
||||||
fDocumentCount(1)
|
fDocumentCount(1)
|
||||||
{
|
{
|
||||||
// TODO: allow selecting a folder from Tracker as well!
|
fNavigator = new AutoAdjustingNavigator(fCurrentRef, trackerMessenger);
|
||||||
if (trackerMessenger.IsValid())
|
|
||||||
fNavigator = new TrackerNavigator(trackerMessenger);
|
|
||||||
else
|
|
||||||
fNavigator = new FolderNavigator(fCurrentRef);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user