[solang] The renderers are plugins too



commit 9ed313017f28914862301ed3ea1dc2b6adc3b6f8
Author: Debarshi Ray <rishi gnu org>
Date:   Fri Feb 5 16:19:22 2010 +0200

    The renderers are plugins too
    
    It makes sense to consider the renderers as plugins because that way
    we can have some exotic renderers which can be split into separate
    plugins to avoid bloating the set of dependencies.
    
    + The browser, enlarged and slideshow renderers implement both IPlug
      and IRenderer.
    + Added RendererRegistry::remove, and removed RendererRegistry::init
      and RendererRegistry::final.
    + IRendererPtr is no longer a std::tr1::shared_ptr. It is a native
      pointer now because the lifetime of the renderers is going to be
      controlled by their existence as plugins.

 src/application/application.cpp       |   20 ++---
 src/application/renderer-registry.cpp |  149 +++------------------------------
 src/application/renderer-registry.h   |   11 +--
 src/common/i-renderer.h               |    8 +--
 src/common/types.h                    |    4 +-
 src/renderer/browser-renderer.cpp     |   47 ++++++++--
 src/renderer/browser-renderer.h       |   17 +++-
 src/renderer/enlarged-renderer.cpp    |   92 +++++++++++++-------
 src/renderer/enlarged-renderer.h      |   17 +++-
 src/renderer/slideshow-renderer.cpp   |   53 +++++++++---
 src/renderer/slideshow-renderer.h     |   19 ++++-
 11 files changed, 208 insertions(+), 229 deletions(-)
---
diff --git a/src/application/application.cpp b/src/application/application.cpp
index ff9fb52..c38e152 100644
--- a/src/application/application.cpp
+++ b/src/application/application.cpp
@@ -310,21 +310,19 @@ Application::init() throw()
 //    IPluginPtr flickr_importer(new Importer(flickr_source, false));
 //    plugins_.push_back(flickr_importer);
 
-    std::for_each(plugins_.begin(), plugins_.end(),
-                  Initializer<IPluginPtr>(this));
-
     // Renderers.
 
-    IRendererPtr browser_renderer(new BrowserRenderer());
-    rendererRegistry_.add(browser_renderer);
+    IPluginPtr browser_renderer(new BrowserRenderer());
+    plugins_.push_back(browser_renderer);
 
-    IRendererPtr enlarged_renderer(new EnlargedRenderer());
-    rendererRegistry_.add(enlarged_renderer);
+    IPluginPtr enlarged_renderer(new EnlargedRenderer());
+    plugins_.push_back(enlarged_renderer);
 
-    IRendererPtr slideshow_renderer(new SlideshowRenderer());
-    rendererRegistry_.add(slideshow_renderer);
+    IPluginPtr slideshow_renderer(new SlideshowRenderer());
+    plugins_.push_back(slideshow_renderer);
 
-    rendererRegistry_.init(*this);
+    std::for_each(plugins_.begin(), plugins_.end(),
+                  Initializer<IPluginPtr>(this));
 
     const IRendererPtr renderer
         = rendererRegistry_.select<BrowserRenderer>();
@@ -356,8 +354,6 @@ Application::final() throw()
     engine_.final();
     mainWindow_.final(*this);
 
-    rendererRegistry_.final(*this);
-
     std::for_each(plugins_.rbegin(), plugins_.rend(),
                   Finalizer<IPluginPtr>(this));
     plugins_.clear();
diff --git a/src/application/renderer-registry.cpp b/src/application/renderer-registry.cpp
index 2d82552..170da54 100644
--- a/src/application/renderer-registry.cpp
+++ b/src/application/renderer-registry.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
- * Copyright (C) 2009 Debarshi Ray <rishi gnu org>
+ * Copyright (C) 2009, 2010 Debarshi Ray <rishi gnu org>
  *
  * Solang is free software: you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -21,7 +21,6 @@
 #endif // HAVE_CONFIG_H
 
 #include <algorithm>
-#include <functional>
 
 #include "application.h"
 #include "renderer-registry.h"
