under-os/under-os

View on GitHub
gems/under-os-ui/lib/under_os/ui/style/outlining.rb

Summary

Maintainability
B
5 hrs
Test Coverage
#
# This module contains things like colors, borders, shadows, etc
#
module UnderOs::UI
  class Style
    module Outlining
      def opacity
        @view.alpha
      end

      def opacity=(value)
        @view.alpha = value
      end

      def backgroundColor
        @view.backgroundColor
      end

      def backgroundColor=(color, state=UIControlStateNormal)
        if @view.is_a?(UIButton)
          @view.setBackgroundColor convert_color(color), forState:state
        else
          @view.backgroundColor = convert_color(color)
        end
      end

      def backgroundImage
        @background_image
      end

      def backgroundImage=(image)
        image = UIImage.UIImage.imageNamed(image) if image.is_a?(String)

        if @view.is_a?(UIButton)
          @view.setBackgroundImage(image, forState:UIControlStateNormal)
        else
          @background_image = UnderOs::UI::Image.new(src: image, class: 'uos-background-image')
          @background_image._.frame = [[0, 0], [@view.frame.size.width, @view.frame.size.height]]
          @view.insertSubview(@background_image._, atIndex: 0)
        end
      end

      alias :background  :backgroundColor
      alias :background= :backgroundColor=

      def color(state=UIControlStateNormal)
        if @view.is_a?(UIButton)
          @view.titleColorForState(state)
        elsif @view.respond_to?(:textColor)
          @view.textColor
        elsif @view.respond_to?(:color)
          @view.color
        end
      end

      def color=(color, state=UIControlStateNormal)
        if @view.is_a?(UIButton)
          @view.setTitleColor convert_color(color), forState:state
        elsif @view.respond_to?(:textColor)
          @view.textColor = convert_color(color)
        elsif @view.respond_to?(:color)
          @view.color = convert_color(color)
        end
      end

      def borderRadius
        @view.layer.cornerRadius
      end

      def borderRadius=(radius)
        @view.clipsToBounds      = true
        @view.layer.cornerRadius = radius
      end

      def borderColor
        @view.layer.borderColor
      end

      def borderColor=(color)
        @view.layer.borderColor = convert_color(color).CGColor
      end

      def borderWidth
        @view.layer.borderWidth
      end

      def borderWidth=(width)
        @view.layer.borderWidth = width
      end

      def boxShadow
        get_layer_shadow @view.layer
      end

      def boxShadow=(value)
        set_layer_shadow @view.layer, value
      end

      def textShadow
        get_layer_shadow text_layer
      end

      def textShadow=(value)
        set_layer_shadow text_layer, value
      end

    private

      def convert_color(color)
        UnderOs::Color.new(color).ui
      end

      def text_layer
        @view.is_a?(UIButton) ? @view.titleLabel : @view.layer
      end

      def get_layer_shadow(layer)
        [
          layer.shadowOffset.width,
          layer.shadowOffset.height,
          layer.shadowRadius,
          layer.shadowOpacity,
          UnderOs::Color.new(layer.shadowColor).to_hex
        ].compact.join(" ")
      end

      def set_layer_shadow(layer, value)
        x, y, radius, opacity, color = parse_shadow_params(value)

        layer.shadowOffset  = CGSizeMake(x, y) if x && y
        layer.shadowColor   = color.CGColor    if color
        layer.shadowRadius  = radius           if radius
        layer.shadowOpacity = opacity          if opacity
        layer.shadowPath    = UIBezierPath.bezierPathWithRect(@view.layer.bounds).CGPath
      end

      def parse_shadow_params(string)
        x, y, radius, opacity, color = string.strip.split

        x = x.gsub /px$/, ''
        y = y.gsub /px$/, ''
        radius  = radius.gsub  /px$/, '' if radius
        opacity = opacity.gsub /px$/, '' if opacity

        if ! color
          if opacity
            unless opacity =~ /^[\d\.]+$/
              color   = opacity
              opacity = nil
            end
          elsif radius
            unless radius =~ /^[\d\.]+$/
              color  = radius
              radius = nil
            end
          end
        end

        x = x.to_f if x
        y = y.to_f if y

        radius  = radius.to_f  if radius
        opacity = opacity.to_f if opacity
        color   = convert_color(color) if color

        [x, y, radius, opacity, color]
      end
    end
  end
end