Вход Регистрация
Файл: concrete5.7.5.6/concrete/js/image-editor/controls/position.js
Строк: 582
<?php
var me = $(this), ratio_h, ratio_v;

im.bind('changeActiveElement', function () {
    if (
im.strictSize) {
        
im.activeElement.setDraggable(true);
    }
    
im.activeElement.setPosition({x: 0, y: 0});
    
im.adjustSavers();
    
ratio = im.activeElement.getWidth() / im.activeElement.getHeight();
    
height_input.val(im.activeElement.getHeight());
    
width_input.val(im.activeElement.getWidth());
    
resetScale();
});

function 
FitImage(im, me) {

    function 
resetThumbnail() {
        if (
im.settings.saveWidth && !im.settings.saveHeight) {
            $(
width_input).val(im.settings.saveWidth).keyup();
        } else if (
im.settings.saveWidth && im.settings.saveHeight) {
            if (
ratio > 1 || ratio === 1) {
                if (
im.settings.saveWidth > im.settings.saveHeight) {
                    $(
width_input).val(im.settings.saveWidth).keyup();
                } else {
                    $(
height_input).val(im.settings.saveHeight).keyup();
                }
            } else if (
ratio < 1) {
                if (
im.settings.saveWidth < im.settings.saveHeight) {
                    $(
height_input).val(im.settings.saveHeight).keyup();
                } else {
                    $(
width_input).val(im.settings.saveWidth).keyup();
                }
            }
        }
    }

    function 
centerImage() {
        
im.activeElement.setPosition(0, 0);
        
im.activeElement.parent.draw();
    }

    if (
im.settings.saveWidth || im.settings.saveHeight) {
        $(
'button.reset', me).on('click', function() {
            
resetThumbnail();
            
centerImage();
        });
    } else {
        $(
'button.reset', me).hide();
    }

}

new 
FitImage(im, me);

function 
Rotation(im, me) {
    var 
my = this,
        
RotationFlipModeVertical = 0,
        
RotationFlipModeHorizontal = 1;

    function 
flip(rotationFlipMode) {
        var 
scale = im.activeElement.getScale(),
            
scaleCopy = {x: scale.x, y: scale.y};
        switch (
rotationFlipMode) {
            case 
RotationFlipModeHorizontal:
                
scaleCopy.x *= -1;

                var 
degChange = im.activeElement.getRotation(),
                    
r = -scaleCopy.x * im.activeElement.getWidth();
                
im.activeElement.parent.move(r * Math.cos(degChange), r * Math.sin(degChange));
                break;
            case 
RotationFlipModeVertical:
                
scaleCopy.y *= -1;

                
im.activeElement.rotateDeg(90);
                var 
degChange = im.activeElement.getRotation(),
                    
r = -scaleCopy.y * im.activeElement.getHeight();
                
im.activeElement.rotateDeg(-90);
                
im.activeElement.parent.move(r * Math.cos(degChange), r * Math.sin(degChange));

                break;
        }
        
im.activeElement.setScale(scaleCopy);
        
im.fire('activeElementShouldAdjustLayer');
        
im.activeElement.parent.draw();
        
im.fire('rotationChanged');
        
setTimeout(function () {
            
im.activeElement.parent.draw();
        }, 
0);
    }

    $(
'button.hflip', me).click(function () {
        
flip(RotationFlipModeHorizontal);
    });
    $(
'button.vflip', me).click(function () {
        
flip(RotationFlipModeVertical);
    });
    $(
'button.rot', me).click(function () {
        var 
deg = im.activeElement.getRotationDeg();
        
deg = (Math.round((deg + 90) / 90) * 90) % 360;
        
im.activeElement.setRotationDeg(deg);
        
im.activeElement.setPosition({x: 0, y: 0});
        
im.adjustSavers();

        
im.fire('activeElementShouldAdjustLayer');

        
im.fire('rotationChanged');
        
setTimeout(function () {
            
im.activeElement.parent.draw();
        }, 
0);
    });
    
this.box = $('div.angle > input', me).val(0);
}

new 
Rotation(im, me);

var 
crop_area = $('div.crop-area', me);
var 
locked = true,
    
lock = $('button.lock', me).click(function () {
        var 
method;
        if (
locked) {
            
method = $.fn.removeClass;
        } else {
            
method = $.fn.addClass;
            
ratio = im.activeElement.getWidth() / im.activeElement.getHeight();
        }
        
locked = !locked;
        
method.call(lock, 'active');
    });

