Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds crop selection presets (square, 3:2, 4:3, 5:4, 7:5, 16:9) #54

Merged
merged 3 commits into from
Oct 31, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
crop presets
  • Loading branch information
joelabair committed Aug 22, 2018
commit 24f38f381ae3bbd787a70c3c29901a083e3f3113
10 changes: 6 additions & 4 deletions src/css/buttons.styl
Original file line number Diff line number Diff line change
Expand Up @@ -30,18 +30,20 @@
display: none;
svg > use.active
display: block;

/* MASK BUTTON */
#tie-mask-apply.apply.active .{prefix}-button.apply
label
color: #fff;
svg > use.active
display: block;

/* CROP BUTTON */
#tie-crop-button
.{prefix}-button.apply
margin-right: 24px;
.{prefix}-button.preset.active svg > use.active
display: block;
.{prefix}-button.apply.active svg > use.active
display: block;

Expand All @@ -50,7 +52,7 @@
#tie-shape-button
&.rect .{prefix}-button.rect,
&.circle .{prefix}-button.circle,
&.triangle .{prefix}-button.triangle
&.triangle .{prefix}-button.triangle
svg > use.normal
display: none;
svg > use.active
Expand All @@ -74,4 +76,4 @@
border: 1px solid green;
cursor: inherit;
left: 0;
top: 0;
top: 0;
22 changes: 22 additions & 0 deletions src/js/action.js
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,28 @@ export default {
cancel: () => {
this.stopDrawingMode();
this.ui.changeMenu('crop');
},
'preset-none': () => {
this.setCropzoneRect();
this.ui.crop.changeApplyButtonStatus(false);
},
'preset-square': () => {
this.setCropzoneRect(1 / 1);
},
'preset-3-2': () => {
this.setCropzoneRect(3 / 2);
},
'preset-4-3': () => {
this.setCropzoneRect(4 / 3);
},
'preset-5-4': () => {
this.setCropzoneRect(5 / 4);
},
'preset-7-5': () => {
this.setCropzoneRect(7 / 5);
},
'preset-16-9': () => {
this.setCropzoneRect(16 / 9);
}
}, this._commonAction());
},
Expand Down
51 changes: 51 additions & 0 deletions src/js/component/cropper.js
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,57 @@ class Cropper extends Component {
};
}

/*
* Set a cropzone square
*/
setCropzoneRect(factor) {
const canvas = this.getCanvas();
canvas.deactivateAll();
canvas.selection = false;

const cropzone = this._cropzone;
cropzone.remove();

if (!factor) {
return;
}

const canvasImage = this.getCanvasImage();
const oWidth = canvasImage.getOriginalSize().width;
const oHeight = canvasImage.getOriginalSize().height;

let width = (10000 * factor);
let height = 10000;
let scale = 1;

if (width > oWidth) {
scale = (oWidth / width);
width = (width * scale);
height = (height * scale);
}

if (height > oHeight) {
scale = (oHeight / height);
width = (width * scale);
height = (height * scale);
}

const top = 0;
const left = 0;

cropzone.set({
top,
left,
height,
width
});

canvas.add(cropzone);
canvas.centerObject(cropzone);
canvas.setActiveObject(cropzone);
canvas.selection = true;
}

/**
* Keydown event handler
* @param {KeyboardEvent} e - Event object
Expand Down
9 changes: 9 additions & 0 deletions src/js/graphics.js
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,15 @@ class Graphics {
return this.getComponent(components.CROPPER).getCropzoneRect();
}

/**
* Get cropped rect
* @param {Object} mode cropzone rect mode
* @returns {Object} rect
*/
setCropzoneRect(mode) {
return this.getComponent(components.CROPPER).setCropzoneRect(mode);
}

/**
* Get cropped image data
* @param {Object} cropRect cropzone rect
Expand Down
9 changes: 9 additions & 0 deletions src/js/imageEditor.js
Original file line number Diff line number Diff line change
Expand Up @@ -655,6 +655,15 @@ class ImageEditor {
return this._graphics.getCropzoneRect();
}

/**
* Set the cropping rect
* @param {Object} mode crop rect mode [1, 1.5, 1.3333333333333333, 1.25, 1.7777777777777777]
* @returns {Object} {{left: number, top: number, width: number, height: number}} rect
*/
setCropzoneRect(mode) {
return this._graphics.setCropzoneRect(mode);
}

