Fossil SCM

Mark closed leaves with an X on the timeline graph.

drh 2023-09-28 13:38 trunk merge
Commit 57bea365a3e4cc839c3771d5142c0de006f1fc4f534c027abdc49dc39922f6fb
--- skins/ardoise/css.txt
+++ skins/ardoise/css.txt
@@ -1032,10 +1032,18 @@
10321032
top: 3px;
10331033
left: 3px;
10341034
width: 4px;
10351035
height: 4px;
10361036
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;
10371045
}
10381046
.tl-node.sel:after {
10391047
content: '';
10401048
position: absolute;
10411049
top: 1px;
10421050
--- 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 @@
387387
top: 3px;
388388
left: 3px;
389389
width: 4px;
390390
height: 4px;
391391
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;
392400
}
393401
.tl-node.sel:after {
394402
content: '';
395403
position: absolute;
396404
top: 1px;
397405
--- 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
--- skins/eagle/css.txt
+++ skins/eagle/css.txt
@@ -209,10 +209,20 @@
209209
left: 3px;
210210
width: 4px;
211211
height: 4px;
212212
background: #fff;
213213
}
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
+}
214224
215225
/* up arrow */
216226
.tl-arrow.u {
217227
margin-top: -1px;
218228
border-width: 0 3px;
219229
--- 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
--- src/default.css
+++ src/default.css
@@ -117,10 +117,18 @@
117117
top: 3px;
118118
left: 3px;
119119
width: 4px;
120120
height: 4px;
121121
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;
122130
}
123131
.tl-node.sel:after {
124132
content: '';
125133
position: absolute;
126134
top: 2px;
127135
--- 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 @@
389389
if( p.r<0 ) return;
390390
if( p.u>0 ) drawUpArrow(p,tx.rowinfo[p.u-tx.iTopRow],p.fg,p.id);
391391
if( p.sb>0 ) drawDotted(p,tx.rowinfo[p.sb-tx.iTopRow],p.fg,p.id);
392392
var cls = node.cls;
393393
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";
395396
var n = drawBox(cls,p.bg,p.x,p.y);
396397
n.id = "tln"+p.id;
397398
n.onclick = clickOnNode;
398399
n.ondblclick = dblclickOnNode;
399400
n.onmousemove = mouseOverNode;
400401
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
+ }
401414
if( !tx.omitDescenders ){
402415
if( p.u==0 ){
403416
if( p.hasOwnProperty('mo') && p.r==p.mo ){
404417
var ix = p.hasOwnProperty('cu') ? p.cu : p.mu;
405418
var top = tx.rowinfo[ix-tx.iTopRow]
406419
--- 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 @@
450450
nCherrypick++;
451451
}
452452
db_reset(&qcherrypick);
453453
}
454454
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);
456457
db_reset(&qbranch);
457458
@ <div id="m%d(gidx)" class="tl-nodemark"></div>
458459
}else if( zType[0]=='e' && pGraph && zBgClr && zBgClr[0] ){
459460
/* For technotes, make a graph node with nParent==(-1). This will
460461
** not actually draw anything on the graph, but it will set the
@@ -941,11 +942,11 @@
941942
** no thick-line riser (if the node is a leaf).
942943
** sb: Draw a dotted child-line out of the top of this node up to the
943944
** node with the id equal to the value. This is like "u" except
944945
** that the line is dotted instead of solid and has no arrow.
945946
** Mnemonic: "Same Branch".
946
- ** f: 0x01: a leaf node.
947
+ ** f: 0x01: a leaf node, 0x02: a closed leaf node.
947948
** au: An array of integers that define thick-line risers for branches.
948949
** The integers are in pairs. For each pair, the first integer is
949950
** is the rail on which the riser should run and the second integer
950951
** is the id of the node upto which the riser should run. If there
951952
** are no risers, this array does not exist.
@@ -981,10 +982,11 @@
981982
}else{
982983
cgi_printf("\"u\":%d,", pRow->aiRiser[pRow->iRail]);
983984
}
984985
k = 0;
985986
if( pRow->isLeaf ) k |= 1;
987
+ if( pRow->isLeaf & 2) k |= 2;
986988
cgi_printf("\"f\":%d,",k);
987989
for(i=k=0; i<GR_MAX_RAIL; i++){
988990
if( i==pRow->iRail ) continue;
989991
if( pRow->aiRiser[i]>0 ){
990992
if( k==0 ){
991993
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button