Fossil SCM

The new "Simple" view for timelines attempts to declutter the timeline without being as extreme as the "Compact" view. The check-in: or artifact: detail is still shown, but other details are omitted, though they can be recalled by clicking on the ellipsis. The "left" or "closed" prefix to the "check-in:" detail is also omitted. "Simple" attempts to be a compromise between "Compact" and "Verbose".

drh 2025-10-18 17:18 timeline-enhance-2025
Commit 07a43dd39adb93452684bef5dcdc91293af3f598a627e031e3c9d9093693eb10
3 files changed +2 -2 +14 -7 +28 -8
+2 -2
--- src/branch.c
+++ src/branch.c
@@ -1030,11 +1030,11 @@
10301030
){
10311031
int rid;
10321032
int tmFlagsNew;
10331033
char *zBrName;
10341034
1035
- if( (tmFlags & (TIMELINE_CLASSIC|TIMELINE_VERBOSE|TIMELINE_COMPACT))!=0 ){
1035
+ if( (tmFlags & TIMELINE_INLINE)!=0 ){
10361036
tmFlagsNew = (tmFlags & ~TIMELINE_VIEWS) | TIMELINE_MODERN;
10371037
cgi_printf("(");
10381038
}else{
10391039
tmFlagsNew = tmFlags;
10401040
}
@@ -1043,11 +1043,11 @@
10431043
if( !g.perm.Hyperlink ) return;
10441044
rid = db_column_int(pQuery,0);
10451045
zBrName = branch_of_rid(rid);
10461046
@ branch:&nbsp;<span class='timelineHash'>\
10471047
@ %z(href("%R/timeline?r=%T",zBrName))%h(zBrName)</a></span>
1048
- if( (tmFlags & (TIMELINE_CLASSIC|TIMELINE_VERBOSE|TIMELINE_COMPACT))!=0 ){
1048
+ if( (tmFlags & TIMELINE_INLINE)!=0 ){
10491049
cgi_printf(")");
10501050
}
10511051
}
10521052
10531053
/*
10541054
--- src/branch.c
+++ src/branch.c
@@ -1030,11 +1030,11 @@
1030 ){
1031 int rid;
1032 int tmFlagsNew;
1033 char *zBrName;
1034
1035 if( (tmFlags & (TIMELINE_CLASSIC|TIMELINE_VERBOSE|TIMELINE_COMPACT))!=0 ){
1036 tmFlagsNew = (tmFlags & ~TIMELINE_VIEWS) | TIMELINE_MODERN;
1037 cgi_printf("(");
1038 }else{
1039 tmFlagsNew = tmFlags;
1040 }
@@ -1043,11 +1043,11 @@
1043 if( !g.perm.Hyperlink ) return;
1044 rid = db_column_int(pQuery,0);
1045 zBrName = branch_of_rid(rid);
1046 @ branch:&nbsp;<span class='timelineHash'>\
1047 @ %z(href("%R/timeline?r=%T",zBrName))%h(zBrName)</a></span>
1048 if( (tmFlags & (TIMELINE_CLASSIC|TIMELINE_VERBOSE|TIMELINE_COMPACT))!=0 ){
1049 cgi_printf(")");
1050 }
1051 }
1052
1053 /*
1054
--- src/branch.c
+++ src/branch.c
@@ -1030,11 +1030,11 @@
1030 ){
1031 int rid;
1032 int tmFlagsNew;
1033 char *zBrName;
1034
1035 if( (tmFlags & TIMELINE_INLINE)!=0 ){
1036 tmFlagsNew = (tmFlags & ~TIMELINE_VIEWS) | TIMELINE_MODERN;
1037 cgi_printf("(");
1038 }else{
1039 tmFlagsNew = tmFlags;
1040 }
@@ -1043,11 +1043,11 @@
1043 if( !g.perm.Hyperlink ) return;
1044 rid = db_column_int(pQuery,0);
1045 zBrName = branch_of_rid(rid);
1046 @ branch:&nbsp;<span class='timelineHash'>\
1047 @ %z(href("%R/timeline?r=%T",zBrName))%h(zBrName)</a></span>
1048 if( (tmFlags & TIMELINE_INLINE)!=0 ){
1049 cgi_printf(")");
1050 }
1051 }
1052
1053 /*
1054
+14 -7
--- src/finfo.c
+++ src/finfo.c
@@ -394,10 +394,12 @@
394394
tmFlags = timeline_ss_submenu();
395395
if( tmFlags & TIMELINE_COLUMNAR ){
396396
zStyle = "Columnar";
397397
}else if( tmFlags & TIMELINE_COMPACT ){
398398
zStyle = "Compact";
399
+ }else if( tmFlags & TIMELINE_SIMPLE ){
400
+ zStyle = "Simple";
399401
}else if( tmFlags & TIMELINE_VERBOSE ){
400402
zStyle = "Verbose";
401403
}else if( tmFlags & TIMELINE_CLASSIC ){
402404
zStyle = "Classic";
403405
}else{
@@ -731,14 +733,14 @@
731733
}
732734
if( tmFlags & TIMELINE_COMPACT ){
733735
cgi_printf("<span class='clutter' id='detail-%d'>",frid);
734736
}
735737
cgi_printf("<span class='timeline%sDetail'>", zStyle);
736
- if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ) cgi_printf("(");
738
+ if( tmFlags & TIMELINE_INLINE ) cgi_printf("(");
737739
if( zUuid && (tmFlags & TIMELINE_VERBOSE)==0 ){
738740
@ file:&nbsp;%z(href("%R/file?name=%T&ci=%!S",zFName,zCkin))\
739
- @ [%S(zUuid)]</a>
741
+ @ %S(zUuid)</a>
740742
if( fShowId ){
741743
int srcId = delta_source_rid(frid);
742744
if( srcId>0 ){
743745
@ id:&nbsp;%z(href("%R/deltachain/%d",frid))\
744746
@ %d(frid)&larr;%d(srcId)</a>
@@ -745,20 +747,25 @@
745747
}else{
746748
@ id:&nbsp;%z(href("%R/deltachain/%d",frid))%d(frid)</a>
747749
}
748750
}
749751
}
752
+ if( tmFlags & TIMELINE_SIMPLE ){
753
+ @ <span class='timelineEllipsis' data-id='%d(frid)' \
754
+ @ id='ellipsis-%d(frid)'>...</span>
755
+ @ <span class='clutter' id='detail-%d(frid)'>
756
+ }
750757
@ check-in:&nbsp;\
751758
hyperlink_to_version(zCkin);
752759
if( fShowId ){
753760
@ (%d(fmid))
754761
}
755762
@ user:&nbsp;\
756763
hyperlink_to_user(zUser, zDate, ",");
757764
@ branch:&nbsp;%z(href("%R/timeline?t=%T",zBr))%h(zBr)</a>,
758
- if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ){
759
- @ size:&nbsp;%d(szFile))
765
+ if( tmFlags & TIMELINE_INLINE ){
766
+ @ size:&nbsp;%d(szFile)
760767
}else{
761768
@ size:&nbsp;%d(szFile)
762769
}
763770
if( g.perm.Hyperlink && zUuid ){
764771
const char *z = zFName;
@@ -793,14 +800,14 @@
793800
zAncLink = href("%R/finfo?name=%T&from=%!S&debug=1",zFName,zCkin);
794801
@ %z(zAncLink)[ancestry]</a>
795802
}
796803
tag_private_status(frid);
797804
/* End timelineDetail */
798
- if( tmFlags & TIMELINE_COMPACT ){
799
- @ </span></span>
805
+ if( tmFlags & (TIMELINE_COMPACT|TIMELINE_SIMPLE) ){
806
+ @ </span>)</span>
800807
}else{
801
- @ </span>
808
+ @ )</span>
802809
}
803810
@ </td></tr>
804811
}
805812
db_finalize(&q);
806813
db_finalize(&qparent);
807814
--- src/finfo.c
+++ src/finfo.c
@@ -394,10 +394,12 @@
394 tmFlags = timeline_ss_submenu();
395 if( tmFlags & TIMELINE_COLUMNAR ){
396 zStyle = "Columnar";
397 }else if( tmFlags & TIMELINE_COMPACT ){
398 zStyle = "Compact";
 
 
399 }else if( tmFlags & TIMELINE_VERBOSE ){
400 zStyle = "Verbose";
401 }else if( tmFlags & TIMELINE_CLASSIC ){
402 zStyle = "Classic";
403 }else{
@@ -731,14 +733,14 @@
731 }
732 if( tmFlags & TIMELINE_COMPACT ){
733 cgi_printf("<span class='clutter' id='detail-%d'>",frid);
734 }
735 cgi_printf("<span class='timeline%sDetail'>", zStyle);
736 if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ) cgi_printf("(");
737 if( zUuid && (tmFlags & TIMELINE_VERBOSE)==0 ){
738 @ file:&nbsp;%z(href("%R/file?name=%T&ci=%!S",zFName,zCkin))\
739 @ [%S(zUuid)]</a>
740 if( fShowId ){
741 int srcId = delta_source_rid(frid);
742 if( srcId>0 ){
743 @ id:&nbsp;%z(href("%R/deltachain/%d",frid))\
744 @ %d(frid)&larr;%d(srcId)</a>
@@ -745,20 +747,25 @@
745 }else{
746 @ id:&nbsp;%z(href("%R/deltachain/%d",frid))%d(frid)</a>
747 }
748 }
749 }
 
 
 
 
 
