Skip to content

Commit 081b435

Browse files
committed
curve-editor: add alt+z/alt+x(undo/redo) functionality
1 parent d055552 commit 081b435

16 files changed

+333
-123
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
app/build/*.hot-update.js
2+
app/build/*.hot-update.json
23
node_modules
34
npm-debug.log
45
.DS_Store

app/build/1c8094dca512d7c622c3.hot-update.json

Lines changed: 0 additions & 1 deletion
This file was deleted.

app/build/mojs-curve-editor.js

Lines changed: 175 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ return /******/ (function(modules) { // webpackBootstrap
7575
/******/ }
7676
/******/
7777
/******/ var hotApplyOnUpdate = true;
78-
/******/ var hotCurrentHash = "2afae19088204d749848"; // eslint-disable-line no-unused-vars
78+
/******/ var hotCurrentHash = "39e444aa888e695705a3"; // eslint-disable-line no-unused-vars
7979
/******/ var hotCurrentModuleData = {};
8080
/******/ var hotCurrentParents = []; // eslint-disable-line no-unused-vars
8181
/******/
@@ -3305,6 +3305,8 @@ return /******/ (function(modules) { // webpackBootstrap
33053305

33063306
var _resizeMod2 = _interopRequireDefault(_resizeMod);
33073307

3308+
var _reduxUndo = __webpack_require__(22);
3309+
33083310
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
33093311

33103312
__webpack_require__(117);
@@ -3323,15 +3325,33 @@ return /******/ (function(modules) { // webpackBootstrap
33233325
}).on('panend', function (ev) {
33243326
var x = ev.deltaX;
33253327
var y = ev.deltaY;
3326-
var translate = store.getState().present.resize.translate;
3328+
var translate = store.getState().resize.translate;
33273329

33283330
_this.x = _this.y = 0;
33293331
store.dispatch({ type: 'EDITOR_TRANSLATE', data: { x: translate.x + x, y: translate.y + y } });
33303332
});
3333+
3334+
document.addEventListener('keyup', _this.onKeyUp);
33313335
});
33323336

3337+
this.onKeyUp = function (e) {
3338+
if (!e.altKey) {
3339+
return;
3340+
}
3341+
switch (e.which) {
3342+
case 90:
3343+
{
3344+
return store.dispatch(_reduxUndo.ActionCreators.undo());
3345+
}
3346+
case 88:
3347+
{
3348+
return store.dispatch(_reduxUndo.ActionCreators.redo());
3349+
}
3350+
}
3351+
};
3352+
33333353
this.getStyle = function () {
3334-
var state = store.getState().present.resize;
3354+
var state = store.getState().resize;
33353355
var temp_top = state.temp_top;
33363356
var temp_bottom = state.temp_bottom;
33373357
var temp_right = state.temp_right;
@@ -3429,22 +3449,13 @@ return /******/ (function(modules) { // webpackBootstrap
34293449

34303450
var _redux = __webpack_require__(7);
34313451

3432-
var _reduxUndo = __webpack_require__(22);
3433-
3434-
var _reduxUndo2 = _interopRequireDefault(_reduxUndo);
3435-
34363452
var _indexReducer = __webpack_require__(23);
34373453

34383454
var _indexReducer2 = _interopRequireDefault(_indexReducer);
34393455

34403456
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
34413457

3442-
// redux-undo higher-order reducer
3443-
var store = (0, _redux.createStore)((0, _reduxUndo2.default)(_indexReducer2.default, {
3444-
filter: function filterActions(action, currState, history) {
3445-
return action.isRecord; // only add to history if isRecord set on action
3446-
}
3447-
}));
3458+
var store = (0, _redux.createStore)(_indexReducer2.default);
34483459
// import reducer
34493460
exports.default = store;
34503461

@@ -4796,6 +4807,10 @@ return /******/ (function(modules) { // webpackBootstrap
47964807

47974808
var _redux = __webpack_require__(7);
47984809

4810+
var _reduxUndo = __webpack_require__(22);
4811+
4812+
var _reduxUndo2 = _interopRequireDefault(_reduxUndo);
4813+
47994814
var _resizeReducer = __webpack_require__(24);
48004815

48014816
var _resizeReducer2 = _interopRequireDefault(_resizeReducer);
@@ -4806,10 +4821,18 @@ return /******/ (function(modules) { // webpackBootstrap
48064821

48074822
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
48084823

4824+
// Redux utility functions
48094825
var reducer = (0, _redux.combineReducers)({
48104826
resize: _resizeReducer2.default,
4811-
points: _pointsReducer2.default
4812-
}); // Redux utility functions
4827+
points: (0, _reduxUndo2.default)(_pointsReducer2.default, {
4828+
limit: 10,
4829+
filter: function filterActions(action, currState, history) {
4830+
return action.isRecord; // only add to history if isRecord set on action
4831+
},
4832+
debug: false
4833+
})
4834+
});
4835+
// redux-undo higher-order reducer
48134836
exports.default = reducer;
48144837

48154838
/***/ },
@@ -4833,7 +4856,7 @@ return /******/ (function(modules) { // webpackBootstrap
48334856
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
48344857

48354858
var INITIAL_STATE = {
4836-
translate: { x: 150, y: 0 },
4859+
translate: { x: 150, y: 150 },
48374860
top: 0,
48384861
temp_top: 0,
48394862

@@ -5501,7 +5524,7 @@ return /******/ (function(modules) { // webpackBootstrap
55015524

55025525
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
55035526

5504-
var INITIAL_STATE = [(0, _makePoint2.default)({ x: 0, y: 358 }), (0, _makePoint2.default)({ x: 100, y: 0 })];
5527+
var INITIAL_STATE = [(0, _makePoint2.default)({ x: 0, y: 358, isLockedX: true }), (0, _makePoint2.default)({ x: 50, y: 179 }), (0, _makePoint2.default)({ x: 100, y: 0, isLockedX: true })];
55055528

55065529
var pointsReducer = function pointsReducer() {
55075530
var state = arguments.length <= 0 || arguments[0] === undefined ? INITIAL_STATE : arguments[0];
@@ -5518,6 +5541,22 @@ return /******/ (function(modules) { // webpackBootstrap
55185541
newState[data.index] = (0, _extends3.default)({}, oldPoint, { tempX: data.x, tempY: data.y });
55195542
return newState;
55205543
}
5544+
case 'POINT_TRANSLATE_END':
5545+
{
5546+
var _data = action.data;
5547+
var _index = _data.index;
5548+
var _oldPoint = state[_index];
5549+
var _newState = [].concat((0, _toConsumableArray3.default)(state));
5550+
5551+
_newState[_data.index] = (0, _extends3.default)({}, _oldPoint, {
5552+
tempX: 0, tempY: 0,
5553+
x: _data.x, y: _data.y
5554+
});
5555+
5556+
return _newState;
5557+
}
5558+
// just to save the store before any update
5559+
// case 'POINT_TRANSLATE_START': { return [ ...state ]; }
55215560
}
55225561
return state;
55235562
};
@@ -6040,7 +6079,7 @@ return /******/ (function(modules) { // webpackBootstrap
60406079
}, makePositionPoint(o), {
60416080
// add curve handles
60426081
handle1: makePositionPoint(o.handle1),
6043-
handle2: !o.isOneHandle ? makePositionPoint(o.handle2) : undefined
6082+
handle2: makePositionPoint(o.handle2)
60446083
});
60456084
};
60466085

@@ -9434,9 +9473,11 @@ return /******/ (function(modules) { // webpackBootstrap
94349473
/* WEBPACK VAR INJECTION */(function(riot) {
94359474
__webpack_require__(109);
94369475

9437-
riot.tag2('curve', '<div class="{this.CLASSES[\'curve__svg-wrapper\']}" riot-style="{this.getSvgStyle()}"> <point each="{point, _index in points}"></point> <svg width="358" height="358" viewbox="0 0 100 100" class="{this.CLASSES[\'curve__svg\']}"> </svg> </div>', '', 'class="{this.CLASSES[\'curve\']}" riot-style="{this.getStyle()}"', function(opts) {
9476+
riot.tag2('curve', '<div class="{this.CLASSES[\'curve__svg-wrapper\']}" riot-style="{this.styles.transform}"> <point each="{point, _index in points}"></point> <svg height="358" viewbox="0 0 100 100" preserveaspectratio="none" class="{this.CLASSES[\'curve__svg\']}"> <path riot-d="{this.path}" stroke="#ffffff" stroke-width="2" vector-effect="non-scaling-stroke" fill="none"> </path> </svg> </div>', '', 'class="{this.CLASSES[\'curve\']}" riot-style="{this.styles.background}"', function(opts) {
94389477
'use strict';
94399478

9479+
var _this = this;
9480+
94409481
var _store = __webpack_require__(6);
94419482

94429483
var _store2 = _interopRequireDefault(_store);
@@ -9450,15 +9491,23 @@ return /******/ (function(modules) { // webpackBootstrap
94509491
this.CLASSES = __webpack_require__(114);
94519492
__webpack_require__(115);
94529493

9453-
var state = _store2.default.getState().present;
9454-
var points = state.points;
9455-
9456-
this.points = points;
9457-
9458-
_store2.default.subscribe(this.update.bind(this));
9494+
var getPath = function getPath() {
9495+
var str = '';
9496+
for (var i = 0; i < _this.points.length; i++) {
9497+
var point = _this.points[i],
9498+
x = point.x + point.tempX,
9499+
y = point.y + point.tempY;
9500+
if (i === 0) {
9501+
str += 'M' + x + ', ' + y / 3.58 + ' ';
9502+
} else {
9503+
str += 'L' + x + ', ' + y / 3.58 + ' ';
9504+
}
9505+
}
9506+
_this.path = str;
9507+
};
94599508

9460-
this.getSvgStyle = function () {
9461-
var resize = state.resize;
9509+
this.getStyle = function () {
9510+
var resize = _this.state.resize;
94629511
var temp_top = resize.temp_top;
94639512

94649513
temp_top += resize.top;
@@ -9468,25 +9517,37 @@ return /******/ (function(modules) { // webpackBootstrap
94689517
}
94699518
temp_top = (0, _resizeMod2.default)(temp_top, -1);
94709519

9520+
var background = 'background-position: 0 ' + (-temp_top - 1) + 'px';
94719521
var transform = 'transform: translate(0px, ' + -temp_top + 'px)';
94729522

9473-
return '' + mojs.h.prefix.css + transform + '; ' + transform + ';';
9523+
return {
9524+
background: background,
9525+
transform: '' + mojs.h.prefix.css + transform + '; ' + transform + ';'
9526+
};
94749527
};
94759528

9476-
this.getStyle = function () {
9477-
var state = _store2.default.getState().present;
9478-
var temp_top = state.temp_top;
9479-
9480-
temp_top += state.top;
9529+
var getState = function getState() {
9530+
_this.state = _store2.default.getState();
9531+
};
94819532

9482-
if (358 - temp_top < 358) {
9483-
temp_top = 0;
9484-
}
9485-
temp_top = (0, _resizeMod2.default)(temp_top, -1);
9533+
var getPoints = function getPoints() {
9534+
_this.points = _this.state.points.present;
9535+
};
94869536

9487-
var background = 'background-position: 0 ' + (-temp_top - 1) + 'px';
9488-
return background + ';';
9537+
var getStyles = function getStyles() {
9538+
_this.styles = _this.getStyle();
9539+
};
9540+
var get = function get() {
9541+
getState();
9542+
getPoints();
9543+
getPath();
9544+
getStyles();
94899545
};
9546+
9547+
get();
9548+
_store2.default.subscribe(function () {
9549+
get();_this.update();
9550+
});
94909551
});
94919552
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))
94929553

@@ -9520,37 +9581,92 @@ return /******/ (function(modules) { // webpackBootstrap
95209581
this.CLASSES = __webpack_require__(111);
95219582
__webpack_require__(112);
95229583

9523-
// store.subscribe(this.update.bind(this));
9584+
_store2.default.subscribe(this.update.bind(this));
9585+
var clamp = mojs.h.clamp;
95249586

95259587
this.getStyle = function () {
9526-
var resize = _store2.default.getState().present.resize;
9527-
var x = (_this.point.x + _this.point.tempX) * resize.scalerX;
9528-
var translate = 'transform: translate(' + x + 'px, ' + _this.point.y + 'px)';
9588+
var _store$getState = _store2.default.getState();
95299589

9530-
// console.log(this.point.x + this.point.tempX, this.point.tempX);
9590+
var resize = _store$getState.resize;
9591+
var x = clamp(_this.point.x + _this.point.tempX, 0, 100);
9592+
var cleanX = x * resize.scalerX;
9593+
9594+
var y = _this.point.y + _this.point.tempY;
9595+
9596+
var translate = 'transform: translate(' + cleanX + 'px, ' + y + 'px)';
95319597
return '' + mojs.h.prefix.css + translate + '; ' + translate;
95329598
};
95339599

9600+
var getTempX = function getTempX(e) {
9601+
var _store$getState2 = _store2.default.getState();
9602+
9603+
var resize = _store$getState2.resize;
9604+
9605+
// if point is not locked to x axes ->
9606+
// calculate delta regarding scaler
9607+
9608+
if (_this.point.isLockedX) {
9609+
return 0;
9610+
};
9611+
9612+
var x = e.deltaX / resize.scalerX;
9613+
if (_this.point.x + x < 0) {
9614+
return 0 - _this.point.x;
9615+
} else if (_this.point.x + x > 100) {
9616+
return 100 - _this.point.x;
9617+
}
9618+
return x;
9619+
};
9620+
9621+
var getY = function getY(e) {
9622+
var _store$getState3 = _store2.default.getState();
9623+
9624+
var resize = _store$getState3.resize;
9625+
9626+
var y = _this.point.y + e.deltaY;
9627+
// clamp y to the size of curve
9628+
return clamp(y, resize.top, 358 + resize.bottom);
9629+
};
9630+
9631+
// get y delta reagarding curve bounds
9632+
var getTempY = function getTempY(e) {
9633+
var _store$getState4 = _store2.default.getState();
9634+
9635+
var resize = _store$getState4.resize;
9636+
var y = _this.point.y + e.deltaY;
9637+
9638+
if (y < resize.top) {
9639+
return resize.top - _this.point.y;
9640+
}
9641+
if (y > 358 + resize.bottom) {
9642+
return 358 + resize.bottom - _this.point.y;
9643+
}
9644+
return e.deltaY;
9645+
};
9646+
95349647
this.on('mount', function () {
95359648
var hammertime = (0, _propagatingHammerjs2.default)(new _hammerjs2.default(_this.root)).on('pan', function (e) {
95369649
_store2.default.dispatch({
95379650
type: 'POINT_TRANSLATE',
9651+
data: { x: getTempX(e), y: getTempY(e), index: _this._index }
9652+
});
9653+
e.stopPropagation();
9654+
}).on('panend', function (e) {
9655+
// reset temporary deltas
9656+
_store2.default.dispatch({ type: 'POINT_TRANSLATE', data: { x: 0, y: 0, index: _this._index } });
9657+
// fire translate end and save it to the store
9658+
_store2.default.dispatch({
9659+
type: 'POINT_TRANSLATE_END',
95389660
data: {
9539-
x: _this.point.x + e.deltaX,
9540-
y: _this.point.y + e.deltaY,
9661+
x: _this.point.x + getTempX(e),
9662+
y: getY(e),
95419663
index: _this._index
9542-
}
9664+
},
9665+
isRecord: true
95439666
});
9667+
95449668
e.stopPropagation();
95459669
});
9546-
// .on('panend', (ev) => {
9547-
// const x = ev.deltaX,
9548-
// y = ev.deltaY,
9549-
// {translate} = store.getState().present.resize;
9550-
9551-
// this.x = this.y = 0;
9552-
// store.dispatch({ type: 'EDITOR_TRANSLATE', data: { x: translate.x + x, y: translate.y + y } })
9553-
// });
95549670
});
95559671
});
95569672
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2)))
@@ -9638,9 +9754,9 @@ return /******/ (function(modules) { // webpackBootstrap
96389754
/***/ function(module, exports) {
96399755

96409756
module.exports = {
9641-
"curve": "_curve_1rlvw_5",
9642-
"curve__svg-wrapper": "_curve__svg-wrapper_1rlvw_1",
9643-
"curve__svg": "_curve__svg_1rlvw_1"
9757+
"curve": "_curve_n7tci_5",
9758+
"curve__svg-wrapper": "_curve__svg-wrapper_n7tci_1",
9759+
"curve__svg": "_curve__svg_n7tci_1"
96449760
};
96459761

96469762
/***/ },
@@ -9678,7 +9794,7 @@ return /******/ (function(modules) { // webpackBootstrap
96789794

96799795

96809796
// module
9681-
exports.push([module.id, "._curve_1rlvw_5{position:absolute;left:0;top:10px;right:10px;bottom:10px;border-radius:2px;background:rgba(58,8,58,.75);border:1px solid #b3a0b2;box-shadow:inset 4px 4px 0 rgba(0,0,0,.5)}._curve__svg-wrapper_1rlvw_1{position:absolute;left:-1px;top:-1px}._curve__svg_1rlvw_1{display:block;overflow:visible}", ""]);
9797+
exports.push([module.id, "._curve_n7tci_5{position:absolute;left:0;top:10px;right:10px;bottom:10px;border-radius:2px;background:rgba(58,8,58,.75);border:1px solid #b3a0b2;box-shadow:inset 4px 4px 0 rgba(0,0,0,.5)}._curve__svg-wrapper_n7tci_1{position:absolute;left:-1px;top:-1px;width:100%}._curve__svg_n7tci_1{display:block;overflow:visible;width:100%}", ""]);
96829798

96839799
// exports
96849800

app/build/mojs-curve-editor.min.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)