*
* Copyright (C) 2003-2005, Evan Battaglia <gtoevan@gmx.net>
* Copyright (C) 2005-2006, Alex Foobarian <foobarian@gmail.com>
- * Copyright (C) 2012-2013, Rob Norris <rw_norris@hotmail.com>
+ * Copyright (C) 2012-2014, Rob Norris <rw_norris@hotmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include "mapcache.h"
#include "print.h"
#include "preferences.h"
+#include "toolbar.h"
#include "viklayer_defaults.h"
#include "icons/icons.h"
#include "vikexttools.h"
#include "vikmapslayer.h"
#include "geonamessearch.h"
#include "vikutils.h"
+#include "dir.h"
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#define DRAW_IMAGE_DEFAULT_HEIGHT 1024
#define DRAW_IMAGE_DEFAULT_SAVE_AS_PNG TRUE
+// The last used directories
+static gchar *last_folder_files_uri = NULL;
+static gchar *last_folder_images_uri = NULL;
+
static void window_finalize ( GObject *gob );
static GObjectClass *parent_class;
/* End Drawing Functions */
+static void toggle_draw_scale ( GtkAction *a, VikWindow *vw );
+static void toggle_draw_centermark ( GtkAction *a, VikWindow *vw );
+static void toggle_draw_highlight ( GtkAction *a, VikWindow *vw );
+
static void menu_addlayer_cb ( GtkAction *a, VikWindow *vw );
static void menu_properties_cb ( GtkAction *a, VikWindow *vw );
static void menu_delete_layer_cb ( GtkAction *a, VikWindow *vw );
VikWindow *vw;
} toolbox_tools_t;
-static void menu_tool_cb ( GtkAction *old, GtkAction *a, VikWindow *vw );
+static void menu_cb ( GtkAction *old, GtkAction *a, VikWindow *vw );
+static void window_change_coord_mode_cb ( GtkAction *old, GtkAction *a, VikWindow *vw );
static toolbox_tools_t* toolbox_create(VikWindow *vw);
static void toolbox_add_tool(toolbox_tools_t *vt, VikToolInterface *vti, gint layer_type );
static int toolbox_get_tool(toolbox_tools_t *vt, const gchar *tool_name);
VikViewport *viking_vvp;
VikLayersPanel *viking_vlp;
VikStatusbar *viking_vs;
+ VikToolbar *viking_vtb;
- GtkToolbar *toolbar;
+ GtkWidget *main_vbox;
+ GtkWidget *menu_hbox;
GdkCursor *busy_cursor;
GdkCursor *viewport_cursor; // only a reference
GtkActionGroup *action_group;
+ // Display controls
+ // NB scale, centermark and highlight are in viewport.
+ gboolean show_full_screen;
+ gboolean show_side_panel;
+ gboolean show_statusbar;
+ gboolean show_toolbar;
+ gboolean show_main_menu;
+
+ gboolean select_move;
gboolean pan_move;
gint pan_x, pan_y;
gint delayed_pan_x, delayed_pan_y; // Temporary storage
gboolean modified;
VikLoadType_t loaded_type;
- GtkWidget *open_dia, *save_dia;
- GtkWidget *save_img_dia, *save_img_dir_dia;
-
gboolean only_updating_coord_mode_ui; /* hack for a bug in GTK */
GtkUIManager *uim;
*/
void vik_window_statusbar_update ( VikWindow *vw, const gchar* message, vik_statusbar_type_t vs_type )
{
+ GThread *thread = vik_window_get_thread ( vw );
+ if ( !thread )
+ // Do nothing
+ return;
+
statusbar_idle_data *sid = g_malloc ( sizeof (statusbar_idle_data) );
sid->vs = vw->viking_vs;
sid->vs_type = vs_type;
sid->message = g_strdup ( message );
- if ( g_thread_self() == vik_window_get_thread ( vw ) ) {
+ if ( g_thread_self() == thread ) {
g_idle_add ( (GSourceFunc) statusbar_idle_update, sid );
}
else {
static void destroy_window ( GtkWidget *widget,
gpointer data )
{
- if ( ! --window_count )
+ if ( ! --window_count ) {
+ g_free ( last_folder_files_uri );
+ g_free ( last_folder_images_uri );
gtk_main_quit ();
+ }
}
#define VIK_SETTINGS_WIN_SIDEPANEL "window_sidepanel"
gboolean toolbar;
if ( a_settings_get_boolean ( VIK_SETTINGS_WIN_TOOLBAR, &toolbar ) )
if ( ! toolbar ) {
- gtk_widget_hide ( GTK_WIDGET(vw->toolbar) );
+ gtk_widget_hide ( toolbar_get_widget (vw->viking_vtb) );
GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewToolBar" );
gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), FALSE );
}
vik_statusbar_set_message ( vw->viking_vs, VIK_STATUSBAR_INFO, _("Trying to determine location...") );
- a_background_thread ( GTK_WINDOW(vw),
+ a_background_thread ( BACKGROUND_POOL_REMOTE,
+ GTK_WINDOW(vw),
_("Determining location"),
(vik_thr_func) determine_location_thread,
vw,
action = gtk_action_group_get_action(vw->action_group,
layer_interface->tools[j].radioActionEntry.name);
g_object_set(action, "sensitive", i == vl->type, NULL);
+ toolbar_action_set_sensitive ( vw->viking_vtb, vik_layer_get_interface(i)->tools[j].radioActionEntry.name, i == vl->type );
}
}
}
g_free ( vw->vt->tools );
g_free ( vw->vt );
+ vik_toolbar_finalize ( vw->viking_vtb );
+
G_OBJECT_CLASS(parent_class)->finalize(gob);
}
GtkWidget *aw = gtk_menu_get_active ( GTK_MENU (menushell) );
gint active = GPOINTER_TO_INT(g_object_get_data ( G_OBJECT (aw), "position" ));
- gdouble zoom_request = pow (2, active-2 );
+ gdouble zoom_request = pow (2, active-5 );
// But has it really changed?
gdouble current_zoom = vik_viewport_get_zoom ( vw->viking_vvp );
static GtkWidget *create_zoom_menu_all_levels ( gdouble mpp )
{
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" };
+ char *itemLabels[] = { "0.031", "0.063", "0.125", "0.25", "0.5", "1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1024", "2048", "4096", "8192", "16384", "32768" };
int i;
for (i = 0 ; i < G_N_ELEMENTS(itemLabels) ; i++)
g_object_set_data (G_OBJECT (item), "position", GINT_TO_POINTER(i));
}
- gint active = 2 + round ( log (mpp) / log (2) );
+ gint active = 5 + round ( log (mpp) / log (2) );
// Ensure value derived from mpp is in bounds of the menu
if ( active >= G_N_ELEMENTS(itemLabels) )
active = G_N_ELEMENTS(itemLabels) - 1;
gtk_drag_finish ( context, success, FALSE, time );
}
+static void toolbar_tool_cb ( GtkAction *old, GtkAction *current, gpointer gp )
+{
+ VikWindow *vw = (VikWindow*)gp;
+ GtkAction *action = gtk_action_group_get_action ( vw->action_group, gtk_action_get_name(current) );
+ if ( action )
+ gtk_action_activate ( action );
+}
+
+static void toolbar_reload_cb ( GtkActionGroup *grp, gpointer gp )
+{
+ VikWindow *vw = (VikWindow*)gp;
+ center_changed_cb ( vw );
+}
+
#define VIK_SETTINGS_WIN_MAX "window_maximized"
#define VIK_SETTINGS_WIN_FULLSCREEN "window_fullscreen"
#define VIK_SETTINGS_WIN_WIDTH "window_width"
#define VIK_SETTINGS_WIN_SAVE_IMAGE_PNG "window_save_image_as_png"
#define VIK_SETTINGS_WIN_COPY_CENTRE_FULL_FORMAT "window_copy_centre_full_format"
+#define VIKING_ACCELERATOR_KEY_FILE "keys.rc"
+
static void vik_window_init ( VikWindow *vw )
{
- GtkWidget *main_vbox;
-
vw->action_group = NULL;
vw->viking_vvp = vik_viewport_new();
vw->viking_vs = vik_statusbar_new();
vw->vt = toolbox_create(vw);
+ vw->viking_vtb = vik_toolbar_new ();
window_create_ui(vw);
window_set_filename (vw, NULL);
- vw->toolbar = GTK_TOOLBAR(gtk_ui_manager_get_widget (vw->uim, "/MainToolbar"));
vw->busy_cursor = gdk_cursor_new ( GDK_WATCH );
- // Set the default tool
- gtk_action_activate ( gtk_action_group_get_action ( vw->action_group, "Pan" ) );
-
vw->filename = NULL;
vw->loaded_type = LOAD_TYPE_READ_FAILURE; //AKA none
vw->modified = FALSE;
vw->only_updating_coord_mode_ui = FALSE;
-
+
+ vw->select_move = FALSE;
vw->pan_move = FALSE;
vw->pan_x = vw->pan_y = -1;
vw->single_click_pending = FALSE;
else
vw->draw_image_save_as_png = DRAW_IMAGE_DEFAULT_SAVE_AS_PNG;
- main_vbox = gtk_vbox_new(FALSE, 1);
- gtk_container_add (GTK_CONTAINER (vw), main_vbox);
-
- gtk_box_pack_start (GTK_BOX(main_vbox), gtk_ui_manager_get_widget (vw->uim, "/MainMenu"), FALSE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX(main_vbox), GTK_WIDGET(vw->toolbar), FALSE, TRUE, 0);
- gtk_toolbar_set_icon_size (vw->toolbar, GTK_ICON_SIZE_SMALL_TOOLBAR);
- gtk_toolbar_set_style (vw->toolbar, GTK_TOOLBAR_ICONS);
+ vw->main_vbox = gtk_vbox_new(FALSE, 1);
+ gtk_container_add (GTK_CONTAINER (vw), vw->main_vbox);
+ vw->menu_hbox = gtk_hbox_new(FALSE, 1);
+ GtkWidget *menu_bar = gtk_ui_manager_get_widget (vw->uim, "/MainMenu");
+ gtk_box_pack_start (GTK_BOX(vw->menu_hbox), menu_bar, FALSE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX(vw->main_vbox), vw->menu_hbox, FALSE, TRUE, 0);
+
+ toolbar_init(vw->viking_vtb,
+ &vw->gtkwindow,
+ vw->main_vbox,
+ vw->menu_hbox,
+ toolbar_tool_cb,
+ toolbar_reload_cb,
+ (gpointer)vw); // This auto packs toolbar into the vbox
+ // Must be performed post toolbar init
+ gint i,j;
+ for (i=0; i<VIK_LAYER_NUM_TYPES; i++) {
+ for ( j = 0; j < vik_layer_get_interface(i)->tools_count; j++ ) {
+ toolbar_action_set_sensitive ( vw->viking_vtb, vik_layer_get_interface(i)->tools[j].radioActionEntry.name, FALSE );
+ }
+ }
vik_ext_tool_datasources_add_menu_items ( vw, vw->uim );
center_changed_cb ( vw );
vw->hpaned = gtk_hpaned_new ();
- gtk_paned_pack1 ( GTK_PANED(vw->hpaned), GTK_WIDGET (vw->viking_vlp), FALSE, FALSE );
+ gtk_paned_pack1 ( GTK_PANED(vw->hpaned), GTK_WIDGET (vw->viking_vlp), FALSE, TRUE );
gtk_paned_pack2 ( GTK_PANED(vw->hpaned), GTK_WIDGET (vw->viking_vvp), TRUE, TRUE );
/* This packs the button into the window (a gtk container). */
- gtk_box_pack_start (GTK_BOX(main_vbox), vw->hpaned, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX(vw->main_vbox), vw->hpaned, TRUE, TRUE, 0);
- gtk_box_pack_end (GTK_BOX(main_vbox), GTK_WIDGET(vw->viking_vs), FALSE, TRUE, 0);
+ gtk_box_pack_end (GTK_BOX(vw->main_vbox), GTK_WIDGET(vw->viking_vs), FALSE, TRUE, 0);
a_background_add_window ( vw );
gboolean full;
if ( a_settings_get_boolean ( VIK_SETTINGS_WIN_FULLSCREEN, &full ) ) {
if ( full ) {
+ vw->show_full_screen = TRUE;
gtk_window_fullscreen ( GTK_WINDOW(vw) );
GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/FullScreen" );
- gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), TRUE );
+ if ( check_box )
+ gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), TRUE );
}
}
gtk_window_set_default_size ( GTK_WINDOW(vw), width, height );
- vw->open_dia = NULL;
- vw->save_dia = NULL;
- vw->save_img_dia = NULL;
- vw->save_img_dir_dia = NULL;
+ vw->show_side_panel = TRUE;
+ vw->show_statusbar = TRUE;
+ vw->show_toolbar = TRUE;
+ vw->show_main_menu = TRUE;
// Only accept Drag and Drop of files onto the viewport
gtk_drag_dest_set ( GTK_WIDGET(vw->viking_vvp), GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_COPY );
// Hopefully we are storing the main thread value here :)
// [ATM any window initialization is always be performed by the main thread]
vw->thread = g_thread_self();
+
+ // Set the default tool + mode
+ gtk_action_activate ( gtk_action_group_get_action ( vw->action_group, "Pan" ) );
+ gtk_action_activate ( gtk_action_group_get_action ( vw->action_group, "ModeMercator" ) );
+
+ gchar *accel_file_name = g_build_filename ( a_get_viking_dir(), VIKING_ACCELERATOR_KEY_FILE, NULL );
+ gtk_accel_map_load ( accel_file_name );
+ g_free ( accel_file_name );
}
static VikWindow *window_new ()
a_settings_set_boolean ( VIK_SETTINGS_WIN_STATUSBAR, GTK_WIDGET_VISIBLE (GTK_WIDGET(vw->viking_vs)) );
- a_settings_set_boolean ( VIK_SETTINGS_WIN_TOOLBAR, GTK_WIDGET_VISIBLE (GTK_WIDGET(vw->toolbar)) );
+ a_settings_set_boolean ( VIK_SETTINGS_WIN_TOOLBAR, GTK_WIDGET_VISIBLE (toolbar_get_widget(vw->viking_vtb)) );
// If supersized - no need to save the enlarged width+height values
if ( ! (state_fullscreen || state_max) ) {
a_settings_set_integer ( VIK_SETTINGS_WIN_SAVE_IMAGE_WIDTH, vw->draw_image_width );
a_settings_set_integer ( VIK_SETTINGS_WIN_SAVE_IMAGE_HEIGHT, vw->draw_image_height );
a_settings_set_boolean ( VIK_SETTINGS_WIN_SAVE_IMAGE_PNG, vw->draw_image_save_as_png );
+
+ gchar *accel_file_name = g_build_filename ( a_get_viking_dir(), VIKING_ACCELERATOR_KEY_FILE, NULL );
+ gtk_accel_map_save ( accel_file_name );
+ g_free ( accel_file_name );
}
return FALSE;
ck->cont = !vik_layer_get_interface(vl->type)->select_click ( vl, ck->event, ck->vvp, ck->tool_edit );
}
+#ifdef WINDOWS
+// Hopefully Alt keys by default
+#define VIK_MOVE_MODIFIER GDK_MOD1_MASK
+#else
+// Alt+mouse on Linux desktops tend to be used by the desktop manager
+// Thus use an alternate modifier - you may need to set something into this group
+#define VIK_MOVE_MODIFIER GDK_MOD5_MASK
+#endif
+
static VikLayerToolFuncStatus selecttool_click (VikLayer *vl, GdkEventButton *event, tool_ed_t *t)
{
+ t->vw->select_move = FALSE;
/* Only allow selection on primary button */
if ( event->button == 1 ) {
- /* Enable click to apply callback to potentially all track/waypoint layers */
- /* Useful as we can find things that aren't necessarily in the currently selected layer */
- GList* gl = vik_layers_panel_get_all_layers_of_type ( t->vw->viking_vlp, VIK_LAYER_TRW, FALSE ); // Don't get invisible layers
- clicker ck;
- ck.cont = TRUE;
- ck.vvp = t->vw->viking_vvp;
- ck.event = event;
- ck.tool_edit = t;
- g_list_foreach ( gl, (GFunc) click_layer_selected, &ck );
- g_list_free ( gl );
-
- // If nothing found then deselect & redraw screen if necessary to remove the highlight
- if ( ck.cont ) {
- GtkTreeIter iter;
- VikTreeview *vtv = vik_layers_panel_get_treeview ( t->vw->viking_vlp );
-
- if ( vik_treeview_get_selected_iter ( vtv, &iter ) ) {
- // Only clear if selected thing is a TrackWaypoint layer or a sublayer
- gint type = vik_treeview_item_get_type ( vtv, &iter );
- if ( type == VIK_TREEVIEW_TYPE_SUBLAYER ||
- VIK_LAYER(vik_treeview_item_get_pointer ( vtv, &iter ))->type == VIK_LAYER_TRW ) {
+
+ if ( event->state & VIK_MOVE_MODIFIER )
+ vik_window_pan_click ( t->vw, event );
+ else {
+ /* Enable click to apply callback to potentially all track/waypoint layers */
+ /* Useful as we can find things that aren't necessarily in the currently selected layer */
+ GList* gl = vik_layers_panel_get_all_layers_of_type ( t->vw->viking_vlp, VIK_LAYER_TRW, FALSE ); // Don't get invisible layers
+ clicker ck;
+ ck.cont = TRUE;
+ ck.vvp = t->vw->viking_vvp;
+ ck.event = event;
+ ck.tool_edit = t;
+ g_list_foreach ( gl, (GFunc) click_layer_selected, &ck );
+ g_list_free ( gl );
+
+ // If nothing found then deselect & redraw screen if necessary to remove the highlight
+ if ( ck.cont ) {
+ GtkTreeIter iter;
+ VikTreeview *vtv = vik_layers_panel_get_treeview ( t->vw->viking_vlp );
+
+ if ( vik_treeview_get_selected_iter ( vtv, &iter ) ) {
+ // Only clear if selected thing is a TrackWaypoint layer or a sublayer
+ gint type = vik_treeview_item_get_type ( vtv, &iter );
+ if ( type == VIK_TREEVIEW_TYPE_SUBLAYER ||
+ VIK_LAYER(vik_treeview_item_get_pointer ( vtv, &iter ))->type == VIK_LAYER_TRW ) {
- vik_treeview_item_unselect ( vtv, &iter );
- if ( vik_window_clear_highlight ( t->vw ) )
- draw_update ( t->vw );
- }
+ vik_treeview_item_unselect ( vtv, &iter );
+ if ( vik_window_clear_highlight ( t->vw ) )
+ draw_update ( t->vw );
+ }
+ }
+ }
+ else {
+ // Something found - so enable movement
+ t->vw->select_move = TRUE;
}
}
}
return VIK_LAYER_TOOL_ACK;
}
-static VikLayerToolFuncStatus selecttool_move (VikLayer *vl, GdkEventButton *event, tool_ed_t *t)
+static VikLayerToolFuncStatus selecttool_move (VikLayer *vl, GdkEventMotion *event, tool_ed_t *t)
{
- /* Only allow selection on primary button */
- if ( event->button == 1 ) {
+ if ( t->vw->select_move ) {
// Don't care about vl here
if ( t->vtl )
if ( vik_layer_get_interface(VIK_LAYER_TRW)->select_move )
- vik_layer_get_interface(VIK_LAYER_TRW)->select_move ( vl, event, t->vvp, t );
+ vik_layer_get_interface(VIK_LAYER_TRW)->select_move ( vl, event, t->vvp, t );
}
+ else
+ // Optional Panning
+ if ( event->state & VIK_MOVE_MODIFIER )
+ vik_window_pan_move ( t->vw, event );
+
return VIK_LAYER_TOOL_ACK;
}
static VikLayerToolFuncStatus selecttool_release (VikLayer *vl, GdkEventButton *event, tool_ed_t *t)
{
- /* Only allow selection on primary button */
- if ( event->button == 1 ) {
+ if ( t->vw->select_move ) {
// Don't care about vl here
if ( t->vtl )
if ( vik_layer_get_interface(VIK_LAYER_TRW)->select_release )
- vik_layer_get_interface(VIK_LAYER_TRW)->select_release ( (VikLayer*)t->vtl, event, t->vvp, t );
+ vik_layer_get_interface(VIK_LAYER_TRW)->select_release ( (VikLayer*)t->vtl, event, t->vvp, t );
}
+
+ if ( event->button == 1 && (event->state & VIK_MOVE_MODIFIER) )
+ vik_window_pan_release ( t->vw, event );
+
+ // Force pan off incase it was on
+ t->vw->pan_move = FALSE;
+ t->vw->pan_x = t->vw->pan_y = -1;
+
+ // End of this select movement
+ t->vw->select_move = FALSE;
+
return VIK_LAYER_TOOL_ACK;
}
draw_update ( vw );
}
-static void full_screen_cb ( GtkAction *a, VikWindow *vw )
-{
- GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/FullScreen" );
- g_assert(check_box);
- gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box));
- if ( state )
- gtk_window_fullscreen ( GTK_WINDOW(vw) );
- else
- gtk_window_unfullscreen ( GTK_WINDOW(vw) );
-}
-
static void draw_zoom_cb ( GtkAction *a, VikWindow *vw )
{
guint what = 128;
if ( action_forward ) {
gtk_action_set_sensitive ( action_forward, vik_viewport_forward_available(vw->viking_vvp) );
}
+
+ toolbar_action_set_sensitive ( vw->viking_vtb, "GoForward", vik_viewport_forward_available(vw->viking_vvp) );
}
/**
#endif /* WINDOWS */
}
+static void toggle_side_panel ( VikWindow *vw )
+{
+ vw->show_side_panel = !vw->show_side_panel;
+ if ( vw->show_side_panel )
+ gtk_widget_show(GTK_WIDGET(vw->viking_vlp));
+ else
+ gtk_widget_hide(GTK_WIDGET(vw->viking_vlp));
+}
+
+static void toggle_full_screen ( VikWindow *vw )
+{
+ vw->show_full_screen = !vw->show_full_screen;
+ if ( vw->show_full_screen )
+ gtk_window_fullscreen ( GTK_WINDOW(vw) );
+ else
+ gtk_window_unfullscreen ( GTK_WINDOW(vw) );
+}
+
+static void toggle_statusbar ( VikWindow *vw )
+{
+ vw->show_statusbar = !vw->show_statusbar;
+ if ( vw->show_statusbar )
+ gtk_widget_show ( GTK_WIDGET(vw->viking_vs) );
+ else
+ gtk_widget_hide ( GTK_WIDGET(vw->viking_vs) );
+}
+
+static void toggle_toolbar ( VikWindow *vw )
+{
+ vw->show_toolbar = !vw->show_toolbar;
+ if ( vw->show_toolbar )
+ gtk_widget_show ( toolbar_get_widget (vw->viking_vtb) );
+ else
+ gtk_widget_hide ( toolbar_get_widget (vw->viking_vtb) );
+}
+
+static void toggle_main_menu ( VikWindow *vw )
+{
+ vw->show_main_menu = !vw->show_main_menu;
+ if ( vw->show_main_menu )
+ gtk_widget_show ( gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu" ) );
+ else
+ gtk_widget_hide ( gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu" ) );
+}
+
+// Only for 'view' toggle menu widgets ATM.
+GtkWidget *get_show_widget_by_name(VikWindow *vw, const gchar *name)
+{
+ g_return_val_if_fail(name != NULL, NULL);
+
+ // ATM only FullScreen is *not* in SetShow path
+ gchar *path;
+ if ( g_strcmp0 ("FullScreen", name ) )
+ path = g_strconcat("/ui/MainMenu/View/SetShow/", name, NULL);
+ else
+ path = g_strconcat("/ui/MainMenu/View/", name, NULL);
+
+ GtkWidget *widget = gtk_ui_manager_get_widget(vw->uim, path);
+ g_free(path);
+
+ return widget;
+}
+
+static void tb_view_side_panel_cb ( GtkAction *a, VikWindow *vw )
+{
+ gboolean next_state = !vw->show_side_panel;
+ GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) );
+ gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) );
+ if ( next_state != menu_state )
+ gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state );
+ else
+ toggle_side_panel ( vw );
+}
+
+static void tb_full_screen_cb ( GtkAction *a, VikWindow *vw )
+{
+ gboolean next_state = !vw->show_full_screen;
+ GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) );
+ gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) );
+ if ( next_state != menu_state )
+ gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state );
+ else
+ toggle_full_screen ( vw );
+}
+
+static void tb_view_statusbar_cb ( GtkAction *a, VikWindow *vw )
+{
+ gboolean next_state = !vw->show_statusbar;
+ GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) );
+ gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) );
+ if ( next_state != menu_state )
+ gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state );
+ else
+ toggle_statusbar ( vw );
+}
+
+static void tb_view_toolbar_cb ( GtkAction *a, VikWindow *vw )
+{
+ gboolean next_state = !vw->show_toolbar;
+ GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) );
+ gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) );
+ if ( next_state != menu_state )
+ gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state );
+ else
+ toggle_toolbar ( vw );
+}
+
+static void tb_view_main_menu_cb ( GtkAction *a, VikWindow *vw )
+{
+ gboolean next_state = !vw->show_main_menu;
+ GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) );
+ gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) );
+ if ( next_state != menu_state )
+ gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state );
+ else
+ toggle_main_menu ( vw );
+}
+
+static void tb_set_draw_scale ( GtkAction *a, VikWindow *vw )
+{
+ gboolean next_state = !vik_viewport_get_draw_scale ( vw->viking_vvp );
+ GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) );
+ gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) );
+ if ( next_state != menu_state )
+ gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state );
+ else {
+ vik_viewport_set_draw_scale ( vw->viking_vvp, next_state );
+ draw_update ( vw );
+ }
+}
+
+static void tb_set_draw_centermark ( GtkAction *a, VikWindow *vw )
+{
+ gboolean next_state = !vik_viewport_get_draw_centermark ( vw->viking_vvp );
+ GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) );
+ gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) );
+ if ( next_state != menu_state )
+ gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state );
+ else {
+ vik_viewport_set_draw_centermark ( vw->viking_vvp, next_state );
+ draw_update ( vw );
+ }
+}
+
+static void tb_set_draw_highlight ( GtkAction *a, VikWindow *vw )
+{
+ gboolean next_state = !vik_viewport_get_draw_highlight ( vw->viking_vvp );
+ GtkWidget *check_box = get_show_widget_by_name ( vw, gtk_action_get_name(a) );
+ gboolean menu_state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) );
+ if ( next_state != menu_state )
+ gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), next_state );
+ else {
+ vik_viewport_set_draw_highlight ( vw->viking_vvp, next_state );
+ draw_update ( vw );
+ }
+}
+
static void help_about_cb ( GtkAction *a, VikWindow *vw )
{
a_dialog_about(GTK_WINDOW(vw));
g_free ( msg );
}
+static void back_forward_info_cb ( GtkAction *a, VikWindow *vw )
+{
+ vik_viewport_show_centers ( vw->viking_vvp, GTK_WINDOW(vw) );
+}
+
static void menu_delete_layer_cb ( GtkAction *a, VikWindow *vw )
{
if ( vik_layers_panel_get_selected ( vw->viking_vlp ) )
a_dialog_info_msg ( GTK_WINDOW(vw), _("You must select a layer to delete.") );
}
+static void full_screen_cb ( GtkAction *a, VikWindow *vw )
+{
+ gboolean next_state = !vw->show_full_screen;
+ GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, gtk_action_get_name(a) );
+ if ( tbutton ) {
+ gboolean tb_state = gtk_toggle_tool_button_get_active ( tbutton );
+ if ( next_state != tb_state )
+ gtk_toggle_tool_button_set_active ( tbutton, next_state );
+ else
+ toggle_full_screen ( vw );
+ }
+ else
+ toggle_full_screen ( vw );
+}
+
static void view_side_panel_cb ( GtkAction *a, VikWindow *vw )
{
- GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewSidePanel" );
- g_assert(check_box);
- gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box));
- if ( state )
- gtk_widget_show(GTK_WIDGET(vw->viking_vlp));
+ gboolean next_state = !vw->show_side_panel;
+ GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, gtk_action_get_name(a) );
+ if ( tbutton ) {
+ gboolean tb_state = gtk_toggle_tool_button_get_active ( tbutton );
+ if ( next_state != tb_state )
+ gtk_toggle_tool_button_set_active ( tbutton, next_state );
+ else
+ toggle_side_panel ( vw );
+ }
else
- gtk_widget_hide(GTK_WIDGET(vw->viking_vlp));
+ toggle_side_panel ( vw );
}
static void view_statusbar_cb ( GtkAction *a, VikWindow *vw )
{
- GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewStatusBar" );
- if ( !check_box )
- return;
- gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) );
- if ( state )
- gtk_widget_show ( GTK_WIDGET(vw->viking_vs) );
+ gboolean next_state = !vw->show_statusbar;
+ GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, gtk_action_get_name(a) );
+ if ( tbutton ) {
+ gboolean tb_state = gtk_toggle_tool_button_get_active ( tbutton );
+ if ( next_state != tb_state )
+ gtk_toggle_tool_button_set_active ( tbutton, next_state );
+ else
+ toggle_statusbar ( vw );
+ }
else
- gtk_widget_hide ( GTK_WIDGET(vw->viking_vs) );
+ toggle_statusbar ( vw );
}
static void view_toolbar_cb ( GtkAction *a, VikWindow *vw )
{
- GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewToolbar" );
- if ( !check_box )
- return;
- gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) );
- if ( state )
- gtk_widget_show ( GTK_WIDGET(vw->toolbar) );
+ gboolean next_state = !vw->show_toolbar;
+ GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, gtk_action_get_name(a) );
+ if ( tbutton ) {
+ gboolean tb_state = gtk_toggle_tool_button_get_active ( tbutton );
+ if ( next_state != tb_state )
+ gtk_toggle_tool_button_set_active ( tbutton, next_state );
+ else
+ toggle_toolbar ( vw );
+ }
else
- gtk_widget_hide ( GTK_WIDGET(vw->toolbar) );
+ toggle_toolbar ( vw );
}
static void view_main_menu_cb ( GtkAction *a, VikWindow *vw )
{
- GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ViewMainMenu" );
- if ( !check_box )
- return;
- gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box) );
- if ( !state )
- gtk_widget_hide ( gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu" ) );
+ gboolean next_state = !vw->show_main_menu;
+ GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, gtk_action_get_name(a) );
+ if ( tbutton ) {
+ gboolean tb_state = gtk_toggle_tool_button_get_active ( tbutton );
+ if ( next_state != tb_state )
+ gtk_toggle_tool_button_set_active ( tbutton, next_state );
+ else
+ toggle_main_menu ( vw );
+ }
else
- gtk_widget_show ( gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu" ) );
+ toggle_toolbar ( vw );
}
/***************************************
gtk_action_activate ( gtk_action_group_get_action ( vw->action_group, vik_layer_get_interface(layer_id)->tools[tool_id].radioActionEntry.name ) );
}
-/* this function gets called whenever a toolbar tool is clicked */
-static void menu_tool_cb ( GtkAction *old, GtkAction *a, VikWindow *vw )
+// Be careful with usage - as it may trigger actions being continually alternately by the menu and toolbar items
+// DON'T Use this from menu callback with toggle toolbar items!!
+static void toolbar_sync ( VikWindow *vw, const gchar *name, gboolean state )
{
+ GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, name );
+ if ( tbutton ) {
+ // Causes toggle signal action to be raised.
+ gtk_toggle_tool_button_set_active ( tbutton, state );
+ }
+}
+
+/* this function gets called whenever a menu is clicked */
+// Note old is not used
+static void menu_cb ( GtkAction *old, GtkAction *a, VikWindow *vw )
+{
+ // Ensure Toolbar kept in sync
+ const gchar *name = gtk_action_get_name(a);
+ toolbar_sync ( vw, name, TRUE );
+
/* White Magic, my friends ... White Magic... */
gint tool_id;
- toolbox_activate(vw->vt, gtk_action_get_name(a));
+ toolbox_activate(vw->vt, name);
- vw->viewport_cursor = (GdkCursor *)toolbox_get_cursor(vw->vt, gtk_action_get_name(a));
+ vw->viewport_cursor = (GdkCursor *)toolbox_get_cursor(vw->vt, name);
if ( gtk_widget_get_window(GTK_WIDGET(vw->viking_vvp)) )
/* We set cursor, even if it is NULL: it resets to default */
gdk_window_set_cursor ( gtk_widget_get_window(GTK_WIDGET(vw->viking_vvp)), vw->viewport_cursor );
- if (!strcmp(gtk_action_get_name(a), "Pan")) {
+ if (!g_strcmp0(name, "Pan")) {
vw->current_tool = TOOL_PAN;
}
- else if (!strcmp(gtk_action_get_name(a), "Zoom")) {
+ else if (!g_strcmp0(name, "Zoom")) {
vw->current_tool = TOOL_ZOOM;
}
- else if (!strcmp(gtk_action_get_name(a), "Ruler")) {
+ else if (!g_strcmp0(name, "Ruler")) {
vw->current_tool = TOOL_RULER;
}
- else if (!strcmp(gtk_action_get_name(a), "Select")) {
+ else if (!g_strcmp0(name, "Select")) {
vw->current_tool = TOOL_SELECT;
}
else {
VikLayerTypeEnum layer_id;
for (layer_id=0; layer_id<VIK_LAYER_NUM_TYPES; layer_id++) {
for ( tool_id = 0; tool_id < vik_layer_get_interface(layer_id)->tools_count; tool_id++ ) {
- if (!strcmp(vik_layer_get_interface(layer_id)->tools[tool_id].radioActionEntry.name, gtk_action_get_name(a))) {
+ if (!g_strcmp0(vik_layer_get_interface(layer_id)->tools[tool_id].radioActionEntry.name, name)) {
vw->current_tool = TOOL_LAYER;
vw->tool_layer_id = layer_id;
vw->tool_tool_id = tool_id;
vw->only_updating_coord_mode_ui = FALSE;
vik_layers_panel_change_coord_mode ( vw->viking_vlp, vik_viewport_get_coord_mode ( vw->viking_vvp ) );
-
- mode_button = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowScale" );
- g_assert ( mode_button );
- gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(mode_button),vik_viewport_get_draw_scale(vw->viking_vvp) );
- mode_button = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowCenterMark" );
- g_assert ( mode_button );
- gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(mode_button),vik_viewport_get_draw_centermark(vw->viking_vvp) );
-
- mode_button = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowHighlight" );
- g_assert ( mode_button );
- gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(mode_button),vik_viewport_get_draw_highlight (vw->viking_vvp) );
+ // Slightly long winded methods to align loaded viewport settings with the UI
+ // Since the rewrite for toolbar + menu actions
+ // there no longer exists a simple way to directly change the UI to a value for toggle settings
+ // it only supports toggling the existing setting (otherwise get infinite loops in trying to align tb+menu elements)
+ // Thus get state, compare them, if different then invert viewport setting and (re)sync the setting (via toggling)
+ gboolean vp_state_scale = vik_viewport_get_draw_scale ( vw->viking_vvp );
+ gboolean ui_state_scale = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(get_show_widget_by_name(vw, "ShowScale")) );
+ if ( vp_state_scale != ui_state_scale ) {
+ vik_viewport_set_draw_scale ( vw->viking_vvp, !vp_state_scale );
+ toggle_draw_scale ( NULL, vw );
+ }
+ gboolean vp_state_centermark = vik_viewport_get_draw_centermark ( vw->viking_vvp );
+ gboolean ui_state_centermark = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(get_show_widget_by_name(vw, "ShowCenterMark")) );
+ if ( vp_state_centermark != ui_state_centermark ) {
+ vik_viewport_set_draw_centermark ( vw->viking_vvp, !vp_state_centermark );
+ toggle_draw_centermark ( NULL, vw );
+ }
+ gboolean vp_state_highlight = vik_viewport_get_draw_highlight ( vw->viking_vvp );
+ gboolean ui_state_highlight = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(get_show_widget_by_name(vw, "ShowHighlight")) );
+ if ( vp_state_highlight != ui_state_highlight ) {
+ vik_viewport_set_draw_highlight ( vw->viking_vvp, !vp_state_highlight );
+ toggle_draw_highlight ( NULL, vw );
+ }
}
// NB No break, carry on to redraw
//case LOAD_TYPE_OTHER_SUCCESS:
g_critical("Houston, we've had a problem.");
return;
}
-
- if ( ! vw->open_dia )
- {
- vw->open_dia = gtk_file_chooser_dialog_new (_("Please select a GPS data file to open. "),
- GTK_WINDOW(vw),
- GTK_FILE_CHOOSER_ACTION_OPEN,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
- NULL);
- gchar *cwd = g_get_current_dir();
- if ( cwd ) {
- gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER(vw->open_dia), cwd );
- g_free ( cwd );
- }
- GtkFileFilter *filter;
- // NB file filters are listed this way for alphabetical ordering
+ GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Please select a GPS data file to open. "),
+ GTK_WINDOW(vw),
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+ NULL);
+ if ( last_folder_files_uri )
+ gtk_file_chooser_set_current_folder_uri ( GTK_FILE_CHOOSER(dialog), last_folder_files_uri );
+
+ GtkFileFilter *filter;
+ // NB file filters are listed this way for alphabetical ordering
#ifdef VIK_CONFIG_GEOCACHES
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name( filter, _("Geocaching") );
- gtk_file_filter_add_pattern ( filter, "*.loc" ); // No MIME type available
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vw->open_dia), filter);
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name( filter, _("Geocaching") );
+ gtk_file_filter_add_pattern ( filter, "*.loc" ); // No MIME type available
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
#endif
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name( filter, _("Google Earth") );
- gtk_file_filter_add_mime_type ( filter, "application/vnd.google-earth.kml+xml");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vw->open_dia), filter);
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name( filter, _("GPX") );
- gtk_file_filter_add_pattern ( filter, "*.gpx" ); // No MIME type available
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vw->open_dia), filter);
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name ( filter, _("JPG") );
- gtk_file_filter_add_mime_type ( filter, "image/jpeg");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vw->open_dia), filter);
-
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name( filter, _("Viking") );
- gtk_file_filter_add_pattern ( filter, "*.vik" );
- gtk_file_filter_add_pattern ( filter, "*.viking" );
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vw->open_dia), filter);
-
- // NB could have filters for gpspoint (*.gps,*.gpsoint?) + gpsmapper (*.gsm,*.gpsmapper?)
- // However assume this are barely used and thus not worthy of inclusion
- // as they'll just make the options too many and have no clear file pattern
- // one can always use the all option
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name( filter, _("All") );
- gtk_file_filter_add_pattern ( filter, "*" );
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vw->open_dia), filter);
- // Default to any file - same as before open filters were added
- gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(vw->open_dia), filter);
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name( filter, _("Google Earth") );
+ gtk_file_filter_add_mime_type ( filter, "application/vnd.google-earth.kml+xml");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name( filter, _("GPX") );
+ gtk_file_filter_add_pattern ( filter, "*.gpx" ); // No MIME type available
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name ( filter, _("JPG") );
+ gtk_file_filter_add_mime_type ( filter, "image/jpeg");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name( filter, _("Viking") );
+ gtk_file_filter_add_pattern ( filter, "*.vik" );
+ gtk_file_filter_add_pattern ( filter, "*.viking" );
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
+
+ // NB could have filters for gpspoint (*.gps,*.gpsoint?) + gpsmapper (*.gsm,*.gpsmapper?)
+ // However assume this are barely used and thus not worthy of inclusion
+ // as they'll just make the options too many and have no clear file pattern
+ // one can always use the all option
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name( filter, _("All") );
+ gtk_file_filter_add_pattern ( filter, "*" );
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
+ // Default to any file - same as before open filters were added
+ gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog), filter);
+
+ gtk_file_chooser_set_select_multiple ( GTK_FILE_CHOOSER(dialog), TRUE );
+ gtk_window_set_transient_for ( GTK_WINDOW(dialog), GTK_WINDOW(vw) );
+ gtk_window_set_destroy_with_parent ( GTK_WINDOW(dialog), TRUE );
- gtk_file_chooser_set_select_multiple ( GTK_FILE_CHOOSER(vw->open_dia), TRUE );
- gtk_window_set_transient_for ( GTK_WINDOW(vw->open_dia), GTK_WINDOW(vw) );
- gtk_window_set_destroy_with_parent ( GTK_WINDOW(vw->open_dia), TRUE );
- }
- if ( gtk_dialog_run ( GTK_DIALOG(vw->open_dia) ) == GTK_RESPONSE_ACCEPT )
+ if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT )
{
- gtk_widget_hide ( vw->open_dia );
+ g_free ( last_folder_files_uri );
+ last_folder_files_uri = gtk_file_chooser_get_current_folder_uri ( GTK_FILE_CHOOSER(dialog) );
+
#ifdef VIKING_PROMPT_IF_MODIFIED
if ( (vw->modified || vw->filename) && newwindow )
#else
if ( vw->filename && newwindow )
#endif
- g_signal_emit ( G_OBJECT(vw), window_signals[VW_OPENWINDOW_SIGNAL], 0, gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER(vw->open_dia) ) );
+ g_signal_emit ( G_OBJECT(vw), window_signals[VW_OPENWINDOW_SIGNAL], 0, gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER(dialog) ) );
else {
- files = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER(vw->open_dia) );
+
+ files = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER(dialog) );
gboolean change_fn = newwindow && (g_slist_length(files)==1); /* only change fn if one file */
gboolean first_vik_file = TRUE;
cur_file = files;
g_slist_free (files);
}
}
- else
- gtk_widget_hide ( vw->open_dia );
+ gtk_widget_destroy ( dialog );
}
static gboolean save_file_as ( GtkAction *a, VikWindow *vw )
{
gboolean rv = FALSE;
const gchar *fn;
- if ( ! vw->save_dia )
- {
- vw->save_dia = gtk_file_chooser_dialog_new (_("Save as Viking File."),
- GTK_WINDOW(vw),
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
- NULL);
- gchar *cwd = g_get_current_dir();
- if ( cwd ) {
- gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER(vw->save_dia), cwd );
- g_free ( cwd );
- }
- GtkFileFilter *filter;
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name( filter, _("All") );
- gtk_file_filter_add_pattern ( filter, "*" );
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vw->save_dia), filter);
+ GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Save as Viking File."),
+ GTK_WINDOW(vw),
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+ NULL);
+ if ( last_folder_files_uri )
+ gtk_file_chooser_set_current_folder_uri ( GTK_FILE_CHOOSER(dialog), last_folder_files_uri );
+
+ GtkFileFilter *filter;
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name( filter, _("All") );
+ gtk_file_filter_add_pattern ( filter, "*" );
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
+
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name( filter, _("Viking") );
+ gtk_file_filter_add_pattern ( filter, "*.vik" );
+ gtk_file_filter_add_pattern ( filter, "*.viking" );
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(dialog), filter);
+ // Default to a Viking file
+ gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog), filter);
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name( filter, _("Viking") );
- gtk_file_filter_add_pattern ( filter, "*.vik" );
- gtk_file_filter_add_pattern ( filter, "*.viking" );
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER(vw->save_dia), filter);
- // Default to a Viking file
- gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(vw->save_dia), filter);
+ gtk_window_set_transient_for ( GTK_WINDOW(dialog), GTK_WINDOW(vw) );
+ gtk_window_set_destroy_with_parent ( GTK_WINDOW(dialog), TRUE );
- gtk_window_set_transient_for ( GTK_WINDOW(vw->save_dia), GTK_WINDOW(vw) );
- gtk_window_set_destroy_with_parent ( GTK_WINDOW(vw->save_dia), TRUE );
- }
// Auto append / replace extension with '.vik' to the suggested file name as it's going to be a Viking File
gchar* auto_save_name = g_strdup ( window_get_filename ( vw ) );
if ( ! a_file_check_ext ( auto_save_name, ".vik" ) )
auto_save_name = g_strconcat ( auto_save_name, ".vik", NULL );
- gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(vw->save_dia), auto_save_name);
+ gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER(dialog), auto_save_name);
- while ( gtk_dialog_run ( GTK_DIALOG(vw->save_dia) ) == GTK_RESPONSE_ACCEPT )
+ while ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT )
{
- fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(vw->save_dia) );
- if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE || a_dialog_yes_or_no ( GTK_WINDOW(vw->save_dia), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) )
+ fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog) );
+ if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) == FALSE || a_dialog_yes_or_no ( GTK_WINDOW(dialog), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) )
{
window_set_filename ( vw, fn );
rv = window_save ( vw );
- vw->modified = FALSE;
+ if ( rv ) {
+ vw->modified = FALSE;
+ g_free ( last_folder_files_uri );
+ last_folder_files_uri = gtk_file_chooser_get_current_folder_uri ( GTK_FILE_CHOOSER(dialog) );
+ }
break;
}
}
g_free ( auto_save_name );
- gtk_widget_hide ( vw->save_dia );
+ gtk_widget_destroy ( dialog );
return rv;
}
// Ensure TZ Lookup initialized
if ( a_vik_get_time_ref_frame() == VIK_TIME_REF_WORLD )
vu_setup_lat_lon_tz_lookup();
+
+ toolbar_apply_settings ( vw->viking_vtb, vw->main_vbox, vw->menu_hbox, TRUE );
}
static void default_location_cb ( GtkAction *a, VikWindow *vw )
if ( one_image_only )
{
// Single file
- if (!vw->save_img_dia) {
- vw->save_img_dia = gtk_file_chooser_dialog_new (_("Save Image"),
- GTK_WINDOW(vw),
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
- NULL);
-
- gchar *cwd = g_get_current_dir();
- if ( cwd ) {
- gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER(vw->save_img_dia), cwd );
- g_free ( cwd );
- }
+ GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Save Image"),
+ GTK_WINDOW(vw),
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+ NULL);
+ if ( last_folder_images_uri )
+ gtk_file_chooser_set_current_folder_uri ( GTK_FILE_CHOOSER(dialog), last_folder_images_uri );
+
+ GtkFileChooser *chooser = GTK_FILE_CHOOSER ( dialog );
+ /* Add filters */
+ GtkFileFilter *filter;
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name ( filter, _("All") );
+ gtk_file_filter_add_pattern ( filter, "*" );
+ gtk_file_chooser_add_filter ( chooser, filter );
- GtkFileChooser *chooser = GTK_FILE_CHOOSER ( vw->save_img_dia );
- /* Add filters */
- GtkFileFilter *filter;
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name ( filter, _("All") );
- gtk_file_filter_add_pattern ( filter, "*" );
- gtk_file_chooser_add_filter ( chooser, filter );
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name ( filter, _("JPG") );
+ gtk_file_filter_add_mime_type ( filter, "image/jpeg");
+ gtk_file_chooser_add_filter ( chooser, filter );
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name ( filter, _("JPG") );
- gtk_file_filter_add_mime_type ( filter, "image/jpeg");
- gtk_file_chooser_add_filter ( chooser, filter );
+ if ( !vw->draw_image_save_as_png )
+ gtk_file_chooser_set_filter ( chooser, filter );
- if ( !vw->draw_image_save_as_png )
- gtk_file_chooser_set_filter ( chooser, filter );
+ filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name ( filter, _("PNG") );
+ gtk_file_filter_add_mime_type ( filter, "image/png");
+ gtk_file_chooser_add_filter ( chooser, filter );
- filter = gtk_file_filter_new ();
- gtk_file_filter_set_name ( filter, _("PNG") );
- gtk_file_filter_add_mime_type ( filter, "image/png");
- gtk_file_chooser_add_filter ( chooser, filter );
+ if ( vw->draw_image_save_as_png )
+ gtk_file_chooser_set_filter ( chooser, filter );
- if ( vw->draw_image_save_as_png )
- gtk_file_chooser_set_filter ( chooser, filter );
+ gtk_window_set_transient_for ( GTK_WINDOW(dialog), GTK_WINDOW(vw) );
+ gtk_window_set_destroy_with_parent ( GTK_WINDOW(dialog), TRUE );
- gtk_window_set_transient_for ( GTK_WINDOW(vw->save_img_dia), GTK_WINDOW(vw) );
- gtk_window_set_destroy_with_parent ( GTK_WINDOW(vw->save_img_dia), TRUE );
- }
+ if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) {
+ g_free ( last_folder_images_uri );
+ last_folder_images_uri = gtk_file_chooser_get_current_folder_uri ( GTK_FILE_CHOOSER(dialog) );
- if ( gtk_dialog_run ( GTK_DIALOG(vw->save_img_dia) ) == GTK_RESPONSE_ACCEPT ) {
- fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(vw->save_img_dia) );
+ fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog) );
if ( g_file_test ( fn, G_FILE_TEST_EXISTS ) )
- if ( ! a_dialog_yes_or_no ( GTK_WINDOW(vw->save_img_dia), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) )
- fn = NULL;
+ if ( ! a_dialog_yes_or_no ( GTK_WINDOW(dialog), _("The file \"%s\" exists, do you wish to overwrite it?"), a_file_basename ( fn ) ) )
+ fn = NULL;
}
- gtk_widget_hide ( vw->save_img_dia );
+ gtk_widget_destroy ( dialog );
}
else {
// A directory
return fn;
}
- if (!vw->save_img_dir_dia) {
- vw->save_img_dir_dia = gtk_file_chooser_dialog_new (_("Choose a directory to hold images"),
- GTK_WINDOW(vw),
- GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
- NULL);
- gtk_window_set_transient_for ( GTK_WINDOW(vw->save_img_dir_dia), GTK_WINDOW(vw) );
- gtk_window_set_destroy_with_parent ( GTK_WINDOW(vw->save_img_dir_dia), TRUE );
+ GtkWidget *dialog = gtk_file_chooser_dialog_new (_("Choose a directory to hold images"),
+ GTK_WINDOW(vw),
+ GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+ NULL);
+ gtk_window_set_transient_for ( GTK_WINDOW(dialog), GTK_WINDOW(vw) );
+ gtk_window_set_destroy_with_parent ( GTK_WINDOW(dialog), TRUE );
+
+ if ( gtk_dialog_run ( GTK_DIALOG(dialog) ) == GTK_RESPONSE_ACCEPT ) {
+ fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog) );
}
-
- if ( gtk_dialog_run ( GTK_DIALOG(vw->save_img_dir_dia) ) == GTK_RESPONSE_ACCEPT ) {
- fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(vw->save_img_dir_dia) );
- }
- gtk_widget_hide ( vw->save_img_dir_dia );
+ gtk_widget_destroy ( dialog );
}
return fn;
}
/* really a misnomer: changes coord mode (actual coordinates) AND/OR draw mode (viewport only) */
static void window_change_coord_mode_cb ( GtkAction *old_a, GtkAction *a, VikWindow *vw )
{
+ const gchar *name = gtk_action_get_name(a);
+ GtkToggleToolButton *tbutton = (GtkToggleToolButton *)toolbar_get_widget_by_name ( vw->viking_vtb, name );
+ if ( tbutton )
+ gtk_toggle_tool_button_set_active ( tbutton, TRUE );
+
VikViewportDrawMode drawmode;
- if (!strcmp(gtk_action_get_name(a), "ModeUTM")) {
+ if (!g_strcmp0(name, "ModeUTM")) {
drawmode = VIK_VIEWPORT_DRAWMODE_UTM;
}
- else if (!strcmp(gtk_action_get_name(a), "ModeLatLon")) {
+ else if (!g_strcmp0(name, "ModeLatLon")) {
drawmode = VIK_VIEWPORT_DRAWMODE_LATLON;
}
- else if (!strcmp(gtk_action_get_name(a), "ModeExpedia")) {
+ else if (!g_strcmp0(name, "ModeExpedia")) {
drawmode = VIK_VIEWPORT_DRAWMODE_EXPEDIA;
}
- else if (!strcmp(gtk_action_get_name(a), "ModeMercator")) {
+ else if (!g_strcmp0(name, "ModeMercator")) {
drawmode = VIK_VIEWPORT_DRAWMODE_MERCATOR;
}
else {
}
}
-static void set_draw_scale ( GtkAction *a, VikWindow *vw )
+static void toggle_draw_scale ( GtkAction *a, VikWindow *vw )
{
+ gboolean state = !vik_viewport_get_draw_scale ( vw->viking_vvp );
GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowScale" );
- g_assert(check_box);
- gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box));
+ if ( !check_box )
+ return;
+ gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), state );
vik_viewport_set_draw_scale ( vw->viking_vvp, state );
draw_update ( vw );
}
-static void set_draw_centermark ( GtkAction *a, VikWindow *vw )
+static void toggle_draw_centermark ( GtkAction *a, VikWindow *vw )
{
+ gboolean state = !vik_viewport_get_draw_centermark ( vw->viking_vvp );
GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowCenterMark" );
- g_assert(check_box);
- gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box));
+ if ( !check_box )
+ return;
+ gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), state );
vik_viewport_set_draw_centermark ( vw->viking_vvp, state );
draw_update ( vw );
}
-static void set_draw_highlight ( GtkAction *a, VikWindow *vw )
+static void toggle_draw_highlight ( GtkAction *a, VikWindow *vw )
{
+ gboolean state = !vik_viewport_get_draw_highlight ( vw->viking_vvp );
GtkWidget *check_box = gtk_ui_manager_get_widget ( vw->uim, "/ui/MainMenu/View/SetShow/ShowHighlight" );
- g_assert(check_box);
- gboolean state = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM(check_box));
- vik_viewport_set_draw_highlight ( vw->viking_vvp, state );
+ if ( !check_box )
+ return;
+ gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM(check_box), state );
+ vik_viewport_set_draw_highlight ( vw->viking_vvp, state );
draw_update ( vw );
}
}
-
/***********************************************************************************************
** GUI Creation
***********************************************************************************************/
static GtkActionEntry debug_entries[] = {
{ "MapCacheInfo", NULL, "_Map Cache Info", NULL, NULL, (GCallback)help_cache_info_cb },
+ { "BackForwardInfo", NULL, "_Back/Forward Info", NULL, NULL, (GCallback)back_forward_info_cb },
};
static GtkActionEntry entries_gpsbabel[] = {
};
/* Radio items */
-/* FIXME use VIEWPORT_DRAWMODE values */
static GtkRadioActionEntry mode_entries[] = {
- { "ModeUTM", NULL, N_("_UTM Mode"), "<control>u", NULL, 0 },
- { "ModeExpedia", NULL, N_("_Expedia Mode"), "<control>e", NULL, 1 },
- { "ModeMercator", NULL, N_("_Mercator Mode"), "<control>m", NULL, 4 },
- { "ModeLatLon", NULL, N_("Lat_/Lon Mode"), "<control>l", NULL, 5 },
+ { "ModeUTM", NULL, N_("_UTM Mode"), "<control>u", NULL, VIK_VIEWPORT_DRAWMODE_UTM },
+ { "ModeExpedia", NULL, N_("_Expedia Mode"), "<control>e", NULL, VIK_VIEWPORT_DRAWMODE_EXPEDIA },
+ { "ModeMercator", NULL, N_("_Mercator Mode"), "<control>m", NULL, VIK_VIEWPORT_DRAWMODE_MERCATOR },
+ { "ModeLatLon", NULL, N_("Lat_/Lon Mode"), "<control>l", NULL, VIK_VIEWPORT_DRAWMODE_LATLON },
};
static GtkToggleActionEntry toggle_entries[] = {
- { "ShowScale", NULL, N_("Show _Scale"), "<shift>F5", N_("Show Scale"), (GCallback)set_draw_scale, TRUE },
- { "ShowCenterMark", NULL, N_("Show _Center Mark"), "F6", N_("Show Center Mark"), (GCallback)set_draw_centermark, TRUE },
- { "ShowHighlight", GTK_STOCK_UNDERLINE, N_("Show _Highlight"), "F7", N_("Show Highlight"), (GCallback)set_draw_highlight, TRUE },
+ { "ShowScale", NULL, N_("Show _Scale"), "<shift>F5", N_("Show Scale"), (GCallback)toggle_draw_scale, TRUE },
+ { "ShowCenterMark", NULL, N_("Show _Center Mark"), "F6", N_("Show Center Mark"), (GCallback)toggle_draw_centermark, TRUE },
+ { "ShowHighlight", GTK_STOCK_UNDERLINE, N_("Show _Highlight"), "F7", N_("Show Highlight"), (GCallback)toggle_draw_highlight, TRUE },
{ "FullScreen", GTK_STOCK_FULLSCREEN, N_("_Full Screen"), "F11", N_("Activate full screen mode"), (GCallback)full_screen_cb, FALSE },
{ "ViewSidePanel", GTK_STOCK_INDEX, N_("Show Side _Panel"), "F9", N_("Show Side Panel"), (GCallback)view_side_panel_cb, TRUE },
{ "ViewStatusBar", NULL, N_("Show Status_bar"), "F12", N_("Show Statusbar"), (GCallback)view_statusbar_cb, TRUE },
{ "ViewMainMenu", NULL, N_("Show _Menu"), "F4", N_("Show Menu"), (GCallback)view_main_menu_cb, TRUE },
};
+// This must match the toggle entries order above
+static gpointer toggle_entries_toolbar_cb[] = {
+ (GCallback)tb_set_draw_scale,
+ (GCallback)tb_set_draw_centermark,
+ (GCallback)tb_set_draw_highlight,
+ (GCallback)tb_full_screen_cb,
+ (GCallback)tb_view_side_panel_cb,
+ (GCallback)tb_view_statusbar_cb,
+ (GCallback)tb_view_toolbar_cb,
+ (GCallback)tb_view_main_menu_cb,
+};
+
#include "menu.xml.h"
static void window_create_ui( VikWindow *window )
{
toolbox_add_tool(window->vt, &pan_tool, TOOL_LAYER_TYPE_NONE);
toolbox_add_tool(window->vt, &select_tool, TOOL_LAYER_TYPE_NONE);
+ toolbar_action_tool_entry_register ( window->viking_vtb, &pan_tool.radioActionEntry );
+ toolbar_action_tool_entry_register ( window->viking_vtb, &zoom_tool.radioActionEntry );
+ toolbar_action_tool_entry_register ( window->viking_vtb, &ruler_tool.radioActionEntry );
+ toolbar_action_tool_entry_register ( window->viking_vtb, &select_tool.radioActionEntry );
+
error = NULL;
if (!(mid = gtk_ui_manager_add_ui_from_string (uim, menu_xml, -1, &error))) {
g_error_free (error);
gtk_action_group_add_radio_actions (action_group, mode_entries, G_N_ELEMENTS (mode_entries), 4, (GCallback)window_change_coord_mode_cb, window);
if ( vik_debug ) {
if ( gtk_ui_manager_add_ui_from_string ( uim,
- "<ui><menubar name='MainMenu'><menu action='Help'><menuitem action='MapCacheInfo'/></menu></menubar></ui>",
+ "<ui><menubar name='MainMenu'><menu action='Help'>"
+ "<menuitem action='MapCacheInfo'/>"
+ "<menuitem action='BackForwardInfo'/>"
+ "</menu></menubar></ui>",
-1, NULL ) ) {
gtk_action_group_add_actions (action_group, debug_entries, G_N_ELEMENTS (debug_entries), window);
}
}
+ for ( i=0; i < G_N_ELEMENTS (entries); i++ ) {
+ if ( entries[i].callback )
+ toolbar_action_entry_register ( window->viking_vtb, &entries[i] );
+ }
+
+ if ( G_N_ELEMENTS (toggle_entries) != G_N_ELEMENTS (toggle_entries_toolbar_cb) ) {
+ g_print ( "Broken entries definitions\n" );
+ exit (1);
+ }
+ for ( i=0; i < G_N_ELEMENTS (toggle_entries); i++ ) {
+ if ( toggle_entries_toolbar_cb[i] )
+ toolbar_action_toggle_entry_register ( window->viking_vtb, &toggle_entries[i], toggle_entries_toolbar_cb[i] );
+ }
+
+ for ( i=0; i < G_N_ELEMENTS (mode_entries); i++ ) {
+ toolbar_action_mode_entry_register ( window->viking_vtb, &mode_entries[i] );
+ }
// Use this to see if GPSBabel is available:
if ( a_babel_available () ) {
if ( vik_layer_get_interface(i)->tools_count ) {
gtk_ui_manager_add_ui(uim, mid, "/ui/MainMenu/Tools/", vik_layer_get_interface(i)->name, NULL, GTK_UI_MANAGER_SEPARATOR, FALSE);
- gtk_ui_manager_add_ui(uim, mid, "/ui/MainToolbar/ToolItems/", vik_layer_get_interface(i)->name, NULL, GTK_UI_MANAGER_SEPARATOR, FALSE);
}
// Further tool copying for to apply to the UI, also apply menu UI setup
vik_layer_get_interface(i)->tools[j].radioActionEntry.label,
vik_layer_get_interface(i)->tools[j].radioActionEntry.name,
GTK_UI_MANAGER_MENUITEM, FALSE);
- gtk_ui_manager_add_ui(uim, mid, "/ui/MainToolbar/ToolItems",
- vik_layer_get_interface(i)->tools[j].radioActionEntry.label,
- vik_layer_get_interface(i)->tools[j].radioActionEntry.name,
- GTK_UI_MANAGER_TOOLITEM, FALSE);
toolbox_add_tool(window->vt, &(vik_layer_get_interface(i)->tools[j]), i);
+ toolbar_action_tool_entry_register ( window->viking_vtb, &(vik_layer_get_interface(i)->tools[j].radioActionEntry) );
*radio = vik_layer_get_interface(i)->tools[j].radioActionEntry;
// Overwrite with actual number to use
}
g_object_unref (icon_factory);
- gtk_action_group_add_radio_actions(action_group, tools, ntools, 0, (GCallback)menu_tool_cb, window);
+ gtk_action_group_add_radio_actions(action_group, tools, ntools, 0, (GCallback)menu_cb, window);
g_free(tools);
gtk_ui_manager_insert_action_group (uim, action_group, 0);
return need_redraw;
}
+/**
+ * May return NULL if the window no longer exists
+ */
GThread *vik_window_get_thread ( VikWindow *vw )
{
- return vw->thread;
+ if ( vw )
+ return vw->thread;
+ return NULL;
}