var 
height_input = $('input[name="height"]', me).keyup(_.debounce(function (e) {
    if (
e.which === 9) {
        return;
    }
    var 
height = parseInt($(this).val()), width = im.activeElement.getWidth();

    if (
locked) {
        
width = Math.floor(height * ratio);
    }

    
im.activeElement.setWidth(width);
    
im.activeElement.setHeight(height);

    
im.fire('sizeChanged', { width: width, height: height });

}, 
250));

var 
width_input = $('input[name="width"]', me).keyup(_.debounce(function (e) {
    if (
e.which === 9) {
        return;
    }
    var 
width = parseInt($(this).val()), height = im.activeElement.getHeight();

    if (
locked) {
        
height = Math.floor(width * (1 / ratio));
    }

    
im.activeElement.setWidth(width);
    
im.activeElement.setHeight(height);

    
im.fire('sizeChanged', { width: width, height: height });

}, 
250));

var 
crop_button = $('button.begincrop', me).click(function() {
    if (
im.crop) return;
    
im.crop = new Crop;
    
crop_button.attr('disabled', 1);
});

im.bind('sizeChanged', function (event, data) {
    
im.activeElement.parent.draw();
    
im.adjustSavers();

    
width_input.val(data.width);
    
height_input.val(data.height);

    if (!
data.scale) {
        
resetScale();
    }
});

var 
percent = $('span.scale-percent');
var 
scale = $('div.scale-slider');
var 
scale_width = 0, scale_height = 0, fired_from_scale = false;

var 
resetScale = function() {
    
scale_width = im.activeElement.getWidth();
    
scale_height = im.activeElement.getHeight();
    
scale.slider('value', 100);
    
percent.text('100%');
};

var 
resetDebounced = _.debounce(function() {
    
resetScale();
}, 
2000);

scale.slider({
    
value: 100,
    
min: 10,
    
max: 500,
    
step: 5,
    
slide: function(event, data) {
        
new_width = Math.floor(scale_width * (data.value / 100));
        
new_height = Math.floor(scale_height * (data.value / 100));
        
im.activeElement.setWidth(new_width);
        
im.activeElement.setHeight(new_height);
        
im.adjustSavers();

        
percent.text(data.value + '%');
        
resetDebounced();

        
im.fire('sizeChanged', {
            
width: new_width,
            
height: new_height,
            
scale: true
        
});
    }
});

