Как добавить фон / цвет заливки в bounding_box в Prawn

Можно ли добавить цвет фона для bounding_box в Prawn?

 bounding_box([100, cursor], width: 80, height: 20) do
    pad_top(7) { text "THIS IS TEXT", size: 8, align: :center }
    stroke_bounds
 end 

Я пытался добавить это в блок bounding_box

     background_color: "CCCCCC"

Я пытался добавить это внутри блока

    fill_color "CCCCCC"
    background_color "CCCCCC"

Ничто, кажется, не работает с bounding_box

4 ответа

Решение

Вот код

    bounding_box([200,cursor], :width => 350, :height => 80) do
        stroke_color 'FFFFFF'
        stroke_bounds
        stroke do
            stroke_color 'FFFF00'
            fill_color '36DA5C'
            fill_and_stroke_rounded_rectangle [cursor-80,cursor], 350, 80, 10
            fill_color '000000'
        end
    end

Это обсуждалось в 2008 году [1] (хотя, по-видимому, ни к чему не привело), ​​я также не вижу упоминания в руководстве [2]. Читать инструкцию?:)

Что касается того, как это делается: После помещения всего содержимого в ограничивающий прямоугольник, вы можете получить результирующую ширину и высоту из ограничивающего прямоугольника. С этой информацией вы можете использовать простой прямоугольный рисунок для ее заполнения. После этого вам придется перерисовывать содержимое, потому что теперь вы будете рисовать прямо поверх него с помощью прямоугольной заливки.

Надеюсь (возможно?) Есть и лучший способ, когда вам не нужно рисовать фактический контент дважды; Обязательно поделитесь этим со всеми, когда натолкнетесь на это!

Все, что я упомянул в кратком руководстве, прекрасно документировано в руководстве [2]; Удачи!

[1] https://groups.google.com/forum/

[2] http://prawn.majesticseacreature.com/manual.pdf

Вот как я это сделал.

bounding_box([0, y_position], width: 200, height: 50) do
  fill_color 'CCCCCC'
  fill { rectangle [0, 50], 200, 50 }
  text 'Hello', align: :center, valign: :center
end

РЕДАКТИРОВАНИЕ Полностью все еще нужно немного поработать, но попробуйте это

module Prawn
  module Graphics
    def fill_and_stroke_bounding_box(options={},&block)
      current_settings = {fill_color: fill_color, 
                      stroke_color: stroke_color, 
                      line_width: self.line_width }
      fill_color options[:fill_color] || fill_color
      stroke_color options[:stroke][:color] || stroke_color if options[:stroke]
      self.line_width  options[:stroke][:width] || self.line_width if options[:stroke]
      rectangle options[:position], options[:width], options[:height]
      options[:stroke] ? fill_and_stroke : fill
      box_options = convert_box_options(options)
      options[:revert_before_block] ?  revert(current_settings) : check_fill_visiblity(options[:text_color])
      fill_color options[:text_color] || fill_color 
      bounding_box(box_options[:position],box_options[:options]) do 
        if block_given?
          block.call
        end
      end
      revert(current_settings) unless options[:skip_revert]
    end

    def revert(settings={})
      fill_color settings[:fill_color]
      stroke_color settings[:stroke_color]
      self.line_width settings[:line_width]
    end

    def convert_box_options(options={})
      converted_options =  {position: options.delete(:position)}
      if options.delete(:stroke)
        resize_box(options)
        reposition_box(converted_options)
      end
      converted_options.merge({options: options})
    end

    def resize_box(options ={})
      [:width,:height].each do |param|
        options[param] -= (self.line_width * 2)
      end
    end

    def reposition_box(options)
      options[:position][0] += self.line_width
      options[:position][1] -= self.line_width
    end

    def check_fill_visiblity(text_color)
      text_color ||= fill_color
      warn "[WARNING] Text Will Not be visible without text_color set or revert_before_block" if text_color == fill_color
    end 

  end
end

Тогда вы можете назвать это так

fill_and_stroke_bounding_box(position:[0,cursor],
                            stroke:{color: "7CFC00",width: 2.mm},
                            text_color: "668B8B"
                            fill_color:"FFFFFF", 
                            width: 19.cm, height: 100
                            ) do 

Единственные опции, которые требуются position,height, а также width(bounding_box не требует height но так как вы помещаете его в прямоугольник, вы должны указать height,

Хотя рекомендуется text_color или же revert_before_block также устанавливаются, в противном случае текст внутри блока будет невидимым.

options включает в себя все параметры bounding_box, включая использование блока, а также следующие новые параметры stroke:{:color,:width} который позволяет вам установить внешнюю обводку для прямоугольника. fill_color: установить цвет прямоугольника. text_color цвет текста внутри блока. revert_before_block вернет цвета перед выполнением блока, потому что fill_color контролирует цвет текста в креветках. Вы можете использовать эту опцию вместо text_color если правильный цвет уже установлен.skip_revert это отменит варианты fill_color,stroke_color, а также self.line_width которые были установлены до вызова этого метода. Это расширение будет также warn если text_color такой же, как fill_color,

Надеюсь, это поможет кому-то.

Просто чтобы добавить еще один вариант ответа Willing... если кто-то найдет это и захочет использовать его с сеткой.

def widget
  grid([2,2], [3,2]).bounding_box do
    stroke do
      fill_color '36DA5C'
      fill_and_stroke_rounded_rectangle [cursor-bounds.height,cursor], bounds.width, bounds.height, 5
      fill_color '000000'
    end

    text "This is text inside the box"
  end
end
Другие вопросы по тегам