# frozen_string_literal: true module Axlsx # the access class defines common properties and values for a chart axis. class Axis include Axlsx::OptionsParser # Creates an Axis object # @option options [Axis] cross_axis the perpendicular axis # @option options [Symbol] ax_pos # @option options [Symbol] crosses # @option options [Symbol] tick_lbl_pos # @raise [ArgumentError] If axi_id or cross_ax are not unsigned integers def initialize(options = {}) @id = rand(8**8) @format_code = "General" @delete = @label_rotation = 0 @scaling = Scaling.new(orientation: :minMax) @title = @color = nil self.ax_pos = :b self.tick_lbl_pos = :nextTo self.format_code = "General" self.crosses = :autoZero self.gridlines = true parse_options options end # the fill color to use in the axis shape properties. This should be a 6 character long hex string # e.g. FF0000 for red # @return [String] attr_reader :color # the id of the axis. # @return [Integer] attr_reader :id alias :axID :id # The perpendicular axis # @return [Integer] attr_reader :cross_axis alias :crossAx :cross_axis # The scaling of the axis # @see Scaling # @return [Scaling] attr_reader :scaling # The position of the axis # must be one of [:l, :r, :t, :b] # @return [Symbol] attr_reader :ax_pos alias :axPos :ax_pos # the position of the tick labels # must be one of [:nextTo, :high, :low] # @return [Symbol] attr_reader :tick_lbl_pos alias :tickLblPos :tick_lbl_pos # The number format format code for this axis # default :General # @return [String] attr_reader :format_code # specifies how the perpendicular axis is crossed # must be one of [:autoZero, :min, :max] # @return [Symbol] attr_reader :crosses # specifies how the degree of label rotation # @return [Integer] attr_reader :label_rotation # specifies if gridlines should be shown in the chart # @return [Boolean] attr_reader :gridlines # specifies if gridlines should be shown in the chart # @return [Boolean] attr_reader :delete # the title for the axis. This can be a cell or a fixed string. attr_reader :title # The color for this axis. This value is used when rendering the axis line in the chart. # colors should be in 6 character rbg format # @return [String] the rbg color assinged. # @see color def color=(color_rgb) @color = color_rgb end # The crossing axis for this axis # @param [Axis] axis def cross_axis=(axis) DataTypeValidator.validate "#{self.class}.cross_axis", [Axis], axis @cross_axis = axis end # The position of the axis # must be one of [:l, :r, :t, :b] def ax_pos=(v) RestrictionValidator.validate "#{self.class}.ax_pos", [:l, :r, :b, :t], v; @ax_pos = v; end alias :axPos= :ax_pos= # the position of the tick labels # must be one of [:nextTo, :high, :low1] def tick_lbl_pos=(v) RestrictionValidator.validate "#{self.class}.tick_lbl_pos", [:nextTo, :high, :low, :none], v; @tick_lbl_pos = v; end alias :tickLblPos= :tick_lbl_pos= # The number format format code for this axis # default :General def format_code=(v) Axlsx.validate_string(v); @format_code = v; end # Specify if gridlines should be shown for this axis # default true def gridlines=(v) Axlsx.validate_boolean(v); @gridlines = v; end # Specify if axis should be removed from the chart # default false def delete=(v) Axlsx.validate_boolean(v); @delete = v; end # specifies how the perpendicular axis is crossed # must be one of [:autoZero, :min, :max] def crosses=(v) RestrictionValidator.validate "#{self.class}.crosses", [:autoZero, :min, :max], v; @crosses = v; end # Specify the degree of label rotation to apply to labels # default true def label_rotation=(v) Axlsx.validate_int(v) adjusted = v.to_i * 60000 Axlsx.validate_angle(adjusted) @label_rotation = adjusted end # The title object for the chart. # @param [String, Cell] v # @return [Title] def title=(v) DataTypeValidator.validate "#{self.class}.title", [String, Cell], v @title ||= Title.new if v.is_a?(String) @title.text = v elsif v.is_a?(Cell) @title.cell = v end end # Serializes the object # @param [String] str # @return [String] def to_xml_string(str = +'') str << '' @scaling.to_xml_string str str << '' str << '' str << '' # TODO: shape properties need to be extracted into a class if gridlines == false str << '' str << '' str << '' str << '' str << '' end str << '' @title.to_xml_string(str) unless @title.nil? # Need to set sourceLinked to 0 if we're setting a format code on this row # otherwise it will never take, as it will always prefer the 'General' formatting # of the cells themselves str << '' str << '' str << '' str << '' # TODO: this is also being used for series colors # time to extract this into a class spPr - Shape Properties if @color str << '' str << '' str << '' end # some potential value in implementing this in full. Very detailed! str << '' str << '' str << '' end end end