2013-07-20 2 views
14

Можно ли добавить цвет фона в 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 

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

 background_color: "CCCCCC" 

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

fill_color "CCCCCC" 
    background_color "CCCCCC" 

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

+0

У вас есть рабочее решение? – inquisitive

ответ

9

Здесь код

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 
+1

Сорри этот метод не позволяет динамические высоты колонок – b1nary

4

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

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

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

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

[1] https://groups.google.com/forum/#!msg/prawn-ruby/6XW54cGy0GA/RdXwL0Zo_Z8J

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

3

Editted Полностью Тем не менее нуждается в некоторой доработке, но попробовать это

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 в Prawn. Вы можете использовать эту опцию вместо text_color, если правильный цвет уже установлен. skip_revert это отклонит опции fill_color, stroke_color и self.line_width, которые были установлены до вызова этого метода. Это расширение также будет warn, если text_color совпадает с fill_color.

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

2

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

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 
Смежные вопросы