function 
Crop() {
    var 
crop = this;

    
im.bind('ImageEditorWillSave', function() {
        
crop.layer.hide();
    });

    
this.active = true;
    
crop_area.slideDown();
    
this.layer = new Kinetic.Layer({
        
fill: 'red',
        
position: im.activeElement.parent.getPosition(),
        
draggable: false,
        
listening: true
    
});

    
im.bind('sizeChanged', function() {
        var 
old_position = _.clone(crop.layer.getPosition());
        
crop.layer.setPosition(im.activeElement.parent.getPosition());
        
crop.dragLayer.setPosition(im.activeElement.parent.getPosition());
        var 
new_position = _.clone(crop.layer.getPosition());

        
crop.offset.x -= (new_position.x - old_position.x);
        
crop.offset.y -= (new_position.y - old_position.y);

        
crop.layer.draw();
    });

    var 
start_position, start_offset;

    
this.cover = new Kinetic.Shape({
        
fill: 'black',
        
opacity: .4,
        
width: im.stage.getWidth() * 2,
        
height: im.stage.getHeight() * 2,
        
listening: false,
        
draggable: false,
        
drawFunc: function (context) {
            var 
dimensions = im.stage.getTotalDimensions(),
                
x = dimensions.min.x - crop.layer.getPosition().x - (1 / im.scale * im.stage.getPosition().x),
                
y = dimensions.min.y - crop.layer.getPosition().y - (1 / im.scale * im.stage.getPosition().y),
                
offset = Math.max(dimensions.visibleWidth, dimensions.visibleHeight) * 2,
                
small_rect = {
                    
position: {
                        
x: crop.offset.x,
                        
y: crop.offset.y
                    
},
                    
size: {
                        
width:  crop.width,
                        
height: crop.height
                    
}
                },
                
large_rect = {
                    
position: {
                        
x: x - offset,
                        
y: y - offset
                    
},
                    
size: {
                        
width:  offset * 2,
                        
height: offset * 2
                    
}
                };

            
context.beginPath();

            
context.moveTo(small_rect.position.x, small_rect.position.y);
            
context.lineTo(small_rect.position.x, small_rect.position.y + small_rect.size.height);
            
context.lineTo(small_rect.position.x + small_rect.size.width, small_rect.position.y + small_rect.size.height);
            
context.lineTo(small_rect.position.x + small_rect.size.width, small_rect.position.y);
            
context.lineTo(large_rect.position.x + large_rect.size.width, small_rect.position.y);
            
context.lineTo(large_rect.position.x + large_rect.size.width, large_rect.position.y + large_rect.size.height);
            
context.lineTo(large_rect.position.x, large_rect.position.y + large_rect.size.height);
            
context.lineTo(large_rect.position.x, large_rect.position.y);
            
context.lineTo(large_rect.position.x + large_rect.size.width, large_rect.position.y);
            
context.lineTo(large_rect.position.x + large_rect.size.width, small_rect.position.y);

            
context.closePath();

            
context.fillStrokeShape(this);
        }
    });


    
this.dragLayer = new Kinetic.Layer({
        
position: crop.layer.getPosition()
    });

    
this.dragRect = new Kinetic.Rect({
        
draggable: true,
        
listening: true,
        
drawFunc: function (context) {
            var 
dimensions = im.stage.getTotalDimensions();
            
context.beginPath();
            
context.rect(crop.offset.x + crop.width, crop.offset.y, -crop.width, crop.height);

            
context.closePath();
            
context.fillStrokeShape(this);
        }
    })
        .
on('dragstart', function () {
            
start_position = _.clone(this.getPosition());
            
start_offset = _.clone(crop.offset);
        })
        .
on('dragmove', function () {
            var 
change = {
                
x: this.getPosition().x - start_position.x,
                
y: this.getPosition().y - start_position.y
            
};
            
crop.offset.x = start_offset.x + change.x;
            
crop.offset.y = start_offset.y + change.y;

            
crop.positionDraggers(this);
            
crop.draggers.top.left.parent.draw();
        })
        .
on('dragend', function () {
            var 
me = this;
            
_.defer(function () {
                
crop.layer.moveToTop();
                
im.stage.draw();
                
me.setPosition(0, 0);
                
me.parent.draw();
            });
        });

    
this.dragLayer.add(this.dragRect);

    return 
this.init();
}

