static void gth_map_view_init (GthMapView *self) { ClutterActor *scale; self->priv = GTH_MAP_VIEW_GET_PRIVATE (self); gtk_box_set_spacing (GTK_BOX (self), 6); gtk_container_set_border_width (GTK_CONTAINER (self), 2); gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL); /* No GPS label */ self->priv->no_gps_label = gtk_label_new (_("The geographical position information is not available for this image.")); g_object_set (G_OBJECT (self->priv->no_gps_label), "wrap", TRUE, "wrap-mode", PANGO_WRAP_WORD_CHAR, "single-line-mode", FALSE, "justify", GTK_JUSTIFY_CENTER, "width-request", LABEL_MAX_WIDTH, NULL); gtk_widget_show (self->priv->no_gps_label); gtk_box_pack_start (GTK_BOX (self), self->priv->no_gps_label, TRUE, TRUE, 0); /* The map widget */ self->priv->embed = gtk_champlain_embed_new (); self->priv->map_view = gtk_champlain_embed_get_view (GTK_CHAMPLAIN_EMBED (self->priv->embed)); g_object_set (G_OBJECT (self->priv->map_view), "reactive", TRUE, "zoom-level", 5, "zoom-on-double-click", TRUE, "kinetic-mode", TRUE, NULL); scale = champlain_scale_new (); champlain_scale_connect_view (CHAMPLAIN_SCALE (scale), self->priv->map_view); champlain_view_bin_layout_add (self->priv->map_view, scale, CLUTTER_BIN_ALIGNMENT_START, CLUTTER_BIN_ALIGNMENT_END); self->priv->marker_layer = champlain_marker_layer_new (); champlain_view_add_layer (self->priv->map_view, CHAMPLAIN_LAYER (self->priv->marker_layer)); clutter_actor_show (CLUTTER_ACTOR (self->priv->marker_layer)); self->priv->marker = champlain_label_new_with_text ("", "Sans 10", NULL, NULL); clutter_actor_show (self->priv->marker); champlain_marker_layer_add_marker (self->priv->marker_layer, CHAMPLAIN_MARKER (self->priv->marker)); gtk_widget_show_all (self->priv->embed); gtk_widget_hide (self->priv->embed); gtk_box_pack_start (GTK_BOX (self), self->priv->embed, TRUE, TRUE, 0); }
static void build_ui (EmerillonWindow *self) { GtkAction *action; GtkWidget *vbox; GtkWidget *menubar; GtkToolItem *throbber; GtkWidget *viewport; GtkWidget *hpaned; GtkWidget *embed_view; ClutterActor *scale; GError *error = NULL; /* Action entries. */ self->priv->main_actions = gtk_action_group_new ("MenuActionsWindow"); gtk_action_group_set_translation_domain (self->priv->main_actions, GETTEXT_PACKAGE); gtk_action_group_add_actions (self->priv->main_actions, action_entries, G_N_ELEMENTS (action_entries), self); /* Toggle entries. */ gtk_action_group_add_toggle_actions (self->priv->main_actions, toggle_entries, G_N_ELEMENTS (toggle_entries), self); /* Radio entries. */ gtk_action_group_add_radio_actions (self->priv->main_actions, radio_entries, G_N_ELEMENTS (radio_entries), 0, G_CALLBACK (cmd_map_change_map), self); /* Short labels. */ action = gtk_action_group_get_action (self->priv->main_actions, "ViewZoomIn"); g_object_set (action, "short_label", _("In"), NULL); action = gtk_action_group_get_action (self->priv->main_actions, "ViewZoomOut"); g_object_set (action, "short_label", _("Out"), NULL); /* UI manager. */ self->priv->ui_manager = gtk_ui_manager_new (); gtk_ui_manager_insert_action_group (self->priv->ui_manager, self->priv->main_actions, 0); if (!gtk_ui_manager_add_ui_from_file (self->priv->ui_manager, EMERILLON_DATADIR "/emerillon-ui.xml", &error)) { g_warning ("building menus failed: %s", error->message); g_error_free (error); return; } g_signal_connect (self->priv->ui_manager, "connect_proxy", G_CALLBACK (connect_proxy_cb), self); g_signal_connect (self->priv->ui_manager, "disconnect_proxy", G_CALLBACK (disconnect_proxy_cb), self); gtk_window_add_accel_group (GTK_WINDOW (self), gtk_ui_manager_get_accel_group (self->priv->ui_manager)); /* Main box. */ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (self), vbox); gtk_widget_show (vbox); /* Menu. */ menubar = gtk_ui_manager_get_widget (self->priv->ui_manager, "/MainMenu"); g_assert (GTK_IS_WIDGET (menubar)); gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0); gtk_widget_show (menubar); /* Toolbar. */ self->priv->toolbar = gtk_ui_manager_get_widget (self->priv->ui_manager, "/Toolbar"); gtk_style_context_add_class (gtk_widget_get_style_context (self->priv->toolbar), "primary-toolbar"); self->priv->throbber = gtk_spinner_new (); throbber = gtk_tool_item_new (); gtk_container_add (GTK_CONTAINER (throbber), self->priv->throbber); gtk_widget_show (GTK_WIDGET (self->priv->throbber)); gtk_widget_show (GTK_WIDGET (throbber)); gtk_toolbar_insert (GTK_TOOLBAR (self->priv->toolbar), throbber, -1); gtk_box_pack_start (GTK_BOX (vbox), self->priv->toolbar, FALSE, FALSE, 0); gtk_widget_show (self->priv->toolbar); /* Statusbar. */ self->priv->statusbar = gtk_statusbar_new (); gtk_box_pack_end (GTK_BOX (vbox), GTK_WIDGET (self->priv->statusbar), FALSE, FALSE, 0); gtk_widget_show (self->priv->statusbar); self->priv->tooltip_message_context_id = gtk_statusbar_get_context_id ( GTK_STATUSBAR (self->priv->statusbar), "tooltip-message"); /* Viewport. */ viewport = gtk_frame_new (NULL); /* Map. */ embed_view = gtk_champlain_embed_new (); gtk_container_add (GTK_CONTAINER (viewport), embed_view); /* FIXME: workaround for a champlain-gtk bug, replace with _show(). */ gtk_widget_show_all (embed_view); self->priv->view = gtk_champlain_embed_get_view (GTK_CHAMPLAIN_EMBED (embed_view)); g_signal_connect (self->priv->view, "notify::zoom-level", G_CALLBACK (zoom_changed_cb), self); g_signal_connect (self->priv->view, "notify::map-source", G_CALLBACK (zoom_changed_cb), self); g_signal_connect (self->priv->view, "notify::state", G_CALLBACK (state_changed_cb), self); g_object_set (self->priv->view, "zoom-level", 1, "kinetic-mode", TRUE, NULL); champlain_view_center_on (self->priv->view, 40, 0); scale = champlain_scale_new (); champlain_scale_connect_view (CHAMPLAIN_SCALE (scale), self->priv->view); /* align to the bottom left */ champlain_view_bin_layout_add (self->priv->view, scale, CLUTTER_BIN_ALIGNMENT_START, CLUTTER_BIN_ALIGNMENT_END); /* Sidebar. */ self->priv->sidebar = emerillon_sidebar_new (); gtk_widget_set_size_request (self->priv->sidebar, 200, -1); /* Horizontal pane. */ hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL); gtk_paned_pack1 (GTK_PANED (hpaned), self->priv->sidebar, FALSE, FALSE); gtk_paned_pack2 (GTK_PANED (hpaned), viewport, TRUE, FALSE); gtk_widget_show (self->priv->sidebar); gtk_widget_show (viewport); g_signal_connect_after (self->priv->sidebar, "show", G_CALLBACK (sidebar_visibility_changed_cb), self); g_signal_connect_after (self->priv->sidebar, "hide", G_CALLBACK (sidebar_visibility_changed_cb), self); gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0); gtk_widget_show (hpaned); update_ui_visibility (self); }
static void impl_activate (EogWindowActivatable *activatable) { EogMapPlugin *plugin = EOG_MAP_PLUGIN (activatable); GtkWidget *sidebar, *vbox, *bbox, *button, *viewport; GtkWidget *embed; ClutterActor *scale; eog_debug (DEBUG_PLUGINS); /* This is a workaround until bug 590692 is fixed. */ viewport = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (viewport), GTK_SHADOW_ETCHED_IN); /*viewport = gtk_viewport_new (NULL, NULL); gtk_viewport_set_shadow_type (GTK_VIEWPORT (viewport), GTK_SHADOW_ETCHED_IN);*/ embed = gtk_champlain_embed_new (); plugin->map = gtk_champlain_embed_get_view (GTK_CHAMPLAIN_EMBED (embed)); g_object_set (G_OBJECT (plugin->map), "zoom-level", 3, "kinetic-mode", TRUE, NULL); scale = champlain_scale_new (); champlain_scale_connect_view (CHAMPLAIN_SCALE (scale), plugin->map); /* align to the bottom left */ champlain_view_bin_layout_add (plugin->map, scale, CLUTTER_BIN_ALIGNMENT_START, CLUTTER_BIN_ALIGNMENT_END); gtk_container_add (GTK_CONTAINER (viewport), embed); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); bbox = gtk_toolbar_new (); button = GTK_WIDGET (gtk_tool_button_new (NULL, NULL)); gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (button), "go-jump-symbolic"); gtk_widget_set_tooltip_text (button, _("Jump to current image's location")); g_signal_connect (button, "clicked", G_CALLBACK (jump_to), plugin); gtk_container_add (GTK_CONTAINER (bbox), button); plugin->jump_to_button = button; button = GTK_WIDGET (gtk_separator_tool_item_new ()); gtk_container_add (GTK_CONTAINER (bbox), button); button = GTK_WIDGET (gtk_tool_button_new (NULL, NULL)); gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (button), "zoom-in-symbolic"); gtk_widget_set_tooltip_text (button, _("Zoom in")); g_signal_connect (button, "clicked", G_CALLBACK (zoom_in), plugin->map); gtk_container_add (GTK_CONTAINER (bbox), button); button = GTK_WIDGET (gtk_tool_button_new (NULL, NULL)); gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (button), "zoom-out-symbolic"); gtk_widget_set_tooltip_text (button, _("Zoom out")); g_signal_connect (button, "clicked", G_CALLBACK (zoom_out), plugin->map); gtk_container_add (GTK_CONTAINER (bbox), button); plugin->layer = champlain_marker_layer_new_full (CHAMPLAIN_SELECTION_SINGLE); champlain_view_add_layer (CHAMPLAIN_VIEW (plugin->map), CHAMPLAIN_LAYER (plugin->layer)); sidebar = eog_window_get_sidebar (plugin->window); plugin->viewport = vbox; gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, FALSE, 0); gtk_widget_set_vexpand (viewport, TRUE); gtk_container_add (GTK_CONTAINER (vbox), viewport); eog_sidebar_add_page (EOG_SIDEBAR (sidebar), _("Map"), vbox); gtk_widget_show_all (vbox); plugin->win_prepared_id = g_signal_connect (G_OBJECT (plugin->window), "prepared", G_CALLBACK (prepared_cb), plugin); /* Call the callback once in case the window is already ready */ prepared_cb (plugin->window, plugin); }