2013-07-20 138 views
14

Prawnのbounding_boxに背景色を追加することはできますか?Prawnのbounding_boxに背景/塗りつぶしの色を追加する方法

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

アイブ氏は、アイブ氏は

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

で動いていないようにみえブロック内にこれを追加しようとしたBOUNDING_BOXブロックにこれを追加すること

 background_color: "CCCCCC" 

を試してみました2008 [1](明らかにどこにも導かなかった)、私はそれがどこにも言及されていないマニュアル[2]。マニュアルを読む? :)

すべてのコンテンツをバウンディングボックスに入れた後、結果の幅と高さをバウンディングボックスから取得できます。その情報を使用して、プリミティブ矩形描画を使用して塗りつぶすことができます。その後、コンテンツを再描画する必要があります。これまでに、四角形で塗りつぶしているためです。

うまくいけば、実際のコンテンツを2回描く必要がない、より良い方法があります。あなたがそれを見つけたときに誰もがそれを共有することを確認してください!

上記の簡単な方法で説明したすべてのものは、マニュアル[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 
必要とされるの

唯一の選択肢はpositionheight、そしてwidthbounding_boxheight必要はありませんが、長方形の内側にそれを置いているので、あなたがheightを指定する必要があります。

text_colorまたはrevert_before_blockも設定することをお勧めしますが、ブロック内のテキストは表示されません。

optionsには、ブロックの使用を含むすべてのbounding_boxオプションと、矩形の外側ストロークを設定できる次の新しいオプションstroke:{:color,:width}が含まれています。 fill_color:矩形の色を設定します。 text_colorブロック内のテキストの色。 revert_before_blockは、fill_colorがPrawnのtext_colorを制御するため、ブロックを実行する前に色を元に戻します。正しい色がすでに設定されている場合は、text_colorの代わりにこのオプションを使用できます。 skip_revertこれは、このメソッドを呼び出す前に設定されたfill_color,stroke_color、およびself.line_widthのオプションを破棄します。 text_colorfill_colorと同じ場合は、この拡張子もwarnになります。

これは誰かを助けることを望みます。

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