Class: MotionPrime::BaseElement
- Inherits:
-
Object
- Object
- MotionPrime::BaseElement
- Extended by:
- HasClassFactory
- Includes:
- HasClassFactory, HasNormalizer, HasStyleChainBuilder, HasStyleOptions, MotionSupport::Callbacks
- Defined in:
- motion-prime/elements/base_element.rb
Direct Known Subclasses
ButtonElement, DrawElement, GoogleMapElement, ImageElement, LabelElement, MapElement, PageViewControllerElement, ProgressHudElement, SpinnerElement, TableHeaderElement, TableViewCellElement, TableViewElement, TextFieldElement, TextViewElement, ViewWithSectionElement, WebViewElement
Instance Attribute Summary collapse
-
#name ⇒ Object
Returns the value of attribute name.
-
#options ⇒ Object
Returns the value of attribute options.
-
#screen ⇒ Object
Returns the value of attribute screen.
-
#section ⇒ Object
Returns the value of attribute section.
-
#styles ⇒ Object
Returns the value of attribute styles.
-
#view ⇒ Object
Returns the value of attribute view.
-
#view_class ⇒ Object
Returns the value of attribute view_class.
-
#view_name ⇒ Object
Returns the value of attribute view_name.
Class Method Summary collapse
- .after_render(method_name) ⇒ Object
- .before_render(method_name) ⇒ Object
- .factory(type, options = {}) ⇒ Object
Instance Method Summary collapse
- #add_target(target = nil, action = 'on_click:', event = :touch) ⇒ Object
- #bind_gesture(action, receiver = nil) ⇒ Object
- #cell_element? ⇒ Boolean
- #cell_section? ⇒ Boolean
- #compute_options! ⇒ Object
-
#computed_options ⇒ Object
Lazy-computing options.
- #dealloc ⇒ Object
- #hide ⇒ Object
-
#initialize(options = {}) ⇒ BaseElement
constructor
A new instance of BaseElement.
- #notify_section_after_render ⇒ Object
- #notify_section_before_render ⇒ Object
- #reload! ⇒ Object
- #render(options = {}, &block) ⇒ Object
- #render!(options = {}, &block) ⇒ Object
- #rerender!(changed_options = []) ⇒ Object
- #show ⇒ Object
- #update ⇒ Object
- #update_options(new_options) ⇒ Object
- #update_with_options(new_options = {}) ⇒ Object
Methods included from HasClassFactory
camelize_factory, class_factory, low_camelize_factory, underscore_factory
Methods included from HasStyleOptions
Methods included from HasStyleChainBuilder
Methods included from HasNormalizer
#debug_info, #element?, #normalize_object, #normalize_options, #normalize_value
Constructor Details
#initialize(options = {}) ⇒ BaseElement
Returns a new instance of BaseElement.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'motion-prime/elements/base_element.rb', line 22 def initialize( = {}) [:screen] = [:screen].try(:weak_ref) = @screen = [:screen] @section = [:section] @view_class = [:view_class] || 'UIView' @name = [:name] @block = [:block] @view_name = underscore_factory(self.class_name_without_kvo.demodulize).gsub(/(_draw)?_element/, '') if Prime.env.development? info = [] info << @name info << view_name info << section.try(:name) info << screen.class @_element_info = info.join(' ') @@_allocated_elements ||= [] @@_allocated_elements << @_element_info end end |
Instance Attribute Details
#name ⇒ Object
Returns the value of attribute name.
17 18 19 |
# File 'motion-prime/elements/base_element.rb', line 17 def name @name end |
#options ⇒ Object
Returns the value of attribute options.
17 18 19 |
# File 'motion-prime/elements/base_element.rb', line 17 def end |
#screen ⇒ Object
Returns the value of attribute screen.
17 18 19 |
# File 'motion-prime/elements/base_element.rb', line 17 def screen @screen end |
#section ⇒ Object
Returns the value of attribute section.
17 18 19 |
# File 'motion-prime/elements/base_element.rb', line 17 def section @section end |
#styles ⇒ Object
Returns the value of attribute styles.
17 18 19 |
# File 'motion-prime/elements/base_element.rb', line 17 def styles @styles end |
#view ⇒ Object
Returns the value of attribute view.
17 18 19 |
# File 'motion-prime/elements/base_element.rb', line 17 def view @view end |
#view_class ⇒ Object
Returns the value of attribute view_class.
17 18 19 |
# File 'motion-prime/elements/base_element.rb', line 17 def view_class @view_class end |
#view_name ⇒ Object
Returns the value of attribute view_name.
17 18 19 |
# File 'motion-prime/elements/base_element.rb', line 17 def view_name @view_name end |
Class Method Details
.after_render(method_name) ⇒ Object
280 281 282 |
# File 'motion-prime/elements/base_element.rb', line 280 def after_render(method_name) set_callback :render, :after, method_name end |
.before_render(method_name) ⇒ Object
277 278 279 |
# File 'motion-prime/elements/base_element.rb', line 277 def before_render(method_name) set_callback :render, :before, method_name end |
.factory(type, options = {}) ⇒ Object
270 271 272 273 274 275 276 |
# File 'motion-prime/elements/base_element.rb', line 270 def factory(type, = {}) element_class = class_factory("#{type}_element", true) || self view_class_name = camelize_factory("ui_#{type}") .merge!(view_class: view_class_name) element_class.new() end |
Instance Method Details
#add_target(target = nil, action = 'on_click:', event = :touch) ⇒ Object
54 55 56 57 |
# File 'motion-prime/elements/base_element.rb', line 54 def add_target(target = nil, action = 'on_click:', event = :touch) return false unless self.view self.view.addTarget(target || section, action: action, forControlEvents: event.uicontrolevent) end |
#bind_gesture(action, receiver = nil) ⇒ Object
153 154 155 156 157 158 |
# File 'motion-prime/elements/base_element.rb', line 153 def bind_gesture(action, receiver = nil) receiver ||= self single_tap = UITapGestureRecognizer.alloc.initWithTarget(receiver, action: action) view.addGestureRecognizer single_tap view.setUserInteractionEnabled true end |
#cell_element? ⇒ Boolean
164 165 166 |
# File 'motion-prime/elements/base_element.rb', line 164 def cell_element? @view_class == 'UICollectionViewCell' || @view_class == 'UITableViewCell' end |
#cell_section? ⇒ Boolean
160 161 162 |
# File 'motion-prime/elements/base_element.rb', line 160 def cell_section? section.respond_to?(:cell_section_name) end |
#compute_options! ⇒ Object
91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'motion-prime/elements/base_element.rb', line 91 def = || {} = self..except(:screen, :name, :block, :view_class).merge() () = Styles.for(styles).deep_merge() = (, section.try(:elements_eval_object), %w[ font font_name font_size text placeholder title_label padding padding_left padding_right padding_top padding_bottom left right min_width min_outer_width max_width max_outer_width width top bottom min_height min_outer_height max_height max_outer_height height]) end |
#computed_options ⇒ Object
Lazy-computing options
86 87 88 89 |
# File 'motion-prime/elements/base_element.rb', line 86 def unless end |
#dealloc ⇒ Object
45 46 47 48 49 50 51 52 |
# File 'motion-prime/elements/base_element.rb', line 45 def dealloc if Prime.env.development? index = @@_allocated_elements.index(@_element_info) @@_allocated_elements.delete_at(index) if index end Prime.logger. :element, self, self.name super end |
#hide ⇒ Object
145 146 147 |
# File 'motion-prime/elements/base_element.rb', line 145 def hide view.hidden = true if view # TODO: should we update computed options in opposite case? end |
#notify_section_after_render ⇒ Object
63 64 65 |
# File 'motion-prime/elements/base_element.rb', line 63 def notify_section_after_render section.try(:after_element_render, self) end |
#notify_section_before_render ⇒ Object
59 60 61 |
# File 'motion-prime/elements/base_element.rb', line 59 def notify_section_before_render section.try(:before_element_render, self) end |
#reload! ⇒ Object
104 105 106 107 |
# File 'motion-prime/elements/base_element.rb', line 104 def reload! reset_computed_values end |
#render(options = {}, &block) ⇒ Object
67 68 69 70 71 |
# File 'motion-prime/elements/base_element.rb', line 67 def render( = {}, &block) run_callbacks :render do render!(, &block) end end |
#render!(options = {}, &block) ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 |
# File 'motion-prime/elements/base_element.rb', line 73 def render!( = {}, &block) view = screen.add_view class_factory(view_class), .merge() do |view| @view = view block.try(:call, view, self) end if .has_key?(:delegate) && [:delegate].respond_to?(:delegated_by) && view.respond_to?(:setDelegate) [:delegate].delegated_by(view) end view end |
#rerender!(changed_options = []) ⇒ Object
109 110 111 112 113 114 115 116 117 |
# File 'motion-prime/elements/base_element.rb', line 109 def rerender!( = []) render_target = view.try(:superview) view.try(:removeFromSuperview) render(render_target: render_target) if ( & [:text, :size_to_fit]).any? && respond_to?(:size_to_fit) size_to_fit end end |
#show ⇒ Object
149 150 151 |
# File 'motion-prime/elements/base_element.rb', line 149 def show view.hidden = false if view end |
#update ⇒ Object
141 142 143 |
# File 'motion-prime/elements/base_element.rb', line 141 def update ({}) end |
#update_options(new_options) ⇒ Object
126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'motion-prime/elements/base_element.rb', line 126 def () .deep_merge!() return unless view = if .slice(:width, :height, :top, :left, :right, :bottom).any? [:calculate_frame] = true [:width, :height, :top, :left, :right, :bottom] elsif .slice(:text, :title).any? [:line_spacing, :line_height, :underline, :fragment_color, :text_alignment, :font, :font_name, :font_size, :line_break_mode, :number_of_lines] end = .slice(*Array.wrap()).merge() ViewStyler.new(view, view.superview.try(:bounds), ).apply end |
#update_with_options(new_options = {}) ⇒ Object
119 120 121 122 123 124 |
# File 'motion-prime/elements/base_element.rb', line 119 def ( = {}) .deep_merge!() reload! .deep_merge!() rerender!(.keys) end |