@@ -29,126 +28,6 @@
 namespace Solang
 {
 
-template<typename T>
-class Initializer :
-    public std::unary_function<T &, void>
-{
-    public:
-        Initializer(Application * const & application) throw();
-
-        Initializer(const Initializer<T> & source) throw();
-    
-        ~Initializer() throw();
-
-        Initializer<T> &
-        operator=(const Initializer<T> & source) throw();
-
-        void
-        operator()(T & x) throw();
-
-    protected:
-        Application * application_;
-};
-
-template<typename T>
-Initializer<T>::Initializer(Application * const & application) throw() :
-    std::unary_function<T &, void>(),
-    application_(application)
-{
-}
-
-template<typename T>
-Initializer<T>::Initializer(const Initializer<T> & source) throw() :
-    std::unary_function<T &, void>(source),
-    application_(source.application_)
-{
-}
-
-template<typename T>
-Initializer<T>::~Initializer() throw()
-{
-}
-
-template<typename T>
-Initializer<T> &
-Initializer<T>::operator=(const Initializer<T> & source) throw()
-{
-    if (this != &source)
-    {
-        std::unary_function<T &, void>::operator=(source);
-        application_ = source.application_;
-    }
-
-    return *this;
-}
-
-template<typename T>
-void
-Initializer<T>::operator()(T & x) throw()
-{
-    x->init(*application_);
-}
-
-template<typename T>
-class Finalizer :
-    public std::unary_function<T &, void>
-{
-    public:
-        Finalizer(Application * const & application) throw();
-
-        Finalizer(const Finalizer<T> & source) throw();
-    
-        ~Finalizer() throw();
-
-        Finalizer<T> &
-        operator=(const Finalizer<T> & source) throw();
-
-        void
-        operator()(T & x) throw();
-
-    protected:
-        Application * application_;
-};
-
-template<typename T>
-Finalizer<T>::Finalizer(Application * const & application) throw() :
-    std::unary_function<T &, void>(),
-    application_(application)
-{
-}
-
-template<typename T>
-Finalizer<T>::Finalizer(const Finalizer<T> & source) throw() :
-    std::unary_function<T &, void>(source),
-    application_(source.application_)
-{
-}
-
-template<typename T>
-Finalizer<T>::~Finalizer() throw()
-{
-}
-
-template<typename T>
-Finalizer<T> &
-Finalizer<T>::operator=(const Finalizer<T> & source) throw()
-{
-    if (this != &source)
-    {
-        std::unary_function<T &, void>::operator=(source);
-        application_ = source.application_;
-    }
-
-    return *this;
-}
-
-template<typename T>
-void
-Finalizer<T>::operator()(T & x) throw()
-{
-    x->final(*application_);
-}
-
 RendererRegistry::RendererRegistry() throw() :
     renderers_(),
     current_(),
@@ -161,20 +40,6 @@ RendererRegistry::~RendererRegistry() throw()
 }
 
 void
-RendererRegistry::init(Application & application) throw()
-{
-    std::for_each(renderers_.begin(), renderers_.end(),
-                  Initializer<IRendererPtr>(&application));
-}
-
-void
-RendererRegistry::final(Application & application) throw()
-{
-    std::for_each(renderers_.rbegin(), renderers_.rend(),
-                  Finalizer<IRendererPtr>(&application));
-}
-
-void
 RendererRegistry::add(const IRendererPtr & renderer) throw()
 {
     renderers_.push_back(renderer);
@@ -187,6 +52,18 @@ RendererRegistry::get_current() throw()
 }
 
 void
