56e08dec28f452488f1a5794efd06a8d8aacfde1
tdreszer
  Fri Sep 30 14:25:27 2011 -0700
Changes to fix redmine 4892 composite/view/subtrack inconsistency.
diff --git src/hg/inc/trackDb.h src/hg/inc/trackDb.h
index 263624b..545264a 100644
--- src/hg/inc/trackDb.h
+++ src/hg/inc/trackDb.h
@@ -77,30 +77,31 @@
 #define PARENT_MASK                      0xF0
 #define CHILD_MASK                       0x0F
 #define TREETYPE_MASK                    0xFF
 #define PARENT_NODE(nodeType)            ((nodeType) & PARENT_MASK)
 #define CHILD_NODE(nodeType)             ((nodeType) & CHILD_MASK)
 #define FOLDER_NODE(nodeType)            ((nodeType) & FOLDER_MASK)
 #define COMPOSITE_NODE(nodeType)         ((nodeType) & COMPOSITE_MASK)
 #define MULTI_TRACK_NODE(nodeType)       ((nodeType) & MULTI_TRACK_MASK)
 #define CONTAINER_NODE(nodeType)         ((nodeType) & (MULTI_TRACK_MASK | COMPOSITE_MASK))
 #define FOLDER_CHILD_NODE(nodeType)      ((nodeType) & FOLDER_CHILD_MASK)
 #define COMPOSITE_CHILD_NODE(nodeType)   ((nodeType) & COMPOSITE_CHILD_MASK)
 #define COMPOSITE_VIEW_NODE(nodeType)    ((nodeType) & COMPOSITE_VIEW_MASK)
 #define MULTI_TRACK_CHILD_NODE(nodeType) ((nodeType) & MULTI_TRACK_CHILD_MASK)
 #define CONTAINER_CHILD_NODE(nodeType)   ((nodeType) & (MULTI_TRACK_CHILD_MASK | COMPOSITE_CHILD_MASK))
 #define INDEPENDENT_NODE(nodeType)      (((nodeType) & TREETYPE_MASK ) == 0 )
+#define SOLO_NODE(nodeType)             (((nodeType) & TREETYPE_MASK) <= FOLDER_CHILD_MASK)
 //#define tdbIsParent(tdb)              ((tdb)->subtracks)
 //#define tdbIsChild(tdb)               ((tdb)->parent   )
 //#define tdbIsTreeLeaf(tdb)            ( CHILD_NODE((tdb)->treeNodeType) && !tdbIsParent(tdb))
 //#define tdbIsTreeRoot(tdb)            (PARENT_NODE((tdb)->treeNodeType) && !tdbIsChild(tdb) )
 //#define tdbIsTreeBranch(tdb)          (!INDEPENDENT_NODE((tdb)->treeNodeType) &&  tdbIsParent(tdb) &&  tdbIsChild(tdb))
 //#define tdbIsNotInTree(tdb)           ( INDEPENDENT_NODE((tdb)->treeNodeType) && !tdbIsParent(tdb) && !tdbIsChild(tdb))
 
 // --- Folders are superTracks.  Currently only one level deep
 INLINE void tdbMarkAsFolder(struct trackDb *tdb)
 // Marks a trackDb struct as a supertrack
 {
 tdb->treeNodeType |= FOLDER_MASK;
 }
 #define tdbMarkAsSuperTrack(tdb) tdbMarkAsFolder(tdb)
 
@@ -234,30 +235,42 @@
 // Is this trackDb struct marked as a child of a composite or multiTrack ?
 {
 return tdb && tdb->parent && CONTAINER_CHILD_NODE(tdb->treeNodeType);
 }
 #define tdbIsSubtrack(tdb) tdbIsContainerChild(tdb)
 
 INLINE struct trackDb *tdbGetContainer(struct trackDb *tdb)
 // Return closest ancestor who is a container track.
 {
 struct trackDb *parent = tdb->parent;
 for ( ; parent != NULL && !tdbIsContainer(parent); parent = parent->parent)
      ;
 return parent;
 }
 
+// Solo (or stand alone) tracks are non-containers which may only be contained by folders
+INLINE boolean tdbIsSoloTrack(struct trackDb *tdb)
+// Is this trackDb struct marked as a solo so it should have data
+{
+return tdb && SOLO_NODE(tdb->treeNodeType);
+}
+#define tdbIsStandAlone(tdb) tdbIsSoloTrack(tdb)
+
+// TrackUi Top level means composite, multitrack or solo
+// These are not folders, views or subtracks.
+#define tdbIsTrackUiTopLevel(tdb) (tdbIsContainer(tdb) || tdbIsSoloTrack(tdb))
+
 #define DOWNLOADS_ONLY_TYPE  "downloadsOnly"
 INLINE boolean tdbIsDownloadsOnly(struct trackDb *tdb)
 // Is this a downloadsOnly tdb
 {
 return (tdb && sameWord(tdb->type,DOWNLOADS_ONLY_TYPE));
 }
 
 
 
 struct trackDb *trackDbLoad(char **row);
 /* Load a trackDb from row fetched with select * from trackDb
  * from database.  Dispose of this with trackDbFree(). */
 
 struct trackDb *trackDbLoadAll(char *fileName);
 /* Load all trackDb from whitespace-separated file.