Как добавить фон / цвет заливки в 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]; Удачи!
Вот как я это сделал.
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