Class: CTioga2::TextSizeWatcher

Inherits:
Object
  • Object
show all
Defined in:
lib/ctioga2/utils.rb

Overview

This class watches over a list of named texts and can be queried for size/position information.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeTextSizeWatcher

Returns a new instance of TextSizeWatcher.



423
424
425
# File 'lib/ctioga2/utils.rb', line 423

def initialize
  @watched_names = Set.new
end

Instance Attribute Details

#bbObject

A left, bottom, right, up bounding box (in output coordinates divided by 10)



421
422
423
# File 'lib/ctioga2/utils.rb', line 421

def bb
  @bb
end

#watched_namesObject

Watched text names



417
418
419
# File 'lib/ctioga2/utils.rb', line 417

def watched_names
  @watched_names
end

Instance Method Details

#compute_bb(t) ⇒ Object



467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
# File 'lib/ctioga2/utils.rb', line 467

def compute_bb(t)

  @bb = nil

  for w in @watched_names
    info = t.get_text_size(w)
    if info.key? 'points'
      # We need to take every single point, since for rotated
      # text, potentially all coordinates are different
      for p in info['points']
        update_bb(*p)
      end
    end
  end
end

#update_margins(t, margins, padding = 2, min = 4) ⇒ Object

Given the MarginsBox with which the text was drawn, returns another MarginsBox item that specifies how much the text extends from the previous box. Works using the current frame coordinates.

Padding in big points

Min is the minimum size, also in big points.



439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
# File 'lib/ctioga2/utils.rb', line 439

def update_margins(t, margins, padding = 2, min = 4)
  compute_bb(t)
  if ! @bb
    # Don't change anything if the bounding box does not exist
    return margins
  end
  left, top, right, bottom = *margins.to_frame_coordinates(t)
  
  xl = 0.1 * t.convert_page_to_output_x(t.convert_frame_to_page_x(left))
  xr = 0.1 * t.convert_page_to_output_x(t.convert_frame_to_page_x(right))
  yt = 0.1 * t.convert_page_to_output_y(t.convert_frame_to_page_y(top))
  yb = 0.1 * t.convert_page_to_output_y(t.convert_frame_to_page_y(bottom))

  vals = [ xl - @bb[0], @bb[2] - xr, @bb[3] - yt, yb - @bb[1]].map do |x|
    x += padding
    x = if x > min
          x
        else
          min
        end
    Graphics::Types::Dimension.new(:bp, x)
  end

  return Graphics::Types::MarginsBox.
    new(*vals)
end

#watch(*names) ⇒ Object



427
428
429
# File 'lib/ctioga2/utils.rb', line 427

def watch(*names)
  @watched_names += names
end