Fossil SCM

Shortcuts SHIFT+N and SHIFT+M to put focus the first (topmost) or last (bottommost) entry.

florian 2022-08-04 03:41 timeline-keyboard-navigation
Commit 145df5a3e10a7fb1507111020a078d815caaf97ac6328258707d7250716a4c6d
1 file changed +23 -3
+23 -3
--- src/graph.js
+++ src/graph.js
@@ -852,12 +852,22 @@
852852
window.addEventListener('load',function(){
853853
function focusDefaultId(){
854854
var tn = document.querySelector('.timelineSelected .tl-nodemark') ||
855855
document.querySelector('.timelineCurrent .tl-nodemark');
856856
return tn ? tn.id : 'm1';
857
+ }
858
+ function focusFirstId(id){
859
+ return 'm1';
860
+ }
861
+ function focusLastId(id){
862
+ var el = document.getElementsByClassName('tl-nodemark');
863
+ var tn = el ? el[el.length-1] : null;
864
+ return tn ? tn.id : id;
857865
}
858866
function focusNextId(id,dx){
867
+ if( dx<-1 ) return focusFirstId(id);
868
+ if( dx>+1 ) return focusLastId(id);
859869
var m = /^m(\d+)$/.exec(id);
860870
return m!==null ? 'm' + (parseInt(m[1]) + dx) : null;
861871
}
862872
function timelineGetDataBlock(i){
863873
var tb = document.getElementById('timeline-data-' + i);
@@ -912,21 +922,31 @@
912922
}
913923
focusCacheInit();
914924
document.addEventListener('keydown',function(evt){
915925
if( evt.target.tagName=='INPUT' ) return;
916926
var
927
+ mSHIFT = 1<<13,
928
+ kFRST = mSHIFT | 78 /* SHIFT+N */,
917929
kNEXT = 78 /* N */,
918930
kPREV = 77 /* M */,
931
+ kLAST = mSHIFT | 77 /* SHIFT+M */,
919932
kTMLN = 74 /* J */,
920933
kVIEW = 75 /* K */,
921934
kDONE = 76 /* L */,
922935
mod = evt.altKey<<15 | evt.ctrlKey<<14 | evt.shiftKey<<13,
923936
key = ( evt.which || evt.keyCode ) | mod;
924937
var dx = 0;
925
- if( key==kPREV ) dx++;
926
- else if( key==kNEXT ) dx--;
927
- else if( key!=kTMLN && key!=kVIEW && key!=kDONE ) return;
938
+ switch( key ){
939
+ case kFRST: dx = -2; break;
940
+ case kNEXT: dx = -1; break;
941
+ case kPREV: dx = +1; break;
942
+ case kLAST: dx = +2; break;
943
+ case kTMLN: break;
944
+ case kVIEW: break;
945
+ case kDONE: break;
946
+ default: return;
947
+ }
928948
if( key==kDONE ){
929949
focusCacheSet(null);
930950
focusVisualize(null,false);
931951
document.cookie =
932952
'fossil_timeline_kbnav=;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/';
933953
--- src/graph.js
+++ src/graph.js
@@ -852,12 +852,22 @@
852 window.addEventListener('load',function(){
853 function focusDefaultId(){
854 var tn = document.querySelector('.timelineSelected .tl-nodemark') ||
855 document.querySelector('.timelineCurrent .tl-nodemark');
856 return tn ? tn.id : 'm1';
 
 
 
 
 
 
 
 
857 }
858 function focusNextId(id,dx){
 
 
859 var m = /^m(\d+)$/.exec(id);
860 return m!==null ? 'm' + (parseInt(m[1]) + dx) : null;
861 }
862 function timelineGetDataBlock(i){
863 var tb = document.getElementById('timeline-data-' + i);
@@ -912,21 +922,31 @@
912 }
913 focusCacheInit();
914 document.addEventListener('keydown',function(evt){
915 if( evt.target.tagName=='INPUT' ) return;
916 var
 
 
917 kNEXT = 78 /* N */,
918 kPREV = 77 /* M */,
 
919 kTMLN = 74 /* J */,
920 kVIEW = 75 /* K */,
921 kDONE = 76 /* L */,
922 mod = evt.altKey<<15 | evt.ctrlKey<<14 | evt.shiftKey<<13,
923 key = ( evt.which || evt.keyCode ) | mod;
924 var dx = 0;
925 if( key==kPREV ) dx++;
926 else if( key==kNEXT ) dx--;
927 else if( key!=kTMLN && key!=kVIEW && key!=kDONE ) return;
 
 
 
 
 
 
 
928 if( key==kDONE ){
929 focusCacheSet(null);
930 focusVisualize(null,false);
931 document.cookie =
932 'fossil_timeline_kbnav=;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/';
933
--- src/graph.js
+++ src/graph.js
@@ -852,12 +852,22 @@
852 window.addEventListener('load',function(){
853 function focusDefaultId(){
854 var tn = document.querySelector('.timelineSelected .tl-nodemark') ||
855 document.querySelector('.timelineCurrent .tl-nodemark');
856 return tn ? tn.id : 'm1';
857 }
858 function focusFirstId(id){
859 return 'm1';
860 }
861 function focusLastId(id){
862 var el = document.getElementsByClassName('tl-nodemark');
863 var tn = el ? el[el.length-1] : null;
864 return tn ? tn.id : id;
865 }
866 function focusNextId(id,dx){
867 if( dx<-1 ) return focusFirstId(id);
868 if( dx>+1 ) return focusLastId(id);
869 var m = /^m(\d+)$/.exec(id);
870 return m!==null ? 'm' + (parseInt(m[1]) + dx) : null;
871 }
872 function timelineGetDataBlock(i){
873 var tb = document.getElementById('timeline-data-' + i);
@@ -912,21 +922,31 @@
922 }
923 focusCacheInit();
924 document.addEventListener('keydown',function(evt){
925 if( evt.target.tagName=='INPUT' ) return;
926 var
927 mSHIFT = 1<<13,
928 kFRST = mSHIFT | 78 /* SHIFT+N */,
929 kNEXT = 78 /* N */,
930 kPREV = 77 /* M */,
931 kLAST = mSHIFT | 77 /* SHIFT+M */,
932 kTMLN = 74 /* J */,
933 kVIEW = 75 /* K */,
934 kDONE = 76 /* L */,
935 mod = evt.altKey<<15 | evt.ctrlKey<<14 | evt.shiftKey<<13,
936 key = ( evt.which || evt.keyCode ) | mod;
937 var dx = 0;
938 switch( key ){
939 case kFRST: dx = -2; break;
940 case kNEXT: dx = -1; break;
941 case kPREV: dx = +1; break;
942 case kLAST: dx = +2; break;
943 case kTMLN: break;
944 case kVIEW: break;
945 case kDONE: break;
946 default: return;
947 }
948 if( key==kDONE ){
949 focusCacheSet(null);
950 focusVisualize(null,false);
951 document.cookie =
952 'fossil_timeline_kbnav=;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/';
953

Keyboard Shortcuts

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