]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-sidebar-thumbnails.c
[dualscreen] fix crash on ctrl+w and fix control window closing
[evince.git] / shell / ev-sidebar-thumbnails.c
index 08be12b2fab9283c86748935d9e237fd66d123cf..390e14fa61c08e9a347f4816ae2182cadcec676a 100644 (file)
@@ -19,7 +19,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -32,7 +32,6 @@
 #include <gtk/gtk.h>
 
 #include "ev-document-misc.h"
-#include "ev-document-thumbnails.h"
 #include "ev-job-scheduler.h"
 #include "ev-sidebar-page.h"
 #include "ev-sidebar-thumbnails.h"
  * limit its use */
 #define MAX_ICON_VIEW_PAGE_COUNT 1500
 
+typedef struct _EvThumbsSize
+{
+       gint width;
+       gint height;
+} EvThumbsSize;
+
+typedef struct _EvThumbsSizeCache {
+       gboolean uniform;
+       gint uniform_width;
+       gint uniform_height;
+       EvThumbsSize *sizes;
+} EvThumbsSizeCache;
 
 struct _EvSidebarThumbnailsPrivate {
        GtkWidget *swindow;
@@ -54,11 +65,13 @@ struct _EvSidebarThumbnailsPrivate {
        GtkListStore *list_store;
        GHashTable *loading_icons;
        EvDocument *document;
-       EvPageCache *page_cache;
+       EvDocumentModel *model;
+       EvThumbsSizeCache *size_cache;
 
        gint n_pages, pages_done;
 
        int rotation;
+       gboolean inverted_colors;
 
        /* Visible pages */
        gint start_page, end_page;
@@ -77,16 +90,14 @@ enum {
        PROP_WIDGET,
 };
 
-static void         ev_sidebar_thumbnails_clear_model      (EvSidebarThumbnails *sidebar);
-static gboolean     ev_sidebar_thumbnails_support_document (EvSidebarPage       *sidebar_page,
-                                                           EvDocument          *document);
-static void         ev_sidebar_thumbnails_page_iface_init  (EvSidebarPageIface  *iface);
-static void         ev_sidebar_thumbnails_set_document     (EvSidebarPage       *sidebar_page,
-                                                           EvDocument          *document);
-static const gchar* ev_sidebar_thumbnails_get_label        (EvSidebarPage       *sidebar_page);
-static void         thumbnail_job_completed_callback       (EvJobThumbnail      *job,
-                                                           EvSidebarThumbnails *sidebar_thumbnails);
-static void         adjustment_changed_cb                  (EvSidebarThumbnails *sidebar_thumbnails);
+static void         ev_sidebar_thumbnails_clear_model      (EvSidebarThumbnails     *sidebar);
+static gboolean     ev_sidebar_thumbnails_support_document (EvSidebarPage           *sidebar_page,
+                                                           EvDocument              *document);
+static void         ev_sidebar_thumbnails_page_iface_init  (EvSidebarPageInterface  *iface);
+static const gchar* ev_sidebar_thumbnails_get_label        (EvSidebarPage           *sidebar_page);
+static void         thumbnail_job_completed_callback       (EvJobThumbnail          *job,
+                                                           EvSidebarThumbnails     *sidebar_thumbnails);
+static void         adjustment_changed_cb                  (EvSidebarThumbnails     *sidebar_thumbnails);
 
 G_DEFINE_TYPE_EXTENDED (EvSidebarThumbnails, 
                         ev_sidebar_thumbnails, 
@@ -98,6 +109,113 @@ G_DEFINE_TYPE_EXTENDED (EvSidebarThumbnails,
 #define EV_SIDEBAR_THUMBNAILS_GET_PRIVATE(object) \
        (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_SIDEBAR_THUMBNAILS, EvSidebarThumbnailsPrivate));
 
+/* Thumbnails dimensions cache */
+#define EV_THUMBNAILS_SIZE_CACHE_KEY "ev-thumbnails-size-cache"
+
+static void
+get_thumbnail_size_for_page (EvDocument *document,
+                            guint       page,
+                            gint       *width,
+                            gint       *height)
+{
+       gdouble scale;
+       gdouble w, h;
+
+       ev_document_get_page_size (document, page, &w, &h);
+       scale = (gdouble)THUMBNAIL_WIDTH / w;
+
+       *width = MAX ((gint)(w * scale + 0.5), 1);
+       *height = MAX ((gint)(h * scale + 0.5), 1);
+}
+
+static EvThumbsSizeCache *
+ev_thumbnails_size_cache_new (EvDocument *document)
+{
+       EvThumbsSizeCache *cache;
+       gint               i, n_pages;
+       EvThumbsSize      *thumb_size;
+
+       cache = g_new0 (EvThumbsSizeCache, 1);
+
+       if (ev_document_is_page_size_uniform (document)) {
+               cache->uniform = TRUE;
+               get_thumbnail_size_for_page (document, 0,
+                                            &cache->uniform_width,
+                                            &cache->uniform_height);
+               return cache;
+       }
+
+       n_pages = ev_document_get_n_pages (document);
+       cache->sizes = g_new0 (EvThumbsSize, n_pages);
+
+       for (i = 0; i < n_pages; i++) {
+               thumb_size = &(cache->sizes[i]);
+               get_thumbnail_size_for_page (document, i,
+                                            &thumb_size->width,
+                                            &thumb_size->height);
+       }
+
+       return cache;
+}
+
+static void
+ev_thumbnails_size_cache_get_size (EvThumbsSizeCache *cache,
+                                  gint               page,
+                                  gint               rotation,
+                                  gint              *width,
+                                  gint              *height)
+{
+       gint w, h;
+
+       if (cache->uniform) {
+               w = cache->uniform_width;
+               h = cache->uniform_height;
+       } else {
+               EvThumbsSize *thumb_size;
+
+               thumb_size = &(cache->sizes[page]);
+
+               w = thumb_size->width;
+               h = thumb_size->height;
+       }
+
+       if (rotation == 0 || rotation == 180) {
+               if (width) *width = w;
+               if (height) *height = h;
+       } else {
+               if (width) *width = h;
+               if (height) *height = w;
+       }
+}
+
+static void
+ev_thumbnails_size_cache_free (EvThumbsSizeCache *cache)
+{
+       if (cache->sizes) {
+               g_free (cache->sizes);
+               cache->sizes = NULL;
+       }
+
+       g_free (cache);
+}
+
+static EvThumbsSizeCache *
+ev_thumbnails_size_cache_get (EvDocument *document)
+{
+       EvThumbsSizeCache *cache;
+
+       cache = g_object_get_data (G_OBJECT (document), EV_THUMBNAILS_SIZE_CACHE_KEY);
+       if (!cache) {
+               cache = ev_thumbnails_size_cache_new (document);
+               g_object_set_data_full (G_OBJECT (document),
+                                       EV_THUMBNAILS_SIZE_CACHE_KEY,
+                                       cache,
+                                       (GDestroyNotify)ev_thumbnails_size_cache_free);
+       }
+
+       return cache;
+}
+
 
 static void
 ev_sidebar_thumbnails_dispose (GObject *object)
@@ -114,7 +232,7 @@ ev_sidebar_thumbnails_dispose (GObject *object)
                g_object_unref (sidebar_thumbnails->priv->list_store);
                sidebar_thumbnails->priv->list_store = NULL;
        }
-       
+
        G_OBJECT_CLASS (ev_sidebar_thumbnails_parent_class)->dispose (object);
 }
 
@@ -155,11 +273,9 @@ static void
 ev_sidebar_thumbnails_class_init (EvSidebarThumbnailsClass *ev_sidebar_thumbnails_class)
 {
        GObjectClass *g_object_class;
-       GtkObjectClass *gtk_object_class;
        GtkWidgetClass *widget_class;
 
        g_object_class = G_OBJECT_CLASS (ev_sidebar_thumbnails_class);
-       gtk_object_class = GTK_OBJECT_CLASS (ev_sidebar_thumbnails_class);
        widget_class = GTK_WIDGET_CLASS (ev_sidebar_thumbnails_class);
 
        g_object_class->dispose = ev_sidebar_thumbnails_dispose;
@@ -188,15 +304,18 @@ ev_sidebar_thumbnails_get_loading_icon (EvSidebarThumbnails *sidebar_thumbnails,
                                        gint                 width,
                                        gint                 height)
 {
+       EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
        GdkPixbuf *icon;
        gchar     *key;
 
        key = g_strdup_printf ("%dx%d", width, height);
-       icon = g_hash_table_lookup (sidebar_thumbnails->priv->loading_icons, key);
+       icon = g_hash_table_lookup (priv->loading_icons, key);
        if (!icon) {
-               icon = ev_document_misc_get_thumbnail_frame (width, height, NULL);
-               g_hash_table_insert (sidebar_thumbnails->priv->loading_icons,
-                                    key, icon);
+               gboolean inverted_colors;
+
+               inverted_colors = ev_document_model_get_inverted_colors (priv->model);
+               icon = ev_document_misc_get_loading_thumbnail (width, height, inverted_colors);
+               g_hash_table_insert (priv->loading_icons, key, icon);
        } else {
                g_free (key);
        }
@@ -237,7 +356,7 @@ clear_range (EvSidebarThumbnails *sidebar_thumbnails,
                        g_object_unref (job);
                }
 
-               ev_page_cache_get_thumbnail_size (priv->page_cache, start_page,
+               ev_thumbnails_size_cache_get_size (priv->size_cache, start_page,
                                                  priv->rotation,
                                                  &width, &height);
                if (!loading_icon || (width != prev_width && height != prev_height)) {
@@ -263,13 +382,11 @@ get_scale_for_page (EvSidebarThumbnails *sidebar_thumbnails,
                    gint                 page)
 {
        EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
-       gint width, height;
+       gdouble width;
 
-       ev_page_cache_get_size (priv->page_cache,
-                               page, 0,
-                               1.0, &width, &height);
-       
-       return (gdouble)THUMBNAIL_WIDTH / (gdouble)width;
+       ev_document_get_page_size (priv->document, page, &width, NULL);
+
+       return (gdouble)THUMBNAIL_WIDTH / width;
 }
 
 static void
@@ -357,25 +474,31 @@ adjustment_changed_cb (EvSidebarThumbnails *sidebar_thumbnails)
        EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
        GtkTreePath *path = NULL;
        GtkTreePath *path2 = NULL;
+       gdouble page_size;
+       gdouble value;
        gint wy1;
        gint wy2;
 
        /* Widget is not currently visible */
-       if (!GTK_WIDGET_MAPPED (sidebar_thumbnails))
+       if (!gtk_widget_get_mapped (GTK_WIDGET (sidebar_thumbnails)))
                return;
 
-       if (priv->vadjustment->page_size == 0)
+       page_size = gtk_adjustment_get_page_size (priv->vadjustment);
+
+       if (page_size == 0)
                return;
+
+       value = gtk_adjustment_get_value (priv->vadjustment);
        
        if (priv->tree_view) {
-               if (! GTK_WIDGET_REALIZED (priv->tree_view))
+               if (! gtk_widget_get_realized (priv->tree_view))
                        return;
 
                gtk_tree_view_convert_tree_to_bin_window_coords (GTK_TREE_VIEW (priv->tree_view),
-                                                                0, (int) priv->vadjustment->value,
+                                                                0, (int) value,
                                                                 NULL, &wy1);
                gtk_tree_view_convert_tree_to_bin_window_coords (GTK_TREE_VIEW (priv->tree_view),
-                                                                0, (int) (priv->vadjustment->value + priv->vadjustment->page_size),
+                                                                0, (int) (value + page_size),
                                                                 NULL, &wy2);
                gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (priv->tree_view),
                                               1, wy1 + 1, &path,
@@ -384,7 +507,7 @@ adjustment_changed_cb (EvSidebarThumbnails *sidebar_thumbnails)
                                               1, wy2 -1, &path2,
                                               NULL, NULL, NULL);
        } else if (priv->icon_view) {
-               if (! GTK_WIDGET_REALIZED (priv->icon_view))
+               if (! gtk_widget_get_realized (priv->icon_view))
                        return;
                if (! gtk_icon_view_get_visible_range (GTK_ICON_VIEW (priv->icon_view), &path, &path2))
                        return;
@@ -417,9 +540,9 @@ ev_sidebar_thumbnails_fill_model (EvSidebarThumbnails *sidebar_thumbnails)
                GdkPixbuf *loading_icon = NULL;
                gint       width, height;
 
-               page_label = ev_page_cache_get_page_label (priv->page_cache, i);
+               page_label = ev_document_get_page_label (priv->document, i);
                page_string = g_markup_printf_escaped ("<i>%s</i>", page_label);
-               ev_page_cache_get_thumbnail_size (sidebar_thumbnails->priv->page_cache, i,
+               ev_thumbnails_size_cache_get_size (sidebar_thumbnails->priv->size_cache, i,
                                                  sidebar_thumbnails->priv->rotation,
                                                  &width, &height);
                if (!loading_icon || (width != prev_width && height != prev_height)) {
@@ -442,34 +565,6 @@ ev_sidebar_thumbnails_fill_model (EvSidebarThumbnails *sidebar_thumbnails)
        }
 }
 
-static gboolean
-refresh (EvSidebarThumbnails *sidebar_thumbnails)
-{
-       adjustment_changed_cb (sidebar_thumbnails);
-       return FALSE;
-}
-
-void
-ev_sidebar_thumbnails_refresh (EvSidebarThumbnails *sidebar_thumbnails,
-                              int                  rotation)
-{
-       sidebar_thumbnails->priv->rotation = rotation;
-       if (sidebar_thumbnails->priv->loading_icons)
-               g_hash_table_remove_all (sidebar_thumbnails->priv->loading_icons);
-
-       if (sidebar_thumbnails->priv->document == NULL ||
-           sidebar_thumbnails->priv->n_pages <= 0)
-               return;
-
-       ev_sidebar_thumbnails_clear_model (sidebar_thumbnails);
-       ev_sidebar_thumbnails_fill_model (sidebar_thumbnails);
-
-       /* Trigger a redraw */
-       sidebar_thumbnails->priv->start_page = -1;
-       sidebar_thumbnails->priv->end_page = -1;
-       g_idle_add ((GSourceFunc)refresh, sidebar_thumbnails);
-}
-
 static void
 ev_sidebar_tree_selection_changed (GtkTreeSelection *selection,
                                   EvSidebarThumbnails *ev_sidebar_thumbnails)
@@ -487,7 +582,7 @@ ev_sidebar_tree_selection_changed (GtkTreeSelection *selection,
        page = gtk_tree_path_get_indices (path)[0];
        gtk_tree_path_free (path);
 
-       ev_page_cache_set_current_page_history (priv->page_cache, page);
+       ev_document_model_set_page (priv->model, page);
 }
 
 static void
@@ -512,7 +607,7 @@ ev_sidebar_icon_selection_changed (GtkIconView         *icon_view,
        gtk_tree_path_free (path);
        g_list_free (selected);
 
-       ev_page_cache_set_current_page_history (priv->page_cache, page);
+       ev_document_model_set_page (priv->model, page);
 }
 
 static void
@@ -565,9 +660,8 @@ static gboolean
 ev_sidebar_thumbnails_use_icon_view (EvSidebarThumbnails *sidebar_thumbnails)
 {
        EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
-       if (ev_page_cache_get_n_pages (priv->page_cache) > MAX_ICON_VIEW_PAGE_COUNT)
-               return FALSE;
-       return TRUE;
+
+       return (ev_document_get_n_pages (priv->document) <= MAX_ICON_VIEW_PAGE_COUNT);
 }
 
 static void
@@ -607,9 +701,8 @@ ev_sidebar_thumbnails_init (EvSidebarThumbnails *ev_sidebar_thumbnails)
 }
 
 static void
-page_changed_cb (EvPageCache         *page_cache,
-                int                  page,
-                EvSidebarThumbnails *sidebar)
+ev_sidebar_thumbnails_set_current_page (EvSidebarThumbnails *sidebar,
+                                       gint                 page)
 {
        GtkTreeView *tree_view;
        GtkTreePath *path;
@@ -632,12 +725,74 @@ page_changed_cb (EvPageCache         *page_cache,
                        (sidebar->priv->icon_view,
                         G_CALLBACK (ev_sidebar_icon_selection_changed), sidebar);
 
-               gtk_icon_view_set_cursor (GTK_ICON_VIEW (sidebar->priv->icon_view), path, NULL, FALSE);
+               gtk_icon_view_scroll_to_path (GTK_ICON_VIEW (sidebar->priv->icon_view), path, FALSE, 0.0, 0.0);
        }
 
        gtk_tree_path_free (path);
 }
 
+static void
+page_changed_cb (EvSidebarThumbnails *sidebar,
+                gint                 old_page,
+                gint                 new_page)
+{
+       ev_sidebar_thumbnails_set_current_page (sidebar, new_page);
+}
+
+static gboolean
+refresh (EvSidebarThumbnails *sidebar_thumbnails)
+{
+       adjustment_changed_cb (sidebar_thumbnails);
+       return FALSE;
+}
+
+static void
+ev_sidebar_thumbnails_reload (EvSidebarThumbnails *sidebar_thumbnails)
+{
+       EvDocumentModel *model;
+
+       if (sidebar_thumbnails->priv->loading_icons)
+               g_hash_table_remove_all (sidebar_thumbnails->priv->loading_icons);
+
+       if (sidebar_thumbnails->priv->document == NULL ||
+           sidebar_thumbnails->priv->n_pages <= 0)
+               return;
+
+       model = sidebar_thumbnails->priv->model;
+
+       ev_sidebar_thumbnails_clear_model (sidebar_thumbnails);
+       ev_sidebar_thumbnails_fill_model (sidebar_thumbnails);
+
+       /* Trigger a redraw */
+       sidebar_thumbnails->priv->start_page = -1;
+       sidebar_thumbnails->priv->end_page = -1;
+       ev_sidebar_thumbnails_set_current_page (sidebar_thumbnails,
+                                               ev_document_model_get_page (model));
+       g_idle_add ((GSourceFunc)refresh, sidebar_thumbnails);
+}
+
+static void
+ev_sidebar_thumbnails_rotation_changed_cb (EvDocumentModel     *model,
+                                          GParamSpec          *pspec,
+                                          EvSidebarThumbnails *sidebar_thumbnails)
+{
+       gint rotation = ev_document_model_get_rotation (model);
+
+       sidebar_thumbnails->priv->rotation = rotation;
+       ev_sidebar_thumbnails_reload (sidebar_thumbnails);
+}
+
+static void
+ev_sidebar_thumbnails_inverted_colors_changed_cb (EvDocumentModel     *model,
+                                                 GParamSpec          *pspec,
+                                                 EvSidebarThumbnails *sidebar_thumbnails)
+{
+       gboolean inverted_colors = ev_document_model_get_inverted_colors (model);
+
+       sidebar_thumbnails->priv->inverted_colors = inverted_colors;
+       ev_sidebar_thumbnails_reload (sidebar_thumbnails);
+}
+
 static void
 thumbnail_job_completed_callback (EvJobThumbnail      *job,
                                  EvSidebarThumbnails *sidebar_thumbnails)
@@ -646,6 +801,8 @@ thumbnail_job_completed_callback (EvJobThumbnail      *job,
        GtkTreeIter *iter;
 
        iter = (GtkTreeIter *) g_object_get_data (G_OBJECT (job), "tree_iter");
+       if (priv->inverted_colors)
+               ev_document_misc_invert_pixbuf (job->thumbnail);
        gtk_list_store_set (priv->list_store,
                            iter,
                            COLUMN_PIXBUF, job->thumbnail,
@@ -655,18 +812,23 @@ thumbnail_job_completed_callback (EvJobThumbnail      *job,
 }
 
 static void
-ev_sidebar_thumbnails_set_document (EvSidebarPage      *sidebar_page,
-                                   EvDocument          *document)
+ev_sidebar_thumbnails_document_changed_cb (EvDocumentModel     *model,
+                                          GParamSpec          *pspec,
+                                          EvSidebarThumbnails *sidebar_thumbnails)
 {
-       EvSidebarThumbnails *sidebar_thumbnails = EV_SIDEBAR_THUMBNAILS (sidebar_page);
-
+       EvDocument *document = ev_document_model_get_document (model);
        EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
 
-       g_return_if_fail (EV_IS_DOCUMENT_THUMBNAILS (document));
+       if (ev_document_get_n_pages (document) <= 0 ||
+           !ev_document_check_dimensions (document)) {
+               return;
+       }
 
-       priv->page_cache = ev_page_cache_get (document);
+       priv->size_cache = ev_thumbnails_size_cache_get (document);
        priv->document = document;
-       priv->n_pages = ev_page_cache_get_n_pages (priv->page_cache);
+       priv->n_pages = ev_document_get_n_pages (document);
+       priv->rotation = ev_document_model_get_rotation (model);
+       priv->inverted_colors = ev_document_model_get_inverted_colors (model);
        priv->loading_icons = g_hash_table_new_full (g_str_hash,
                                                     g_str_equal,
                                                     (GDestroyNotify)g_free,
@@ -701,15 +863,38 @@ ev_sidebar_thumbnails_set_document (EvSidebarPage *sidebar_page,
        }
 
        /* Connect to the signal and trigger a fake callback */
-       g_signal_connect (priv->page_cache, "page-changed", G_CALLBACK (page_changed_cb), sidebar_thumbnails);
+       g_signal_connect_swapped (priv->model, "page-changed",
+                                 G_CALLBACK (page_changed_cb),
+                                 sidebar_thumbnails);
+       g_signal_connect (priv->model, "notify::rotation",
+                         G_CALLBACK (ev_sidebar_thumbnails_rotation_changed_cb),
+                         sidebar_thumbnails);
+       g_signal_connect (priv->model, "notify::inverted-colors",
+                         G_CALLBACK (ev_sidebar_thumbnails_inverted_colors_changed_cb),
+                         sidebar_thumbnails);
        sidebar_thumbnails->priv->start_page = -1;
        sidebar_thumbnails->priv->end_page = -1;
-       page_changed_cb (priv->page_cache,
-                        ev_page_cache_get_current_page (priv->page_cache),
-                        sidebar_thumbnails);
+       ev_sidebar_thumbnails_set_current_page (sidebar_thumbnails,
+                                               ev_document_model_get_page (model));
        adjustment_changed_cb (sidebar_thumbnails);
 }
 
+static void
+ev_sidebar_thumbnails_set_model (EvSidebarPage   *sidebar_page,
+                                EvDocumentModel *model)
+{
+       EvSidebarThumbnails *sidebar_thumbnails = EV_SIDEBAR_THUMBNAILS (sidebar_page);
+       EvSidebarThumbnailsPrivate *priv = sidebar_thumbnails->priv;
+
+       if (priv->model == model)
+               return;
+
+       priv->model = model;
+       g_signal_connect (model, "notify::document",
+                         G_CALLBACK (ev_sidebar_thumbnails_document_changed_cb),
+                         sidebar_page);
+}
+
 static gboolean
 ev_sidebar_thumbnails_clear_job (GtkTreeModel *model,                                             
                                 GtkTreePath *path,
@@ -742,7 +927,7 @@ static gboolean
 ev_sidebar_thumbnails_support_document (EvSidebarPage   *sidebar_page,
                                        EvDocument *document)
 {
-       return (EV_IS_DOCUMENT_THUMBNAILS (document));
+       return TRUE;
 }
 
 static const gchar*
@@ -752,10 +937,9 @@ ev_sidebar_thumbnails_get_label (EvSidebarPage *sidebar_page)
 }
 
 static void
-ev_sidebar_thumbnails_page_iface_init (EvSidebarPageIface *iface)
+ev_sidebar_thumbnails_page_iface_init (EvSidebarPageInterface *iface)
 {
        iface->support_document = ev_sidebar_thumbnails_support_document;
-       iface->set_document = ev_sidebar_thumbnails_set_document;
+       iface->set_model = ev_sidebar_thumbnails_set_model;
        iface->get_label = ev_sidebar_thumbnails_get_label;
 }
-