+RendererRegistry::remove(const IRendererPtr & renderer) throw()
+{
+    const IRendererList::iterator iter = std::find(renderers_.begin(),
+                                                   renderers_.end(),
+                                                   renderer);
+    if (renderers_.end() != iter)
+    {
+        renderers_.erase(iter);
+    }
+}
+
+void
 RendererRegistry::set_current(const IRendererPtr & renderer) throw()
 {
     current_ = renderer;
diff --git a/src/application/renderer-registry.h b/src/application/renderer-registry.h
index 7f841f3..2120757 100644
--- a/src/application/renderer-registry.h
+++ b/src/application/renderer-registry.h
@@ -1,6 +1,6 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
- * Copyright (C) 2009 Debarshi Ray <rishi gnu org>
+ * Copyright (C) 2009, 2010 Debarshi Ray <rishi gnu org>
  *
  * Solang is free software: you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -38,18 +38,15 @@ class RendererRegistry
         ~RendererRegistry() throw();
 
         void
-        init(Application & application) throw();
-
-        void
-        final(Application & application) throw();
-
-        void
         add(const IRendererPtr & renderer) throw();
 
         IRendererPtr
         get_current() throw();
 
         void
+        remove(const IRendererPtr & renderer) throw();
+
+        void
         set_current(const IRendererPtr & renderer) throw();
 
         template <typename T>
diff --git a/src/common/i-renderer.h b/src/common/i-renderer.h
index 8f14485..195169d 100644
--- a/src/common/i-renderer.h
+++ b/src/common/i-renderer.h
@@ -1,6 +1,6 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
- * Copyright (C) 2009 Debarshi Ray <rishi gnu org>
+ * Copyright (C) 2009, 2010 Debarshi Ray <rishi gnu org>
  *
  * Solang is free software: you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -37,17 +37,11 @@ class IRenderer :
         ~IRenderer() throw() = 0;
 
         virtual void
-        init(Application & application) throw() = 0;
-
-        virtual void
         render(const PhotoPtr & photo) throw() = 0;
 
         virtual void
         render(const PhotoList & photos) throw() = 0;
 
-        virtual void
-        final(Application & application) throw() = 0;
-
         virtual PhotoList
         get_current_selection() throw() = 0;
 
diff --git a/src/common/types.h b/src/common/types.h
index 6cc7b69..837be80 100644
--- a/src/common/types.h
+++ b/src/common/types.h
@@ -186,8 +186,8 @@ typedef std::tr1::shared_ptr<IPlugin> IPluginPtr;
 typedef std::vector<IPluginPtr> IPluginList;
 
 class IRenderer;
-typedef std::tr1::shared_ptr<const IRenderer> ConstIRendererPtr;
-typedef std::tr1::shared_ptr<IRenderer> IRendererPtr;
+typedef const IRenderer * ConstIRendererPtr;
+typedef IRenderer * IRendererPtr;
 typedef std::vector<IRendererPtr> IRendererList;
 
 class DatePhotoInfo;
diff --git a/src/renderer/browser-renderer.cpp b/src/renderer/browser-renderer.cpp
index dc32210..8f98ac9 100644
--- a/src/renderer/browser-renderer.cpp
+++ b/src/renderer/browser-renderer.cpp
@@ -66,6 +66,7 @@ static const std::string uiFileThumbnail
 
 BrowserRenderer::BrowserRenderer() throw() :
     IRenderer(),
+    Plugin(),
     sigc::trackable(),
     application_(NULL),
     iconFactory_(Gtk::IconFactory::create()),
@@ -305,6 +306,10 @@ BrowserRenderer::init(Application & application) throw()
 {
     application_ = &application;
 
+    RendererRegistry & renderer_registry
+        = application.get_renderer_registry();
+    renderer_registry.add(this);
+
     const ListStorePtr & list_store = application.get_list_store();
 
     treeModelFilter_ = Gtk::TreeModelFilter::create(list_store);
@@ -361,16 +366,6 @@ BrowserRenderer::init(Application & application) throw()
 }
 
 void
-BrowserRenderer::render(const PhotoPtr & photo) throw()
-{
-}
-
-void
-BrowserRenderer::render(const PhotoList & photos) throw()
-{
-}
-
-void
 BrowserRenderer::final(Application & application) throw()
 {
     signalItemActivated_.disconnect();
@@ -391,10 +386,42 @@ BrowserRenderer::final(Application & application) throw()
 
     treeModelFilter_.reset();
 
+    RendererRegistry & renderer_registry
+        = application.get_renderer_registry();
+    renderer_registry.remove(this);
+
     // finalized_.emit(*this);
 }
 
 void
+BrowserRenderer::visit_renderer(BrowserRenderer & browser_renderer)
+                                throw()
+{
+}
+
+void
+BrowserRenderer::visit_renderer(EnlargedRenderer & enlarged_renderer)
+                                throw()
+{
+}
+
+void
+BrowserRenderer::visit_renderer(SlideshowRenderer & slideshow_renderer)
+                                throw()
+{
+}
+
+void
+BrowserRenderer::render(const PhotoPtr & photo) throw()
+{
+}
+
+void
+BrowserRenderer::render(const PhotoList & photos) throw()
+{
+}
+
+void
 BrowserRenderer::clear_thumbnails() throw()
 {
     Gtk::TreeModel::Children children
diff --git a/src/renderer/browser-renderer.h b/src/renderer/browser-renderer.h
index b54409c..1656126 100644
--- a/src/renderer/browser-renderer.h
+++ b/src/renderer/browser-renderer.h
@@ -29,6 +29,7 @@
 
 #include "i-renderer.h"
 #include "pagination-bar.h"
+#include "plugin.h"
 #include "thumbnail-view.h"
 #include "types.h"
 
@@ -37,6 +38,7 @@ namespace Solang
 
 class BrowserRenderer :
     public IRenderer,
+    public Plugin,
     public sigc::trackable
 {
     public:
@@ -49,13 +51,22 @@ class BrowserRenderer :
         init(Application & application) throw();
 
         virtual void
-        render(const PhotoPtr & photo) throw();
+        final(Application & application) throw();
 
         virtual void
-        render(const PhotoList & photos) throw();
+        visit_renderer(BrowserRenderer & browser_renderer) throw();
 
         virtual void
-        final(Application & application) throw();
+        visit_renderer(EnlargedRenderer & enlarged_renderer) throw();
+
+        virtual void
+        visit_renderer(SlideshowRenderer & slideshow_renderer) throw();
+
+        virtual void
+        render(const PhotoPtr & photo) throw();
+
+        virtual void
+        render(const PhotoList & photos) throw();
 
         void
         on_init_end(Application & application) throw();
diff --git a/src/renderer/enlarged-renderer.cpp b/src/renderer/enlarged-renderer.cpp
index 2eef5c8..5147cf1 100644
--- a/src/renderer/enlarged-renderer.cpp
+++ b/src/renderer/enlarged-renderer.cpp
@@ -62,6 +62,7 @@ image_view_on_scroll_event(GtkImageView * view,
 
 EnlargedRenderer::EnlargedRenderer() throw() :
     IRenderer(),
+    Plugin(),
     sigc::trackable(),
     application_(NULL),
     firstUse_(true),
@@ -114,10 +115,69 @@ void
 EnlargedRenderer::init(Application & application) throw()
 {
     application_ = &application;
+
+    RendererRegistry & renderer_registry
+        = application.get_renderer_registry();
+    renderer_registry.add(this);
+
     // initialized_.emit(*this);
 }
 
 void
+EnlargedRenderer::final(Application & application) throw()
+{
+    if (true == firstUse_)
+    {
+        return;
+    }
+
+    MainWindow & main_window = application.get_main_window();
+    const UIManagerPtr & ui_manager = main_window.get_ui_manager();
+
+    if (0 != uiID_)
+    {
+        ui_manager->remove_action_group(actionGroup_);
+        ui_manager->remove_ui(uiID_);
+        uiID_ = 0;
+    }
+
+    actionGroup_.reset();
+
+    signalMainWindowStateEvent_.disconnect();
+    signalListStoreChangeEnd_.disconnect();
+    signalSwitchPage_.disconnect();
+
+    main_window.undock_object_center(GDL_DOCK_OBJECT(dockItem_));
+
+    pageNum_ = -1;
+    firstUse_ = true;
+
+    RendererRegistry & renderer_registry
+        = application.get_renderer_registry();
+    renderer_registry.remove(this);
+
+    // finalized_.emit(*this);
+}
+
+void
+EnlargedRenderer::visit_renderer(BrowserRenderer & browser_renderer)
+                                 throw()
+{
+}
+
+void
+EnlargedRenderer::visit_renderer(EnlargedRenderer & enlarged_renderer)
+                                 throw()
+{
+}
+
+void
+EnlargedRenderer::visit_renderer(SlideshowRenderer & slideshow_renderer)
+                                 throw()
+{
+}
+
+void
 EnlargedRenderer::render(const PhotoPtr & photo) throw()
 {
     pixbufMaker_->stop_async();
@@ -231,38 +291,6 @@ EnlargedRenderer::render(const PhotoList & photos) throw()
 }
 
 void
-EnlargedRenderer::final(Application & application) throw()
-{
-    if (true == firstUse_)
-    {
-        return;
-    }
-
-    MainWindow & main_window = application.get_main_window();
-    const UIManagerPtr & ui_manager = main_window.get_ui_manager();
-
-    if (0 != uiID_)
-    {
-        ui_manager->remove_action_group(actionGroup_);
-        ui_manager->remove_ui(uiID_);
-        uiID_ = 0;
-    }
-
-    actionGroup_.reset();
-
-    signalMainWindowStateEvent_.disconnect();
-    signalListStoreChangeEnd_.disconnect();
-    signalSwitchPage_.disconnect();
-
-    main_window.undock_object_center(GDL_DOCK_OBJECT(dockItem_));
-
-    pageNum_ = -1;
-    firstUse_ = true;
-
-    // finalized_.emit(*this);
-}
-
-void
 EnlargedRenderer::create_action_group() throw()
 {
     actionGroup_ = Gtk::ActionGroup::create(
diff --git a/src/renderer/enlarged-renderer.h b/src/renderer/enlarged-renderer.h
index 5f72448..a857484 100644
--- a/src/renderer/enlarged-renderer.h
+++ b/src/renderer/enlarged-renderer.h
@@ -27,6 +27,7 @@
 #include <sigc++/sigc++.h>
 
 #include "i-renderer.h"
+#include "plugin.h"
 #include "thumbnail-view.h"
 #include "types.h"
 
@@ -35,6 +36,7 @@ namespace Solang
 
 class EnlargedRenderer :
     public IRenderer,
+    public Plugin,
     public sigc::trackable
 {
     public:
@@ -47,13 +49,22 @@ class EnlargedRenderer :
         init(Application & application) throw();
 
         virtual void
-        render(const PhotoPtr & photo) throw();
+        final(Application & application) throw();
 
         virtual void
-        render(const PhotoList & photos) throw();
+        visit_renderer(BrowserRenderer & browser_renderer) throw();
 
         virtual void
-        final(Application & application) throw();
+        visit_renderer(EnlargedRenderer & enlarged_renderer) throw();
+
+        virtual void
+        visit_renderer(SlideshowRenderer & slideshow_renderer) throw();
+
+        virtual void
+        render(const PhotoPtr & photo) throw();
+
+        virtual void
+        render(const PhotoList & photos) throw();
 
         void
         on_scroll_event(GdkScrollDirection direction) throw();
diff --git a/src/renderer/slideshow-renderer.cpp b/src/renderer/slideshow-renderer.cpp
index bd3c11a..324a9f8 100644
--- a/src/renderer/slideshow-renderer.cpp
+++ b/src/renderer/slideshow-renderer.cpp
@@ -43,6 +43,7 @@ static const std::string uiFile
 
 SlideshowRenderer::SlideshowRenderer() throw() :
     IRenderer(),
+    Plugin(),
     sigc::trackable(),
     application_(0),
     firstUse_(true),
@@ -63,6 +64,45 @@ void
 SlideshowRenderer::init(Application & application) throw()
 {
     application_ = &application;
+
+    RendererRegistry & renderer_registry
+        = application.get_renderer_registry();
+    renderer_registry.add(this);
+}
+
+void
+SlideshowRenderer::final(Application & application) throw()
+{
+    if (true == firstUse_)
+    {
+        return;
+    }
+
+    slideshowWindow_.reset();
+    actionGroup_.reset();
+    firstUse_ = true;
+
+    RendererRegistry & renderer_registry
+        = application.get_renderer_registry();
+    renderer_registry.remove(this);
+}
+
+void
+SlideshowRenderer::visit_renderer(BrowserRenderer & browser_renderer)
+                                  throw()
+{
+}
+
+void
+SlideshowRenderer::visit_renderer(
+                       EnlargedRenderer & enlarged_renderer) throw()
+{
+}
+
+void
+SlideshowRenderer::visit_renderer(
+                       SlideshowRenderer & slideshow_renderer) throw()
+{
 }
 
 void
@@ -109,19 +149,6 @@ SlideshowRenderer::render(const PhotoList & photos) throw()
 }
 
 void
-SlideshowRenderer::final(Application & application) throw()
-{
-    if (true == firstUse_)
-    {
-        return;
-    }
-
-    slideshowWindow_.reset();
-    actionGroup_.reset();
-    firstUse_ = true;
-}
-
-void
 SlideshowRenderer::create_action_group() throw()
 {
     actionGroup_ = Gtk::ActionGroup::create(
diff --git a/src/renderer/slideshow-renderer.h b/src/renderer/slideshow-renderer.h
index 01f4568..b27e972 100644
--- a/src/renderer/slideshow-renderer.h
+++ b/src/renderer/slideshow-renderer.h
@@ -1,6 +1,6 @@
 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 /*
- * Copyright (C) 2009 Debarshi Ray <rishi gnu org>
+ * Copyright (C) 2009, 2010 Debarshi Ray <rishi gnu org>
  *
  * Solang is free software: you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -26,6 +26,7 @@
 #include <sigc++/sigc++.h>
 
 #include "i-renderer.h"
+#include "plugin.h"
 #include "types.h"
 
 namespace Solang
@@ -33,6 +34,7 @@ namespace Solang
 
 class SlideshowRenderer :
     public IRenderer,
+    public Plugin,
     public sigc::trackable
 {
     public:
@@ -45,13 +47,22 @@ class SlideshowRenderer :
         init(Application & application) throw();
 
         virtual void
-        render(const PhotoPtr & photo) throw();
+        final(Application & application) throw();
 
         virtual void
-        render(const PhotoList & photos) throw();
+        visit_renderer(BrowserRenderer & browser_renderer) throw();
 
         virtual void
-        final(Application & application) throw();
+        visit_renderer(EnlargedRenderer & enlarged_renderer) throw();
+
+        virtual void
+        visit_renderer(SlideshowRenderer & slideshow_renderer) throw();
+
+        virtual void
+        render(const PhotoPtr & photo) throw();
+
+        virtual void
+        render(const PhotoList & photos) throw();
 
         virtual PhotoList
         get_current_selection() throw();



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