/**
* Flip
* @returns {Promise}
Expand Down
58 changes: 57 additions & 1 deletion src/js/ui/crop.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,14 @@ class Crop extends Submenu {
this.status = 'active';
this._els = {
apply: this.selector('#tie-crop-button .apply'),
cancel: this.selector('#tie-crop-button .cancel')
cancel: this.selector('#tie-crop-button .cancel'),
'preset-none': this.selector('#tie-crop-button .preset-none'),
'preset-square': this.selector('#tie-crop-button .preset-square'),
'preset-3-2': this.selector('#tie-crop-button .preset-3-2'),
'preset-4-3': this.selector('#tie-crop-button .preset-4-3'),
'preset-5-4': this.selector('#tie-crop-button .preset-5-4'),
'preset-7-5': this.selector('#tie-crop-button .preset-7-5'),
'preset-16-9': this.selector('#tie-crop-button .preset-16-9')
};
}

Expand All @@ -39,6 +46,41 @@ class Crop extends Submenu {
this.actions.cancel();
this._els.apply.classList.remove('active');
});

this._els['preset-none'].addEventListener('click', () => {
this.setPresetButtonActive('preset-none');
this.actions['preset-none']();
});

this._els['preset-square'].addEventListener('click', () => {
this.setPresetButtonActive('preset-square');
this.actions['preset-square']();
});

this._els['preset-3-2'].addEventListener('click', () => {
this.setPresetButtonActive('preset-3-2');
this.actions['preset-3-2']();
});

this._els['preset-4-3'].addEventListener('click', () => {
this.setPresetButtonActive('preset-4-3');
this.actions['preset-4-3']();
});

this._els['preset-5-4'].addEventListener('click', () => {
this.setPresetButtonActive('preset-5-4');
this.actions['preset-5-4']();
});

this._els['preset-7-5'].addEventListener('click', () => {
this.setPresetButtonActive('preset-7-5');
this.actions['preset-7-5']();
});

this._els['preset-16-9'].addEventListener('click', () => {
this.setPresetButtonActive('preset-16-9');
this.actions['preset-16-9']();
});
}

/**
Expand Down Expand Up @@ -66,6 +108,20 @@ class Crop extends Submenu {
this._els.apply.classList.remove('active');
}
}

/**
* Set preset button to active status
* @param {String} preset - preset name
*/
setPresetButtonActive(preset) {
const excludeList = [preset, 'apply', 'cancel'];
Object.keys(this._els).forEach(key => {
if (!excludeList.includes(key)) {
this._els[key].classList.remove('active');
}
});
this._els[preset].classList.add('active');
}
}

export default Crop;
83 changes: 82 additions & 1 deletion src/js/ui/template/submenu/crop.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,87 @@
export default ({iconStyle: {normal, active}}) => (`
<ul class="tui-image-editor-submenu-item">
<li id="tie-crop-button" class="apply">
<li id="tie-crop-button">
<div class="tui-image-editor-button preset preset-none active">
<div>
<svg class="svg_ic-submenu">
<use xlink:href="${normal.path}#${normal.name}-ic-shape-rectangle"
class="normal"/>
<use xlink:href="${active.path}#${active.name}-ic-shape-rectangle"
class="active"/>
</svg>
</div>
<label> Custom </label>
</div>
<div class="tui-image-editor-button preset preset-square">
<div>
<svg class="svg_ic-submenu">
<use xlink:href="${normal.path}#${normal.name}-ic-crop"
class="normal"/>
<use xlink:href="${active.path}#${active.name}-ic-crop"
class="active"/>
</svg>
</div>
<label> Square </label>
</div>
<div class="tui-image-editor-button preset preset-3-2">
<div>
<svg class="svg_ic-submenu">
<use xlink:href="${normal.path}#${normal.name}-ic-crop"
class="normal"/>
<use xlink:href="${active.path}#${active.name}-ic-crop"
class="active"/>
</svg>
</div>
<label> 3:2 </label>
</div>
<div class="tui-image-editor-button preset preset-4-3">
<div>
<svg class="svg_ic-submenu">
<use xlink:href="${normal.path}#${normal.name}-ic-crop"
class="normal"/>
<use xlink:href="${active.path}#${active.name}-ic-crop"
class="active"/>
</svg>
</div>
<label> 4:3 </label>
</div>
<div class="tui-image-editor-button preset preset-5-4">
<div>
<svg class="svg_ic-submenu">
<use xlink:href="${normal.path}#${normal.name}-ic-crop"
class="normal"/>
<use xlink:href="${active.path}#${active.name}-ic-crop"
class="active"/>
</svg>
</div>
<label> 5:4 </label>
</div>
<div class="tui-image-editor-button preset preset-7-5">
<div>
<svg class="svg_ic-submenu">
<use xlink:href="${normal.path}#${normal.name}-ic-crop"
class="normal"/>
<use xlink:href="${active.path}#${active.name}-ic-crop"
class="active"/>
</svg>
</div>
<label> 7:5 </label>
</div>
<div class="tui-image-editor-button preset preset-16-9">
<div>
<svg class="svg_ic-submenu">
<use xlink:href="${normal.path}#${normal.name}-ic-crop"
class="normal"/>
<use xlink:href="${active.path}#${active.name}-ic-crop"
class="active"/>
</svg>
</div>
<label> 16:9 </label>
</div>
</li>
<li class="tui-image-editor-partition tui-image-editor-newline">
</li>
<li id="tie-crop-button" class="action">
<div class="tui-image-editor-button apply">
<svg class="svg_ic-menu">
<use xlink:href="${normal.path}#${normal.name}-ic-apply" class="normal"/>
Expand Down