jcropper 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.rdoc CHANGED
@@ -1,11 +1,15 @@
1
1
  = Overview
2
2
 
3
- jcropper wraps jcrop 0.98, http://deepliquid.com/content/Jcrop.html, a javascript cropping tool.
3
+ jcropper wraps jcrop 0.98, http://deepliquid.com/content/Jcrop.html, an in-browser cropping tool, to allow users to crop attached images. It currently only works with paperclip.
4
4
 
5
- jcropper currently only works with paperclip.
5
+ (note, there is also another jcrop plugin, http://github.com/jschwindt/rjcrop)
6
6
 
7
7
  = Installation
8
8
 
9
+ Install as a plugin (gem to come soon)
10
+
11
+ script/plugin install git://github.com/syfo/jcropper.git
12
+
9
13
  Include the jcropper processor in the paperclip style.
10
14
 
11
15
  class User < ActiveRecord::Base
@@ -24,12 +28,24 @@ Generate and install your migration
24
28
 
25
29
  Install js/css/images for jcropper
26
30
 
27
- rake js_cropper:install
31
+ rake jcropper:install
32
+
33
+ Add the headers to your view or layout (jquery required)
34
+ <%= javascript_include_tag 'jquery.Jcrop.min.js' %>
35
+ <%= javascript_include_tag 'jcropper.js' %>
36
+ <%= stylesheet_link_tag 'jquery.Jcrop.css' %>
28
37
 
29
38
  Add the helpers to your view:
30
39
 
31
40
  <%= croppable_image @user, :avatar, :thumb -%>
32
41
  <%= croppable_image_preview @user, :avatar, :thumb -%>
33
42
 
43
+ Helper Options:
44
+ :css_prefix => 'jcrop'
45
+ :width => 100, :height => 100
46
+ :js_object => 'MyGlobalJsObject',
47
+ :aspect_ratio => 2
48
+ :aspect_ratio => false
49
+
34
50
 
35
51
  Copyright (c) 2010 Symbolforce, LLC., released under the MIT license
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.3.0
@@ -1,6 +1,6 @@
1
1
  Description:
2
- Generates a migration for jcropper one class's attachment. x/y/w/h crop variables
2
+ Generates a migration for jcropper corresponding to one attachment and one style. Creates fields on the model to save the crop rectangle.
3
3
 
4
- Example:
5
- ./script/generate jcropper class attachment
4
+ Usage:
5
+ ./script/generate jcropper <model> <attachment> <style>
6
6
 
@@ -1,8 +1,9 @@
1
1
  class JcropperGenerator < Rails::Generator::NamedBase
2
- attr_accessor :attachment, :migration_name
2
+ attr_accessor :attachment, :migration_name, :style
3
3
 
4
4
  def initialize(args, options = {})
5
5
  super
6
+ raise "Incorrect usage!" unless args.length == 3
6
7
  @class_name, @attachment, @style = args[0], args[1], args[2]
7
8
  end
8
9
 
@@ -17,6 +18,6 @@ class JcropperGenerator < Rails::Generator::NamedBase
17
18
  private
18
19
 
19
20
  def generate_file_name
20
- "add_crop_variables_for_#{@attachment}_style_#{@style}_to_#{@class_name.underscore}"
21
+ "add_crop_variables_for_#{@attachment}_#{@style}_to_#{@class_name.underscore}"
21
22
  end
22
23
  end
@@ -1,15 +1,15 @@
1
1
  class <%= migration_name %> < ActiveRecord::Migration
2
2
  def self.up
3
- add_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment %>_<%= style %>_crop_x, :integer, :default => 0
4
- add_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment %>_<%= style %>_crop_y, :integer, :default => 0
5
- add_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment %>_<%= style %>_crop_w, :integer, :default => 0
6
- add_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment %>_<%= style %>_crop_h, :integer, :default => 0
3
+ add_column :<%= class_name.underscore.camelize.tableize %>, :<%= JCropper.jattr attachment, style, :x %>, :integer, :default => 0
4
+ add_column :<%= class_name.underscore.camelize.tableize %>, :<%= JCropper.jattr attachment, style, :y %>, :integer, :default => 0
5
+ add_column :<%= class_name.underscore.camelize.tableize %>, :<%= JCropper.jattr attachment, style, :w %>, :integer, :default => 0
6
+ add_column :<%= class_name.underscore.camelize.tableize %>, :<%= JCropper.jattr attachment, style, :h %>, :integer, :default => 0
7
7
  end
8
8
 
9
9
  def self.down
10
- remove_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment %>_<%= style %>_crop_x
11
- remove_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment %>_<%= style %>_crop_y
12
- remove_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment %>_<%= style %>_crop_w
13
- remove_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment %>_<%= style %>_crop_h
10
+ remove_column :<%= class_name.underscore.camelize.tableize %>, :<%= JCropper.jattr attachment, style, :x %>
11
+ remove_column :<%= class_name.underscore.camelize.tableize %>, :<%= JCropper.jattr attachment, style, :y %>
12
+ remove_column :<%= class_name.underscore.camelize.tableize %>, :<%= JCropper.jattr attachment, style, :w %>
13
+ remove_column :<%= class_name.underscore.camelize.tableize %>, :<%= JCropper.jattr attachment, style, :h %>
14
14
  end
15
15
  end
data/lib/jcropper.rb CHANGED
@@ -1,3 +1,5 @@
1
1
  ROOT = File.join(File.dirname(__FILE__), 'jcropper')
2
2
  require File.join(ROOT, 'jcropper')
3
- require File.join(ROOT, 'helpers')
3
+ require File.join(ROOT, 'helpers')
4
+ require File.join(ROOT, 'cropped_image')
5
+ Paperclip.autoload 'Jcropper', File.join(ROOT, '../paperclip_processors/jcropper.rb')
@@ -0,0 +1,33 @@
1
+ module JCropper
2
+ class CroppedImage
3
+ attr_reader :original_geometry, :cropped_geometry, :attachment_name, :style_name, :coord_names, :starting_crop, :attachment
4
+
5
+ def initialize(object)
6
+ @object = object
7
+ @attachment_name = object.class.jcropper_defs[:attachment]
8
+ @style_name = object.jcropper_defs[:style]
9
+ @attachment = object.send(attachment_name)
10
+ @coord_names = {}
11
+ %w(x y w h).each{|v| @coord_names[v.to_sym] = JCropper.jattr(attachment_name, style_name, v)}
12
+
13
+ @starting_crop = @coord_names.inject({}) {|h,pair| h.merge({ pair[0] => object.send("#{pair[1].to_s}_was") }) }
14
+ end
15
+
16
+ ###CRZ these two might get out of date...
17
+ def original_geometry
18
+ if attachment.to_file(:original) and File.exists? attachment.to_file(:original)
19
+ @original_geometry ||= Paperclip::Geometry.from_file(attachment.to_file(:original))
20
+ else
21
+ nil
22
+ end
23
+ end
24
+
25
+ def target_geometry
26
+ @target_geometry ||= Paperclip::Geometry.parse(@object.send(attachment_name).styles[style_name.to_sym][:geometry])
27
+ end
28
+
29
+ def max_crop
30
+ [0, 0, original_geometry.width, original_geometry.height]
31
+ end
32
+ end
33
+ end
@@ -1,133 +1,83 @@
1
- module JCropper
1
+ module JCropper
2
2
  module Helpers
3
3
  def croppable_image(object_name, attachment, style, options = {})
4
4
  object = eval("@#{object_name.to_s}") unless object_name.is_a? ActiveRecord::Base
5
- paperclip_options = object.send(attachment).styles[style.to_sym]
6
- options = options.merge(default_options)
5
+ options[:view_size] = {:width => options.delete(:width), :height => options.delete(:height)}
6
+ return unless options = parse_options(object, options)
7
7
 
8
- x, y, w, h = ['x', 'y', 'w', 'h'].map{|v| "#{attachment}_crop_#{v}"}
9
-
10
- target_geometry = Paperclip::Geometry.parse(paperclip_options[:geometry])
11
- file_geometry = Paperclip::Geometry.from_file(object.send(attachment).path(:original))
12
- options[:view_size] ||= {:width => file_geometry.width, :height => file_geometry.height}
13
-
14
- resized_ratio = options[:view_size][:width] / file_geometry.width
15
-
16
- s = "<div class='#{options[:css_prefix]}'>#{image_tag(object.send(attachment).url, options[:view_size])}</div>" + "\n"
17
- s += hidden_field_tag("#{object_name}[#{x}]", object.send(x), :id => x) + "\n"
18
- s += hidden_field_tag("#{object_name}[#{y}]", object.send(y), :id => y) + "\n"
19
- s += hidden_field_tag("#{object_name}[#{w}]", object.send(w), :id => w) + "\n"
20
- s += hidden_field_tag("#{object_name}[#{h}]", object.send(h), :id => h) + "\n"
21
- s += <<-CSS
22
- <style type="text/css">
23
- /* Fixes issue here http://code.google.com/p/jcrop/issues/detail?id=1 */
24
- .jcrop-holder { text-align: left; }
25
-
26
- .jcrop-vline, .jcrop-hline
27
- {
28
- font-size: 0;
29
- position: absolute;
30
- background: white url('Jcrop.gif') top left repeat;
31
- }
32
- .jcrop-vline { height: 100%; width: 1px !important; }
33
- .jcrop-hline { width: 100%; height: 1px !important; }
34
- .jcrop-handle {
35
- font-size: 1px;
36
- width: 7px !important;
37
- height: 7px !important;
38
- border: 1px #eee solid;
39
- background-color: #333;
40
- *width: 9px;
41
- *height: 9px;
42
- }
43
-
44
- .jcrop-tracker { width: 100%; height: 100%; }
45
-
46
- .custom .jcrop-vline,
47
- .custom .jcrop-hline
48
- {
49
- background: yellow;
50
- }
51
- .custom .jcrop-handle
52
- {
53
- border-color: black;
54
- background-color: #C7BB00;
55
- -moz-border-radius: 3px;
56
- -webkit-border-radius: 3px;
57
- }
58
- </style>
59
- CSS
60
-
61
- s += <<-HTML
62
- <script type='text/javascript'>
63
- function findBoundingScale(img, container) {
64
- imgAspect = img[0] / img[1]
65
- containerAspect = container[0] / container[1]
66
-
67
- if(imgAspect < containerAspect) {
68
- return (container[0] / img[0]);
69
- }
70
- else {
71
- return (container[1] / img[1]);
72
- }
73
- }
74
-
75
- $('.#{options[:css_prefix]} img').load(function() {
76
- var trueWidth = #{file_geometry.width};
77
- var trueHeight = #{file_geometry.height};
78
-
79
- var targetWidth = #{target_geometry.width};
80
- var targetHeight = #{target_geometry.height};
81
-
82
- function cropOnChange(coords) {
83
- var rx = $('##{options[:css_prefix]}-preview').parent().width() / coords.w;
84
- var ry = $('##{options[:css_prefix]}-preview').parent().height() / coords.h;
85
-
86
- $('##{options[:css_prefix]}-preview').css({
87
- width: Math.round(rx * trueWidth) + 'px',
88
- height: Math.round(ry * trueHeight) + 'px',
89
- marginLeft: '-' + Math.round(rx * coords.x) + 'px',
90
- marginTop: '-' + Math.round(ry * coords.y) + 'px'
91
- });
92
-
93
- $('##{x}').val(coords.x);
94
- $('##{y}').val(coords.y);
95
- $('##{w}').val(coords.w);
96
- $('##{h}').val(coords.h);
97
- console.log(coords);
98
- }
8
+ ###CRZ - duplicated in JS!
9
+ view_scale = find_bounding_scale([options[:view_size][:width], options[:view_size][:height]],
10
+ [options[:original_geometry][:width], options[:original_geometry][:height]])
99
11
 
100
- api = $('.#{options[:css_prefix]} img').Jcrop({
101
- #{options[:jcrop_options].map{|k,v| "#{k.to_s}: #{v.to_s},\n"}}
102
- setSelect: #{[object.send(x), object.send(y),
103
- object.send(x) + object.send(w), object.send(y) + object.send(h)].map {|v| v*resized_ratio}.to_json},
104
- onChange: cropOnChange,
105
- onSelect: cropOnChange,
106
- // aspectRatio: targetWidth / targetHeight,
107
- trueSize: [trueWidth, trueHeight]
108
- });
109
- });
12
+ scaled_img_dims = {:width => options[:original_geometry][:width]*view_scale, :height => options[:original_geometry][:height]*view_scale}
13
+ s = "<div class='#{options[:css_prefix]}'>#{image_tag(object.send(attachment).url, scaled_img_dims.merge(:id => options[:id]))}</div>" + "\n"
14
+ s += hidden_field_tag("#{object_name}[#{@js_cropper_c_i.coord_names[:x]}]", @js_cropper_c_i.starting_crop[:x], :id => @js_cropper_c_i.coord_names[:x]) + "\n"
15
+ s += hidden_field_tag("#{object_name}[#{@js_cropper_c_i.coord_names[:y]}]", @js_cropper_c_i.starting_crop[:y], :id => @js_cropper_c_i.coord_names[:y]) + "\n"
16
+ s += hidden_field_tag("#{object_name}[#{@js_cropper_c_i.coord_names[:w]}]", @js_cropper_c_i.starting_crop[:w], :id => @js_cropper_c_i.coord_names[:w]) + "\n"
17
+ s += hidden_field_tag("#{object_name}[#{@js_cropper_c_i.coord_names[:h]}]", @js_cropper_c_i.starting_crop[:h], :id => @js_cropper_c_i.coord_names[:h]) + "\n"
18
+ s += <<-JS
19
+ <script type="text/javascript">
20
+ #{options[:js_object]} = new CroppedImage(jQuery('.#{options[:css_prefix]} img'),
21
+ $.extend(
22
+ #{camelize_keys(options).to_json},
23
+ {
24
+ originalGeometry: #{{:width => @js_cropper_c_i.original_geometry.width, :height => @js_cropper_c_i.original_geometry.height}.to_json},
25
+ targetGeometry: #{{:width => @js_cropper_c_i.target_geometry.width, :height => @js_cropper_c_i.target_geometry.height}.to_json},
26
+ coordNames: #{@js_cropper_c_i.coord_names.to_json}
27
+ })
28
+ );
110
29
  </script>
