From 0e004c696b0e68b2cff37a4c3315b022a35eaf43 Mon Sep 17 00:00:00 2001 From: Perberos Date: Thu, 1 Dec 2011 22:24:23 -0300 Subject: moving from https://github.com/perberos/mate-desktop-environment --- src/caja-zoom-action.c | 211 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 src/caja-zoom-action.c (limited to 'src/caja-zoom-action.c') diff --git a/src/caja-zoom-action.c b/src/caja-zoom-action.c new file mode 100644 index 00000000..690042e0 --- /dev/null +++ b/src/caja-zoom-action.c @@ -0,0 +1,211 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */ + +/* + * Caja + * + * Copyright (C) 2009 Red Hat, Inc. + * + * Caja is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * Caja is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Authors: Alexander Larsson + * + */ + +#include + +#include "caja-zoom-action.h" +#include "caja-zoom-control.h" +#include "caja-navigation-window.h" +#include "caja-window-private.h" +#include "caja-navigation-window-slot.h" +#include +#include + +G_DEFINE_TYPE (CajaZoomAction, caja_zoom_action, GTK_TYPE_ACTION) + +static void caja_zoom_action_init (CajaZoomAction *action); +static void caja_zoom_action_class_init (CajaZoomActionClass *class); + +static GObjectClass *parent_class = NULL; + +#define CAJA_ZOOM_ACTION_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), CAJA_TYPE_ZOOM_ACTION, CajaZoomActionPrivate)) + +struct CajaZoomActionPrivate +{ + CajaNavigationWindow *window; +}; + +enum +{ + PROP_0, + PROP_WINDOW +}; + +static void +zoom_changed_callback (CajaWindow *window, + CajaZoomLevel zoom_level, + gboolean supports_zooming, + gboolean can_zoom, + gboolean can_zoom_in, + gboolean can_zoom_out, + GtkWidget *zoom_control) +{ + if (supports_zooming) + { + gtk_widget_set_sensitive (zoom_control, can_zoom); + gtk_widget_show (zoom_control); + if (can_zoom) + { + caja_zoom_control_set_zoom_level (CAJA_ZOOM_CONTROL (zoom_control), + zoom_level); + } + } + else + { + gtk_widget_hide (zoom_control); + } +} + +static void +connect_proxy (GtkAction *action, + GtkWidget *proxy) +{ + if (GTK_IS_TOOL_ITEM (proxy)) + { + GtkToolItem *item = GTK_TOOL_ITEM (proxy); + CajaZoomAction *zaction = CAJA_ZOOM_ACTION (action); + CajaNavigationWindow *window = zaction->priv->window; + GtkWidget *zoom_control; + + zoom_control = caja_zoom_control_new (); + gtk_container_set_border_width (GTK_CONTAINER (item), 4); + gtk_container_add (GTK_CONTAINER (item), zoom_control); + gtk_widget_show (zoom_control); + + g_signal_connect_object (zoom_control, "zoom_in", + G_CALLBACK (caja_window_zoom_in), + window, G_CONNECT_SWAPPED); + g_signal_connect_object (zoom_control, "zoom_out", + G_CALLBACK (caja_window_zoom_out), + window, G_CONNECT_SWAPPED); + g_signal_connect_object (zoom_control, "zoom_to_level", + G_CALLBACK (caja_window_zoom_to_level), + window, G_CONNECT_SWAPPED); + g_signal_connect_object (zoom_control, "zoom_to_default", + G_CALLBACK (caja_window_zoom_to_default), + window, G_CONNECT_SWAPPED); + + g_signal_connect (window, "zoom-changed", + G_CALLBACK (zoom_changed_callback), + zoom_control); + } + + (* GTK_ACTION_CLASS (parent_class)->connect_proxy) (action, proxy); +} + +static void +disconnect_proxy (GtkAction *action, + GtkWidget *proxy) +{ + if (GTK_IS_TOOL_ITEM (proxy)) + { + GtkToolItem *item = GTK_TOOL_ITEM (proxy); + CajaZoomAction *zaction = CAJA_ZOOM_ACTION (action); + CajaNavigationWindow *window = zaction->priv->window; + GtkWidget *child; + + child = gtk_bin_get_child (GTK_BIN (item)); + + g_signal_handlers_disconnect_by_func (window, G_CALLBACK (zoom_changed_callback), child); + + } + + (* GTK_ACTION_CLASS (parent_class)->disconnect_proxy) (action, proxy); +} + +static void +caja_zoom_action_finalize (GObject *object) +{ + (* G_OBJECT_CLASS (parent_class)->finalize) (object); +} + +static void +caja_zoom_action_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + CajaZoomAction *zoom; + + zoom = CAJA_ZOOM_ACTION (object); + + switch (prop_id) + { + case PROP_WINDOW: + zoom->priv->window = CAJA_NAVIGATION_WINDOW (g_value_get_object (value)); + break; + } +} + +static void +caja_zoom_action_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + CajaZoomAction *zoom; + + zoom = CAJA_ZOOM_ACTION (object); + + switch (prop_id) + { + case PROP_WINDOW: + g_value_set_object (value, zoom->priv->window); + break; + } +} + +static void +caja_zoom_action_class_init (CajaZoomActionClass *class) +{ + GObjectClass *object_class = G_OBJECT_CLASS (class); + GtkActionClass *action_class = GTK_ACTION_CLASS (class); + + object_class->finalize = caja_zoom_action_finalize; + object_class->set_property = caja_zoom_action_set_property; + object_class->get_property = caja_zoom_action_get_property; + + parent_class = g_type_class_peek_parent (class); + + action_class->toolbar_item_type = GTK_TYPE_TOOL_ITEM; + action_class->connect_proxy = connect_proxy; + action_class->disconnect_proxy = disconnect_proxy; + + g_object_class_install_property (object_class, + PROP_WINDOW, + g_param_spec_object ("window", + "Window", + "The navigation window", + G_TYPE_OBJECT, + G_PARAM_READWRITE)); + + g_type_class_add_private (object_class, sizeof(CajaZoomActionPrivate)); +} + +static void +caja_zoom_action_init (CajaZoomAction *action) +{ + action->priv = CAJA_ZOOM_ACTION_GET_PRIVATE (action); +} -- cgit v1.2.1