/* public API for getting markers from "animation" context */ ListBase *ED_animcontext_get_markers(const bAnimContext *ac) { if (ac) return context_get_markers(ac->scene, ac->sa); else return NULL; }
static int ed_marker_select(bContext *C, wmEvent *evt, int extend) { ListBase *markers= context_get_markers(C); View2D *v2d= UI_view2d_fromcontext(C); float viewx; int x, y, cfra; if(markers == NULL) return OPERATOR_PASS_THROUGH; x= evt->x - CTX_wm_region(C)->winrct.xmin; y= evt->y - CTX_wm_region(C)->winrct.ymin; UI_view2d_region_to_view(v2d, x, y, &viewx, NULL); cfra= ED_markers_find_nearest_marker_time(markers, viewx); if (extend) select_timeline_marker_frame(markers, cfra, 1); else select_timeline_marker_frame(markers, cfra, 0); WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL); /* allowing tweaks */ return OPERATOR_PASS_THROUGH; }
static int ed_marker_select_all_exec(bContext *C, wmOperator *op) { ListBase *markers= context_get_markers(C); TimeMarker *marker; int select= RNA_int_get(op->ptr, "select_type"); if(markers == NULL) return OPERATOR_CANCELLED; if(RNA_boolean_get(op->ptr, "select_swap")) { for(marker= markers->first; marker; marker= marker->next) { if(marker->flag & SELECT) break; } if(marker) select= 0; else select= 1; } for(marker= markers->first; marker; marker= marker->next) { if(select) marker->flag |= SELECT; else marker->flag &= ~SELECT; } WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL); return OPERATOR_FINISHED; }
/* duplicate selected TimeMarkers */ static void ed_marker_duplicate_apply(bContext *C, wmOperator *op) { ListBase *markers= context_get_markers(C); TimeMarker *marker, *newmarker; if (markers == NULL) return; /* go through the list of markers, duplicate selected markers and add duplicated copies * to the begining of the list (unselect original markers) */ for (marker= markers->first; marker; marker= marker->next) { if (marker->flag & SELECT) { /* unselect selected marker */ marker->flag &= ~SELECT; /* create and set up new marker */ newmarker = MEM_callocN(sizeof(TimeMarker), "TimeMarker"); newmarker->flag= SELECT; newmarker->frame= marker->frame; BLI_strncpy(newmarker->name, marker->name, sizeof(marker->name)); /* new marker is added to the begining of list */ BLI_addhead(markers, newmarker); } } }
/* return 0 if not OK */ static int ed_marker_move_init(bContext *C, wmOperator *op) { ListBase *markers= context_get_markers(C); MarkerMove *mm; TimeMarker *marker; int totmark=0; int a; if(markers == NULL) return 0; for (marker= markers->first; marker; marker= marker->next) if (marker->flag & SELECT) totmark++; if (totmark==0) return 0; op->customdata= mm= MEM_callocN(sizeof(MarkerMove), "Markermove"); mm->slink= CTX_wm_space_data(C); mm->markers= markers; mm->oldframe= MEM_callocN(totmark*sizeof(int), "MarkerMove oldframe"); for (a=0, marker= markers->first; marker; marker= marker->next) { if (marker->flag & SELECT) { mm->oldframe[a]= marker->frame; a++; } } return 1; }
/* add TimeMarker at curent frame */ static int ed_marker_add(bContext *C, wmOperator *op) { ListBase *markers= context_get_markers(C); TimeMarker *marker; int frame= CTX_data_scene(C)->r.cfra; if (markers == NULL) return OPERATOR_CANCELLED; /* two markers can't be at the same place */ for (marker= markers->first; marker; marker= marker->next) { if (marker->frame == frame) return OPERATOR_CANCELLED; } /* deselect all */ for(marker= markers->first; marker; marker= marker->next) marker->flag &= ~SELECT; marker = MEM_callocN(sizeof(TimeMarker), "TimeMarker"); marker->flag= SELECT; marker->frame= frame; sprintf(marker->name, "Frame %d", frame); // XXX - temp code only BLI_addtail(markers, marker); WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL); return OPERATOR_FINISHED; }
static int ed_marker_border_select_exec(bContext *C, wmOperator *op) { View2D *v2d= UI_view2d_fromcontext(C); ListBase *markers= context_get_markers(C); TimeMarker *marker; float xminf, xmaxf, yminf, ymaxf; int event_type= RNA_int_get(op->ptr, "event_type"); int xmin= RNA_int_get(op->ptr, "xmin"); int xmax= RNA_int_get(op->ptr, "xmax"); int ymin= RNA_int_get(op->ptr, "ymin"); int ymax= RNA_int_get(op->ptr, "ymax"); UI_view2d_region_to_view(v2d, xmin, ymin, &xminf, &yminf); UI_view2d_region_to_view(v2d, xmax, ymax, &xmaxf, &ymaxf); /* XXX disputable */ if(yminf > 30.0f || ymaxf < 0.0f) return 0; if(markers == NULL) return 0; /* XXX marker context */ for(marker= markers->first; marker; marker= marker->next) { if ((marker->frame > xminf) && (marker->frame <= xmaxf)) { /* XXX weak... */ switch (event_type) { case LEFTMOUSE: if ((marker->flag & SELECT) == 0) marker->flag |= SELECT; break; case RIGHTMOUSE: if (marker->flag & SELECT) marker->flag &= ~SELECT; break; } } } WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL); return 1; }
/* Draw Scene-Markers in time window */ void draw_markers_time(const bContext *C, int flag) { ListBase *markers= context_get_markers(C); View2D *v2d= UI_view2d_fromcontext(C); TimeMarker *marker; if (markers == NULL) return; /* unselected markers are drawn at the first time */ for (marker= markers->first; marker; marker= marker->next) { if ((marker->flag & SELECT) == 0) draw_marker(v2d, marker, CTX_data_scene(C)->r.cfra, flag); } /* selected markers are drawn later */ for (marker= markers->first; marker; marker= marker->next) { if (marker->flag & SELECT) draw_marker(v2d, marker, CTX_data_scene(C)->r.cfra, flag); } }
/* remove selected TimeMarkers */ static int ed_marker_delete_exec(bContext *C, wmOperator *op) { ListBase *markers= context_get_markers(C); TimeMarker *marker, *nmarker; short changed= 0; if(markers == NULL) return OPERATOR_CANCELLED; for(marker= markers->first; marker; marker= nmarker) { nmarker= marker->next; if(marker->flag & SELECT) { BLI_freelinkN(markers, marker); changed= 1; } } if (changed) WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL); return OPERATOR_FINISHED; }
/* public API for getting markers from context */ ListBase *ED_context_get_markers(const bContext *C) { return context_get_markers(CTX_data_scene(C), CTX_wm_area(C)); }