Last active
September 25, 2015 07:54
-
-
Save r7kamura/ab9b96253be3d8e6d7f3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 }); | |
}); | |
} | |
} |
Author
r7kamura
commented
Sep 25, 2015
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment