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.