Crop.prototype = {

    
init: function () {
        
this.locked = true;

        
this.initializeDraggers();

        var 
dragger = this.draggers, layer = this.layer, crop = this;
        
layer.add(this.cover);
        
layer.add(dragger.top.left);
        
layer.add(dragger.top.right);
        
layer.add(dragger.bottom.left);
        
layer.add(dragger.bottom.right);

        
layer.setRotation(im.activeElement.getRotation());
        
layer.setScale(im.activeElement.getScale());
        
this.dragLayer.setRotation(im.activeElement.getRotation());
        
this.dragLayer.setScale(im.activeElement.getScale());

        
this.width = im.activeElement.getWidth();
        
this.height = im.activeElement.getHeight();
        
this.offset = {
            
x: 0,
            
y: 0
        
};

        
im.stage.add(this.dragLayer);
        
im.stage.add(layer);
        
layer.moveToTop();
        
im.stage.draw();

        
im.bind('scaleChange', function (event) {
            if (!
crop.active) return;
            
dragger.top.left.setScale(1 / im.scale);
            
dragger.top.right.setScale(1 / im.scale);
            
dragger.bottom.left.setScale(1 / im.scale);
            
dragger.bottom.right.setScale(1 / im.scale);
            
crop.dragRect.parent.draw();
        });

        var 
start_position;
        
im.bind('rotationChanged', function() {
            
_.defer(function(){
                
layer.setRotation(im.activeElement.getRotation());
                
layer.setScale(im.activeElement.getScale());
                
crop.dragLayer.setRotation(im.activeElement.getRotation());
                
crop.dragLayer.setScale(im.activeElement.getScale());
                
im.stage.draw();
            });
        });

        
im.bind('sizeChanged', function (event, data) {
            if (!
crop.active) return;
            
crop.positionDraggers();
            
crop.dragRect.parent.draw();
        });

        var 
ratio = im.activeElement.getWidth() / im.activeElement.getHeight();

        var 
lock_button = $('button.croplock').click(function () {
            if (!
crop.active) return;

            var 
method;
            if (
crop.locked) {
                
method = $.fn.removeClass;
            } else {
                
method = $.fn.addClass;
                
ratio = crop.width / crop.height;
            }
            
crop.locked = !crop.locked;
            
method.call(lock_button, 'active');
        }).
addClass('active');
        
im.bind('changeActiveElement', function () {
            if (
crop !== im.crop) Concrete.event.unbind(event, im.stage.getContainer());

            
ratio = crop.width / crop.height;
            
im.stage.draw();
        });

        var 
do_crop = $('button.docrop', me).click(function() {
            if (!
crop.active) return;
            
crop.finalize();
        });
        var 
cancel_crop = $('button.cancel', me).click(function() {
            
crop.destroy();
            
im.adjustSavers();
        });


        var 
height_input = $('input[name="cropheight"]', me).keyup(_.debounce(function () {
            var 
height = parseInt($(this).val()), width = crop.width;

            if (!
height || isNaN(height)) {
                
height = im.activeElement.getHeight();
            }

            if (
crop.locked) {
                
width = Math.floor(height * ratio);
            }

            
crop.width = width;
            
crop.height = height;

            
im.fire('cropSizeChanged', { width: width, height: height });

        }, 
250)).val(crop.height);

        var 
width_input = $('input[name="cropwidth"]', me).keyup(_.debounce(function () {
            var 
width = parseInt($(this).val()), height = crop.height;

            if (!
width || isNaN(width)) {
                
width = im.activeElement.getHeight();
            }

            if (
crop.locked) {
                
height = Math.floor(width * (1 / ratio));
            }

            
crop.width = Math.abs(width);
            
crop.height = Math.abs(height);

            
im.fire('cropSizeChanged', { width: width, height: height });

        }, 
250)).val(crop.width);

        
im.bind('cropSizeChanged', function (event, data) {
            
crop.width = Math.floor(data.width);
            
crop.height = Math.floor(data.height);
            
width_input.val(crop.width);
            
height_input.val(crop.height);
            
_.defer(function () {
                
crop.positionDraggers();
                
layer.draw();
            });
        });

        
this.positionDraggers();
    },

    
initializeDraggers: function () {
        var 
crop = this, start_position, start_offset, start_width, start_height,
            
dragger = new Kinetic.Rect({
                
width: 10,
                
height: 10,
                
offset: {
                    
x: 5,
                    
y: 5
                
},
                
scale: 1 / im.scale,
                
stroke: 'black',
                
fill: 'white',
                
draggable: true,
                
listening: true
            
}).on('dragstart',function () {
                
start_position = _.clone(this.getPosition());
                
start_offset = _.clone(crop.offset);
                
start_width = crop.width;
                
start_height = crop.height;
            }).
on('dragend',function () {
                
crop.positionDraggers();

                
im.stage.draw();
            }).
on('dragmove', function () {
                
im.fire('cropSizeChanged', {
                    
width: crop.width,
                    
height: crop.height
                
});
            });

        var 
drawFunc = dragger.getDrawFunc();
        
dragger.setDrawFunc(function () {
            
crop.positionDraggers();
            
drawFunc.apply(this, arguments);
        });

        
this.draggers = {
            
top: {
                
left: dragger,
                
right: dragger.clone()
            },
            
bottom: {
                
left: dragger.clone(),
                
right: dragger.clone()
            }
        };

        function 
getOffset() {
            return {
                
x: this.getPosition().x - start_position.x,
                
y: this.getPosition().y - start_position.y
            
};
        }

        
this.draggers.top.left.on('dragmove', function () {
            var 
offset = getOffset.call(this);

            if (
crop.locked) {
                
offset.y = offset.x * (start_height / start_width);
            }

            
crop.width = start_width - offset.x;
            
crop.height = start_height - offset.y;
            
crop.offset.y = start_offset.y + offset.y;
            
crop.offset.x = start_offset.x + offset.x;

            
crop.positionDraggers(this);
        });

        
this.draggers.top.right.on('dragmove', function () {
            var 
offset = getOffset.call(this);

            if (
crop.locked) {
                
offset.y = -offset.x * (start_height / start_width);
            }

            
crop.width = start_width + offset.x;
            
crop.height = start_height - offset.y;
            
crop.offset.y = start_offset.y + offset.y;

            
crop.positionDraggers(this);
        });

        
this.draggers.bottom.left.on('dragmove', function () {
            var 
offset = getOffset.call(this);

            if (
crop.locked) {
                
offset.y = -offset.x * (start_height / start_width);
            }
            
crop.width = start_width - offset.x;
            
crop.height = start_height + offset.y;
            
crop.offset.x = start_offset.x + offset.x;

            
crop.positionDraggers(this);
        });

        
this.draggers.bottom.right.on('dragmove', function () {
            var 
offset = getOffset.call(this);

            if (
crop.locked) {
                
offset.y = offset.x * (start_height / start_width);
            }
            
crop.width = start_width + offset.x;
            
crop.height = start_height + offset.y;

            
crop.positionDraggers(this);
        });
    },

    
positionDraggers: function (omit_dragger) {
        var 
top_left = this.draggers.top.left, top_right = this.draggers.top.right,
            
bottom_left = this.draggers.bottom.left, bottom_right = this.draggers.bottom.right,
            
offset;

        if (
this.height < 0 || this.width < 0) {
            
this.height = Math.max(this.height, 0);
            
this.width = Math.max(this.width, 0);
            
omit_dragger = null;
        }
        
offset = {
            
width: (-this.width * im.scale) + 5,
            
height: (-this.height * im.scale) + 5
        
};

        if (
top_left !== omit_dragger) {
            
top_left.setPosition({
                
x: this.offset.x,
                
y: this.offset.y
            
});
        }
        if (
top_right !== omit_dragger) {
            
top_right.setPosition({
                
x: this.offset.x,
                
y: this.offset.y
            
}).setOffset({
                
x: offset.width,
                
y: 5
            
});
        }
        if (
bottom_left !== omit_dragger) {
            
bottom_left.setPosition({
                
x: this.offset.x,
                
y: this.offset.y
            
}).setOffset({
                
x: 5,
                
y: offset.height
            
});
        }
        if (
bottom_right !== omit_dragger) {
            
bottom_right.setPosition({
                
x: this.offset.x,
                
y: this.offset.y
            
}).setOffset({
                
x: offset.width,
                
y: offset.height
            
});
        }
    },

    
destroy: function () {
        var 
me = this;
        
this.active = false;
        
this.layer.removeChildren();
        
this.layer.remove();
        
this.dragLayer.removeChildren();
        
this.dragLayer.remove();
        
im.crop = null;
        
crop_button.enable();
        
crop_area.slideUp();

        
_(this).chain().functions().each(function(val) {
            
me[val] = function(){};
        });
    },

    
finalize: function() {
        var 
crop = this,
            
elem = im.activeElement,
            
old_filter = elem.getFilter(),
            
old_rotation = elem.getRotationDeg(),
            
old_scale = elem.getScale(),
            
old_layer_position = elem.parent.getPosition(),
            
old_stage_position = im.stage.getPosition();

        
im.stage.setScale(1);
        
im.stage.setPosition(0, 0);
        
elem.parent.setPosition(0, 0);
        
elem.setRotationDeg(0);
        
elem.setScale(1, 1);
        
elem.clearFilter();

        
elem.toImage({
            
x: 0,
            
y: 0,
            
width: elem.getWidth(),
            
height: elem.getHeight(),
            
callback: function(image) {
                
im.activeElement.setImage(image);
                
im.activeElement.setFilter(old_filter);
                
im.activeElement.setRotationDeg(old_rotation);
                
im.activeElement.setScale(old_scale);
                
elem.setCrop({
                    
x: crop.offset.x,
                    
y: crop.offset.y,
                    
width: crop.width,
                    
height: crop.height
                
});
                
im.stage.setScale(im.scale);

                
elem.setWidth(crop.width);
                
elem.setHeight(crop.height);

                
elem.parent.draw();
                
im.adjustSavers();
                
crop.destroy();
                
im.stage.draw();

                
elem.getLayer().setPosition(old_layer_position);
                
im.stage.setPosition(old_stage_position);

                
im.fire('activeElementSizeChange');
                
im.fire('sizeChanged', {
                    
width: crop.width,
                    
height: crop.height
                
});
            }
        });

    }

};
?>
Онлайн: 2
Реклама