Diff of /trunk/src/relation_edit.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 76 by harbaum, Fri Feb 13 12:02:26 2009 UTC revision 77 by harbaum, Fri Feb 13 20:30:32 2009 UTC
# Line 282  static void on_relation_item_remove(GtkW Line 282  static void on_relation_item_remove(GtkW
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,
# Line 561  enum { Line 556  enum {
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
# Line 577  relation_list_selection_func(GtkTreeSele Line 592  relation_list_selection_func(GtkTreeSele
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;
# Line 768  static void on_relation_members(GtkWidge Line 772  static void on_relation_members(GtkWidge
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();
# Line 853  static GtkWidget *relation_list_widget(r Line 941  static GtkWidget *relation_list_widget(r
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);
# Line 872  static GtkWidget *relation_list_widget(r Line 959  static GtkWidget *relation_list_widget(r
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  }  }

Legend:
Removed from v.76  
changed lines
  Added in v.77