Class: PREP::Core::Drawable
- Inherits:
-
Object
- Object
- PREP::Core::Drawable
- Defined in:
- lib/core/drawable.rb
Overview
構成要素を表現する基底クラス
Label, Line, Rectangle などの描画構成要素の基底クラス. 描画に必要となる基本的な機能が実装されている.
Instance Attribute Summary collapse
-
#identifier ⇒ Object
readonly
Returns the value of attribute identifier.
-
#layer ⇒ Object
readonly
Returns the value of attribute layer.
Instance Method Summary collapse
-
#<=>(other) ⇒ Object
比較メソッド.
-
#calculate_pos(page, region, x, y) ⇒ Object
座標変換.
-
#calculate_region(prep, region, values, stop_on_drawable = nil) ⇒ Object
描画領域計算.
-
#draw(prep, region, values, stop_on_drawable = nil) ⇒ Object
描画処理の呼び出し.
-
#initialize(identifier, layer = 1) ⇒ Drawable
constructor
初期化.
-
#key_string_to_symbol(hash) ⇒ Object
ハッシュに対して再帰的にキーが文字列の場合にシンボルに置換.
-
#rewind_current_page(prep, parent_direction = nil) ⇒ Object
領域計算前後で現在位置を保持して戻すためのブロック付きメソッド.
-
#visible?(value) ⇒ Boolean
実際の描画を行うかどうかの判定.
Constructor Details
#initialize(identifier, layer = 1) ⇒ Drawable
初期化
28 29 30 31 32 |
# File 'lib/core/drawable.rb', line 28 def initialize(identifier, layer = 1) STDERR.puts("Initializing #{self.class}: #{identifier}") if ENV['DEBUG'] @identifier = identifier @layer = layer.to_i end |
Instance Attribute Details
#identifier ⇒ Object (readonly)
Returns the value of attribute identifier.
25 26 27 |
# File 'lib/core/drawable.rb', line 25 def identifier @identifier end |
#layer ⇒ Object (readonly)
Returns the value of attribute layer.
25 26 27 |
# File 'lib/core/drawable.rb', line 25 def layer @layer end |
Instance Method Details
#<=>(other) ⇒ Object
比較メソッド
40 41 42 43 44 45 |
# File 'lib/core/drawable.rb', line 40 def <=>(other) unless Drawable === other raise ArgumentError.new end return @layer <=> other.layer end |
#calculate_pos(page, region, x, y) ⇒ Object
座標変換
実際に PDF 上に配置する際の座標に変換 絶対補正座標と相対座標の組みで渡されて x, y のリストで返却される
81 82 83 84 85 86 87 |
# File 'lib/core/drawable.rb', line 81 def calculate_pos(page, region, x, y) # 絶対座標変換 x = region.x + x y = region.y + y # Y 座標反転 return x, page.get_height - y end |
#calculate_region(prep, region, values, stop_on_drawable = nil) ⇒ Object
描画領域計算
35 36 37 |
# File 'lib/core/drawable.rb', line 35 def calculate_region(prep, region, values, stop_on_drawable = nil) raise NotImplementedError.new end |
#draw(prep, region, values, stop_on_drawable = nil) ⇒ Object
描画処理の呼び出し
継承先で実装されるべきメソッド 引数として描画可能領域を表現するリージョンインスタンス、 および、関連する値のハッシュが渡されます。 描画対象は Prep#current_page から取得します。
53 54 55 |
# File 'lib/core/drawable.rb', line 53 def draw(prep, region, values, stop_on_drawable = nil) raise NotImplementedError.new end |
#key_string_to_symbol(hash) ⇒ Object
ハッシュに対して再帰的にキーが文字列の場合にシンボルに置換
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/core/drawable.rb', line 58 def key_string_to_symbol(hash) if Hash === hash ret_hash = hash.keys.inject({ }) do |h, key| case hash[key] when Hash h[key.to_sym] = key_string_to_symbol(hash[key]) else h[key.to_sym] = hash[key] end next h end return ret_hash else raise "Argument not Hash." end end |
#rewind_current_page(prep, parent_direction = nil) ⇒ Object
領域計算前後で現在位置を保持して戻すためのブロック付きメソッド
Prep インスタンスと必要に応じて元ループの方向を示す 元ループの方向と内部のページ遷移方向が異なる場合のみページを元に戻す 親の方向が指定されない場合は無条件にページを戻す
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
# File 'lib/core/drawable.rb', line 94 def rewind_current_page(prep, parent_direction = nil) # 領域計算中にページ移動が発生した場合に戻すために保持 current_page_x, current_page_y = prep.page_pos_x, prep.page_pos_y begin values = yield rescue ReRenderJump => e # ページの移動方向を確認 # 設定ファイルの構成によっては両方に遷移する可能性があるがそれはエラーとする horizontal_page_move = prep.page_pos_x - current_page_x vertical_page_move = prep.page_pos_y - current_page_y if horizontal_page_move < 0 # 左方向の遷移を検出したのでエラー raise "Page move to left error!" end if vertical_page_move < 0 # 上方向の遷移を検出したのでエラー raise "Page move to up error!" end if horizontal_page_move != 0 && vertical_page_move != 0 # 水平、垂直両方向への遷移を検出したのでエラー raise "Page move is too difficult!!(Please wait...)" end if parent_direction.nil? if horizontal_page_move != 0 || vertical_page_move != 0 # 方向指定がない場合は戻す prep.current_page = { :x => current_page_x, :y => current_page_y } puts "Rewind page index to [#{current_page_x}:#{current_page_y}]" if ENV["DEBUG"] end elsif parent_direction == Loop::DIRECTIONS[:horizontal] && vertical_page_move > 0 # 方向指定と異なる方向の場合は戻す(ループは水平、ページは垂直) prep.current_page = { :x => current_page_x, :y => current_page_y } puts "Rewind page index to [#{current_page_x}:#{current_page_y}]" if ENV["DEBUG"] elsif parent_direction == Loop::DIRECTIONS[:vertical] && horizontal_page_move > 0 # 方向指定と異なる方向の場合は戻す(ループは垂直、ページは水平) prep.current_page = { :x => current_page_x, :y => current_page_y } puts "Rewind page index to [#{current_page_x}:#{current_page_y}]" if ENV["DEBUG"] end raise e end # 現在のページ番号を元に戻す horizontal_page_move = prep.page_pos_x - current_page_x vertical_page_move = prep.page_pos_y - current_page_y if horizontal_page_move < 0 # 左方向の遷移を検出したのでエラー raise "Page move to left error!" end if vertical_page_move < 0 # 上方向の遷移を検出したのでエラー raise "Page move to up error!" end if horizontal_page_move != 0 && vertical_page_move != 0 # 水平、垂直両方向への遷移を検出したのでエラー raise "Page move is too difficult!!(Please wait...)" end if parent_direction.nil? if horizontal_page_move != 0 || vertical_page_move != 0 # 方向指定がない場合は戻す prep.current_page = { :x => current_page_x, :y => current_page_y } puts "Rewind page index to [#{current_page_x}:#{current_page_y}]" if ENV["DEBUG"] end elsif parent_direction == Loop::DIRECTIONS[:horizontal] && vertical_page_move > 0 # 方向指定と異なる方向の場合は戻す(ループは水平、ページは垂直) prep.current_page = { :x => current_page_x, :y => current_page_y } puts "Rewind page index to [#{current_page_x}:#{current_page_y}]" if ENV["DEBUG"] elsif parent_direction == Loop::DIRECTIONS[:vertical] && horizontal_page_move > 0 # 方向指定と異なる方向の場合は戻す(ループは垂直、ページは水平) prep.current_page = { :x => current_page_x, :y => current_page_y } puts "Rewind page index to [#{current_page_x}:#{current_page_y}]" if ENV["DEBUG"] end return values end |
#visible?(value) ⇒ Boolean
実際の描画を行うかどうかの判定
164 165 166 167 168 |
# File 'lib/core/drawable.rb', line 164 def visible?(value) return true unless @control_visible return !!value end |