750 @ check-in:&nbsp;\
751 hyperlink_to_version(zCkin);
752 if( fShowId ){
753 @ (%d(fmid))
754 }
755 @ user:&nbsp;\
756 hyperlink_to_user(zUser, zDate, ",");
757 @ branch:&nbsp;%z(href("%R/timeline?t=%T",zBr))%h(zBr)</a>,
758 if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ){
759 @ size:&nbsp;%d(szFile))
760 }else{
761 @ size:&nbsp;%d(szFile)
762 }
763 if( g.perm.Hyperlink && zUuid ){
764 const char *z = zFName;
@@ -793,14 +800,14 @@
793 zAncLink = href("%R/finfo?name=%T&from=%!S&debug=1",zFName,zCkin);
794 @ %z(zAncLink)[ancestry]</a>
795 }
796 tag_private_status(frid);
797 /* End timelineDetail */
798 if( tmFlags & TIMELINE_COMPACT ){
799 @ </span></span>
800 }else{
801 @ </span>
802 }
803 @ </td></tr>
804 }
805 db_finalize(&q);
806 db_finalize(&qparent);
807
--- src/finfo.c
+++ src/finfo.c
@@ -394,10 +394,12 @@
394 tmFlags = timeline_ss_submenu();
395 if( tmFlags & TIMELINE_COLUMNAR ){
396 zStyle = "Columnar";
397 }else if( tmFlags & TIMELINE_COMPACT ){
398 zStyle = "Compact";
399 }else if( tmFlags & TIMELINE_SIMPLE ){
400 zStyle = "Simple";
401 }else if( tmFlags & TIMELINE_VERBOSE ){
402 zStyle = "Verbose";
403 }else if( tmFlags & TIMELINE_CLASSIC ){
404 zStyle = "Classic";
405 }else{
@@ -731,14 +733,14 @@
733 }
734 if( tmFlags & TIMELINE_COMPACT ){
735 cgi_printf("<span class='clutter' id='detail-%d'>",frid);
736 }
737 cgi_printf("<span class='timeline%sDetail'>", zStyle);
738 if( tmFlags & TIMELINE_INLINE ) cgi_printf("(");
739 if( zUuid && (tmFlags & TIMELINE_VERBOSE)==0 ){
740 @ file:&nbsp;%z(href("%R/file?name=%T&ci=%!S",zFName,zCkin))\
741 @ %S(zUuid)</a>
742 if( fShowId ){
743 int srcId = delta_source_rid(frid);
744 if( srcId>0 ){
745 @ id:&nbsp;%z(href("%R/deltachain/%d",frid))\
746 @ %d(frid)&larr;%d(srcId)</a>
@@ -745,20 +747,25 @@
747 }else{
748 @ id:&nbsp;%z(href("%R/deltachain/%d",frid))%d(frid)</a>
749 }
750 }
751 }
752 if( tmFlags & TIMELINE_SIMPLE ){
753 @ <span class='timelineEllipsis' data-id='%d(frid)' \
754 @ id='ellipsis-%d(frid)'>...</span>
755 @ <span class='clutter' id='detail-%d(frid)'>
756 }
757 @ check-in:&nbsp;\
758 hyperlink_to_version(zCkin);
759 if( fShowId ){
760 @ (%d(fmid))
761 }
762 @ user:&nbsp;\
763 hyperlink_to_user(zUser, zDate, ",");
764 @ branch:&nbsp;%z(href("%R/timeline?t=%T",zBr))%h(zBr)</a>,
765 if( tmFlags & TIMELINE_INLINE ){
766 @ size:&nbsp;%d(szFile)
767 }else{
768 @ size:&nbsp;%d(szFile)
769 }
770 if( g.perm.Hyperlink && zUuid ){
771 const char *z = zFName;
@@ -793,14 +800,14 @@
800 zAncLink = href("%R/finfo?name=%T&from=%!S&debug=1",zFName,zCkin);
801 @ %z(zAncLink)[ancestry]</a>
802 }
803 tag_private_status(frid);
804 /* End timelineDetail */
805 if( tmFlags & (TIMELINE_COMPACT|TIMELINE_SIMPLE) ){
806 @ </span>)</span>
807 }else{
808 @ )</span>
809 }
810 @ </td></tr>
811 }
812 db_finalize(&q);
813 db_finalize(&qparent);
814
+28 -8
--- src/timeline.c
+++ src/timeline.c
@@ -115,11 +115,13 @@
115115
#define TIMELINE_COMPACT 0x0001000 /* Use the "compact" view style */
116116
#define TIMELINE_VERBOSE 0x0002000 /* Use the "detailed" view style */
117117
#define TIMELINE_MODERN 0x0004000 /* Use the "modern" view style */
118118
#define TIMELINE_COLUMNAR 0x0008000 /* Use the "columns" view style */
119119
#define TIMELINE_CLASSIC 0x0010000 /* Use the "classic" view style */
120
-#define TIMELINE_VIEWS 0x001f000 /* Mask for all of the view styles */
120
+#define TIMELINE_SIMPLE 0x0020000 /* Use the "simple" view style */
121
+#define TIMELINE_INLINE 0x0033000 /* Mask for views with in-line display */
122
+#define TIMELINE_VIEWS 0x003f000 /* Mask for all of the view styles */
121123
#define TIMELINE_NOSCROLL 0x0100000 /* Don't scroll to the selection */
122124
#define TIMELINE_FILEDIFF 0x0200000 /* Show File differences, not ckin diffs */
123125
#define TIMELINE_CHPICK 0x0400000 /* Show cherrypick merges */
124126
#define TIMELINE_FILLGAPS 0x0800000 /* Dotted lines for missing nodes */
125127
#define TIMELINE_XMERGE 0x1000000 /* Omit merges from off-graph nodes */
@@ -194,11 +196,11 @@
194196
const char *zUser = db_column_text(pQuery, 4);
195197
const char *zTagList = db_column_text(pQuery, 8);
196198
int tagid = db_column_int(pQuery, 9);
197199
const char *zDispUser = zUser && zUser[0] ? zUser : "anonymous";
198200
199
- if( (tmFlags & (TIMELINE_CLASSIC|TIMELINE_VERBOSE|TIMELINE_COMPACT))!=0 ){
201
+ if( (tmFlags & TIMELINE_INLINE)!=0 ){
200202
cgi_printf("(");
201203
}
202204
203205
/* The EXTRA_FORMAT macro is an integer that controls various experiments
204206
** in the layout of the extra text.
@@ -234,16 +236,20 @@
234236
}
235237
#endif /* EXTRA_FORMAT==0 */
236238
#if EXTRA_FORMAT==1
237239
if( (tmFlags & TIMELINE_CLASSIC)==0 ){
238240
if( zType[0]=='c' ){
239
- int isLeaf = db_column_int(pQuery, 5);
240241
const char *zPrefix;
241
- if( isLeaf ){
242
- zPrefix = has_closed_tag(rid) ? "closed&nbsp;" : "leaf&nbsp;";
243
- }else{
242
+ if( tmFlags & TIMELINE_SIMPLE ){
244243
zPrefix = "";
244
+ }else{
245
+ int isLeaf = db_column_int(pQuery, 5);
246
+ if( isLeaf ){
247
+ zPrefix = has_closed_tag(rid) ? "closed&nbsp;" : "leaf&nbsp;";
248
+ }else{
249
+ zPrefix = "";
250
+ }
245251
}
246252
cgi_printf("%scheck-in:&nbsp;%z<span class='timelineHash'>"
247253
"%S</span></a> ",
248254
zPrefix, href("%R/info/%!S",zUuid),zUuid);
249255
}else if( zType[0]=='e' && tagid ){
@@ -256,10 +262,16 @@
256262
}else if( zType[0]=='g' || zType[0]=='w' || zType[0]=='t'
257263
|| zType[0]=='n' || zType[0]=='f'){
258264
cgi_printf("artifact:&nbsp;%z%S</a> ",href("%R/info/%!S",zUuid),zUuid);
259265
}
260266
#endif /* EXTRA_FORMAT==1 */
267
+
268
+ if( (tmFlags & TIMELINE_SIMPLE)!=0 ){
269
+ @ <span class='timelineEllipsis' id='ellipsis-%d(rid)' \
270
+ @ data-id='%d(rid)'>...</span>
271
+ @ <span class='clutter' id='detail-%d(rid)'>
272
+ }
261273
262274
if( g.perm.Hyperlink && fossil_strcmp(zDispUser, zThisUser)!=0 ){
263275
char *zLink;
264276
if( zType[0]!='f' || (tmFlags & TIMELINE_FORUMTXT)==0 ){
265277
zLink = mprintf("%R/timeline?u=%h&c=%t&y=a", zDispUser, zDate);
@@ -310,10 +322,14 @@
310322
cgi_printf(" id:&nbsp;%z%d</a>",
311323
href("%R/deltachain/%d",rid), rid);
312324
}
313325
}
314326
tag_private_status(rid);
327
+
328
+ if( (tmFlags & TIMELINE_SIMPLE)!=0 ){
329
+ cgi_printf("</span>"); /* End of the declutter span */
330
+ }
315331
316332
#if EXTRA_FORMAT==2
317333
if( (tmFlags & TIMELINE_CLASSIC)==0 ){
318334
if( zType[0]=='c' ){
319335
cgi_printf(" check-in:&nbsp;%z<span class='timelineHash'>"
@@ -332,11 +348,11 @@
332348
}
333349
#endif /* EXTRA_FORMAT==2 */
334350
335351
336352
/* End timelineDetail */
337
- if( (tmFlags & (TIMELINE_CLASSIC|TIMELINE_VERBOSE|TIMELINE_COMPACT))!=0 ){
353
+ if( (tmFlags & TIMELINE_INLINE)!=0 ){
338354
cgi_printf(")");
339355
}
340356
}
341357
342358
@@ -420,10 +436,12 @@
420436
}
421437
if( tmFlags & TIMELINE_COLUMNAR ){
422438
zStyle = "Columnar";
423439
}else if( tmFlags & TIMELINE_COMPACT ){
424440
zStyle = "Compact";
441
+ }else if( tmFlags & TIMELINE_SIMPLE ){
442
+ zStyle = "Simple";
425443
}else if( tmFlags & TIMELINE_VERBOSE ){
426444
zStyle = "Verbose";
427445
}else if( tmFlags & TIMELINE_CLASSIC ){
428446
zStyle = "Classic";
429447
}else{
@@ -1325,10 +1343,11 @@
13251343
switch( v[0] ){
13261344
case 'c': tmFlags = TIMELINE_COMPACT; break;
13271345
case 'v': tmFlags = TIMELINE_VERBOSE; break;
13281346
case 'j': tmFlags = TIMELINE_COLUMNAR; break;
13291347
case 'x': tmFlags = TIMELINE_CLASSIC; break;
1348
+ case 's': tmFlags = TIMELINE_SIMPLE; break;
13301349
default: tmFlags = TIMELINE_MODERN; break;
13311350
}
13321351
return tmFlags;
13331352
}
13341353
@@ -1337,15 +1356,16 @@
13371356
*/
13381357
const char *const timeline_view_styles[] = {
13391358
"m", "Modern View",
13401359
"j", "Columnar View",
13411360
"c", "Compact View",
1361
+ "s", "Simple View",
13421362
"v", "Verbose View",
13431363
"x", "Classic View",
13441364
};
13451365
#if INTERFACE
1346
-# define N_TIMELINE_VIEW_STYLE 5
1366
+# define N_TIMELINE_VIEW_STYLE 6
13471367
#endif
13481368
13491369
/*
13501370
** Add the select/option box to the timeline submenu that is used to
13511371
** set the ss= parameter that determines the viewing mode.
13521372
--- src/timeline.c
+++ src/timeline.c
@@ -115,11 +115,13 @@
115 #define TIMELINE_COMPACT 0x0001000 /* Use the "compact" view style */
116 #define TIMELINE_VERBOSE 0x0002000 /* Use the "detailed" view style */
117 #define TIMELINE_MODERN 0x0004000 /* Use the "modern" view style */
118 #define TIMELINE_COLUMNAR 0x0008000 /* Use the "columns" view style */
119 #define TIMELINE_CLASSIC 0x0010000 /* Use the "classic" view style */
120 #define TIMELINE_VIEWS 0x001f000 /* Mask for all of the view styles */
 
 
121 #define TIMELINE_NOSCROLL 0x0100000 /* Don't scroll to the selection */
122 #define TIMELINE_FILEDIFF 0x0200000 /* Show File differences, not ckin diffs */
123 #define TIMELINE_CHPICK 0x0400000 /* Show cherrypick merges */
124 #define TIMELINE_FILLGAPS 0x0800000 /* Dotted lines for missing nodes */
125 #define TIMELINE_XMERGE 0x1000000 /* Omit merges from off-graph nodes */
@@ -194,11 +196,11 @@
194 const char *zUser = db_column_text(pQuery, 4);
195 const char *zTagList = db_column_text(pQuery, 8);
196 int tagid = db_column_int(pQuery, 9);
197 const char *zDispUser = zUser && zUser[0] ? zUser : "anonymous";
198
199 if( (tmFlags & (TIMELINE_CLASSIC|TIMELINE_VERBOSE|TIMELINE_COMPACT))!=0 ){
200 cgi_printf("(");
201 }
202
203 /* The EXTRA_FORMAT macro is an integer that controls various experiments
204 ** in the layout of the extra text.
@@ -234,16 +236,20 @@
234 }
235 #endif /* EXTRA_FORMAT==0 */
236 #if EXTRA_FORMAT==1
237 if( (tmFlags & TIMELINE_CLASSIC)==0 ){
238 if( zType[0]=='c' ){
239 int isLeaf = db_column_int(pQuery, 5);
240 const char *zPrefix;
241 if( isLeaf ){
242 zPrefix = has_closed_tag(rid) ? "closed&nbsp;" : "leaf&nbsp;";
243 }else{
244 zPrefix = "";
 
 
 
 
 
 
 
245 }
246 cgi_printf("%scheck-in:&nbsp;%z<span class='timelineHash'>"
247 "%S</span></a> ",
248 zPrefix, href("%R/info/%!S",zUuid),zUuid);
249 }else if( zType[0]=='e' && tagid ){
@@ -256,10 +262,16 @@
256 }else if( zType[0]=='g' || zType[0]=='w' || zType[0]=='t'
257 || zType[0]=='n' || zType[0]=='f'){
258 cgi_printf("artifact:&nbsp;%z%S</a> ",href("%R/info/%!S",zUuid),zUuid);
259 }
260 #endif /* EXTRA_FORMAT==1 */
 
 
 
 
 
 
261
262 if( g.perm.Hyperlink && fossil_strcmp(zDispUser, zThisUser)!=0 ){
263 char *zLink;
264 if( zType[0]!='f' || (tmFlags & TIMELINE_FORUMTXT)==0 ){
265 zLink = mprintf("%R/timeline?u=%h&c=%t&y=a", zDispUser, zDate);
@@ -310,10 +322,14 @@
310 cgi_printf(" id:&nbsp;%z%d</a>",
311 href("%R/deltachain/%d",rid), rid);
312 }
313 }
314 tag_private_status(rid);
 
 
 
 
315
316 #if EXTRA_FORMAT==2
317 if( (tmFlags & TIMELINE_CLASSIC)==0 ){
318 if( zType[0]=='c' ){
319 cgi_printf(" check-in:&nbsp;%z<span class='timelineHash'>"
@@ -332,11 +348,11 @@
332 }
333 #endif /* EXTRA_FORMAT==2 */
334
335
336 /* End timelineDetail */
337 if( (tmFlags & (TIMELINE_CLASSIC|TIMELINE_VERBOSE|TIMELINE_COMPACT))!=0 ){
338 cgi_printf(")");
339 }
340 }
341
342
@@ -420,10 +436,12 @@
420 }
421 if( tmFlags & TIMELINE_COLUMNAR ){
422 zStyle = "Columnar";
423 }else if( tmFlags & TIMELINE_COMPACT ){
424 zStyle = "Compact";
 
 
425 }else if( tmFlags & TIMELINE_VERBOSE ){
426 zStyle = "Verbose";
427 }else if( tmFlags & TIMELINE_CLASSIC ){
428 zStyle = "Classic";
429 }else{
@@ -1325,10 +1343,11 @@
1325 switch( v[0] ){
1326 case 'c': tmFlags = TIMELINE_COMPACT; break;
1327 case 'v': tmFlags = TIMELINE_VERBOSE; break;
1328 case 'j': tmFlags = TIMELINE_COLUMNAR; break;
1329 case 'x': tmFlags = TIMELINE_CLASSIC; break;
 
1330 default: tmFlags = TIMELINE_MODERN; break;
1331 }
1332 return tmFlags;
1333 }
1334
@@ -1337,15 +1356,16 @@
1337 */
1338 const char *const timeline_view_styles[] = {
1339 "m", "Modern View",
1340 "j", "Columnar View",
1341 "c", "Compact View",
 
1342 "v", "Verbose View",
1343 "x", "Classic View",
1344 };
1345 #if INTERFACE
1346 # define N_TIMELINE_VIEW_STYLE 5
1347 #endif
1348
1349 /*
1350 ** Add the select/option box to the timeline submenu that is used to
1351 ** set the ss= parameter that determines the viewing mode.
1352
--- src/timeline.c
+++ src/timeline.c
@@ -115,11 +115,13 @@
115 #define TIMELINE_COMPACT 0x0001000 /* Use the "compact" view style */
116 #define TIMELINE_VERBOSE 0x0002000 /* Use the "detailed" view style */
117 #define TIMELINE_MODERN 0x0004000 /* Use the "modern" view style */
118 #define TIMELINE_COLUMNAR 0x0008000 /* Use the "columns" view style */
119 #define TIMELINE_CLASSIC 0x0010000 /* Use the "classic" view style */
120 #define TIMELINE_SIMPLE 0x0020000 /* Use the "simple" view style */
121 #define TIMELINE_INLINE 0x0033000 /* Mask for views with in-line display */
122 #define TIMELINE_VIEWS 0x003f000 /* Mask for all of the view styles */
123 #define TIMELINE_NOSCROLL 0x0100000 /* Don't scroll to the selection */
124 #define TIMELINE_FILEDIFF 0x0200000 /* Show File differences, not ckin diffs */
125 #define TIMELINE_CHPICK 0x0400000 /* Show cherrypick merges */
126 #define TIMELINE_FILLGAPS 0x0800000 /* Dotted lines for missing nodes */
127 #define TIMELINE_XMERGE 0x1000000 /* Omit merges from off-graph nodes */
@@ -194,11 +196,11 @@
196 const char *zUser = db_column_text(pQuery, 4);
197 const char *zTagList = db_column_text(pQuery, 8);
198 int tagid = db_column_int(pQuery, 9);
199 const char *zDispUser = zUser && zUser[0] ? zUser : "anonymous";
200
201 if( (tmFlags & TIMELINE_INLINE)!=0 ){
202 cgi_printf("(");
203 }
204
205 /* The EXTRA_FORMAT macro is an integer that controls various experiments
206 ** in the layout of the extra text.
@@ -234,16 +236,20 @@
236 }
237 #endif /* EXTRA_FORMAT==0 */
238 #if EXTRA_FORMAT==1
239 if( (tmFlags & TIMELINE_CLASSIC)==0 ){
240 if( zType[0]=='c' ){
 
241 const char *zPrefix;
242 if( tmFlags & TIMELINE_SIMPLE ){
 
 
243 zPrefix = "";
244 }else{
245 int isLeaf = db_column_int(pQuery, 5);
246 if( isLeaf ){
247 zPrefix = has_closed_tag(rid) ? "closed&nbsp;" : "leaf&nbsp;";
248 }else{
249 zPrefix = "";
250 }
251 }
252 cgi_printf("%scheck-in:&nbsp;%z<span class='timelineHash'>"
253 "%S</span></a> ",
254 zPrefix, href("%R/info/%!S",zUuid),zUuid);
255 }else if( zType[0]=='e' && tagid ){
@@ -256,10 +262,16 @@
262 }else if( zType[0]=='g' || zType[0]=='w' || zType[0]=='t'
263 || zType[0]=='n' || zType[0]=='f'){
264 cgi_printf("artifact:&nbsp;%z%S</a> ",href("%R/info/%!S",zUuid),zUuid);
265 }
266 #endif /* EXTRA_FORMAT==1 */
267
268 if( (tmFlags & TIMELINE_SIMPLE)!=0 ){
269 @ <span class='timelineEllipsis' id='ellipsis-%d(rid)' \
270 @ data-id='%d(rid)'>...</span>
271 @ <span class='clutter' id='detail-%d(rid)'>
272 }
273
274 if( g.perm.Hyperlink && fossil_strcmp(zDispUser, zThisUser)!=0 ){
275 char *zLink;
276 if( zType[0]!='f' || (tmFlags & TIMELINE_FORUMTXT)==0 ){
277 zLink = mprintf("%R/timeline?u=%h&c=%t&y=a", zDispUser, zDate);
@@ -310,10 +322,14 @@
322 cgi_printf(" id:&nbsp;%z%d</a>",
323 href("%R/deltachain/%d",rid), rid);
324 }
325 }
326 tag_private_status(rid);
327
328 if( (tmFlags & TIMELINE_SIMPLE)!=0 ){
329 cgi_printf("</span>"); /* End of the declutter span */
330 }
331
332 #if EXTRA_FORMAT==2
333 if( (tmFlags & TIMELINE_CLASSIC)==0 ){
334 if( zType[0]=='c' ){
335 cgi_printf(" check-in:&nbsp;%z<span class='timelineHash'>"
@@ -332,11 +348,11 @@
348 }
349 #endif /* EXTRA_FORMAT==2 */
350
351
352 /* End timelineDetail */
353 if( (tmFlags & TIMELINE_INLINE)!=0 ){
354 cgi_printf(")");
355 }
356 }
357
358
@@ -420,10 +436,12 @@
436 }
437 if( tmFlags & TIMELINE_COLUMNAR ){
438 zStyle = "Columnar";
439 }else if( tmFlags & TIMELINE_COMPACT ){
440 zStyle = "Compact";
441 }else if( tmFlags & TIMELINE_SIMPLE ){
442 zStyle = "Simple";
443 }else if( tmFlags & TIMELINE_VERBOSE ){
444 zStyle = "Verbose";
445 }else if( tmFlags & TIMELINE_CLASSIC ){
446 zStyle = "Classic";
447 }else{
@@ -1325,10 +1343,11 @@
1343 switch( v[0] ){
1344 case 'c': tmFlags = TIMELINE_COMPACT; break;
1345 case 'v': tmFlags = TIMELINE_VERBOSE; break;
1346 case 'j': tmFlags = TIMELINE_COLUMNAR; break;
1347 case 'x': tmFlags = TIMELINE_CLASSIC; break;
1348 case 's': tmFlags = TIMELINE_SIMPLE; break;
1349 default: tmFlags = TIMELINE_MODERN; break;
1350 }
1351 return tmFlags;
1352 }
1353
@@ -1337,15 +1356,16 @@
1356 */
1357 const char *const timeline_view_styles[] = {
1358 "m", "Modern View",
1359 "j", "Columnar View",
1360 "c", "Compact View",
1361 "s", "Simple View",
1362 "v", "Verbose View",
1363 "x", "Classic View",
1364 };
1365 #if INTERFACE
1366 # define N_TIMELINE_VIEW_STYLE 6
1367 #endif
1368
1369 /*
1370 ** Add the select/option box to the timeline submenu that is used to
1371 ** set the ss= parameter that determines the viewing mode.
1372

Keyboard Shortcuts

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