Fossil SCM

Add the ability to specify circle-nodes and omit arrowheads on the timeline using the "details.txt" skin file.

drh 2015-03-30 15:26 improved-skin-edit
Commit d4c2e8db08f041e2b19b26477bbe3179749398b0
--- skins/aht/details.txt
+++ skins/aht/details.txt
@@ -1,2 +1,4 @@
1
-white-foreground: 0
2
-timeline-arrows: 1
1
+timeline-arrowheads: 1
2
+timeline-circle-nodes: 0
3
+timeline-colored-lines: 0
4
+white-foreground: 0
35
--- skins/aht/details.txt
+++ skins/aht/details.txt
@@ -1,2 +1,4 @@
1 white-foreground: 0
2 timeline-arrows: 1
 
 
3
--- skins/aht/details.txt
+++ skins/aht/details.txt
@@ -1,2 +1,4 @@
1 timeline-arrowheads: 1
2 timeline-circle-nodes: 0
3 timeline-colored-lines: 0
4 white-foreground: 0
5
--- skins/black_and_white/details.txt
+++ skins/black_and_white/details.txt
@@ -1,2 +1,4 @@
1
-white-foreground: 0
2
-timeline-arrows: 1
1
+timeline-arrowheads: 1
2
+timeline-circle-nodes: 0
3
+timeline-colored-lines: 0
4
+white-foreground: 0
35
--- skins/black_and_white/details.txt
+++ skins/black_and_white/details.txt
@@ -1,2 +1,4 @@
1 white-foreground: 0
2 timeline-arrows: 1
 
 
3
--- skins/black_and_white/details.txt
+++ skins/black_and_white/details.txt
@@ -1,2 +1,4 @@
1 timeline-arrowheads: 1
2 timeline-circle-nodes: 0
3 timeline-colored-lines: 0
4 white-foreground: 0
5
--- skins/blitz/details.txt
+++ skins/blitz/details.txt
@@ -1,2 +1,4 @@
1
-white-foreground: 0
2
-timeline-arrows: 1
1
+timeline-arrowheads: 1
2
+timeline-circle-nodes: 0
3
+timeline-colored-lines: 0
4
+white-foreground: 0
35
--- skins/blitz/details.txt
+++ skins/blitz/details.txt
@@ -1,2 +1,4 @@
1 white-foreground: 0
2 timeline-arrows: 1
 
 
3
--- skins/blitz/details.txt
+++ skins/blitz/details.txt
@@ -1,2 +1,4 @@
1 timeline-arrowheads: 1
2 timeline-circle-nodes: 0
3 timeline-colored-lines: 0
4 white-foreground: 0
5
--- skins/blitz_no_logo/details.txt
+++ skins/blitz_no_logo/details.txt
@@ -1,2 +1,4 @@
1
-white-foreground: 0
2
-timeline-arrows: 1
1
+timeline-arrowheads: 1
2
+timeline-circle-nodes: 0
3
+timeline-colored-lines: 0
4
+white-foreground: 0
35
--- skins/blitz_no_logo/details.txt
+++ skins/blitz_no_logo/details.txt
@@ -1,2 +1,4 @@
1 white-foreground: 0
2 timeline-arrows: 1
 
 
3
--- skins/blitz_no_logo/details.txt
+++ skins/blitz_no_logo/details.txt
@@ -1,2 +1,4 @@
1 timeline-arrowheads: 1
2 timeline-circle-nodes: 0
3 timeline-colored-lines: 0
4 white-foreground: 0
5
--- skins/default/details.txt
+++ skins/default/details.txt
@@ -1,2 +1,4 @@
1
-white-foreground: 0
2
-timeline-arrows: 1
1
+timeline-arrowheads: 1
2
+timeline-circle-nodes: 0
3
+timeline-colored-lines: 0
4
+white-foreground: 0
35
--- skins/default/details.txt
+++ skins/default/details.txt
@@ -1,2 +1,4 @@
1 white-foreground: 0
2 timeline-arrows: 1
 
 
3
--- skins/default/details.txt
+++ skins/default/details.txt
@@ -1,2 +1,4 @@
1 timeline-arrowheads: 1
2 timeline-circle-nodes: 0
3 timeline-colored-lines: 0
4 white-foreground: 0
5
--- skins/eagle/details.txt
+++ skins/eagle/details.txt
@@ -1,2 +1,4 @@
1
-white-foreground: 1
2
-timeline-arrows: 1
1
+timeline-arrowheads: 1
2
+timeline-circle-nodes: 0
3
+timeline-colored-lines: 0
4
+white-foreground: 1
35
--- skins/eagle/details.txt
+++ skins/eagle/details.txt
@@ -1,2 +1,4 @@
1 white-foreground: 1
2 timeline-arrows: 1
 
 
3
--- skins/eagle/details.txt
+++ skins/eagle/details.txt
@@ -1,2 +1,4 @@
1 timeline-arrowheads: 1
2 timeline-circle-nodes: 0
3 timeline-colored-lines: 0
4 white-foreground: 1
5
--- skins/enhanced1/details.txt
+++ skins/enhanced1/details.txt
@@ -1,2 +1,4 @@
1
-white-foreground: 0
2
-timeline-arrows: 1
1
+timeline-arrowheads: 1
2
+timeline-circle-nodes: 0
3
+timeline-colored-lines: 0
4
+white-foreground: 0
35
--- skins/enhanced1/details.txt
+++ skins/enhanced1/details.txt
@@ -1,2 +1,4 @@
1 white-foreground: 0
2 timeline-arrows: 1
 
 
3
--- skins/enhanced1/details.txt
+++ skins/enhanced1/details.txt
@@ -1,2 +1,4 @@
1 timeline-arrowheads: 1
2 timeline-circle-nodes: 0
3 timeline-colored-lines: 0
4 white-foreground: 0
5
--- skins/khaki/details.txt
+++ skins/khaki/details.txt
@@ -1,2 +1,4 @@
1
-white-foreground: 0
2
-timeline-arrows: 1
1
+timeline-arrowheads: 1
2
+timeline-circle-nodes: 0
3
+timeline-colored-lines: 0
4
+white-foreground: 0
35
--- skins/khaki/details.txt
+++ skins/khaki/details.txt
@@ -1,2 +1,4 @@
1 white-foreground: 0
2 timeline-arrows: 1
 
 
3
--- skins/khaki/details.txt
+++ skins/khaki/details.txt
@@ -1,2 +1,4 @@
1 timeline-arrowheads: 1
2 timeline-circle-nodes: 0
3 timeline-colored-lines: 0
4 white-foreground: 0
5
--- skins/original/details.txt
+++ skins/original/details.txt
@@ -1,2 +1,4 @@
1
-white-foreground: 0
2
-timeline-arrows: 1
1
+timeline-arrowheads: 1
2
+timeline-circle-nodes: 0
3
+timeline-colored-lines: 0
4
+white-foreground: 0
35
--- skins/original/details.txt
+++ skins/original/details.txt
@@ -1,2 +1,4 @@
1 white-foreground: 0
2 timeline-arrows: 1
 
 
3
--- skins/original/details.txt
+++ skins/original/details.txt
@@ -1,2 +1,4 @@
1 timeline-arrowheads: 1
2 timeline-circle-nodes: 0
3 timeline-colored-lines: 0
4 white-foreground: 0
5
--- skins/plain_gray/details.txt
+++ skins/plain_gray/details.txt
@@ -1,2 +1,4 @@
1
-white-foreground: 0
2
-timeline-arrows: 1
1
+timeline-arrowheads: 1
2
+timeline-circle-nodes: 0
3
+timeline-colored-lines: 0
4
+white-foreground: 0
35
--- skins/plain_gray/details.txt
+++ skins/plain_gray/details.txt
@@ -1,2 +1,4 @@
1 white-foreground: 0
2 timeline-arrows: 1
 
 
3
--- skins/plain_gray/details.txt
+++ skins/plain_gray/details.txt
@@ -1,2 +1,4 @@
1 timeline-arrowheads: 1
2 timeline-circle-nodes: 0
3 timeline-colored-lines: 0
4 white-foreground: 0
5
--- skins/rounded1/details.txt
+++ skins/rounded1/details.txt
@@ -1,2 +1,4 @@
1
-white-foreground: 0
2
-timeline-arrows: 1
1
+timeline-arrowheads: 1
2
+timeline-circle-nodes: 0
3
+timeline-colored-lines: 0
4
+white-foreground: 0
35
--- skins/rounded1/details.txt
+++ skins/rounded1/details.txt
@@ -1,2 +1,4 @@
1 white-foreground: 0
2 timeline-arrows: 1
 
 
3
--- skins/rounded1/details.txt
+++ skins/rounded1/details.txt
@@ -1,2 +1,4 @@
1 timeline-arrowheads: 1
2 timeline-circle-nodes: 0
3 timeline-colored-lines: 0
4 white-foreground: 0
5
--- skins/xekri/details.txt
+++ skins/xekri/details.txt
@@ -1,2 +1,4 @@
1
-white-foreground: 0
2
-timeline-arrows: 1
1
+timeline-arrowheads: 1
2
+timeline-circle-nodes: 0
3
+timeline-colored-lines: 0
4
+white-foreground: 0
35
--- skins/xekri/details.txt
+++ skins/xekri/details.txt
@@ -1,2 +1,4 @@
1 white-foreground: 0
2 timeline-arrows: 1
 
 
3
--- skins/xekri/details.txt
+++ skins/xekri/details.txt
@@ -1,2 +1,4 @@
1 timeline-arrowheads: 1
2 timeline-circle-nodes: 0
3 timeline-colored-lines: 0
4 white-foreground: 0
5
+5 -3
--- src/skins.c
+++ src/skins.c
@@ -75,12 +75,14 @@
7575
*/
7676
static struct SkinDetail {
7777
const char *zName; /* Name of the detail */
7878
char *zValue; /* Value of the detail */
7979
} aSkinDetail[] = {
80
- { "timeline-arrowheads", "yes" },
81
- { "white-foreground", "no" }
80
+ { "timeline-arrowheads", "1" },
81
+ { "timeline-circle-nodes", "0" },
82
+ { "timeline-multicolor", "0" },
83
+ { "white-foreground", "0" }
8284
};
8385
8486
/*
8587
** Invoke this routine to set the alternative skin. Return NULL if the
8688
** alternative was successfully installed. Return a string listing all
@@ -597,11 +599,11 @@
597599
db_begin_transaction();
598600
if( P("revert")!=0 ){
599601
db_multi_exec("DELETE FROM config WHERE name=%Q", aSkinAttr[ii].zFile);
600602
cgi_replace_parameter(aSkinAttr[ii].zFile, builtin_text(zDflt));
601603
}
602
- style_header("Edit %s", aSkinAttr[ii].zTitle);
604
+ style_header("%s", aSkinAttr[ii].zTitle);
603605
for(j=0; j<ArraySize(aSkinAttr); j++){
604606
if( j==ii ) continue;
605607
style_submenu_element(aSkinAttr[j].zSubmenu, 0,
606608
"%R/setup_skinedit?w=%d&basis=%h",j,zBasis);
607609
}
608610
--- src/skins.c
+++ src/skins.c
@@ -75,12 +75,14 @@
75 */
76 static struct SkinDetail {
77 const char *zName; /* Name of the detail */
78 char *zValue; /* Value of the detail */
79 } aSkinDetail[] = {
80 { "timeline-arrowheads", "yes" },
81 { "white-foreground", "no" }
 
 
82 };
83
84 /*
85 ** Invoke this routine to set the alternative skin. Return NULL if the
86 ** alternative was successfully installed. Return a string listing all
@@ -597,11 +599,11 @@
597 db_begin_transaction();
598 if( P("revert")!=0 ){
599 db_multi_exec("DELETE FROM config WHERE name=%Q", aSkinAttr[ii].zFile);
600 cgi_replace_parameter(aSkinAttr[ii].zFile, builtin_text(zDflt));
601 }
602 style_header("Edit %s", aSkinAttr[ii].zTitle);
603 for(j=0; j<ArraySize(aSkinAttr); j++){
604 if( j==ii ) continue;
605 style_submenu_element(aSkinAttr[j].zSubmenu, 0,
606 "%R/setup_skinedit?w=%d&basis=%h",j,zBasis);
607 }
608
--- src/skins.c
+++ src/skins.c
@@ -75,12 +75,14 @@
75 */
76 static struct SkinDetail {
77 const char *zName; /* Name of the detail */
78 char *zValue; /* Value of the detail */
79 } aSkinDetail[] = {
80 { "timeline-arrowheads", "1" },
81 { "timeline-circle-nodes", "0" },
82 { "timeline-multicolor", "0" },
83 { "white-foreground", "0" }
84 };
85
86 /*
87 ** Invoke this routine to set the alternative skin. Return NULL if the
88 ** alternative was successfully installed. Return a string listing all
@@ -597,11 +599,11 @@
599 db_begin_transaction();
600 if( P("revert")!=0 ){
601 db_multi_exec("DELETE FROM config WHERE name=%Q", aSkinAttr[ii].zFile);
602 cgi_replace_parameter(aSkinAttr[ii].zFile, builtin_text(zDflt));
603 }
604 style_header("%s", aSkinAttr[ii].zTitle);
605 for(j=0; j<ArraySize(aSkinAttr); j++){
606 if( j==ii ) continue;
607 style_submenu_element(aSkinAttr[j].zSubmenu, 0,
608 "%R/setup_skinedit?w=%d&basis=%h",j,zBasis);
609 }
610
+46 -25
--- src/timeline.c
+++ src/timeline.c
@@ -612,11 +612,19 @@
612612
GraphRow *pRow;
613613
int i;
614614
char cSep;
615615
int mergeOffset; /* Pixel offset from rail to merge riser */
616616
int iRailPitch; /* Pixels between consecutive rails */
617
+ int showArrowheads; /* True to draw arrowheads. False to omit. */
618
+ int circleNodes; /* True for circle nodes. False for square nodes */
619
+ int multicolorLines; /* Use colors for graph lines */
620
+
617621
iRailPitch = pGraph->iRailPitch;
622
+ showArrowheads = skin_detail_boolean("timeline-arrowheads");
623
+ circleNodes = skin_detail_boolean("timeline-circle-nodes");
624
+ multicolorLines = skin_detail_boolean("timeline-multicolor");
625
+ (void)multicolorLines; /* Not currently used */
618626
619627
/* Number of pixels that the thin merge lines are offset from the
620628
** the center of the think rail lines. If zero, then the vertical
621629
** merge lines overlap with the thicker rail lines.
622630
*/
@@ -751,34 +759,40 @@
751759
@ left += obj.offsetLeft;
752760
@ }while( obj = obj.offsetParent );
753761
@ }
754762
@ return left;
755763
@ }
756
- @ function drawUpArrow(x,y0,y1){
757
- @ drawBox(lineClr,x,y0+4,x+1,y1);
758
- @ var n = document.createElement("div"),
759
- @ l = x-2,
760
- @ t = y0;
761
- @ n.style.position = "absolute";
762
- @ n.style.left = l+"px";
763
- @ n.style.top = t+"px";
764
- @ n.style.width = 0;
765
- @ n.style.height = 0;
766
- @ n.style.transform = "scale(.999)";
767
- @ n.style.borderWidth = 0;
768
- @ n.style.borderStyle = "solid";
769
- @ n.style.borderColor = "transparent";
770
- @ n.style.borderRightWidth = "3px";
771
- @ n.style.borderBottomColor = lineClr;
772
- @ n.style.borderLeftWidth = "3px";
773
- @ if( y0+10>=y1 ){
774
- @ n.style.borderBottomWidth = "5px";
775
- @ } else {
776
- @ n.style.borderBottomWidth = "7px";
777
- @ }
778
- @ cDiv.appendChild(n);
779
- @ }
764
+ if( showArrowheads ){
765
+ @ function drawUpArrow(x,y0,y1){
766
+ @ drawBox(lineClr,x,y0+4,x+1,y1);
767
+ @ var n = document.createElement("div"),
768
+ @ l = x-2,
769
+ @ t = y0;
770
+ @ n.style.position = "absolute";
771
+ @ n.style.left = l+"px";
772
+ @ n.style.top = t+"px";
773
+ @ n.style.width = 0;
774
+ @ n.style.height = 0;
775
+ @ n.style.transform = "scale(.999)";
776
+ @ n.style.borderWidth = 0;
777
+ @ n.style.borderStyle = "solid";
778
+ @ n.style.borderColor = "transparent";
779
+ @ n.style.borderRightWidth = "3px";
780
+ @ n.style.borderBottomColor = lineClr;
781
+ @ n.style.borderLeftWidth = "3px";
782
+ @ if( y0+10>=y1 ){
783
+ @ n.style.borderBottomWidth = "5px";
784
+ @ } else {
785
+ @ n.style.borderBottomWidth = "7px";
786
+ @ }
787
+ @ cDiv.appendChild(n);
788
+ @ }
789
+ }else{
790
+ @ function drawUpArrow(x,y0,y1){
791
+ @ drawBox(lineClr,x,y0+1,x+1,y1);
792
+ @ }
793
+ }
780794
@ function drawThinArrow(y,xFrom,xTo){
781795
@ var n = document.createElement("div"),
782796
@ t = y-2;
783797
@ n.style.position = "absolute";
784798
@ n.style.top = t+"px";
@@ -805,11 +819,15 @@
805819
@ }
806820
@ function drawThinLine(x0,y0,x1,y1){
807821
@ drawBox(lineClr,x0,y0,x1,y1);
808822
@ }
809823
@ function drawNodeBox(color,x0,y0,x1,y1){
810
- @ drawBox(color,x0,y0,x1,y1).style.cursor = "pointer";
824
+ @ var n = drawBox(color,x0,y0,x1,y1);
825
+ @ n.style.cursor = "pointer";
826
+ if( circleNodes ){
827
+ @ n.style.borderRadius = "6px";
828
+ }
811829
@ }
812830
@ function drawNode(p, left, btm){
813831
@ drawNodeBox(boxColor,p.x-5,p.y-5,p.x+6,p.y+6);
814832
@ drawNodeBox(p.bg||bgClr,p.x-4,p.y-4,p.x+5,p.y+5);
815833
@ if( p.u>0 ) drawUpArrow(p.x, rowinfo[p.u-1].y+6, p.y-5);
@@ -924,10 +942,13 @@
924942
@ }
925943
@ }
926944
@ function clickOnRow(p){
927945
@ if( selRow==null ){
928946
@ selBox = drawBox("red",p.x-2,p.y-2,p.x+3,p.y+3);
947
+ if( circleNodes ){
948
+ @ selBox.style.borderRadius="6px";
949
+ }
929950
@ selRow = p;
930951
@ }else if( selRow==p ){
931952
@ var canvasDiv = gebi("canvas");
932953
@ canvasDiv.removeChild(selBox);
933954
@ selBox = null;
934955
--- src/timeline.c
+++ src/timeline.c
@@ -612,11 +612,19 @@
612 GraphRow *pRow;
613 int i;
614 char cSep;
615 int mergeOffset; /* Pixel offset from rail to merge riser */
616 int iRailPitch; /* Pixels between consecutive rails */
 
 
 
 
617 iRailPitch = pGraph->iRailPitch;
 
 
 
 
618
619 /* Number of pixels that the thin merge lines are offset from the
620 ** the center of the think rail lines. If zero, then the vertical
621 ** merge lines overlap with the thicker rail lines.
622 */
@@ -751,34 +759,40 @@
751 @ left += obj.offsetLeft;
752 @ }while( obj = obj.offsetParent );
753 @ }
754 @ return left;
755 @ }
756 @ function drawUpArrow(x,y0,y1){
757 @ drawBox(lineClr,x,y0+4,x+1,y1);
758 @ var n = document.createElement("div"),
759 @ l = x-2,
760 @ t = y0;
761 @ n.style.position = "absolute";
762 @ n.style.left = l+"px";
763 @ n.style.top = t+"px";
764 @ n.style.width = 0;
765 @ n.style.height = 0;
766 @ n.style.transform = "scale(.999)";
767 @ n.style.borderWidth = 0;
768 @ n.style.borderStyle = "solid";
769 @ n.style.borderColor = "transparent";
770 @ n.style.borderRightWidth = "3px";
771 @ n.style.borderBottomColor = lineClr;
772 @ n.style.borderLeftWidth = "3px";
773 @ if( y0+10>=y1 ){
774 @ n.style.borderBottomWidth = "5px";
775 @ } else {
776 @ n.style.borderBottomWidth = "7px";
777 @ }
778 @ cDiv.appendChild(n);
779 @ }
 
 
 
 
 
 
780 @ function drawThinArrow(y,xFrom,xTo){
781 @ var n = document.createElement("div"),
782 @ t = y-2;
783 @ n.style.position = "absolute";
784 @ n.style.top = t+"px";
@@ -805,11 +819,15 @@
805 @ }
806 @ function drawThinLine(x0,y0,x1,y1){
807 @ drawBox(lineClr,x0,y0,x1,y1);
808 @ }
809 @ function drawNodeBox(color,x0,y0,x1,y1){
810 @ drawBox(color,x0,y0,x1,y1).style.cursor = "pointer";
 
 
 
 
811 @ }
812 @ function drawNode(p, left, btm){
813 @ drawNodeBox(boxColor,p.x-5,p.y-5,p.x+6,p.y+6);
814 @ drawNodeBox(p.bg||bgClr,p.x-4,p.y-4,p.x+5,p.y+5);
815 @ if( p.u>0 ) drawUpArrow(p.x, rowinfo[p.u-1].y+6, p.y-5);
@@ -924,10 +942,13 @@
924 @ }
925 @ }
926 @ function clickOnRow(p){
927 @ if( selRow==null ){
928 @ selBox = drawBox("red",p.x-2,p.y-2,p.x+3,p.y+3);
 
 
 
929 @ selRow = p;
930 @ }else if( selRow==p ){
931 @ var canvasDiv = gebi("canvas");
932 @ canvasDiv.removeChild(selBox);
933 @ selBox = null;
934
--- src/timeline.c
+++ src/timeline.c
@@ -612,11 +612,19 @@
612 GraphRow *pRow;
613 int i;
614 char cSep;
615 int mergeOffset; /* Pixel offset from rail to merge riser */
616 int iRailPitch; /* Pixels between consecutive rails */
617 int showArrowheads; /* True to draw arrowheads. False to omit. */
618 int circleNodes; /* True for circle nodes. False for square nodes */
619 int multicolorLines; /* Use colors for graph lines */
620
621 iRailPitch = pGraph->iRailPitch;
622 showArrowheads = skin_detail_boolean("timeline-arrowheads");
623 circleNodes = skin_detail_boolean("timeline-circle-nodes");
624 multicolorLines = skin_detail_boolean("timeline-multicolor");
625 (void)multicolorLines; /* Not currently used */
626
627 /* Number of pixels that the thin merge lines are offset from the
628 ** the center of the think rail lines. If zero, then the vertical
629 ** merge lines overlap with the thicker rail lines.
630 */
@@ -751,34 +759,40 @@
759 @ left += obj.offsetLeft;
760 @ }while( obj = obj.offsetParent );
761 @ }
762 @ return left;
763 @ }
764 if( showArrowheads ){
765 @ function drawUpArrow(x,y0,y1){
766 @ drawBox(lineClr,x,y0+4,x+1,y1);
767 @ var n = document.createElement("div"),
768 @ l = x-2,
769 @ t = y0;
770 @ n.style.position = "absolute";
771 @ n.style.left = l+"px";
772 @ n.style.top = t+"px";
773 @ n.style.width = 0;
774 @ n.style.height = 0;
775 @ n.style.transform = "scale(.999)";
776 @ n.style.borderWidth = 0;
777 @ n.style.borderStyle = "solid";
778 @ n.style.borderColor = "transparent";
779 @ n.style.borderRightWidth = "3px";
780 @ n.style.borderBottomColor = lineClr;
781 @ n.style.borderLeftWidth = "3px";
782 @ if( y0+10>=y1 ){
783 @ n.style.borderBottomWidth = "5px";
784 @ } else {
785 @ n.style.borderBottomWidth = "7px";
786 @ }
787 @ cDiv.appendChild(n);
788 @ }
789 }else{
790 @ function drawUpArrow(x,y0,y1){
791 @ drawBox(lineClr,x,y0+1,x+1,y1);
792 @ }
793 }
794 @ function drawThinArrow(y,xFrom,xTo){
795 @ var n = document.createElement("div"),
796 @ t = y-2;
797 @ n.style.position = "absolute";
798 @ n.style.top = t+"px";
@@ -805,11 +819,15 @@
819 @ }
820 @ function drawThinLine(x0,y0,x1,y1){
821 @ drawBox(lineClr,x0,y0,x1,y1);
822 @ }
823 @ function drawNodeBox(color,x0,y0,x1,y1){
824 @ var n = drawBox(color,x0,y0,x1,y1);
825 @ n.style.cursor = "pointer";
826 if( circleNodes ){
827 @ n.style.borderRadius = "6px";
828 }
829 @ }
830 @ function drawNode(p, left, btm){
831 @ drawNodeBox(boxColor,p.x-5,p.y-5,p.x+6,p.y+6);
832 @ drawNodeBox(p.bg||bgClr,p.x-4,p.y-4,p.x+5,p.y+5);
833 @ if( p.u>0 ) drawUpArrow(p.x, rowinfo[p.u-1].y+6, p.y-5);
@@ -924,10 +942,13 @@
942 @ }
943 @ }
944 @ function clickOnRow(p){
945 @ if( selRow==null ){
946 @ selBox = drawBox("red",p.x-2,p.y-2,p.x+3,p.y+3);
947 if( circleNodes ){
948 @ selBox.style.borderRadius="6px";
949 }
950 @ selRow = p;
951 @ }else if( selRow==p ){
952 @ var canvasDiv = gebi("canvas");
953 @ canvasDiv.removeChild(selBox);
954 @ selBox = null;
955

Keyboard Shortcuts

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