class Formotion::RowType::PagedImageRow

Constants

CANCEL
CHOOSE
DELETE
PAGE_VIEW_TAG
SCROLL_VIEW_TAG
TAKE

Public Instance Methods

actionSheet(actionSheet, clickedButtonAtIndex: index) click to toggle source
# File lib/formotion/row_type/paged_image_row.rb, line 91
def actionSheet(actionSheet, clickedButtonAtIndex: index)
  if index == actionSheet.destructiveButtonIndex and !@photo_page.nil?
    self.row.value[@photo_page]=nil
    self.row.value.delete(nil)
    self.resizePages
    self.clearPages
    return
  end
    
  source = nil
  case actionSheet.buttonTitleAtIndex(index)
  when TAKE
    source = :camera
  when CHOOSE
    source = :photo_library
  when CANCEL
  end

  if source
    @camera = BW::Device.camera.send((source == :camera) ? :rear : :any)
    @camera.picture(source_type: source, media_types: [:image]) do |result|
      if result[:original_image]
        #-Resize image when requested (no image upscale)
        if result[:original_image].respond_to?(:resize_image_to_size) and row.max_image_size
          result[:original_image]=result[:original_image].resize_image_to_size(row.max_image_size, false)
        end
        # new photo
        if @photo_page.nil?
          self.row.value<<result[:original_image]
        else # or overwrite photo
          self.row.value[@photo_page]=result[:original_image]
        end
        self.resizePages
        self.clearPages
      end
    end
  end
end
add_plus_accessory(cell) click to toggle source
# File lib/formotion/row_type/paged_image_row.rb, line 130
def add_plus_accessory(cell)
  @add_button ||= begin
    button = UIButton.buttonWithType(UIButtonTypeContactAdd)
    button.accessibilityLabel = BW.localized_string("add image", nil)
    button.when(UIControlEventTouchUpInside) do
      @page_view.becomeFirstResponder
      take_photo
    end
    button
  end
  cell.accessoryView = cell.editingAccessoryView = @add_button
end
build_cell(cell) click to toggle source
# File lib/formotion/row_type/paged_image_row.rb, line 19
def build_cell(cell)
  # only show the "plus" when editable
  add_plus_accessory(cell) if row.editable?
  
  self.row.value = [] unless self.row.value.is_a?(Array)
  
  @page_view     = UIPageControl.alloc.init
  @page_view.tag = PAGE_VIEW_TAG
  @page_view.pageIndicatorTintColor        = '#d0d0d0'.to_color
  @page_view.currentPageIndicatorTintColor = '#505050'.to_color
  @page_view.currentPage   = 0
  @page_view.numberOfPages = self.row.value.size
  @page_view.when(UIControlEventValueChanged) do
    page_width = @scroll_view.frame.size.width
    page=@page_view.currentPage
    offset=((page * page_width * 2.0 - page_width) / 2.0) + (page_width/2.0)
    point=@scroll_view.contentOffset
    point.x=offset
    @scroll_view.contentOffset=point
  end
  cell.addSubview(@page_view)
  
  @scroll_view          = UIScrollView.alloc.init
  @scroll_view.tag      = SCROLL_VIEW_TAG
  @scroll_view.delegate = self
  @scroll_view.pagingEnabled        = true
  @scroll_view.delaysContentTouches = true
  @scroll_view.showsHorizontalScrollIndicator=false
  @scroll_view.showsVerticalScrollIndicator=false
  
  pages_size = @scroll_view.frame.size
  @scroll_view.contentSize = CGSizeMake(pages_size.width * self.row.value.size, pages_size.height)
  @page_views = [nil]*self.row.value.size

  cell.addSubview(@scroll_view)

  cell.swizzle(:layoutSubviews) do
    def layoutSubviews
      old_layoutSubviews

      # viewWithTag is terrible, but I think it's ok to use here...
      
      formotion_field = self.viewWithTag(SCROLL_VIEW_TAG)
      field_frame = formotion_field.frame
      field_frame.origin.y = 10
      field_frame.origin.x = self.textLabel.frame.origin.x + self.textLabel.frame.size.width + Formotion::RowType::Base.field_buffer
      field_frame.size.width  = self.frame.size.width - field_frame.origin.x - Formotion::RowType::Base.field_buffer
      f_height = self.frame.size.height - 20 - Formotion::RowType::Base.field_buffer
      field_frame.size.height = f_height
      formotion_field.frame = field_frame
      scroll_view=formotion_field
      
      formotion_field = self.viewWithTag(PAGE_VIEW_TAG)
      field_frame = formotion_field.frame
      field_frame.origin.y = 20 + f_height
      field_frame.origin.x = self.textLabel.frame.origin.x + self.textLabel.frame.size.width + Formotion::RowType::Base.field_buffer
      field_frame.size.width  = self.frame.size.width - field_frame.origin.x - Formotion::RowType::Base.field_buffer
      field_frame.size.height = 10
      formotion_field.frame = field_frame
      
      scroll_view.delegate.resizePages
      scroll_view.delegate.clearPages
    end
  end
end
clearPages() click to toggle source
# File lib/formotion/row_type/paged_image_row.rb, line 190
def clearPages
  0.upto(@page_views.size-1) do |i|
    self.purgePage(i) unless @page_views[i].nil?
  end
  self.loadVisiblePages
end
get_active_page() click to toggle source
# File lib/formotion/row_type/paged_image_row.rb, line 165
def get_active_page
  page_width = @scroll_view.frame.size.width
  ((@scroll_view.contentOffset.x * 2.0 + page_width) / (page_width * 2.0)).floor
