Skip to content

Instantly share code, notes, and snippets.

@r7kamura
Last active September 25, 2015 07:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save r7kamura/ab9b96253be3d8e6d7f3 to your computer and use it in GitHub Desktop.
Save r7kamura/ab9b96253be3d8e6d7f3 to your computer and use it in GitHub Desktop.
import domainEventPublisher from '../singletons/domain-event-publisher'
import EventLogger from '../libraries/event-logger'
import ipc from 'ipc'
import keyboardEventPublisher from '../singletons/keyboard-event-publisher'
import SheetCreator from '../domain-models/sheet-creator'
import SheetGroupLoader from '../domain-models/sheet-group-loader'
import SheetLoader from '../domain-models/sheet-loader'
import SheetMover from '../domain-models/sheet-mover'
import SheetUpdater from '../domain-models/sheet-updater'
import State from '../domain-models/state'
import View from '../domain-models/view'
import viewEventPublisher from '../singletons/view-event-publisher'
export default class ApplicationService {
constructor() {
this.domainEventLogger = new EventLogger({ name: 'Domain' });
this.sheetCreator = new SheetCreator();
this.sheetGroupLoader = new SheetGroupLoader();
this.sheetLoader = new SheetLoader();
this.sheetMover = new SheetMover();
this.sheetUpdater = new SheetUpdater();
this.state = new State();
this.view = new View();
this.viewEventLogger = new EventLogger({ name: 'View' });
}
start() {
this.subscribeDomainEvents();
this.subscribeIpcEvents();
this.subscribeKeyboardEvents();
this.subscribeStateEvents();
this.subscribeViewEvents();
this.view.render(this.state.toViewState());
this.sheetGroupLoader.loadSheetGroups();
}
subscribeDomainEvents() {
domainEventPublisher.subscribe((event) => {
this.domainEventLogger.log({ event, state: this.state.toViewState() });
}).on('editor-focused', () => {
this.state.focusEditor();
}).on('editor-unfocused', () => {
this.state.unfocusEditor();
}).on('requested-to-clear-sheet-selection', () => {
this.state.clearSheetSelection();
}).on('requested-to-create-new-sheet', () => {
this.sheetCreator.create({ directory: this.state.selectedSheetGroup.path });
}).on('requested-to-delete-selected-sheets', () => {
this.state.selectedSheets.forEach((sheet) => {
this.sheetMover.move({ sheet: sheet, sheetGroup: this.state.trashSheetGroup });
});
}).on('requested-to-enter-selected-sheet', () => {
this.state.focusEditor();
}).on('requested-to-select-sheet-group', ({ sheetGroup }) => {
this.state.selectSheetGroup(sheetGroup);
this.sheetLoader.loadSheetsFrom(sheetGroup.path);
}).on('requested-to-select-next-sheet', () => {
this.state.selectNextSheet();
}).on('requested-to-select-next-sheet-range', () => {
this.state.selectNextSheetRange();
}).on('requested-to-select-previous-sheet', () => {
this.state.selectPreviousSheet();
}).on('requested-to-select-previous-sheet-range', () => {
this.state.selectPreviousSheetRange();
}).on('requested-to-select-sheet', ({ sheet }) => {
this.state.selectSheet(sheet);
}).on('requested-to-select-sheet-range', ({ sheet }) => {
this.state.selectSheetRange(sheet);
}).on('requested-to-switch-to-one-pane', () => {
this.state.switchToOnePane();
}).on('requested-to-switch-to-three-pane', () => {
this.state.switchToThreePane();
}).on('requested-to-switch-to-two-pane', () => {
this.state.switchToTwoPane();
}).on('requested-to-toggle-sheet-selection', ({ sheet }) => {
this.state.toggleSheetSelection(sheet);
}).on('selected-sheet-content-changed', ({ content, sheet }) => {
this.sheetUpdater.update({ content, sheet });
}).on('sheet-created', ({ sheet }) => {
this.state.addSheet(sheet);
this.state.selectSheet(sheet);
this.state.focusEditor();
}).on('sheet-moved', ({ sheet }) => {
this.state.deleteSheet(sheet);
}).on('sheet-groups-loaded', ({ sheetGroups }) => {
this.state.addSheetGroups(sheetGroups);
}).on('sheet-updated', ({ sheet }) => {
this.state.publish('changed');
}).on('sheets-loaded', ({ sheets }) => {
this.state.setSheets(sheets);
});
}
subscribeIpcEvents() {
ipc.on('requested-to-create-new-sheet', () => {
domainEventPublisher.publish('requested-to-create-new-sheet');
}).on('requested-to-delete-selected-sheets', () => {
domainEventPublisher.publish('requested-to-delete-selected-sheets');
}).on('requested-to-switch-to-one-pane', () => {
domainEventPublisher.publish('requested-to-switch-to-one-pane');
}).on('requested-to-switch-to-three-pane', () => {
domainEventPublisher.publish('requested-to-switch-to-three-pane');
}).on('requested-to-switch-to-two-pane', () => {
domainEventPublisher.publish('requested-to-switch-to-two-pane');
});
}
subscribeKeyboardEvents() {
keyboardEventPublisher.on('Down', ({ event }) => {
event.preventDefault();
domainEventPublisher.publish('requested-to-select-next-sheet');
}).on('Esc', ({ event }) => {
event.preventDefault();
domainEventPublisher.publish('requested-to-clear-sheet-selection');
}).on('Return', ({ event }) => {
event.preventDefault();
domainEventPublisher.publish('requested-to-enter-selected-sheet');
}).on('Shift+Down', ({ event }) => {
event.preventDefault();
domainEventPublisher.publish('requested-to-select-next-sheet-range');
}).on('Shift+Up', ({ event }) => {
event.preventDefault();
domainEventPublisher.publish('requested-to-select-previous-sheet-range');
}).on('Up', ({ event }) => {
event.preventDefault();
domainEventPublisher.publish('requested-to-select-previous-sheet');
});
}
subscribeStateEvents() {
this.state.on('changed', () => {
this.view.rerender(this.state.toViewState());
})
}
subscribeViewEvents() {
viewEventPublisher.subscribe((event) => {
this.viewEventLogger.log({ event, state: this.state.toViewState() });
}).on('create-new-sheet-button-clicked', () => {
domainEventPublisher.publish('requested-to-create-new-sheet');
}).on('delete-selected-sheets-button-clicked', () => {
domainEventPublisher.publish('requested-to-delete-selected-sheets');
}).on('editor-focused', () => {
domainEventPublisher.publish('editor-focused');
}).on('editor-value-changed', ({ sheet, value }) => {
domainEventPublisher.publish('selected-sheet-content-changed', { content: value, sheet });
}).on('editor-unfocused', () => {
domainEventPublisher.publish('editor-unfocused');
}).on('sheet-clicked', ({ event, sheet }) => {
if (event.ctrlKey ^ event.metaKey) {
domainEventPublisher.publish('requested-to-toggle-sheet-selection', { sheet });
} else if (event.shiftKey) {
domainEventPublisher.publish('requested-to-select-sheet-range', { sheet });
} else {
domainEventPublisher.publish('requested-to-select-sheet', { sheet });
}
}).on('sheet-double-clicked', () => {
domainEventPublisher.publish('requested-to-enter-selected-sheet');
}).on('sheet-group-clicked', ({ sheetGroup }) => {
domainEventPublisher.publish('requested-to-select-sheet-group', { sheetGroup });
});
}
}
@r7kamura
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment