[niepce] Don't reload the image until redisplay is needed in Darkroom



commit 8d86962a9e8dd2407d347f3536ab51ba6a032ea1
Author: Hub Figuiere <hub figuiere net>
Date:   Wed Nov 16 00:03:20 2011 -0800

    Don't reload the image until redisplay is needed in Darkroom

 src/engine/db/libfile.hpp                      |    1 +
 src/niepce/modules/darkroom/darkroommodule.cpp |   28 ++++++++++++++++++------
 src/niepce/modules/darkroom/darkroommodule.hpp |    4 +++
 src/niepce/ui/imoduleshell.hpp                 |    1 +
 4 files changed, 27 insertions(+), 7 deletions(-)
---
diff --git a/src/engine/db/libfile.hpp b/src/engine/db/libfile.hpp
index 27f6bac..7b1c357 100644
--- a/src/engine/db/libfile.hpp
+++ b/src/engine/db/libfile.hpp
@@ -38,6 +38,7 @@ class LibFile
 {
 public:
     typedef std::tr1::shared_ptr< LibFile > Ptr;
+    typedef std::tr1::weak_ptr< LibFile> WeakPtr;
     typedef std::list< Ptr > List;
     typedef std::tr1::shared_ptr< List > ListPtr;
 
diff --git a/src/niepce/modules/darkroom/darkroommodule.cpp b/src/niepce/modules/darkroom/darkroommodule.cpp
index a85ff27..f0b5895 100644
--- a/src/niepce/modules/darkroom/darkroommodule.cpp
+++ b/src/niepce/modules/darkroom/darkroommodule.cpp
@@ -35,21 +35,38 @@ DarkroomModule::DarkroomModule(const ui::IModuleShell & shell,
     : m_shell(shell)
     , m_actionGroup(action_group)
     , m_image(new ncr::Image)
+    , m_active(false)
+    , m_need_reload(true)
 {
     m_shell.get_selection_controller()->signal_selected.connect(
         sigc::mem_fun(*this, &DarkroomModule::on_selected));
 }
 
-
-void DarkroomModule::set_image(const eng::LibFile::Ptr & file)
+void DarkroomModule::reload_image()
 {
+    if(!m_need_reload) {
+        return;
+    }
+    eng::LibFile::Ptr file = m_imagefile.lock();
     if(file) {
         m_image->reload(file->path(), 
                         file->fileType() == eng::LibFile::FILE_TYPE_RAW,
                         file->orientation());
+        m_need_reload = false;
     }
     else {
-        // clear out
+        // reset
+    }
+}
+
+void DarkroomModule::set_image(const eng::LibFile::Ptr & file)
+{
+    if(m_imagefile.expired() || (file != m_imagefile.lock())) {
+        m_imagefile = eng::LibFile::WeakPtr(file);
+        m_need_reload = true;
+        if(m_active) {
+            reload_image();
+        }
     }
 }
 
@@ -63,10 +80,7 @@ void DarkroomModule::set_active(bool active)
     m_active = active;
     if(active) {
         // if activated, force the refresh of the image.
-        ui::SelectionController::Ptr sel = m_shell.get_selection_controller();
-        eng::library_id_t id = sel->get_selection();
-        eng::LibFile::Ptr file = sel->get_file(id);
-        set_image(file);
+        reload_image();
     }
 }
 
diff --git a/src/niepce/modules/darkroom/darkroommodule.hpp b/src/niepce/modules/darkroom/darkroommodule.hpp
index f500cf9..98739b3 100644
--- a/src/niepce/modules/darkroom/darkroommodule.hpp
+++ b/src/niepce/modules/darkroom/darkroommodule.hpp
@@ -58,6 +58,8 @@ public:
     virtual void set_active(bool active);
     
 protected:
+	void reload_image();
+
     virtual Gtk::Widget * buildWidget(const Glib::RefPtr<Gtk::UIManager> &);
     
 private:
@@ -71,11 +73,13 @@ private:
     Gtk::ScrolledWindow          m_canvas_scroll;
     ToolboxController::Ptr       m_toolbox_ctrl;
     Glib::RefPtr<Gtk::ActionGroup> m_actionGroup;
+    eng::LibFile::WeakPtr        m_imagefile;
     ncr::Image::Ptr              m_image;
     fwk::Dock                   *m_dock;
 
     // state
     bool                         m_active;
+    bool                         m_need_reload;
 };
 
 
diff --git a/src/niepce/ui/imoduleshell.hpp b/src/niepce/ui/imoduleshell.hpp
index 1abe4e9..0897cab 100644
--- a/src/niepce/ui/imoduleshell.hpp
+++ b/src/niepce/ui/imoduleshell.hpp
@@ -28,6 +28,7 @@ namespace ui {
 class IModuleShell
 {
 public:
+    virtual ~IModuleShell() {}
     virtual const ui::SelectionController::Ptr & get_selection_controller() const = 0;
     virtual libraryclient::LibraryClient::Ptr getLibraryClient() const = 0;
 };



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]