282 |
|
|
283 |
printf("remove relation #%ld\n", sel->id); |
printf("remove relation #%ld\n", sel->id); |
284 |
|
|
285 |
int members = 0; |
gint members = osm_relation_members_num(sel); |
|
member_t *member = sel->member; |
|
|
while(member) { |
|
|
members++; |
|
|
member = member->next; |
|
|
} |
|
286 |
|
|
287 |
if(members) |
if(members) |
288 |
if(!yes_no_f(context->dialog, NULL, 0, 0, |
if(!yes_no_f(context->dialog, NULL, 0, 0, |
556 |
RELATION_NUM_COLS |
RELATION_NUM_COLS |
557 |
}; |
}; |
558 |
|
|
559 |
|
static relation_t *get_selected_relation(relation_context_t *context) { |
560 |
|
GtkTreeSelection *selection; |
561 |
|
GtkTreeModel *model; |
562 |
|
GtkTreeIter iter; |
563 |
|
|
564 |
|
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(context->view)); |
565 |
|
if(gtk_tree_selection_get_selected(selection, &model, &iter)) { |
566 |
|
relation_t *relation; |
567 |
|
gtk_tree_model_get(model, &iter, RELATION_COL_DATA, &relation, -1); |
568 |
|
return(relation); |
569 |
|
} |
570 |
|
return NULL; |
571 |
|
} |
572 |
|
|
573 |
static void relation_list_selected(relation_context_t *context, |
static void relation_list_selected(relation_context_t *context, |
574 |
gboolean selected) { |
relation_t *selected) { |
575 |
|
|
576 |
if(context->but_members) |
if(context->but_members) |
577 |
gtk_widget_set_sensitive(context->but_members, selected); |
gtk_widget_set_sensitive(context->but_members, |
578 |
|
(selected != NULL) && (selected->member != NULL)); |
579 |
|
|
580 |
|
if(context->but_remove) |
581 |
|
gtk_widget_set_sensitive(context->but_remove, selected != NULL); |
582 |
|
if(context->but_edit) |
583 |
|
gtk_widget_set_sensitive(context->but_edit, selected != NULL); |
584 |
} |
} |
585 |
|
|
586 |
static gboolean |
static gboolean |
592 |
|
|
593 |
if(gtk_tree_model_get_iter(model, &iter, path)) { |
if(gtk_tree_model_get_iter(model, &iter, path)) { |
594 |
g_assert(gtk_tree_path_get_depth(path) == 1); |
g_assert(gtk_tree_path_get_depth(path) == 1); |
595 |
relation_list_selected(context, TRUE); |
|
596 |
|
relation_t *relation = NULL; |
597 |
|
gtk_tree_model_get(model, &iter, RELATION_COL_DATA, &relation, -1); |
598 |
|
relation_list_selected(context, relation); |
599 |
} |
} |
600 |
|
|
601 |
return TRUE; /* allow selection state to change */ |
return TRUE; /* allow selection state to change */ |
602 |
} |
} |
603 |
|
|
|
static relation_t *get_selected_relation(relation_context_t *context) { |
|
|
GtkTreeSelection *selection; |
|
|
GtkTreeModel *model; |
|
|
GtkTreeIter iter; |
|
|
|
|
|
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(context->view)); |
|
|
if(gtk_tree_selection_get_selected(selection, &model, &iter)) { |
|
|
relation_t *relation; |
|
|
gtk_tree_model_get(model, &iter, RELATION_COL_DATA, &relation, -1); |
|
|
return(relation); |
|
|
} |
|
|
return NULL; |
|
|
} |
|
|
|
|
604 |
typedef struct { |
typedef struct { |
605 |
relation_t *relation; |
relation_t *relation; |
606 |
GtkWidget *dialog, *view; |
GtkWidget *dialog, *view; |
772 |
g_free(mcontext); |
g_free(mcontext); |
773 |
} |
} |
774 |
|
|
775 |
|
static void on_relation_add(GtkWidget *but, relation_context_t *context) { |
776 |
|
/* create a new relation */ |
777 |
|
|
778 |
|
relation_t *relation = osm_relation_new(); |
779 |
|
if(!info_dialog(context->dialog, context->appdata, relation)) { |
780 |
|
printf("tag edit cancelled\n"); |
781 |
|
osm_relation_free(relation); |
782 |
|
} else { |
783 |
|
osm_relation_attach(context->appdata->osm, relation); |
784 |
|
|
785 |
|
/* append a row for the new data */ |
786 |
|
/* try to find something descriptive */ |
787 |
|
|
788 |
|
char *id = g_strdup_printf("#%ld", relation->id); |
789 |
|
|
790 |
|
/* try to find something descriptive */ |
791 |
|
char *name = osm_tag_get_by_key(relation->tag, "name"); |
792 |
|
if(!name) name = osm_tag_get_by_key(relation->tag, "ref"); |
793 |
|
|
794 |
|
char *num = g_strdup_printf("%d", osm_relation_members_num(relation)); |
795 |
|
|
796 |
|
/* Append a row and fill in some data */ |
797 |
|
GtkTreeIter iter; |
798 |
|
gtk_list_store_append(context->store, &iter); |
799 |
|
gtk_list_store_set(context->store, &iter, |
800 |
|
RELATION_COL_ID, id, |
801 |
|
RELATION_COL_TYPE, |
802 |
|
osm_tag_get_by_key(relation->tag, "type"), |
803 |
|
RELATION_COL_NAME, name, |
804 |
|
RELATION_COL_MEMBERS, num, |
805 |
|
RELATION_COL_DATA, relation, |
806 |
|
-1); |
807 |
|
|
808 |
|
g_free(id); |
809 |
|
g_free(num); |
810 |
|
|
811 |
|
gtk_tree_selection_select_iter(gtk_tree_view_get_selection( |
812 |
|
GTK_TREE_VIEW(context->view)), &iter); |
813 |
|
|
814 |
|
/* scroll to end */ |
815 |
|
// GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(); |
816 |
|
/* xyz */ |
817 |
|
} |
818 |
|
} |
819 |
|
|
820 |
|
/* user clicked "edit..." button in relation list */ |
821 |
|
static void on_relation_edit(GtkWidget *but, relation_context_t *context) { |
822 |
|
relation_t *sel = get_selected_relation(context); |
823 |
|
if(!sel) return; |
824 |
|
|
825 |
|
printf("edit relation #%ld\n", sel->id); |
826 |
|
|
827 |
|
info_dialog(context->dialog, context->appdata, sel); |
828 |
|
} |
829 |
|
|
830 |
|
/* remove the selected relation */ |
831 |
|
static void on_relation_remove(GtkWidget *but, relation_context_t *context) { |
832 |
|
relation_t *sel = get_selected_relation(context); |
833 |
|
if(!sel) return; |
834 |
|
|
835 |
|
printf("remove relation #%ld\n", sel->id); |
836 |
|
|
837 |
|
gint members = osm_relation_members_num(sel); |
838 |
|
|
839 |
|
if(members) |
840 |
|
if(!yes_no_f(context->dialog, NULL, 0, 0, |
841 |
|
_("Delete non-empty relation?"), |
842 |
|
_("This relation still has %d members. " |
843 |
|
"Delete it anyway?"), members)) |
844 |
|
return; |
845 |
|
|
846 |
|
/* first remove selected row from list */ |
847 |
|
GtkTreeIter iter; |
848 |
|
GtkTreeSelection *selection = |
849 |
|
gtk_tree_view_get_selection(GTK_TREE_VIEW(context->view)); |
850 |
|
if(gtk_tree_selection_get_selected(selection, NULL, &iter)) |
851 |
|
gtk_list_store_remove(context->store, &iter); |
852 |
|
|
853 |
|
/* then really delete it */ |
854 |
|
osm_relation_delete(context->appdata->osm, sel, FALSE); |
855 |
|
|
856 |
|
relation_list_selected(context, NULL); |
857 |
|
} |
858 |
|
|
859 |
static GtkWidget *relation_list_widget(relation_context_t *context) { |
static GtkWidget *relation_list_widget(relation_context_t *context) { |
860 |
GtkWidget *vbox = gtk_vbox_new(FALSE,3); |
GtkWidget *vbox = gtk_vbox_new(FALSE,3); |
861 |
context->view = gtk_tree_view_new(); |
context->view = gtk_tree_view_new(); |
941 |
GtkWidget *hbox = gtk_hbox_new(TRUE,3); |
GtkWidget *hbox = gtk_hbox_new(TRUE,3); |
942 |
|
|
943 |
context->but_add = gtk_button_new_with_label(_("Add...")); |
context->but_add = gtk_button_new_with_label(_("Add...")); |
|
gtk_widget_set_sensitive(context->but_add, FALSE); |
|
944 |
gtk_box_pack_start_defaults(GTK_BOX(hbox), context->but_add); |
gtk_box_pack_start_defaults(GTK_BOX(hbox), context->but_add); |
945 |
// gtk_signal_connect(GTK_OBJECT(context->but_add), "clicked", |
gtk_signal_connect(GTK_OBJECT(context->but_add), "clicked", |
946 |
// GTK_SIGNAL_FUNC(on_relation_add), context); |
GTK_SIGNAL_FUNC(on_relation_add), context); |
947 |
|
|
948 |
context->but_edit = gtk_button_new_with_label(_("Edit...")); |
context->but_edit = gtk_button_new_with_label(_("Edit...")); |
949 |
gtk_widget_set_sensitive(context->but_edit, FALSE); |
gtk_widget_set_sensitive(context->but_edit, FALSE); |
950 |
gtk_box_pack_start_defaults(GTK_BOX(hbox), context->but_edit); |
gtk_box_pack_start_defaults(GTK_BOX(hbox), context->but_edit); |
951 |
// gtk_signal_connect(GTK_OBJECT(context->but_edit), "clicked", |
gtk_signal_connect(GTK_OBJECT(context->but_edit), "clicked", |
952 |
// GTK_SIGNAL_FUNC(on_relation_edit), context); |
GTK_SIGNAL_FUNC(on_relation_edit), context); |
953 |
|
|
954 |
context->but_members = gtk_button_new_with_label(_("Members...")); |
context->but_members = gtk_button_new_with_label(_("Members...")); |
955 |
gtk_box_pack_start_defaults(GTK_BOX(hbox), context->but_members); |
gtk_box_pack_start_defaults(GTK_BOX(hbox), context->but_members); |
959 |
context->but_remove = gtk_button_new_with_label(_("Remove")); |
context->but_remove = gtk_button_new_with_label(_("Remove")); |
960 |
gtk_widget_set_sensitive(context->but_remove, FALSE); |
gtk_widget_set_sensitive(context->but_remove, FALSE); |
961 |
gtk_box_pack_start_defaults(GTK_BOX(hbox), context->but_remove); |
gtk_box_pack_start_defaults(GTK_BOX(hbox), context->but_remove); |
962 |
// gtk_signal_connect(GTK_OBJECT(context->but_remove), "clicked", |
gtk_signal_connect(GTK_OBJECT(context->but_remove), "clicked", |
963 |
// GTK_SIGNAL_FUNC(on_relation_remove), context); |
GTK_SIGNAL_FUNC(on_relation_remove), context); |
964 |
|
|
965 |
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
966 |
|
|
967 |
relation_list_selected(context, FALSE); |
relation_list_selected(context, NULL); |
968 |
|
|
969 |
return vbox; |
return vbox; |
970 |
} |
} |