Skip to content

Commit

Permalink
Merge pull request #47 from Geksanit/refactor
Browse files Browse the repository at this point in the history
Refactor
  • Loading branch information
Geksanit authored Feb 5, 2018
2 parents 4882afd + 6d5e7a9 commit f254f41
Show file tree
Hide file tree
Showing 14 changed files with 120 additions and 102 deletions.
27 changes: 0 additions & 27 deletions frontend/components/slider/slider.js

This file was deleted.

2 changes: 1 addition & 1 deletion frontend/components/slider/slider.pug
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ mixin slider(options)
- options.value = options.value || 0
- options.mix = options.mix || ''

div(class = "slider slider_color_" + options.color + " " + options.mix)
div(class = "slider js-slider slider_color_" + options.color + " " + options.mix)
if (options.view)
.slider__view.js-slider__view #{options.value}
if (options.line)
Expand Down
31 changes: 31 additions & 0 deletions frontend/components/slider/slider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@

import convertRemToPixels from '../../scripts/convertRemToPixels';

class Slider {
$block: JQuery;
$slider: JQuery;
$view: JQuery;
$line: JQuery;
constructor(element) {
this.$block = $(element);
this.$slider = this.$block.find('.js-slider__input');
this.$view = this.$block.find('.js-slider__view');
this.$line = this.$block.find('.js-slider__line');
this.sliderChange.call(this);
this.$slider.on('input.slider', this.sliderChange.bind(this));
}
sliderChange(): void {
const { $slider } = this;
const width: number = $slider.width() - convertRemToPixels(1.25);
const value: number = Number($slider.val());
const min: number = Number(this.$slider.prop('min'));
const max: number = Number(this.$slider.prop('max'));
const newLeft: number = ((width / (max - min)) * (value - min)) - convertRemToPixels(0.625);
this.$view.text(value).css({ left: newLeft });
const newWidth: number = ((width / (max - min)) * (value - min)) + convertRemToPixels(0.625);
this.$line.width(newWidth);
}
}

let sliders: Slider[] = [];
$('.js-slider').each((index, element) => { sliders.push(new Slider(element)); });
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
/* global $ */

import convertRemToPixels from '../../scripts/convertRemToPixels';

class Button {
$element: JQuery;
size: number;
constructor(element) {
this.$element = $(element).on('click.standart-button', this.rippleEffect.bind(this));
this.size = convertRemToPixels(2);
}
rippleEffect(event) {
const $div = $('<div/>').attr('id', 'button__ripple');
$div.css({ top: `${event.offsetY - this.size}px`, left: `${event.offsetX - this.size}px` });
rippleEffect({ offsetX, offsetY }): void {
const $div: JQuery = $('<div/>').attr('id', 'button__ripple');
$div.css({ top: `${offsetY - this.size}px`, left: `${offsetX - this.size}px` });
this.$element.append($div);
setTimeout(() => $div.remove(), 550);
}
}
let buttons = [];
$('.js-standart-button').each((index, element) => buttons.push(new Button(element)));
$('.js-standart-button').each((index, element) => { buttons.push(new Button(element)); });
3 changes: 2 additions & 1 deletion frontend/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import './index.styl';
import './favicons/favicons';
import './components/slider/slider';
import Controller from './mvc/controller/Controller.ts';
import './components/standart-button/standart-button';
import Controller from './mvc/controller/Controller';
import Model from './mvc/model/Model';
import View from './mvc/view/View';

Expand Down
29 changes: 15 additions & 14 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,34 +16,34 @@ class Controller {
this.setRunning(false);
}
setSubscription():void {
this.model.matrixChanged.attach((sender, obj) => {
if (obj.resized) { this.view.initTable(obj.matrix); }
else { this.view.changeTable(obj.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, options) => {
this.fps = options.value;
this.view.speedChanged.attach((sender, value) => {
this.fps = value;
});
this.view.widthChanged.attach((sender, options) => {
this.view.widthChanged.attach((sender, value) => {
this.setRunning(false);
this.model.setWidthMatrix(options.value);
this.model.setWidthMatrix(value);
});
this.view.heightChanged.attach((sender, options) => {
this.view.heightChanged.attach((sender, value) => {
this.setRunning(false);
this.model.setHeightMatrix(options.value);
this.model.setHeightMatrix(value);
});
}
setRunning(value: boolean): void {
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 = {
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 };
24 changes: 12 additions & 12 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;
listOldMatrix: boolean[][][];
matrixChanged: Event;
stateHistory: boolean[][][];
matrixChanged: EventSender<matrixChangedMessage>;
constructor(rows: number = 10, columns: number = 10) {
this.initMatrix(rows, columns);
this.rows = rows;
this.columns = columns;
this.listOldMatrix = [];
this.matrixChanged = new Event(this);
this.stateHistory = [];
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 @@ -29,7 +29,7 @@ class Model implements IModel{
return row.slice(0, newWidth);
});
this.columns = newWidth;
this.listOldMatrix = [];
this.stateHistory = [];
this.matrixChanged.notify({ matrix: this.matrix, resized: true });
}
setHeightMatrix(newHeight: number): void {
Expand All @@ -38,12 +38,12 @@ class Model implements IModel{
return this.getNewRow(this.columns);
});
this.rows = newHeight;
this.listOldMatrix = [];
this.stateHistory = [];
this.matrixChanged.notify({ matrix: this.matrix, resized: true });
}
clearMatrix(): void {
this.initMatrix(this.rows, this.columns);
this.listOldMatrix = [];
this.stateHistory = [];
this.matrixChanged.notify({ matrix: this.matrix });
}
calculateMatrix(): void {
Expand All @@ -53,15 +53,15 @@ class Model implements IModel{
this.matrixChanged.notify({ matrix: this.matrix });
}
isRepeatMatrix(): boolean {
const result: boolean = this.listOldMatrix.some((matrix: boolean[][]) =>
const result: boolean = this.stateHistory.some((matrix: boolean[][]) =>
matrix.every((row: boolean[], i: number) =>
row.every((cell: boolean, j: number) =>
(cell === this.matrix[i][j]),
),
),
);
if (result) { this.listOldMatrix = []; }
else { this.listOldMatrix.push(this.matrix); }
if (result) { this.stateHistory = []; }
else { this.stateHistory.push(this.matrix); }
return result;
}
calculateCell(row: number, column: number): boolean {
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 = {
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
4 changes: 0 additions & 4 deletions frontend/scripts/convertRemToPixels.js

This file was deleted.

Loading

0 comments on commit f254f41

Please sign in to comment.