[solang] The renderers are plugins too
- From: Debarshi Ray <debarshir src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [solang] The renderers are plugins too
- Date: Sun, 7 Feb 2010 01:15:35 +0000 (UTC)
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]