*
* 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.
*
* $Id$
*/
#include "ephy-zoom-control.h"
#include "ephy-zoom.h"
-#include "ev-debug.h"
#include <gtk/gtk.h>
-#include <gtk/gtkcombobox.h>
-#include <gtk/gtktooltips.h>
#include <glib/gi18n.h>
-#define EPHY_ZOOM_CONTROL_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_ZOOM_CONTROL, EphyZoomControlPrivate))
+#define EPHY_ZOOM_CONTROL_GET_PRIVATE(object)\
+ (G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_ZOOM_CONTROL, EphyZoomControlPrivate))
struct _EphyZoomControlPrivate
{
GtkComboBox *combo;
float zoom;
+ float min_zoom;
+ float max_zoom;
guint handler_id;
};
enum
{
PROP_0,
- PROP_ZOOM
+ PROP_ZOOM,
+ PROP_MIN_ZOOM,
+ PROP_MAX_ZOOM
};
enum
static guint signals[LAST_SIGNAL];
-static GObjectClass *parent_class = NULL;
-
-static void ephy_zoom_control_class_init (EphyZoomControlClass *klass);
-static void ephy_zoom_control_init (EphyZoomControl *control);
-static void ephy_zoom_control_finalize (GObject *o);
-
-GType
-ephy_zoom_control_get_type (void)
-{
- static GType type = 0;
-
- if (G_UNLIKELY (type == 0))
- {
- static const GTypeInfo our_info =
- {
- sizeof (EphyZoomControlClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) ephy_zoom_control_class_init,
- NULL,
- NULL, /* class_data */
- sizeof (EphyZoomControl),
- 0, /* n_preallocs */
- (GInstanceInitFunc) ephy_zoom_control_init,
- };
-
- type = g_type_register_static (GTK_TYPE_TOOL_ITEM,
- "EphyZoomControl",
- &our_info, 0);
- }
-
- return type;
-}
+G_DEFINE_TYPE (EphyZoomControl, ephy_zoom_control, GTK_TYPE_TOOL_ITEM)
static void
combo_changed_cb (GtkComboBox *combo, EphyZoomControl *control)
g_signal_handler_unblock (p->combo, p->handler_id);
}
+static void
+sync_zoom_max_min_cb (EphyZoomControl *control, GParamSpec *pspec, gpointer data)
+{
+ EphyZoomControlPrivate *p = control->priv;
+ GtkListStore *model = (GtkListStore *)gtk_combo_box_get_model (p->combo);
+ GtkTreeIter iter;
+ gint i;
+
+ g_signal_handler_block (p->combo, p->handler_id);
+ gtk_list_store_clear (model);
+
+ for (i = 0; i < n_zoom_levels; i++)
+ {
+ if (zoom_levels[i].level > 0) {
+ if (zoom_levels[i].level < p->min_zoom)
+ continue;
+
+ if (zoom_levels[i].level > p->max_zoom)
+ break;
+ }
+
+ gtk_list_store_append (model, &iter);
+
+ if (zoom_levels[i].name != NULL) {
+ gtk_list_store_set (model, &iter,
+ COL_TEXT, _(zoom_levels[i].name),
+ -1);
+ } else {
+ gtk_list_store_set (model, &iter,
+ COL_IS_SEP, zoom_levels[i].name == NULL,
+ -1);
+ }
+ }
+
+ gtk_combo_box_set_active (p->combo, ephy_zoom_get_zoom_level_index (p->zoom));
+ g_signal_handler_unblock (p->combo, p->handler_id);
+}
+
static gboolean
row_is_separator (GtkTreeModel *model,
GtkTreeIter *iter,
return is_sep;
}
+static void
+ephy_zoom_control_finalize (GObject *o)
+{
+ EphyZoomControl *control = EPHY_ZOOM_CONTROL (o);
+
+ g_object_unref (control->priv->combo);
+
+ G_OBJECT_CLASS (ephy_zoom_control_parent_class)->finalize (o);
+}
+
static void
ephy_zoom_control_init (EphyZoomControl *control)
{
for (i = 0; i < n_zoom_levels; i++)
{
gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter,
- COL_TEXT, zoom_levels[i].name,
- COL_IS_SEP, zoom_levels[i].name == NULL,
- -1);
+
+ if (zoom_levels[i].name != NULL) {
+ gtk_list_store_set (store, &iter,
+ COL_TEXT, _(zoom_levels[i].name),
+ -1);
+ } else {
+ gtk_list_store_set (store, &iter,
+ COL_IS_SEP, zoom_levels[i].name == NULL,
+ -1);
+ }
}
p->combo = GTK_COMBO_BOX (gtk_combo_box_new_with_model (GTK_TREE_MODEL (store)));
NULL, NULL);
gtk_combo_box_set_focus_on_click (p->combo, FALSE);
- g_object_ref (p->combo);
- gtk_object_sink (GTK_OBJECT (p->combo));
+ g_object_ref_sink (G_OBJECT (p->combo));
gtk_widget_show (GTK_WIDGET (p->combo));
i = ephy_zoom_get_zoom_level_index (p->zoom);
g_signal_connect_object (control, "notify::zoom",
G_CALLBACK (sync_zoom_cb), NULL, 0);
+ g_signal_connect_object (control, "notify::min-zoom",
+ G_CALLBACK (sync_zoom_max_min_cb), NULL, 0);
+ g_signal_connect_object (control, "notify::max-zoom",
+ G_CALLBACK (sync_zoom_max_min_cb), NULL, 0);
}
static void
case PROP_ZOOM:
p->zoom = g_value_get_float (value);
break;
+ case PROP_MIN_ZOOM:
+ p->min_zoom = g_value_get_float (value);
+ break;
+ case PROP_MAX_ZOOM:
+ p->max_zoom = g_value_get_float (value);
+ break;
}
}
case PROP_ZOOM:
g_value_set_float (value, p->zoom);
break;
+ case PROP_MIN_ZOOM:
+ g_value_set_float (value, p->min_zoom);
+ break;
+ case PROP_MAX_ZOOM:
+ g_value_set_float (value, p->max_zoom);
+ break;
}
}
-static void
-set_combo_tooltip (GtkWidget *widget,
- GtkTooltipsData *data)
-{
- if (GTK_IS_BUTTON (widget))
- {
- gtk_tooltips_set_tip (data->tooltips, widget,
- data->tip_text, data->tip_private);
- }
-}
-
-static void
-combo_realized (GtkWidget *combo,
- GtkWidget *control)
-{
- GtkTooltipsData *data;
-
- data = gtk_tooltips_data_get (control);
- g_return_if_fail (data != NULL);
-
- gtk_container_forall (GTK_CONTAINER (combo),
- (GtkCallback) set_combo_tooltip, data);
-}
-
-static gboolean
-ephy_zoom_control_set_tooltip (GtkToolItem *tool_item,
- GtkTooltips *tooltips,
- const char *tip_text,
- const char *tip_private)
-{
- EphyZoomControl *control = EPHY_ZOOM_CONTROL (tool_item);
- GtkWidget *widget = GTK_WIDGET (tool_item);
-
- /* hack to make tooltips work also on Ctrl-F1 */
- gtk_tooltips_set_tip (tooltips, widget, tip_text, tip_private);
-
- g_signal_handlers_disconnect_by_func
- (control->priv->combo, G_CALLBACK (combo_realized), widget);
-
- if (GTK_WIDGET_REALIZED (tool_item))
- {
- combo_realized (GTK_WIDGET (control->priv->combo), widget);
- }
- else
- {
- g_signal_connect_after (control->priv->combo, "realize",
- G_CALLBACK (combo_realized), widget);
- }
-
- return TRUE;
-}
-
static void
ephy_zoom_control_class_init (EphyZoomControlClass *klass)
{
GObjectClass *object_class;
GtkToolItemClass *tool_item_class;
- parent_class = g_type_class_peek_parent (klass);
-
object_class = (GObjectClass *)klass;
tool_item_class = (GtkToolItemClass *)klass;
object_class->get_property = ephy_zoom_control_get_property;
object_class->finalize = ephy_zoom_control_finalize;
- tool_item_class->set_tooltip = ephy_zoom_control_set_tooltip;
-
g_object_class_install_property (object_class,
PROP_ZOOM,
g_param_spec_float ("zoom",
ZOOM_MAXIMAL,
1.0,
G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_MIN_ZOOM,
+ g_param_spec_float ("min-zoom",
+ "MinZoom",
+ "The minimum zoom",
+ ZOOM_MINIMAL,
+ ZOOM_MAXIMAL,
+ ZOOM_MINIMAL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_MAX_ZOOM,
+ g_param_spec_float ("max-zoom",
+ "MaxZoom",
+ "The maximum zoom",
+ ZOOM_MINIMAL,
+ ZOOM_MAXIMAL,
+ ZOOM_MAXIMAL,
+ G_PARAM_READWRITE));
signals[ZOOM_TO_LEVEL_SIGNAL] =
g_signal_new ("zoom_to_level",
g_type_class_add_private (object_class, sizeof (EphyZoomControlPrivate));
}
-static void
-ephy_zoom_control_finalize (GObject *o)
-{
- EphyZoomControl *control = EPHY_ZOOM_CONTROL (o);
-
- g_object_unref (control->priv->combo);
-
- G_OBJECT_CLASS (parent_class)->finalize (o);
-}
-
void
ephy_zoom_control_set_zoom_level (EphyZoomControl *control, float zoom)
{