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.



477
478
479
# File 'lib/ctioga2/utils.rb', line 477

def initialize
  @watched_names = Set.new
end

Instance Attribute Details

#bbObject

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



475
476
477
# File 'lib/ctioga2/utils.rb', line 475

def bb
  @bb
end

#watched_namesObject

Watched text names



471
472
473
# File 'lib/ctioga2/utils.rb', line 471

def watched_names
  @watched_names
end

Instance Method Details

#compute_bb(t) ⇒ Object



521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
# File 'lib/ctioga2/utils.rb', line 521

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.



493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
# File 'lib/ctioga2/utils.rb', line 493

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



481
482
483
# File 'lib/ctioga2/utils.rb', line 481

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