enum
{
- ZOOM_CHANGED,
+ CLICKED,
LAST_SIGNAL
};
static guint vik_statusbar_signals[LAST_SIGNAL] = { 0 };
-static void
-selection_done (GtkMenuShell *menushell,
- gpointer user_data)
-{
- VikStatusbar *vs = VIK_STATUSBAR (user_data);
-
- GtkWidget *aw = gtk_menu_get_active ( GTK_MENU (menushell) );
- gint active = GPOINTER_TO_INT(gtk_object_get_data ( GTK_OBJECT (aw), "position" ));
-
- gdouble zoom_request = pow (2, active-2 );
-
- g_signal_emit (G_OBJECT (vs),
- vik_statusbar_signals[ZOOM_CHANGED], 0,
- zoom_request);
-}
-
static gint
-zoom_popup_handler (GtkWidget *widget)
+forward_signal (GtkObject *object, gpointer user_data)
{
- GtkMenu *menu;
+ gint item = GPOINTER_TO_INT (gtk_object_get_data ( object, "type" ));
+ VikStatusbar *vs = VIK_STATUSBAR (user_data);
- g_return_val_if_fail (widget != NULL, FALSE);
- g_return_val_if_fail (GTK_IS_MENU (widget), FALSE);
+ g_signal_emit (G_OBJECT (vs),
+ vik_statusbar_signals[CLICKED], 0,
+ item);
- /* The "widget" is the menu that was supplied when
- * g_signal_connect_swapped() was called.
- */
- menu = GTK_MENU (widget);
-
- gtk_menu_popup (menu, NULL, NULL, NULL, NULL,
- 1, gtk_get_current_event_time());
- return TRUE;
-}
-
-static GtkWidget *
-create_zoom_menu_all_levels ()
-{
- GtkWidget *menu = gtk_menu_new ();
- char *itemLabels[] = { "0.25", "0.5", "1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1024", "2048", "4096", "8192", "16384", "32768", NULL };
-
- int i;
- for (i = 0 ; itemLabels[i] != NULL ; i++)
- {
- GtkWidget *item = gtk_menu_item_new_with_label (itemLabels[i]);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- gtk_widget_show (item);
- gtk_object_set_data (GTK_OBJECT (item), "position", GINT_TO_POINTER(i));
- }
- return menu;
+ return TRUE;
}
static void
vik_statusbar_class_init (VikStatusbarClass *klass)
{
- vik_statusbar_signals[ZOOM_CHANGED] =
- g_signal_new ("zoom-changed",
+ vik_statusbar_signals[CLICKED] =
+ g_signal_new ("clicked",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (VikStatusbarClass, zoom_changed),
+ G_STRUCT_OFFSET (VikStatusbarClass, clicked),
NULL, NULL,
- g_cclosure_marshal_VOID__DOUBLE,
+ g_cclosure_marshal_VOID__INT,
G_TYPE_NONE, 1,
- G_TYPE_DOUBLE);
+ G_TYPE_INT);
- klass->zoom_changed = NULL;
+ klass->clicked = NULL;
}
static void
vs->status[i] = gtk_statusbar_new();
gtk_statusbar_set_has_resize_grip ( GTK_STATUSBAR(vs->status[i]), FALSE );
}
+ gtk_object_set_data (GTK_OBJECT (vs->status[i]), "type", GINT_TO_POINTER(i));
}
gtk_box_pack_start ( GTK_BOX(vs), vs->status[VIK_STATUSBAR_TOOL], FALSE, FALSE, 1);
gtk_box_pack_start ( GTK_BOX(vs), vs->status[VIK_STATUSBAR_ITEMS], FALSE, FALSE, 1);
gtk_widget_set_size_request ( vs->status[VIK_STATUSBAR_ITEMS], 100, -1 );
- GtkWidget *menu = create_zoom_menu_all_levels ();
- g_signal_connect ( G_OBJECT(menu), "selection-done", G_CALLBACK(selection_done), vs);
- g_signal_connect_swapped ( G_OBJECT(vs->status[VIK_STATUSBAR_ZOOM]), "clicked", G_CALLBACK (zoom_popup_handler), menu);
+ g_signal_connect ( G_OBJECT(vs->status[VIK_STATUSBAR_ZOOM]), "clicked", G_CALLBACK (forward_signal), vs);
gtk_button_set_relief ( GTK_BUTTON(vs->status[VIK_STATUSBAR_ZOOM]), GTK_RELIEF_NONE );
gtk_widget_set_tooltip_text (GTK_WIDGET (vs->status[VIK_STATUSBAR_ZOOM]), _("Current zoom level. Click to select a new one."));
gtk_box_pack_start ( GTK_BOX(vs), vs->status[VIK_STATUSBAR_ZOOM], FALSE, FALSE, 1);
VikStatusbar *viking_vs;
GtkToolbar *toolbar;
- GtkComboBox *tb_zoom_combo;
GtkItemFactory *item_factory;
}
-static void set_toolbar_zoom ( VikWindow *vw, gdouble mpp )
+static void zoom_changed (GtkMenuShell *menushell,
+ gpointer user_data)
{
- gint active = 2 + round ( log (mpp) / log (2) );
- // Can we not hard code size here?
- if ( active > 17 )
- active = 17;
- gtk_combo_box_set_active ( vw->tb_zoom_combo, active );
-}
+ VikWindow *vw = VIK_WINDOW (user_data);
+
+ GtkWidget *aw = gtk_menu_get_active ( GTK_MENU (menushell) );
+ gint active = GPOINTER_TO_INT(gtk_object_get_data ( GTK_OBJECT (aw), "position" ));
+
+ gdouble zoom_request = pow (2, active-2 );
-static void zoom_changed_cb ( VikStatusbar *vs, gdouble zoom_request, VikWindow *vw )
-{
// But has it really changed?
gdouble current_zoom = vik_viewport_get_zoom ( vw->viking_vvp );
if ( current_zoom != 0.0 && zoom_request != current_zoom ) {
// Force drawing update
draw_update ( vw );
}
-
}
-static void zoom_changed ( GtkComboBox *combo, VikWindow *vw )
+static GtkWidget * create_zoom_menu_all_levels ()
{
- gint active = gtk_combo_box_get_active ( combo );
+ GtkWidget *menu = gtk_menu_new ();
+ char *itemLabels[] = { "0.25", "0.5", "1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1024", "2048", "4096", "8192", "16384", "32768", NULL };
- // But has it really changed?
- // Unfortunately this function gets invoked even on manual setting of the combo value
- gdouble zoom_request = pow (2, active-2 );
- gdouble current_zoom = vik_viewport_get_zoom ( vw->viking_vvp );
- if ( current_zoom != 0.0 && zoom_request != current_zoom ) {
- vik_viewport_set_zoom ( vw->viking_vvp, zoom_request );
- // Force drawing update
- draw_update ( vw );
- }
+ int i;
+ for (i = 0 ; itemLabels[i] != NULL ; i++)
+ {
+ GtkWidget *item = gtk_menu_item_new_with_label (itemLabels[i]);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show (item);
+ gtk_object_set_data (GTK_OBJECT (item), "position", GINT_TO_POINTER(i));
+ }
+
+ return menu;
}
static GtkWidget *create_zoom_combo_all_levels ()
return zoom_combo;
}
+static gint zoom_popup_handler (GtkWidget *widget)
+{
+ GtkMenu *menu;
+
+ g_return_val_if_fail (widget != NULL, FALSE);
+ g_return_val_if_fail (GTK_IS_MENU (widget), FALSE);
+
+ /* The "widget" is the menu that was supplied when
+ * g_signal_connect_swapped() was called.
+ */
+ menu = GTK_MENU (widget);
+
+ gtk_menu_popup (menu, NULL, NULL, NULL, NULL,
+ 1, gtk_get_current_event_time());
+ return TRUE;
+}
+
static void vik_window_init ( VikWindow *vw )
{
GtkWidget *main_vbox;
vik_ext_tools_add_menu_items ( vw, vw->uim );
- vw->tb_zoom_combo = GTK_COMBO_BOX(create_zoom_combo_all_levels());
-
- g_signal_connect ( G_OBJECT(vw->tb_zoom_combo), "changed", G_CALLBACK(zoom_changed), vw );
- g_signal_connect ( G_OBJECT(vw->viking_vs), "zoom-changed", G_CALLBACK(zoom_changed_cb), vw );
-
- // Add the zoom combo to the toolbar at the end
- GtkToolItem *tooli = gtk_tool_item_new ();
- gtk_container_add ( GTK_CONTAINER(tooli), GTK_WIDGET (vw->tb_zoom_combo) );
- gtk_toolbar_insert ( vw->toolbar, tooli, gtk_toolbar_get_n_items (vw->toolbar) );
+ GtkWidget * zoom_levels = gtk_ui_manager_get_widget (vw->uim, "/MainMenu/View/SetZoom");
+ GtkWidget * zoom_levels_menu = create_zoom_menu_all_levels ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (zoom_levels), zoom_levels_menu);
+ g_signal_connect ( G_OBJECT(zoom_levels_menu), "selection-done", G_CALLBACK(zoom_changed), vw);
+ g_signal_connect_swapped ( G_OBJECT(vw->viking_vs), "clicked", G_CALLBACK(zoom_popup_handler), zoom_levels_menu );
g_signal_connect (G_OBJECT (vw), "delete_event", G_CALLBACK (delete_event), NULL);
g_snprintf ( zoom_level, 22, "%d %s", (int)xmpp, unit );
vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_ZOOM, zoom_level );
- // OK maybe not quite in the statusbar - but we have the zoom level so use it
- set_toolbar_zoom ( vw, xmpp ); // But it's a status of some kind!
draw_status_tool ( vw );
}
{ "ZoomIn", GTK_STOCK_ZOOM_IN, N_("Zoom _In"), "<control>plus", NULL, (GCallback)draw_zoom_cb },
{ "ZoomOut", GTK_STOCK_ZOOM_OUT, N_("Zoom _Out"), "<control>minus", NULL, (GCallback)draw_zoom_cb },
{ "ZoomTo", GTK_STOCK_ZOOM_FIT, N_("Zoom _To..."), "<control>Z", NULL, (GCallback)zoom_to_cb },
- { "Zoom0.25", NULL, N_("0.25"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom0.5", NULL, N_("0.5"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom1", NULL, N_("1"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom2", NULL, N_("2"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom4", NULL, N_("4"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom8", NULL, N_("8"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom16", NULL, N_("16"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom32", NULL, N_("32"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom64", NULL, N_("64"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom128", NULL, N_("128"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom256", NULL, N_("256"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom512", NULL, N_("512"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom1024", NULL, N_("1024"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom2048", NULL, N_("2048"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom4096", NULL, N_("4096"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom8192", NULL, N_("8192"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom16384", NULL, N_("16384"), NULL, NULL, (GCallback)draw_zoom_cb },
- { "Zoom32768", NULL, N_("32768"), NULL, NULL, (GCallback)draw_zoom_cb },
{ "PanNorth", NULL, N_("Pan _North"), "<control>Up", NULL, (GCallback)draw_pan_cb },
{ "PanEast", NULL, N_("Pan _East"), "<control>Right", NULL, (GCallback)draw_pan_cb },
{ "PanSouth", NULL, N_("Pan _South"), "<control>Down", NULL, (GCallback)draw_pan_cb },