[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55655] trunk/blender/source/blender: fix [#34804] Only timeline_markers[0] is selectable if multiple markers at same frame

Campbell Barton ideasman42 at gmail.com
Thu Mar 28 21:58:15 CET 2013


Revision: 55655
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55655
Author:   campbellbarton
Date:     2013-03-28 20:58:14 +0000 (Thu, 28 Mar 2013)
Log Message:
-----------
fix [#34804] Only timeline_markers[0] is selectable if multiple markers at same frame

also add macros for looping on listbases as if they were circular lists which is handy for cycling over items.

Modified Paths:
--------------
    trunk/blender/source/blender/blenlib/BLI_listbase.h
    trunk/blender/source/blender/editors/animation/anim_markers.c

Modified: trunk/blender/source/blender/blenlib/BLI_listbase.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_listbase.h	2013-03-28 20:34:12 UTC (rev 55654)
+++ trunk/blender/source/blender/blenlib/BLI_listbase.h	2013-03-28 20:58:14 UTC (rev 55655)
@@ -75,6 +75,37 @@
 /* create a generic list node containing link to provided data */
 struct LinkData *BLI_genericNodeN(void *data);
 
+/**
+ * Does a full loop on the list, with any value acting as first
+ * (handy for cycling items)
+ *
+ * \code{.c}
+ *
+ * LISTBASE_CIRCULAR_FORWARD_BEGIN (listbase, item, item_init) {
+ *     ...operate on marker...
+ * }
+ * LISTBASE_CIRCULAR_FORWARD_END (listbase, item, item_init);
+ *
+ * \endcode
+ */
+#define LISTBASE_CIRCULAR_FORWARD_BEGIN(lb, lb_iter, lb_init) \
+if ((lb)->first && (lb_init || (lb_init = (lb)->first))) { \
+	lb_iter = lb_init; \
+	do {
+#define LISTBASE_CIRCULAR_FORWARD_END(lb, lb_iter, lb_init) \
+	} while ((lb_iter  = (lb_iter)->next ? (lb_iter)->next : (lb)->first), \
+	         (lb_iter != lb_init)); \
+}
+
+#define LISTBASE_CIRCULAR_BACKWARD_BEGIN(lb, lb_iter, lb_init) \
+if ((lb)->last && (lb_init || (lb_init = (lb)->last))) { \
+	lb_iter = lb_init; \
+	do {
+#define LISTBASE_CIRCULAR_BACKWARD_END(lb, lb_iter, lb_init) \
+	} while ((lb_iter  = (lb_iter)->prev ? (lb_iter)->prev : (lb)->last), \
+	         (lb_iter != lb_init)); \
+}
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/blender/source/blender/editors/animation/anim_markers.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_markers.c	2013-03-28 20:34:12 UTC (rev 55654)
+++ trunk/blender/source/blender/editors/animation/anim_markers.c	2013-03-28 20:58:14 UTC (rev 55655)
@@ -1017,24 +1017,35 @@
 /* ************************** selection ************************************/
 
 /* select/deselect TimeMarker at current frame */
-static void select_timeline_marker_frame(ListBase *markers, int frame, unsigned char shift)
+static void select_timeline_marker_frame(ListBase *markers, int frame, bool extend)
 {
-	TimeMarker *marker;
-	int select = 0;
-	
+	TimeMarker *marker, *marker_first = NULL;
+
+	/* support for selection cycling */
 	for (marker = markers->first; marker; marker = marker->next) {
-		/* if Shift is not set, then deselect Markers */
-		if (!shift) marker->flag &= ~SELECT;
-		
-		/* this way a not-shift select will allways give 1 selected marker */
-		if ((marker->frame == frame) && (!select)) {
-			if (marker->flag & SELECT) 
-				marker->flag &= ~SELECT;
-			else
-				marker->flag |= SELECT;
-			select = 1;
+		if (marker->frame == frame) {
+			if (marker->flag & SELECT) {
+				marker_first = marker->next;
+				break;
+			}
 		}
 	}
+
+	/* if extend is not set, then deselect markers */
+	if (extend == false) {
+		for (marker = markers->first; marker; marker = marker->next) {
+			marker->flag &= ~SELECT;
+		}
+	}
+
+	LISTBASE_CIRCULAR_FORWARD_BEGIN (markers, marker, marker_first) {
+		/* this way a not-extend select will allways give 1 selected marker */
+		if (marker->frame == frame) {
+			marker->flag ^= SELECT;
+			break;
+		}
+	}
+	LISTBASE_CIRCULAR_FORWARD_END (markers, marker, marker_first);
 }
 
 static int ed_marker_select(bContext *C, const wmEvent *event, bool extend, bool camera)




More information about the Bf-blender-cvs mailing list