111
- HTML
30
+ JS
31
+ s
112
32
  end
113
33
 
114
34
  def croppable_image_preview(object_name, attachment, style, options = {})
115
35
  object = eval("@#{object_name.to_s}") unless object_name.is_a? ActiveRecord::Base
116
- options = options.merge(default_options)
36
+ options[:preview_size] = {:width => options.delete(:width), :height => options.delete(:height)}
37
+ return unless options = parse_options(object, options)
117
38
 
118
- <<-HTML
119
- <div style="overflow:hidden;height:100px;width:100px;border:1px solid black;">
120
- #{image_tag(object.send(attachment).url(:original), :id => "#{options[:css_prefix]}-preview")}
39
+ s = <<-HTML
40
+ <div style="overflow:hidden;height:#{options[:preview_size][:height]}px;width:#{options[:preview_size][:width]}px;" class="#{options[:css_prefix]}-preview-mask">
41
+ #{image_tag(@js_cropper_c_i.attachment.url(:original), :class => "#{options[:css_prefix]}-preview")}
121
42
  </div>
122
43
  HTML
44
+ s
123
45
  end
124
46
 
125
47
  private
126
- def default_options
127
- {
128
- :css_prefix => 'js_crop',
129
- :jcrop_options => {}
130
- }
48
+ def camelize_keys(hash)
49
+ hash.inject({}) do |h, pair|
50
+ h.merge(pair[0].to_s.camelize(:lower) => pair[1])
51
+ end
52
+ end
53
+
54
+ def find_bounding_scale(container, to_contain)
55
+ to_contain_aspect = to_contain[0].to_f / to_contain[1]
56
+ container_aspect = container[0].to_f / container[1]
57
+
58
+ if to_contain_aspect > container_aspect
59
+ return (container[0].to_f / to_contain[0]);
60
+ else
61
+ return (container[1].to_f / to_contain[1]);
62
+ end
63
+ end
64
+
65
+
66
+ def parse_options(object, options = {})
67
+ @js_cropper_c_i ||= object.cropped_image
68
+
69
+ return false unless @js_cropper_c_i.target_geometry and @js_cropper_c_i.original_geometry
70
+
71
+ @js_cropper_options ||= {}
72
+ @js_cropper_options = {
73
+ :css_prefix => 'jcrop',
74
+ :view_size => {:width => @js_cropper_c_i.target_geometry.width, :height => @js_cropper_c_i.target_geometry.height},
75
+ :preview_size => {:width => @js_cropper_c_i.target_geometry.width, :height => @js_cropper_c_i.target_geometry.height},
76
+ :aspect_ratio => @js_cropper_c_i.target_geometry.width / @js_cropper_c_i.target_geometry.height,
77
+ :original_geometry => {:width => @js_cropper_c_i.original_geometry.width, :height => @js_cropper_c_i.original_geometry.height},
78
+ :starting_crop => @js_cropper_c_i.starting_crop,
79
+ :js_object => 'croppedImage'
80
+ }.merge(@js_cropper_options.merge(options))
131
81
  end
