[haiku-commits] r40180 - haiku/trunk/src/apps/showimage

  • From: leavengood@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 9 Jan 2011 18:43:41 +0100 (CET)

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);
 }
 
 


Other related posts:

  • » [haiku-commits] r40180 - haiku/trunk/src/apps/showimage - leavengood