Fossil SCM
Shortcuts SHIFT+N and SHIFT+M to put focus the first (topmost) or last (bottommost) entry.
Commit
145df5a3e10a7fb1507111020a078d815caaf97ac6328258707d7250716a4c6d
Parent
115b4849922ba9f…
1 file changed
+23
-3
+23
-3
| --- src/graph.js | ||
| +++ src/graph.js | ||
| @@ -852,12 +852,22 @@ | ||
| 852 | 852 | window.addEventListener('load',function(){ |
| 853 | 853 | function focusDefaultId(){ |
| 854 | 854 | var tn = document.querySelector('.timelineSelected .tl-nodemark') || |
| 855 | 855 | document.querySelector('.timelineCurrent .tl-nodemark'); |
| 856 | 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; | |
| 857 | 865 | } |
| 858 | 866 | function focusNextId(id,dx){ |
| 867 | + if( dx<-1 ) return focusFirstId(id); | |
| 868 | + if( dx>+1 ) return focusLastId(id); | |
| 859 | 869 | var m = /^m(\d+)$/.exec(id); |
| 860 | 870 | return m!==null ? 'm' + (parseInt(m[1]) + dx) : null; |
| 861 | 871 | } |
| 862 | 872 | function timelineGetDataBlock(i){ |
| 863 | 873 | var tb = document.getElementById('timeline-data-' + i); |
| @@ -912,21 +922,31 @@ | ||
| 912 | 922 | } |
| 913 | 923 | focusCacheInit(); |
| 914 | 924 | document.addEventListener('keydown',function(evt){ |
| 915 | 925 | if( evt.target.tagName=='INPUT' ) return; |
| 916 | 926 | var |
| 927 | + mSHIFT = 1<<13, | |
| 928 | + kFRST = mSHIFT | 78 /* SHIFT+N */, | |
| 917 | 929 | kNEXT = 78 /* N */, |
| 918 | 930 | kPREV = 77 /* M */, |
| 931 | + kLAST = mSHIFT | 77 /* SHIFT+M */, | |
| 919 | 932 | kTMLN = 74 /* J */, |
| 920 | 933 | kVIEW = 75 /* K */, |
| 921 | 934 | kDONE = 76 /* L */, |
| 922 | 935 | mod = evt.altKey<<15 | evt.ctrlKey<<14 | evt.shiftKey<<13, |
| 923 | 936 | key = ( evt.which || evt.keyCode ) | mod; |
| 924 | 937 | 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 | + } | |
| 928 | 948 | if( key==kDONE ){ |
| 929 | 949 | focusCacheSet(null); |
| 930 | 950 | focusVisualize(null,false); |
| 931 | 951 | document.cookie = |
| 932 | 952 | 'fossil_timeline_kbnav=;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/'; |
| 933 | 953 |
| --- 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 |