132
82
  end
133
83
  end
@@ -1,46 +1,55 @@
1
1
  module JCropper
2
2
  module ClassMethods
3
- def jcrop(attachment, style, options = {})
3
+ def jcrop(attachment, style)
4
4
  raise "jcropper requires attachment to be of type Paperclip::Attachment" if self.attachment_definitions[attachment.to_sym].nil?
5
- require File.join(ROOT, '../paperclip_processors/jcropper.rb')
6
5
 
7
- options[:attachment] = attachment = attachment.to_s
8
- options[:lock_aspect] ||= true
9
-
10
- x, y, w, h = [:x, :y, :w, :h].map{|coord| jattr(attachment, style, coord) }
6
+ class_exec(attachment, style) do |attachment, style|
7
+ attr_reader :cropped_image
8
+ write_inheritable_hash :jcropper_defs, {:attachment => attachment, :style => style}
9
+ class_inheritable_reader :jcropper_defs
11
10
 
12
- class_exec(options) do |options|
13
- write_inheritable_attribute :jcropper_options, options.dup
14
- class_inheritable_reader :jcropper_options
15
-
16
11
  attr_accessor :jcropper_should_reprocess
17
- before_save :jcropper_check_for_reprocess
12
+ before_save :jcropper_normalize_crop, :jcropper_check_for_reprocess
18
13
  after_save :jcropper_reprocess
