#endif
#include "viking.h"
+#include "settings.h"
#include <string.h>
enum {
VLP_UPDATE_SIGNAL,
+ VLP_DELETE_LAYER_SIGNAL,
VLP_LAST_SIGNAL
};
parent_class = g_type_class_peek_parent (klass);
layers_panel_signals[VLP_UPDATE_SIGNAL] = g_signal_new ( "update", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VikLayersPanelClass, update), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+ layers_panel_signals[VLP_DELETE_LAYER_SIGNAL] = g_signal_new ( "delete_layer", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (VikLayersPanelClass, update), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
}
VikLayersPanel *vik_layers_panel_new ()
/**
* Create menu popup on demand
+ * @full: offer cut/copy options as well - not just the new layer options
*/
-static GtkWidget* layers_panel_create_popup ( VikLayersPanel *vlp )
+static GtkWidget* layers_panel_create_popup ( VikLayersPanel *vlp, gboolean full )
{
GtkWidget *menu = gtk_menu_new ();
GtkWidget *menuitem;
guint ii;
- for ( ii = 0; ii < G_N_ELEMENTS(entries); ii++ ) {
- if ( entries[ii].stock_id ) {
- menuitem = gtk_image_menu_item_new_with_mnemonic ( entries[ii].label );
- gtk_image_menu_item_set_image ( (GtkImageMenuItem*)menuitem, gtk_image_new_from_stock (entries[ii].stock_id, GTK_ICON_SIZE_MENU) );
- }
- else
- menuitem = gtk_menu_item_new_with_mnemonic ( entries[ii].label );
+ if ( full ) {
+ for ( ii = 0; ii < G_N_ELEMENTS(entries); ii++ ) {
+ if ( entries[ii].stock_id ) {
+ menuitem = gtk_image_menu_item_new_with_mnemonic ( entries[ii].label );
+ gtk_image_menu_item_set_image ( (GtkImageMenuItem*)menuitem, gtk_image_new_from_stock (entries[ii].stock_id, GTK_ICON_SIZE_MENU) );
+ }
+ else
+ menuitem = gtk_menu_item_new_with_mnemonic ( entries[ii].label );
- g_signal_connect_swapped ( G_OBJECT(menuitem), "activate", G_CALLBACK(entries[ii].callback), vlp );
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
- gtk_widget_show ( menuitem );
+ g_signal_connect_swapped ( G_OBJECT(menuitem), "activate", G_CALLBACK(entries[ii].callback), vlp );
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
+ gtk_widget_show ( menuitem );
+ }
}
GtkWidget *submenu = gtk_menu_new();
vik_layer_rename ( VIK_LAYER(vlp->toplayer), _("Top Layer"));
g_signal_connect_swapped ( G_OBJECT(vlp->toplayer), "update", G_CALLBACK(vik_layers_panel_emit_update), vlp );
- vik_treeview_add_layer ( vlp->vt, NULL, &(vlp->toplayer_iter), VIK_LAYER(vlp->toplayer)->name, NULL, TRUE, vlp->toplayer, VIK_LAYER_AGGREGATE, VIK_LAYER_AGGREGATE );
+ vik_treeview_add_layer ( vlp->vt, NULL, &(vlp->toplayer_iter), VIK_LAYER(vlp->toplayer)->name, NULL, TRUE, vlp->toplayer, VIK_LAYER_AGGREGATE, VIK_LAYER_AGGREGATE, 0 );
vik_layer_realize ( VIK_LAYER(vlp->toplayer), vlp->vt, &(vlp->toplayer_iter) );
g_signal_connect_swapped ( vlp->vt, "popup_menu", G_CALLBACK(menu_popup_cb), vlp);
pasteimage = gtk_image_new_from_stock ( GTK_STOCK_PASTE, GTK_ICON_SIZE_SMALL_TOOLBAR );
pastebutton = gtk_button_new ( );
gtk_container_add ( GTK_CONTAINER(pastebutton),pasteimage );
- gtk_widget_set_tooltip_text ( GTK_WIDGET(pastebutton), _("Paste layer below selected layer"));
+ gtk_widget_set_tooltip_text ( GTK_WIDGET(pastebutton), _("Paste layer into selected container layer or otherwise above selected layer"));
gtk_box_pack_start ( GTK_BOX(hbox), pastebutton, TRUE, TRUE, 0 );
g_signal_connect_swapped ( G_OBJECT(pastebutton), "clicked", G_CALLBACK(vik_layers_panel_paste_selected), vlp );
void vik_layers_panel_emit_update ( VikLayersPanel *vlp )
{
+ GThread *thread = vik_window_get_thread (VIK_WINDOW(VIK_GTK_WINDOW_FROM_WIDGET(vlp)));
+ if ( !thread )
+ // Do nothing
+ return;
+
// Only ever draw when there is time to do so
- if ( g_thread_self() != vik_window_get_thread (VIK_WINDOW(VIK_GTK_WINDOW_FROM_WIDGET(vlp))) )
+ if ( g_thread_self() != thread )
// Drawing requested from another (background) thread, so handle via the gdk thread method
gdk_threads_add_idle ( (GSourceFunc) idle_draw_panel, vlp );
else
VikLayer *layer = VIK_LAYER(vik_treeview_item_get_pointer ( vlp->vt, iter ));
if ( layer->type == VIK_LAYER_AGGREGATE )
- menu = GTK_MENU ( layers_panel_create_popup ( vlp ) );
+ menu = GTK_MENU ( layers_panel_create_popup ( vlp, TRUE ) );
else
{
GtkWidget *del, *prop;
gtk_menu_shell_append (GTK_MENU_SHELL (menu), del);
gtk_widget_show ( del );
}
-
- vik_layer_add_menu_items ( layer, menu, vlp );
- }
+ }
+ vik_layer_add_menu_items ( layer, menu, vlp );
}
else
{
}
else
{
- menu = GTK_MENU ( layers_panel_create_popup ( vlp ) );
+ menu = GTK_MENU ( layers_panel_create_popup ( vlp, FALSE ) );
}
gtk_menu_popup ( menu, NULL, NULL, NULL, NULL, mouse_button, gtk_get_current_event_time() );
}
layers_popup ( vlp, NULL, 0 );
}
+#define VIK_SETTINGS_LAYERS_TRW_CREATE_DEFAULT "layers_create_trw_auto_default"
/**
* vik_layers_panel_new_layer:
* @type: type of the new layer
{
VikLayer *l;
g_assert ( vlp->vvp );
- l = vik_layer_create ( type, vlp->vvp, VIK_GTK_WINDOW_FROM_WIDGET(vlp), TRUE );
+ gboolean ask_user = FALSE;
+ if ( type == VIK_LAYER_TRW )
+ a_settings_get_boolean ( VIK_SETTINGS_LAYERS_TRW_CREATE_DEFAULT, &ask_user );
+ ask_user = !ask_user;
+ l = vik_layer_create ( type, vlp->vvp, ask_user );
if ( l )
{
vik_layers_panel_add_layer ( vlp, l );
a_clipboard_copy_selected ( vlp );
if (IS_VIK_AGGREGATE_LAYER(parent)) {
- if ( vik_aggregate_layer_delete ( parent, &iter ) )
- vik_layers_panel_emit_update ( vlp );
+
+ g_signal_emit ( G_OBJECT(vlp), layers_panel_signals[VLP_DELETE_LAYER_SIGNAL], 0 );
+
+ if ( vik_aggregate_layer_delete ( parent, &iter ) )
+ vik_layers_panel_emit_update ( vlp );
}
}
else
vik_viewport_set_trigger ( vlp->vvp, NULL );
if (IS_VIK_AGGREGATE_LAYER(parent)) {
+
+ g_signal_emit ( G_OBJECT(vlp), layers_panel_signals[VLP_DELETE_LAYER_SIGNAL], 0 );
+
if ( vik_aggregate_layer_delete ( parent, &iter ) )
vik_layers_panel_emit_update ( vlp );
}
void vik_layers_panel_clear ( VikLayersPanel *vlp )
{
- if ( (! vik_aggregate_layer_is_empty(vlp->toplayer)) && a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), _("Are you sure you wish to delete all layers?"), NULL ) )
+ if ( (! vik_aggregate_layer_is_empty(vlp->toplayer)) && a_dialog_yes_or_no ( VIK_GTK_WINDOW_FROM_WIDGET(vlp), _("Are you sure you wish to delete all layers?"), NULL ) ) {
+ g_signal_emit ( G_OBJECT(vlp), layers_panel_signals[VLP_DELETE_LAYER_SIGNAL], 0 );
vik_aggregate_layer_clear ( vlp->toplayer ); /* simply deletes all layers */
+ }
}
void vik_layers_panel_change_coord_mode ( VikLayersPanel *vlp, VikCoordMode mode )