Skip to content

Commit

Permalink
сделал EventSender дженериком, переименовал ивенты (#32)(#43)
Browse files Browse the repository at this point in the history
  • Loading branch information
Geksanit committed Feb 3, 2018
1 parent 8aaf69e commit 6d5e7a9
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 54 deletions.
21 changes: 11 additions & 10 deletions frontend/mvc/controller/Controller.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import IModel from '../model/IModel';
import IView from '../view/IView';
import { IModel } from '../model/IModel';
import { IView } from '../view/IView';


class Controller {
model: IModel;
Expand All @@ -15,32 +16,32 @@ class Controller {
this.setRunning(false);
}
setSubscription():void {
this.model.matrixChanged.attach((sender, { isResized, matrix }) => {
if (isResized) { this.view.initTable(matrix); }
this.model.matrixChanged.attach((sender, { resized , matrix }) => {
if (resized) { this.view.initTable(matrix); }
else { this.view.changeTable(matrix); }
});
this.view.tableCellChanged.attach((sender, { row, cell }) => {
this.model.toggleCell(row, cell);
});
this.view.startEvent.attach(() => {
this.view.started.attach(() => {
this.setRunning(true);
this.anim();
});
this.view.pauseEvent.attach(() => {
this.view.paused.attach(() => {
this.setRunning(false);
});
this.view.clearEvent.attach(() => {
this.view.cleared.attach(() => {
this.model.clearMatrix();
this.setRunning(false);
});
this.view.speedChanged.attach((sender, { value }) => {
this.view.speedChanged.attach((sender, value) => {
this.fps = value;
});
this.view.widthChanged.attach((sender, { value }) => {
this.view.widthChanged.attach((sender, value) => {
this.setRunning(false);
this.model.setWidthMatrix(value);
});
this.view.heightChanged.attach((sender, { value }) => {
this.view.heightChanged.attach((sender, value) => {
this.setRunning(false);
this.model.setHeightMatrix(value);
});
Expand Down
9 changes: 7 additions & 2 deletions frontend/mvc/model/IModel.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
import IEventSender from '../utils/IEventSender';

type matrixChangedMessage = {

This comment has been minimized.

Copy link
@Znack

Znack Feb 7, 2018

типы с большой буквы именуются :)

matrix: boolean[][];
resized?: boolean;
};

interface IModel {
matrix: boolean[][];
matrixChanged: IEventSender;
matrixChanged: IEventSender<matrixChangedMessage>;
setWidthMatrix(newValue: number): void;
setHeightMatrix(newValue: number): void;
clearMatrix(): void;
Expand All @@ -11,4 +16,4 @@ interface IModel {
toggleCell(row: number, column: number): void;
}

export default IModel;
export { IModel, matrixChangedMessage };
12 changes: 6 additions & 6 deletions frontend/mvc/model/Model.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import Event from '../utils/EventSender';
import IModel from './IModel';
import EventSender from '../utils/EventSender';
import { IModel, matrixChangedMessage } from './IModel';
import '../../scripts/arrayFrom-polyfill';

class Model implements IModel{
matrix: boolean[][];
rows: number;
columns: number;
stateHistory: boolean[][][];
matrixChanged: Event;
matrixChanged: EventSender<matrixChangedMessage>;
constructor(rows: number = 10, columns: number = 10) {
this.initMatrix(rows, columns);
this.rows = rows;
this.columns = columns;
this.stateHistory = [];
this.matrixChanged = new Event(this);
this.matrixChanged = new EventSender<matrixChangedMessage>(this);
}
initMatrix(rows: number, columns: number): void {
this.matrix = Array.from(Array(rows), () => Array.from(Array(columns), () => false));
Expand All @@ -30,7 +30,7 @@ class Model implements IModel{
});
this.columns = newWidth;
this.stateHistory = [];
this.matrixChanged.notify({ matrix: this.matrix, isResized: true });
this.matrixChanged.notify({ matrix: this.matrix, resized: true });
}
setHeightMatrix(newHeight: number): void {
this.matrix = Array.from(Array(newHeight), (row, i) => {
Expand All @@ -39,7 +39,7 @@ class Model implements IModel{
});
this.rows = newHeight;
this.stateHistory = [];
this.matrixChanged.notify({ matrix: this.matrix, isResized: true });
this.matrixChanged.notify({ matrix: this.matrix, resized: true });
}
clearMatrix(): void {
this.initMatrix(this.rows, this.columns);
Expand Down
8 changes: 4 additions & 4 deletions frontend/mvc/utils/EventSender.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import IEventSender from './IEventSender';

class EventSender implements IEventSender {
class EventSender<T> implements IEventSender<T> {
sender: object;
listeners: Array<(a, b) => void>;
listeners: Array<(a: object, b: T) => void>;
constructor(sender: object) {
this.sender = sender;
this.listeners = [];
}
attach(listener: (a, b) => void): void {
attach(listener: (a: object, b: T) => void): void {
this.listeners.push(listener);
}
notify(args: object): void {
notify(args: T): void {
this.listeners.forEach((listener) => {
listener(this.sender, args);
});
Expand Down
6 changes: 3 additions & 3 deletions frontend/mvc/utils/IEventSender.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
interface IEventSender {
attach(listener: (a, b) => void): void;
notify(args: object): void;
interface IEventSender<T> {
attach(listener: (a: object, b: T) => void): void;
notify(args: T): void;
}
export default IEventSender;
22 changes: 14 additions & 8 deletions frontend/mvc/view/IView.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
import IEventSender from '../utils/IEventSender';

type tableCellAddress = {

This comment has been minimized.

Copy link
@Znack

Znack Feb 7, 2018

С большой буквы :)

row: number;
cell:number;
};


interface IView {
tableCellChanged: IEventSender;
startEvent: IEventSender;
pauseEvent: IEventSender;
clearEvent: IEventSender;
widthChanged: IEventSender;
heightChanged: IEventSender;
speedChanged: IEventSender;
tableCellChanged: IEventSender<tableCellAddress>;
started: IEventSender<null>;
paused: IEventSender<null>;
cleared: IEventSender<null>;
widthChanged: IEventSender<number>;
heightChanged: IEventSender<number>;
speedChanged: IEventSender<number>;
setStatus(running: boolean): void;
initTable(matrix: boolean[][]): void;
changeTable(matrix: boolean[][]): void;
}

export default IView;
export { IView, tableCellAddress };
42 changes: 21 additions & 21 deletions frontend/mvc/view/View.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import EventSender from '../utils/EventSender';
import IView from './IView';
import { IView, tableCellAddress } from './IView';

const CLASS_CEIL = 'game__ceil';
const CLASS_CEIL_LIVE = 'game__ceil_live';
Expand All @@ -15,13 +15,13 @@ class View implements IView{
$sliderHeight: JQuery;
$status: JQuery;

tableCellChanged: EventSender;
startEvent: EventSender;
pauseEvent: EventSender;
clearEvent: EventSender;
widthChanged: EventSender;
heightChanged: EventSender;
speedChanged: EventSender;
tableCellChanged: EventSender<tableCellAddress>;
started: EventSender<null>;
paused: EventSender<null>;
cleared: EventSender<null>;
widthChanged: EventSender<number>;
heightChanged: EventSender<number>;
speedChanged: EventSender<number>;
constructor() {
this.initDOMElements();
this.initEvents();
Expand All @@ -39,13 +39,13 @@ class View implements IView{
this.$status = this.$controls.find('.js-game__status');
}
initEvents(): void {
this.tableCellChanged = new EventSender(this);
this.startEvent = new EventSender(this);
this.pauseEvent = new EventSender(this);
this.clearEvent = new EventSender(this);
this.widthChanged = new EventSender(this);
this.heightChanged = new EventSender(this);
this.speedChanged = new EventSender(this);
this.tableCellChanged = new EventSender<tableCellAddress>(this);
this.started = new EventSender<null>(this);
this.paused = new EventSender<null>(this);
this.cleared = new EventSender<null>(this);
this.widthChanged = new EventSender<number>(this);
this.heightChanged = new EventSender<number>(this);
this.speedChanged = new EventSender<number>(this);
}
initHandlers(): void {
this.$table.on('click.view', 'td', ({ target }) => {
Expand All @@ -54,25 +54,25 @@ class View implements IView{
this.tableCellChanged.notify({ row, cell });
});
this.$buttonStart.on('click.view', () => {
this.startEvent.notify({});
this.started.notify(null);
});
this.$buttonPause.on('click.view', () => {
this.pauseEvent.notify({});
this.paused.notify(null);
});
this.$buttonClear.on('click.view', () => {
this.clearEvent.notify({});
this.cleared.notify(null);
});
this.$sliderSpeed.on('change.view', ({ target }) => {
const value: number = Number($(target).val());
this.speedChanged.notify({ value });
this.speedChanged.notify(value);
});
this.$sliderWidth.on('change.view', ({ target }) => {
const value: number = Number($(target).val());
this.widthChanged.notify({ value });
this.widthChanged.notify(value);
});
this.$sliderHeight.on('change.view', ({ target }) => {
const value: number = Number($(target).val());
this.heightChanged.notify({ value });
this.heightChanged.notify(value);
});
}
setButtons(running: boolean): void {
Expand Down

0 comments on commit 6d5e7a9

Please sign in to comment.