19
14
 
15
+ ###CRZ - alias chain this
16
+ def after_initialize
17
+ @cropped_image = CroppedImage.new(self)
18
+ end
19
+
20
20
  def jcropper_reprocess
21
- send(self.class.jcropper_options[:attachment]).reprocess! if @jcropper_should_reprocess
21
+ cropped_image.attachment.reprocess! if @jcropper_should_reprocess
22
22
  end
23
23
  end
24
24
 
25
+ x, y, w, h = [:x, :y, :w, :h].map{|coord| JCropper.jattr(attachment, style, coord) }
25
26
  to_eval = <<-TO_EVAL
26
27
  def jcropper_check_for_reprocess
27
28
  @jcropper_should_reprocess ||= !(changed & %w(#{x} #{y} #{w} #{h})).empty?
28
- return true
29
+ true
30
+ end
31
+
32
+ def jcropper_coords
33
+ [#{x}, #{y}, #{w}, #{h}]
34
+ end
35
+
36
+ def jcropper_needs_crop?
37
+ cropped_image and cropped_image.original_geometry and (#{w} == 0 or #{h} == 0)
38
+ end
39
+
40
+ def jcropper_normalize_crop
41
+ self.#{x}, self.#{y}, self.#{w}, self.#{h} = *cropped_image.max_crop if jcropper_needs_crop?
42
+ true
29
43
  end
30
44
 
31
45
  def jcropper_crop_string
32
- if not [#{x}, #{y}, #{w}, #{h}].all?{|v| v.nil? or v.zero?}
33
- "-crop \#{#{w}}x\#{#{h}}+\#{#{x}}+\#{#{y}}"
34
- else
35
- ""
36
- end
46
+ "-crop \#{#{w}}x\#{#{h}}+\#{#{x}}+\#{#{y}}"
37
47
  end
38
48
  TO_EVAL
39
49
  class_eval to_eval
40
50
  end
41
51
  end
42
52
 
43
- private
44
53
  def self.jattr(attachment, style, coord)
45
54
  "#{attachment}_#{style}_crop_#{coord}"
46
55
  end
@@ -1,5 +1,5 @@
1
1
  module Paperclip
2
- class JCropper < Thumbnail
2
+ class Jcropper < Thumbnail
3
3
  def transformation_command
4
4
  scale, crop = @current_geometry.transformation_to(@target_geometry, crop?)
5
5
  trans = ''
@@ -0,0 +1,104 @@
1
+ CroppedImage = function(image, properties) {
2
+ var t = this;
3
+ t.image = image;
4
+
5
+ t.init = function(properties) {
6
+ $(window).load(function() {
7
+ t.jcrop = jQuery.Jcrop(t.image, jQuery.extend(t.defaultJcropOptions(), t.jcropOptions));
8
+ });
9
+ }
10
+
11
+ t.defaultJcropOptions = function() {
12
+ return {
13
+ onChange: t.cropOnChange,
14
+ onSelect: t.cropOnChange,
15
+ trueSize: [t.originalGeometry.width, t.originalGeometry.height],
16
+ setSelect: [
17
+ t.startingCrop.x * t.viewScale(),
18
+ t.startingCrop.y * t.viewScale(),
19
+ (t.startingCrop.x + t.startingCrop.w) * t.viewScale(),
20
+ (t.startingCrop.y + t.startingCrop.h) * t.viewScale()
21
+ ]
22
+ }
23
+ },
24
+
25
+ t.viewScale = function() {
26
+ return t.findBoundingScale([t.viewSize.width, t.viewSize.height],
27
+ [t.originalGeometry.width, t.originalGeometry.height]);
28
+ }
29
+
30
+ t.log = function() {
31
+ try {
32
+ if(typeof console == 'object' && typeof console.log == 'function') {
33
+ console.log.apply(this, arguments);
34
+ }
35
+ } catch(e) {;}
36
+ }
37
+
38
+ t.cropOnChange = function(coords) {
39
+ t.updatePreview(coords);
40
+
41
+ $('#' + t.coordNames.x).val(coords.x);
42
+ $('#' + t.coordNames.y).val(coords.y);
43
+ $('#' + t.coordNames.w).val(coords.w);
44
+ $('#' + t.coordNames.h).val(coords.h);
45
+ }
46
+
47
+ t.findBoundingScale = function(container, toContain) { /* [width, height] arrays */
48
+ toContainAspect = toContain[0] / toContain[1]
49
+ containerAspect = container[0] / container[1]
50
+
51
+ if(toContainAspect > containerAspect) {
52
+ return (container[0] / toContain[0]);
53
+ }
54
+ else {
55
+ return (container[1] / toContain[1]);
56
+ }
57
+ }
58
+
59
+ t.addProperties = function(properties) {
60
+ jQuery.extend(t, properties);
61
+ }
62
+
63
+ t.previewMask = function() {
64
+ return jQuery('.' + t.cssPrefix + '-preview').parent();
65
+ }
66
+
67
+ t.updatePreview = function(coords) {
68
+ if(coords.x == NaN || t.previewMask().length == null ) {
69
+ return;
70
+ }
71
+
72
+ var rx = t.previewMask().width() / coords.w;
73
+ var ry = t.previewMask().height() / coords.h;
74
+ var scale = t.findBoundingScale([t.previewSize.width, t.previewSize.height],
75
+ [coords.w, coords.h])
76
+
77
+ t.previewMask().css({
78
+ width: Math.round(scale * coords.w) + 'px',
79
+ height: Math.round(scale * coords.h) + 'px',
80
+ });
81
+
82
+ $('.' + t.cssPrefix + '-preview').css({
83
+ width: Math.round(scale * t.originalGeometry.width) + 'px',
84
+ height: Math.round(scale * t.originalGeometry.height) + 'px',
85
+ marginLeft: '-' + Math.round(scale * coords.x) + 'px',
86
+ marginTop: '-' + Math.round(scale * coords.y) + 'px'
87
+ });
88
+ }
89
+
90
+ t.resetCrop = function() {
91
+ t.jcrop.setSelect([t.startingCrop.x,
92
+ t.startingCrop.y,
93
+ t.startingCrop.x + t.startingCrop.w,
94
+ t.startingCrop.y + t.startingCrop.h]);
95
+ }
96
+
97
+ t.clearCrop = function() {
98
+ t.jcrop.setSelect([0, 0, t.originalGeometry.width, t.originalGeometry.height]);
99
+ }
100
+
101
+ t.init(properties);
102
+ t.addProperties(properties); //###CRZ - there are no defaults here
103
+ };
104
+
@@ -5,7 +5,7 @@
5
5
  {
6
6
  font-size: 0;
7
7
  position: absolute;
8
- background: white url('Jcrop.gif') top left repeat;
8
+ background: white url('/images/Jcrop.gif') top left repeat;
9
9
  }
10
10
  .jcrop-vline { height: 100%; width: 1px !important; }
11
11
  .jcrop-hline { width: 100%; height: 1px !important; }
data/rails/init.rb CHANGED
@@ -1 +1,15 @@
1
- require 'jcropper'
1
+ if false
2
+ #if RAILS_ENV == 'development'
3
+ require 'active_support' unless defined? ActiveSupport
4
+ require 'active_record' unless defined? ActiveRecord
5
+
6
+ ActiveSupport::Dependencies.explicitly_unloadable_constants += [ 'JCropper', 'JCropper::ClassMethods']
7
+ ActiveSupport::Dependencies.load_once_paths.delete lib_path
8
+ ActiveSupport::Dependencies.log_activity = true
9
+
10
+ puts "lib_path::", lib_path, "\n"
11
+ puts "load_paths::", ActiveSupport::Dependencies.load_paths, "\n"
12
+ puts "load_once_paths::", ActiveSupport::Dependencies.load_once_paths, "\n"
13
+ end
14
+
15
+ require 'jcropper.rb'
@@ -4,6 +4,7 @@ namespace :jcropper do
4
4
  root = File.join(File.dirname(__FILE__), '..')
5
5
  FileUtils.cp(File.join(root, 'public/images/Jcrop.gif'), File.join(Rails.root, 'public/images/Jcrop.gif'))
6
6
  FileUtils.cp(File.join(root, 'public/javascripts/jquery.Jcrop.min.js'), File.join(Rails.root, 'public/javascripts/jquery.Jcrop.min.js'))
7
+ FileUtils.cp(File.join(root, 'public/javascripts/jcropper.js'), File.join(Rails.root, 'public/javascripts/jcropper.js'))
7
8
  FileUtils.cp(File.join(root, 'public/stylesheets/jquery.Jcrop.css'), File.join(Rails.root, 'public/stylesheets/jquery.Jcrop.css'))
8
9
  end
9
10
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jcropper
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 19
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 1
8
+ - 3
8
9
  - 0
9
- version: 0.1.0
10
+ version: 0.3.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Ryan Ziegler
@@ -14,7 +15,7 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-05-13 00:00:00 -04:00
18
+ date: 2010-05-27 00:00:00 -04:00
18
19
  default_executable:
19
20
  dependencies: []
20
21
 
@@ -38,14 +39,16 @@ files:
38
39
  - generators/jcropper/templates/jcropper_migration.rb.erb
39
40
  - install.rb
40
41
  - lib/jcropper.rb
42
+ - lib/jcropper/cropped_image.rb
41
43
  - lib/jcropper/helpers.rb
42
44
  - lib/jcropper/jcropper.rb
43
45
  - lib/paperclip_processors/jcropper.rb
44
46
  - public/images/Jcrop.gif
47
+ - public/javascripts/jcropper.js
45
48
  - public/javascripts/jquery.Jcrop.min.js
46
49
  - public/stylesheets/jquery.Jcrop.css
47
50
  - rails/init.rb
48
- - tasks/js_cropper.rake
51
+ - tasks/jcropper.rake
49
52
  - test/jcropper_test.rb
50
53
  - test/test_helper.rb
51
54
  - uninstall.rb
@@ -59,23 +62,27 @@ rdoc_options:
59
62
  require_paths:
60
63
  - lib
61
64
  required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
62
66
  requirements:
63
67
  - - ">="
64
68
  - !ruby/object:Gem::Version
69
+ hash: 3
65
70
  segments:
66
71
  - 0
67
72
  version: "0"
68
73
  required_rubygems_version: !ruby/object:Gem::Requirement
74
+ none: false
69
75
  requirements:
70
76
  - - ">="
71
77
  - !ruby/object:Gem::Version
78
+ hash: 3
72
79
  segments:
73
80
  - 0
74
81
  version: "0"
75
82
  requirements: []
76
83
 
77
84
  rubyforge_project:
78
- rubygems_version: 1.3.6
85
+ rubygems_version: 1.3.7
79
86
  signing_key:
80
87
  specification_version: 3
81
88
  summary: gem plugin wrapping jquery