support mutliple modifiers for key bindings
This commit is contained in:
		
							parent
							
								
									4e94695c75
								
							
						
					
					
						commit
						036ede3379
					
				
					 11 changed files with 75 additions and 75 deletions
				
			
		| 
						 | 
				
			
			@ -7,7 +7,28 @@ describe("setting actions", () => {
 | 
			
		|||
    it('create SETTING_SET action', () => {
 | 
			
		||||
      let action = settingActions.set({ red: 'apple', yellow: 'banana' });
 | 
			
		||||
      expect(action.type).to.equal(actions.SETTING_SET);
 | 
			
		||||
      expect(action.value).to.deep.equal({ red: 'apple', yellow: 'banana' });
 | 
			
		||||
      expect(action.value.red).to.equal('apple');
 | 
			
		||||
      expect(action.value.yellow).to.equal('banana');
 | 
			
		||||
      expect(action.value.keymaps).to.be.empty;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('converts keymaps', () => {
 | 
			
		||||
      let action = settingActions.set({
 | 
			
		||||
        keymaps: {
 | 
			
		||||
          'dd': 'remove current tab',
 | 
			
		||||
          'z<C-A>': 'increment',
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
      let keymaps = action.value.keymaps;
 | 
			
		||||
 | 
			
		||||
      expect(action.value.keymaps).to.have.deep.all.keys(
 | 
			
		||||
        [
 | 
			
		||||
          [{ key: 'd', shiftKey: false, ctrlKey: false, altKey: false, metaKey: false },
 | 
			
		||||
           { key: 'd', shiftKey: false, ctrlKey: false, altKey: false, metaKey: false }],
 | 
			
		||||
          [{ key: 'z', shiftKey: false, ctrlKey: false, altKey: false, metaKey: false },
 | 
			
		||||
           { key: 'a', shiftKey: false, ctrlKey: true, altKey: false, metaKey: false }],
 | 
			
		||||
        ]
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,20 +4,21 @@ import { expect } from "chai";
 | 
			
		|||
describe('InputComponent', () => {
 | 
			
		||||
  it('register callbacks', () => {
 | 
			
		||||
    let component = new InputComponent(window.document);
 | 
			
		||||
    let key = { key: 'a', ctrlKey: true, shiftKey: false, altKey: false, metaKey: false };
 | 
			
		||||
    component.onKey((key) => {
 | 
			
		||||
      expect(key).is.equals('a');
 | 
			
		||||
      expect(key).to.deep.equal(key);
 | 
			
		||||
    });
 | 
			
		||||
    component.onKeyDown({ key: 'a' });
 | 
			
		||||
    component.onKeyDown(key);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('invoke callback once', () => {
 | 
			
		||||
    let component = new InputComponent(window.document);
 | 
			
		||||
    let a = 0, b = 0;
 | 
			
		||||
    component.onKey((key) => {
 | 
			
		||||
      if (key == 'a') {
 | 
			
		||||
      if (key.key == 'a') {
 | 
			
		||||
        ++a;
 | 
			
		||||
      } else {
 | 
			
		||||
        key == 'b'
 | 
			
		||||
        key.key == 'b'
 | 
			
		||||
        ++b;
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
| 
						 | 
				
			
			@ -32,38 +33,6 @@ describe('InputComponent', () => {
 | 
			
		|||
    expect(b).is.equals(1);
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  it('add prefix when ctrl pressed', () => {
 | 
			
		||||
    let component = new InputComponent(window.document);
 | 
			
		||||
    component.onKey((key) => {
 | 
			
		||||
      expect(key).is.equals('<C-A>');
 | 
			
		||||
    });
 | 
			
		||||
    component.onKeyDown({ key: 'a', ctrlKey: true });
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  it('press X', () => {
 | 
			
		||||
    let component = new InputComponent(window.document);
 | 
			
		||||
    component.onKey((key) => {
 | 
			
		||||
      expect(key).is.equals('X');
 | 
			
		||||
    });
 | 
			
		||||
    component.onKeyDown({ key: 'X', shiftKey: true });
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  it('press <Shift> + <Esc>', () => {
 | 
			
		||||
    let component = new InputComponent(window.document);
 | 
			
		||||
    component.onKey((key) => {
 | 
			
		||||
      expect(key).is.equals('<S-Esc>');
 | 
			
		||||
    });
 | 
			
		||||
    component.onKeyDown({ key: 'Escape', shiftKey: true });
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  it('press <Ctrl> + <Esc>', () => {
 | 
			
		||||
    let component = new InputComponent(window.document);
 | 
			
		||||
    component.onKey((key) => {
 | 
			
		||||
      expect(key).is.equals('<C-Esc>');
 | 
			
		||||
    });
 | 
			
		||||
    component.onKeyDown({ key: 'Escape', ctrlKey: true });
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  it('does not invoke only meta keys', () => {
 | 
			
		||||
    let component = new InputComponent(window.document);
 | 
			
		||||
    component.onKey((key) => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,22 +5,22 @@ import inputReducer from 'content/reducers/input';
 | 
			
		|||
describe("input reducer", () => {
 | 
			
		||||
  it('return the initial state', () => {
 | 
			
		||||
    let state = inputReducer(undefined, {});
 | 
			
		||||
    expect(state).to.have.deep.property('keys', '');
 | 
			
		||||
    expect(state).to.have.deep.property('keys', []);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('return next state for INPUT_KEY_PRESS', () => {
 | 
			
		||||
    let action = { type: actions.INPUT_KEY_PRESS, key: 'a' };
 | 
			
		||||
    let state = inputReducer(undefined, action);
 | 
			
		||||
    expect(state).to.have.deep.property('keys', 'a');
 | 
			
		||||
    expect(state).to.have.deep.property('keys', ['a']);
 | 
			
		||||
 | 
			
		||||
    action = { type: actions.INPUT_KEY_PRESS, key: '<C-B>' };
 | 
			
		||||
    action = { type: actions.INPUT_KEY_PRESS, key: 'b' };
 | 
			
		||||
    state = inputReducer(state, action);
 | 
			
		||||
    expect(state).to.have.deep.property('keys', 'a<C-B>');
 | 
			
		||||
    expect(state).to.have.deep.property('keys', ['a', 'b']);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('return next state for INPUT_CLEAR_KEYS', () => {
 | 
			
		||||
    let action = { type: actions.INPUT_CLEAR_KEYS };
 | 
			
		||||
    let state = inputReducer({ keys: 'abc' }, action);
 | 
			
		||||
    expect(state).to.have.deep.property('keys', '');
 | 
			
		||||
    let state = inputReducer({ keys: [1, 2, 3] }, action);
 | 
			
		||||
    expect(state).to.have.deep.property('keys', []);
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@ import settingReducer from 'content/reducers/setting';
 | 
			
		|||
describe("content setting reducer", () => {
 | 
			
		||||
  it('return the initial state', () => {
 | 
			
		||||
    let state = settingReducer(undefined, {});
 | 
			
		||||
    expect(state).to.deep.equal({ keymaps: {} });
 | 
			
		||||
    expect(state.keymaps).to.be.empty;
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('return next state for SETTING_SET', () => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Reference in a new issue