rubymotion/BubbleWrap

View on GitHub
motion/util/constants.rb

Summary

Maintainability
A
1 hr
Test Coverage
# Stupid hack because the RubyMotion dependency detection has a bug.
module BubbleWrap
  module Constants
    module_function

    # Looks like RubyMotion only adds UIKit constants
    # at compile time. If you don't use these
    # directly in your code, they don't get added
    # to Kernel and Constants.get crashes.
    # Examples
    # Constants.register UIReturnKeyDone, UIReturnKeyNext
    def register(*ui_constants)
      # do nothing, just get the constants in the code
    end

    # @param [String] base of the constant
    # @param [Integer, NSArray, String, Symbol] the suffix of the constant
    #   when NSArray, will return the bitmask of all suffixes in the array
    # @return [Integer] the constant for this base and suffix
    # Examples
    # get("UIReturnKey", :done) => UIReturnKeyDone == 9
    # get("UIReturnKey", "done") => UIReturnKeyDone == 9
    # get("UIReturnKey", 9) => 9
    # get("UIImagePickerControllerSourceType", ["photo_library", "camera", "saved_photos_album"]) => 3
    # get("UIActivityType", [:air_drop, :print]) => ["com.apple.UIKit.activity.AirDrop", "com.apple.UIKit.activity.Print"]
    def get(base, *values)
      if values.is_a? NSArray
        value = values.size == 1 ? values.first : values.flatten
      else
        value = values
      end

      case value
      when Numeric
        value.to_i
      when NSArray
        unless get(base, value.first).is_a? Fixnum
          value.map { |v| get(base, v) }
        else
          value.reduce { |i, j|
            get(base, i) | get(base, j)
          }
        end
      else
        value = value.to_s.camelize
        Kernel.const_get("#{base}#{value}")
      end
    end
  end
end