Fossil SCM
Mark closed leaves with an X on the timeline graph.
Commit
57bea365a3e4cc839c3771d5142c0de006f1fc4f534c027abdc49dc39922f6fb
Parent
9b10bf45755514b…
6 files changed
+8
+8
+10
+8
+14
-1
+4
-2
| --- skins/ardoise/css.txt | ||
| +++ skins/ardoise/css.txt | ||
| @@ -1032,10 +1032,18 @@ | ||
| 1032 | 1032 | top: 3px; |
| 1033 | 1033 | left: 3px; |
| 1034 | 1034 | width: 4px; |
| 1035 | 1035 | height: 4px; |
| 1036 | 1036 | background: #bbb |
| 1037 | +} | |
| 1038 | +.tl-node.closed-leaf svg { | |
| 1039 | + position: absolute; | |
| 1040 | + top: 0px; | |
| 1041 | + left: 0px; | |
| 1042 | + width: 10px; | |
| 1043 | + height: 10px; | |
| 1044 | + color: #bbb; | |
| 1037 | 1045 | } |
| 1038 | 1046 | .tl-node.sel:after { |
| 1039 | 1047 | content: ''; |
| 1040 | 1048 | position: absolute; |
| 1041 | 1049 | top: 1px; |
| 1042 | 1050 |
| --- skins/ardoise/css.txt | |
| +++ skins/ardoise/css.txt | |
| @@ -1032,10 +1032,18 @@ | |
| 1032 | top: 3px; |
| 1033 | left: 3px; |
| 1034 | width: 4px; |
| 1035 | height: 4px; |
| 1036 | background: #bbb |
| 1037 | } |
| 1038 | .tl-node.sel:after { |
| 1039 | content: ''; |
| 1040 | position: absolute; |
| 1041 | top: 1px; |
| 1042 |
| --- skins/ardoise/css.txt | |
| +++ skins/ardoise/css.txt | |
| @@ -1032,10 +1032,18 @@ | |
| 1032 | top: 3px; |
| 1033 | left: 3px; |
| 1034 | width: 4px; |
| 1035 | height: 4px; |
| 1036 | background: #bbb |
| 1037 | } |
| 1038 | .tl-node.closed-leaf svg { |
| 1039 | position: absolute; |
| 1040 | top: 0px; |
| 1041 | left: 0px; |
| 1042 | width: 10px; |
| 1043 | height: 10px; |
| 1044 | color: #bbb; |
| 1045 | } |
| 1046 | .tl-node.sel:after { |
| 1047 | content: ''; |
| 1048 | position: absolute; |
| 1049 | top: 1px; |
| 1050 |
| --- skins/darkmode/css.txt | ||
| +++ skins/darkmode/css.txt | ||
| @@ -387,10 +387,18 @@ | ||
| 387 | 387 | top: 3px; |
| 388 | 388 | left: 3px; |
| 389 | 389 | width: 4px; |
| 390 | 390 | height: 4px; |
| 391 | 391 | background: #bbb |
| 392 | +} | |
| 393 | +.tl-node.closed-leaf svg { | |
| 394 | + position: absolute; | |
| 395 | + top: 0px; | |
| 396 | + left: 0px; | |
| 397 | + width: 10px; | |
| 398 | + height: 10px; | |
| 399 | + color: #bbb; | |
| 392 | 400 | } |
| 393 | 401 | .tl-node.sel:after { |
| 394 | 402 | content: ''; |
| 395 | 403 | position: absolute; |
| 396 | 404 | top: 1px; |
| 397 | 405 |
| --- skins/darkmode/css.txt | |
| +++ skins/darkmode/css.txt | |
| @@ -387,10 +387,18 @@ | |
| 387 | top: 3px; |
| 388 | left: 3px; |
| 389 | width: 4px; |
| 390 | height: 4px; |
| 391 | background: #bbb |
| 392 | } |
| 393 | .tl-node.sel:after { |
| 394 | content: ''; |
| 395 | position: absolute; |
| 396 | top: 1px; |
| 397 |
| --- skins/darkmode/css.txt | |
| +++ skins/darkmode/css.txt | |
| @@ -387,10 +387,18 @@ | |
| 387 | top: 3px; |
| 388 | left: 3px; |
| 389 | width: 4px; |
| 390 | height: 4px; |
| 391 | background: #bbb |
| 392 | } |
| 393 | .tl-node.closed-leaf svg { |
| 394 | position: absolute; |
| 395 | top: 0px; |
| 396 | left: 0px; |
| 397 | width: 10px; |
| 398 | height: 10px; |
| 399 | color: #bbb; |
| 400 | } |
| 401 | .tl-node.sel:after { |
| 402 | content: ''; |
| 403 | position: absolute; |
| 404 | top: 1px; |
| 405 |
+10
| --- skins/eagle/css.txt | ||
| +++ skins/eagle/css.txt | ||
| @@ -209,10 +209,20 @@ | ||
| 209 | 209 | left: 3px; |
| 210 | 210 | width: 4px; |
| 211 | 211 | height: 4px; |
| 212 | 212 | background: #fff; |
| 213 | 213 | } |
| 214 | + | |
| 215 | +/* closed leaf commit marker */ | |
| 216 | +.tl-node.closed-leaf svg { | |
| 217 | + position: absolute; | |
| 218 | + top: 0px; | |
| 219 | + left: 0px; | |
| 220 | + width: 10px; | |
| 221 | + height: 10px; | |
| 222 | + color: #fff; | |
| 223 | +} | |
| 214 | 224 | |
| 215 | 225 | /* up arrow */ |
| 216 | 226 | .tl-arrow.u { |
| 217 | 227 | margin-top: -1px; |
| 218 | 228 | border-width: 0 3px; |
| 219 | 229 |
| --- skins/eagle/css.txt | |
| +++ skins/eagle/css.txt | |
| @@ -209,10 +209,20 @@ | |
| 209 | left: 3px; |
| 210 | width: 4px; |
| 211 | height: 4px; |
| 212 | background: #fff; |
| 213 | } |
| 214 | |
| 215 | /* up arrow */ |
| 216 | .tl-arrow.u { |
| 217 | margin-top: -1px; |
| 218 | border-width: 0 3px; |
| 219 |
| --- skins/eagle/css.txt | |
| +++ skins/eagle/css.txt | |
| @@ -209,10 +209,20 @@ | |
| 209 | left: 3px; |
| 210 | width: 4px; |
| 211 | height: 4px; |
| 212 | background: #fff; |
| 213 | } |
| 214 | |
| 215 | /* closed leaf commit marker */ |
| 216 | .tl-node.closed-leaf svg { |
| 217 | position: absolute; |
| 218 | top: 0px; |
| 219 | left: 0px; |
| 220 | width: 10px; |
| 221 | height: 10px; |
| 222 | color: #fff; |
| 223 | } |
| 224 | |
| 225 | /* up arrow */ |
| 226 | .tl-arrow.u { |
| 227 | margin-top: -1px; |
| 228 | border-width: 0 3px; |
| 229 |
+8
| --- src/default.css | ||
| +++ src/default.css | ||
| @@ -117,10 +117,18 @@ | ||
| 117 | 117 | top: 3px; |
| 118 | 118 | left: 3px; |
| 119 | 119 | width: 4px; |
| 120 | 120 | height: 4px; |
| 121 | 121 | background: #000; |
| 122 | +} | |
| 123 | +.tl-node.closed-leaf svg { | |
| 124 | + position: absolute; | |
| 125 | + top: 0px; | |
| 126 | + left: 0px; | |
| 127 | + width: 10px; | |
| 128 | + height: 10px; | |
| 129 | + color: #000; | |
| 122 | 130 | } |
| 123 | 131 | .tl-node.sel:after { |
| 124 | 132 | content: ''; |
| 125 | 133 | position: absolute; |
| 126 | 134 | top: 2px; |
| 127 | 135 |
| --- src/default.css | |
| +++ src/default.css | |
| @@ -117,10 +117,18 @@ | |
| 117 | top: 3px; |
| 118 | left: 3px; |
| 119 | width: 4px; |
| 120 | height: 4px; |
| 121 | background: #000; |
| 122 | } |
| 123 | .tl-node.sel:after { |
| 124 | content: ''; |
| 125 | position: absolute; |
| 126 | top: 2px; |
| 127 |
| --- src/default.css | |
| +++ src/default.css | |
| @@ -117,10 +117,18 @@ | |
| 117 | top: 3px; |
| 118 | left: 3px; |
| 119 | width: 4px; |
| 120 | height: 4px; |
| 121 | background: #000; |
| 122 | } |
| 123 | .tl-node.closed-leaf svg { |
| 124 | position: absolute; |
| 125 | top: 0px; |
| 126 | left: 0px; |
| 127 | width: 10px; |
| 128 | height: 10px; |
| 129 | color: #000; |
| 130 | } |
| 131 | .tl-node.sel:after { |
| 132 | content: ''; |
| 133 | position: absolute; |
| 134 | top: 2px; |
| 135 |
+14
-1
| --- src/graph.js | ||
| +++ src/graph.js | ||
| @@ -389,17 +389,30 @@ | ||
| 389 | 389 | if( p.r<0 ) return; |
| 390 | 390 | if( p.u>0 ) drawUpArrow(p,tx.rowinfo[p.u-tx.iTopRow],p.fg,p.id); |
| 391 | 391 | if( p.sb>0 ) drawDotted(p,tx.rowinfo[p.sb-tx.iTopRow],p.fg,p.id); |
| 392 | 392 | var cls = node.cls; |
| 393 | 393 | if( p.hasOwnProperty('mi') && p.mi.length ) cls += " merge"; |
| 394 | - if( p.f&1 ) cls += " leaf"; | |
| 394 | + if( p.f&2 ) cls += " closed-leaf"; | |
| 395 | + else if( p.f&1 ) cls += " leaf"; | |
| 395 | 396 | var n = drawBox(cls,p.bg,p.x,p.y); |
| 396 | 397 | n.id = "tln"+p.id; |
| 397 | 398 | n.onclick = clickOnNode; |
| 398 | 399 | n.ondblclick = dblclickOnNode; |
| 399 | 400 | n.onmousemove = mouseOverNode; |
| 400 | 401 | n.style.zIndex = 10; |
| 402 | + if( p.f&2 ){ | |
| 403 | + var pt1 = 0; | |
| 404 | + var pt2 = 100; | |
| 405 | + if( tx.circleNodes ){ | |
| 406 | + pt1 = 14; | |
| 407 | + pt2 = 86; | |
| 408 | + } | |
| 409 | + n.innerHTML = "<svg width='100%' height='100%'viewbox='0 0 100 100'>" | |
| 410 | + + `<path d='M ${pt1},${pt1} L ${pt2},${pt2} M ${pt1},${pt2} L ${pt2},${pt1}'` | |
| 411 | + + " stroke='currentcolor' stroke-width='13'/>" | |
| 412 | + + "</svg>"; | |
| 413 | + } | |
| 401 | 414 | if( !tx.omitDescenders ){ |
| 402 | 415 | if( p.u==0 ){ |
| 403 | 416 | if( p.hasOwnProperty('mo') && p.r==p.mo ){ |
| 404 | 417 | var ix = p.hasOwnProperty('cu') ? p.cu : p.mu; |
| 405 | 418 | var top = tx.rowinfo[ix-tx.iTopRow] |
| 406 | 419 |
| --- src/graph.js | |
| +++ src/graph.js | |
| @@ -389,17 +389,30 @@ | |
| 389 | if( p.r<0 ) return; |
| 390 | if( p.u>0 ) drawUpArrow(p,tx.rowinfo[p.u-tx.iTopRow],p.fg,p.id); |
| 391 | if( p.sb>0 ) drawDotted(p,tx.rowinfo[p.sb-tx.iTopRow],p.fg,p.id); |
| 392 | var cls = node.cls; |
| 393 | if( p.hasOwnProperty('mi') && p.mi.length ) cls += " merge"; |
| 394 | if( p.f&1 ) cls += " leaf"; |
| 395 | var n = drawBox(cls,p.bg,p.x,p.y); |
| 396 | n.id = "tln"+p.id; |
| 397 | n.onclick = clickOnNode; |
| 398 | n.ondblclick = dblclickOnNode; |
| 399 | n.onmousemove = mouseOverNode; |
| 400 | n.style.zIndex = 10; |
| 401 | if( !tx.omitDescenders ){ |
| 402 | if( p.u==0 ){ |
| 403 | if( p.hasOwnProperty('mo') && p.r==p.mo ){ |
| 404 | var ix = p.hasOwnProperty('cu') ? p.cu : p.mu; |
| 405 | var top = tx.rowinfo[ix-tx.iTopRow] |
| 406 |
| --- src/graph.js | |
| +++ src/graph.js | |
| @@ -389,17 +389,30 @@ | |
| 389 | if( p.r<0 ) return; |
| 390 | if( p.u>0 ) drawUpArrow(p,tx.rowinfo[p.u-tx.iTopRow],p.fg,p.id); |
| 391 | if( p.sb>0 ) drawDotted(p,tx.rowinfo[p.sb-tx.iTopRow],p.fg,p.id); |
| 392 | var cls = node.cls; |
| 393 | if( p.hasOwnProperty('mi') && p.mi.length ) cls += " merge"; |
| 394 | if( p.f&2 ) cls += " closed-leaf"; |
| 395 | else if( p.f&1 ) cls += " leaf"; |
| 396 | var n = drawBox(cls,p.bg,p.x,p.y); |
| 397 | n.id = "tln"+p.id; |
| 398 | n.onclick = clickOnNode; |
| 399 | n.ondblclick = dblclickOnNode; |
| 400 | n.onmousemove = mouseOverNode; |
| 401 | n.style.zIndex = 10; |
| 402 | if( p.f&2 ){ |
| 403 | var pt1 = 0; |
| 404 | var pt2 = 100; |
| 405 | if( tx.circleNodes ){ |
| 406 | pt1 = 14; |
| 407 | pt2 = 86; |
| 408 | } |
| 409 | n.innerHTML = "<svg width='100%' height='100%'viewbox='0 0 100 100'>" |
| 410 | + `<path d='M ${pt1},${pt1} L ${pt2},${pt2} M ${pt1},${pt2} L ${pt2},${pt1}'` |
| 411 | + " stroke='currentcolor' stroke-width='13'/>" |
| 412 | + "</svg>"; |
| 413 | } |
| 414 | if( !tx.omitDescenders ){ |
| 415 | if( p.u==0 ){ |
| 416 | if( p.hasOwnProperty('mo') && p.r==p.mo ){ |
| 417 | var ix = p.hasOwnProperty('cu') ? p.cu : p.mu; |
| 418 | var top = tx.rowinfo[ix-tx.iTopRow] |
| 419 |
+4
-2
| --- src/timeline.c | ||
| +++ src/timeline.c | ||
| @@ -450,11 +450,12 @@ | ||
| 450 | 450 | nCherrypick++; |
| 451 | 451 | } |
| 452 | 452 | db_reset(&qcherrypick); |
| 453 | 453 | } |
| 454 | 454 | gidx = graph_add_row(pGraph, rid, nParent, nCherrypick, aParent, |
| 455 | - zBr, zBgClr, zUuid, isLeaf); | |
| 455 | + zBr, zBgClr, zUuid, | |
| 456 | + isLeaf ? isLeaf + 2 * has_closed_tag(rid) : 0); | |
| 456 | 457 | db_reset(&qbranch); |
| 457 | 458 | @ <div id="m%d(gidx)" class="tl-nodemark"></div> |
| 458 | 459 | }else if( zType[0]=='e' && pGraph && zBgClr && zBgClr[0] ){ |
| 459 | 460 | /* For technotes, make a graph node with nParent==(-1). This will |
| 460 | 461 | ** not actually draw anything on the graph, but it will set the |
| @@ -941,11 +942,11 @@ | ||
| 941 | 942 | ** no thick-line riser (if the node is a leaf). |
| 942 | 943 | ** sb: Draw a dotted child-line out of the top of this node up to the |
| 943 | 944 | ** node with the id equal to the value. This is like "u" except |
| 944 | 945 | ** that the line is dotted instead of solid and has no arrow. |
| 945 | 946 | ** Mnemonic: "Same Branch". |
| 946 | - ** f: 0x01: a leaf node. | |
| 947 | + ** f: 0x01: a leaf node, 0x02: a closed leaf node. | |
| 947 | 948 | ** au: An array of integers that define thick-line risers for branches. |
| 948 | 949 | ** The integers are in pairs. For each pair, the first integer is |
| 949 | 950 | ** is the rail on which the riser should run and the second integer |
| 950 | 951 | ** is the id of the node upto which the riser should run. If there |
| 951 | 952 | ** are no risers, this array does not exist. |
| @@ -981,10 +982,11 @@ | ||
| 981 | 982 | }else{ |
| 982 | 983 | cgi_printf("\"u\":%d,", pRow->aiRiser[pRow->iRail]); |
| 983 | 984 | } |
| 984 | 985 | k = 0; |
| 985 | 986 | if( pRow->isLeaf ) k |= 1; |
| 987 | + if( pRow->isLeaf & 2) k |= 2; | |
| 986 | 988 | cgi_printf("\"f\":%d,",k); |
| 987 | 989 | for(i=k=0; i<GR_MAX_RAIL; i++){ |
| 988 | 990 | if( i==pRow->iRail ) continue; |
| 989 | 991 | if( pRow->aiRiser[i]>0 ){ |
| 990 | 992 | if( k==0 ){ |
| 991 | 993 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -450,11 +450,12 @@ | |
| 450 | nCherrypick++; |
| 451 | } |
| 452 | db_reset(&qcherrypick); |
| 453 | } |
| 454 | gidx = graph_add_row(pGraph, rid, nParent, nCherrypick, aParent, |
| 455 | zBr, zBgClr, zUuid, isLeaf); |
| 456 | db_reset(&qbranch); |
| 457 | @ <div id="m%d(gidx)" class="tl-nodemark"></div> |
| 458 | }else if( zType[0]=='e' && pGraph && zBgClr && zBgClr[0] ){ |
| 459 | /* For technotes, make a graph node with nParent==(-1). This will |
| 460 | ** not actually draw anything on the graph, but it will set the |
| @@ -941,11 +942,11 @@ | |
| 941 | ** no thick-line riser (if the node is a leaf). |
| 942 | ** sb: Draw a dotted child-line out of the top of this node up to the |
| 943 | ** node with the id equal to the value. This is like "u" except |
| 944 | ** that the line is dotted instead of solid and has no arrow. |
| 945 | ** Mnemonic: "Same Branch". |
| 946 | ** f: 0x01: a leaf node. |
| 947 | ** au: An array of integers that define thick-line risers for branches. |
| 948 | ** The integers are in pairs. For each pair, the first integer is |
| 949 | ** is the rail on which the riser should run and the second integer |
| 950 | ** is the id of the node upto which the riser should run. If there |
| 951 | ** are no risers, this array does not exist. |
| @@ -981,10 +982,11 @@ | |
| 981 | }else{ |
| 982 | cgi_printf("\"u\":%d,", pRow->aiRiser[pRow->iRail]); |
| 983 | } |
| 984 | k = 0; |
| 985 | if( pRow->isLeaf ) k |= 1; |
| 986 | cgi_printf("\"f\":%d,",k); |
| 987 | for(i=k=0; i<GR_MAX_RAIL; i++){ |
| 988 | if( i==pRow->iRail ) continue; |
| 989 | if( pRow->aiRiser[i]>0 ){ |
| 990 | if( k==0 ){ |
| 991 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -450,11 +450,12 @@ | |
| 450 | nCherrypick++; |
| 451 | } |
| 452 | db_reset(&qcherrypick); |
| 453 | } |
| 454 | gidx = graph_add_row(pGraph, rid, nParent, nCherrypick, aParent, |
| 455 | zBr, zBgClr, zUuid, |
| 456 | isLeaf ? isLeaf + 2 * has_closed_tag(rid) : 0); |
| 457 | db_reset(&qbranch); |
| 458 | @ <div id="m%d(gidx)" class="tl-nodemark"></div> |
| 459 | }else if( zType[0]=='e' && pGraph && zBgClr && zBgClr[0] ){ |
| 460 | /* For technotes, make a graph node with nParent==(-1). This will |
| 461 | ** not actually draw anything on the graph, but it will set the |
| @@ -941,11 +942,11 @@ | |
| 942 | ** no thick-line riser (if the node is a leaf). |
| 943 | ** sb: Draw a dotted child-line out of the top of this node up to the |
| 944 | ** node with the id equal to the value. This is like "u" except |
| 945 | ** that the line is dotted instead of solid and has no arrow. |
| 946 | ** Mnemonic: "Same Branch". |
| 947 | ** f: 0x01: a leaf node, 0x02: a closed leaf node. |
| 948 | ** au: An array of integers that define thick-line risers for branches. |
| 949 | ** The integers are in pairs. For each pair, the first integer is |
| 950 | ** is the rail on which the riser should run and the second integer |
| 951 | ** is the id of the node upto which the riser should run. If there |
| 952 | ** are no risers, this array does not exist. |
| @@ -981,10 +982,11 @@ | |
| 982 | }else{ |
| 983 | cgi_printf("\"u\":%d,", pRow->aiRiser[pRow->iRail]); |
| 984 | } |
| 985 | k = 0; |
| 986 | if( pRow->isLeaf ) k |= 1; |
| 987 | if( pRow->isLeaf & 2) k |= 2; |
| 988 | cgi_printf("\"f\":%d,",k); |
| 989 | for(i=k=0; i<GR_MAX_RAIL; i++){ |
| 990 | if( i==pRow->iRail ) continue; |
| 991 | if( pRow->aiRiser[i]>0 ){ |
| 992 | if( k==0 ){ |
| 993 |