end
layoutSubviews() click to toggle source
# File lib/formotion/row_type/paged_image_row.rb, line 56
def layoutSubviews
  old_layoutSubviews

  # viewWithTag is terrible, but I think it's ok to use here...
  
  formotion_field = self.viewWithTag(SCROLL_VIEW_TAG)
  field_frame = formotion_field.frame
  field_frame.origin.y = 10
  field_frame.origin.x = self.textLabel.frame.origin.x + self.textLabel.frame.size.width + Formotion::RowType::Base.field_buffer
  field_frame.size.width  = self.frame.size.width - field_frame.origin.x - Formotion::RowType::Base.field_buffer
  f_height = self.frame.size.height - 20 - Formotion::RowType::Base.field_buffer
  field_frame.size.height = f_height
  formotion_field.frame = field_frame
  scroll_view=formotion_field
  
  formotion_field = self.viewWithTag(PAGE_VIEW_TAG)
  field_frame = formotion_field.frame
  field_frame.origin.y = 20 + f_height
  field_frame.origin.x = self.textLabel.frame.origin.x + self.textLabel.frame.size.width + Formotion::RowType::Base.field_buffer
  field_frame.size.width  = self.frame.size.width - field_frame.origin.x - Formotion::RowType::Base.field_buffer
  field_frame.size.height = 10
  formotion_field.frame = field_frame
  
  scroll_view.delegate.resizePages
  scroll_view.delegate.clearPages
end
loadPage(_page) click to toggle source
# File lib/formotion/row_type/paged_image_row.rb, line 210
def loadPage(_page)
  if _page < 0 || _page >= self.row.value.size
    # If it's outside the range of what we have to display, then do nothing
    return
  end
  # Load an individual page, first seeing if we've already loaded it
  page_view = @page_views[_page]
  if page_view.nil?
    frame=@scroll_view.bounds
    frame.origin.x = frame.size.width * _page
    frame.origin.y = 0.0
    thumb = self.row.value[_page].resize_image_to_size([frame.size.height,frame.size.height], false)
    new_page_view = UIImageView.alloc.initWithImage(thumb)
    new_page_view.userInteractionEnabled = true
    new_page_view.contentMode = UIViewContentModeScaleAspectFit
    new_page_view.frame = frame
    single_tap = UITapGestureRecognizer.alloc.initWithTarget(self, action:"pages_single_tap")
    single_tap.numberOfTapsRequired = 1
    new_page_view.addGestureRecognizer(single_tap)
    @scroll_view.addSubview(new_page_view)
    @page_views[_page]=new_page_view
  end
end
loadVisiblePages() click to toggle source

{{{Paged

# File lib/formotion/row_type/paged_image_row.rb, line 144
def loadVisiblePages
  # First, determine which page is currently visible
  page_width = @scroll_view.frame.size.width
  page = ((@scroll_view.contentOffset.x * 2.0 + page_width) / (page_width * 2.0)).floor
  # Update the page control
  @page_view.currentPage = page
  # Work out which pages we want to load
  first_page = page - 10
  last_page = page + 1
  # Purge anything before the first page
  0.upto(first_page-1) do |i|
    self.purgePage(i)
  end
  first_page.upto(last_page) do |i|
    self.loadPage(i)
  end
  (last_page+1).upto(self.row.value.size-1) do |i|
    self.purgePage(i)
  end
end
on_select(tableView, tableViewDelegate) click to toggle source
# File lib/formotion/row_type/paged_image_row.rb, line 85
def on_select(tableView, tableViewDelegate)
  if !row.editable?
    return
  end
end
pages_single_tap() click to toggle source
# File lib/formotion/row_type/paged_image_row.rb, line 170
def pages_single_tap
  page = get_active_page
  if row.editable?
    take_photo(page)
  else
    _on_select(nil, nil)
  end
end
purgePage(_page) click to toggle source
# File lib/formotion/row_type/paged_image_row.rb, line 234
def purgePage(_page)
  if _page < 0 || _page >= self.row.value.size
    # If it's outside the range of what we have to display, then do nothing
    return
  end
  # Remove a page from the scroll view and reset the container array
  page_view = @page_views[_page]
  unless page_view.nil?
    page_view.gestureRecognizers.each do |gr|
      page_view.removeGestureRecognizer(gr)
    end
    page_view.removeFromSuperview
    @page_views[_page]=nil
  end
end
resizePages() click to toggle source
# File lib/formotion/row_type/paged_image_row.rb, line 197
def resizePages
  pages_size = @scroll_view.frame.size
  @scroll_view.contentSize = CGSizeMake(pages_size.width * self.row.value.size, pages_size.height)
  #lf = @page_view.frame
  #cf = @page_view.superview.frame
  #old_width = lf.size.width
  #lf.size.width = cf.size.width-(lf.origin.x*2+10*2)
  #@page_view.frame=lf
  #lf.size.width!=old_width
  @page_view.currentPage   = 0
  @page_view.numberOfPages = self.row.value.size
end
scrollViewDidScroll(_scroll_view) click to toggle source
# File lib/formotion/row_type/paged_image_row.rb, line 250
def scrollViewDidScroll(_scroll_view)
  # Load the pages which are now on screen
  self.loadVisiblePages
end
take_photo(_page=nil) click to toggle source
# File lib/formotion/row_type/paged_image_row.rb, line 179
def take_photo(_page=nil)
  @photo_page=_page
  @action_sheet = UIActionSheet.alloc.init
  @action_sheet.delegate = self
  @action_sheet.destructiveButtonIndex = (@action_sheet.addButtonWithTitle DELETE) unless _page.nil?
  @action_sheet.addButtonWithTitle TAKE if BW::Device.camera.front? or BW::Device.camera.rear?
  @action_sheet.addButtonWithTitle CHOOSE
  @action_sheet.cancelButtonIndex = (@action_sheet.addButtonWithTitle CANCEL)
  @action_sheet.showInView @scroll_view
end